Blame view

Documentation/ia64/efirtc.txt 4.29 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  EFI Real Time Clock driver
  -------------------------------
  S. Eranian <eranian@hpl.hp.com>
  March 2000
  
  I/ Introduction
  
  This document describes the efirtc.c driver has provided for
  the IA-64 platform. 
  
  The purpose of this driver is to supply an API for kernel and user applications
  to get access to the Time Service offered by EFI version 0.92.
  
  EFI provides 4 calls one can make once the OS is booted: GetTime(),
  SetTime(), GetWakeupTime(), SetWakeupTime() which are all supported by this
  driver. We describe those calls as well the design of the driver in the
  following sections.
  
  II/ Design Decisions
  
  The original ideas was to provide a very simple driver to get access to, 
  at first, the time of day service. This is required in order to access, in a 
  portable way, the CMOS clock. A program like /sbin/hwclock uses such a clock 
  to initialize the system view of the time during boot.
  
  Because we wanted to minimize the impact on existing user-level apps using
  the CMOS clock, we decided to expose an API that was very similar to the one
  used today with the legacy RTC driver (driver/char/rtc.c). However, because 
670e9f34e   Paolo Ornati   Documentation: re...
29
  EFI provides a simpler services, not all ioctl() are available. Also
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  new ioctl()s have been introduced for things that EFI provides but not the 
  legacy.
  
  EFI uses a slightly different way of representing the time, noticeably
  the reference date is different. Year is the using the full 4-digit format.
  The Epoch is January 1st 1998. For backward compatibility reasons we don't
  expose this new way of representing time. Instead we use something very 
  similar to the struct tm, i.e. struct rtc_time, as used by hwclock.
  One of the reasons for doing it this way is to allow for EFI to still evolve
  without necessarily impacting any of the user applications. The decoupling
  enables flexibility and permits writing wrapper code is ncase things change.
  
  The driver exposes two interfaces, one via the device file and a set of
  ioctl()s. The other is read-only via the /proc filesystem. 
  
  As of today we don't offer a /proc/sys interface.
  
  To allow for a uniform interface between the legacy RTC and EFI time service,
  we have created the include/linux/rtc.h header file to contain only the 
  "public" API of the two drivers.  The specifics of the legacy RTC are still 
  in include/linux/mc146818rtc.h.
  
   
  III/ Time of day service
  
  The part of the driver gives access to the time of day service of EFI.
  Two ioctl()s, compatible with the legacy RTC calls:
  
  	Read the CMOS clock: ioctl(d, RTC_RD_TIME, &rtc);
  
  	Write the CMOS clock: ioctl(d, RTC_SET_TIME, &rtc);
  
  The rtc is a pointer to a data structure defined in rtc.h which is close
  to a struct tm:
  
  struct rtc_time {
          int tm_sec;
          int tm_min;
          int tm_hour;
          int tm_mday;
          int tm_mon;
          int tm_year;
          int tm_wday;
          int tm_yday;
          int tm_isdst;
  };
  
  The driver takes care of converting back an forth between the EFI time and
  this format.
  
  Those two ioctl()s can be exercised with the hwclock command:
  
  For reading:
  # /sbin/hwclock --show
  Mon Mar  6 15:32:32 2000  -0.910248 seconds
  
  For setting:
  # /sbin/hwclock --systohc
  
  Root privileges are required to be able to set the time of day.
  
  IV/ Wakeup Alarm service
  
  EFI provides an API by which one can program when a machine should wakeup,
  i.e. reboot. This is very different from the alarm provided by the legacy
  RTC which is some kind of interval timer alarm. For this reason we don't use
  the same ioctl()s to get access to the service. Instead we have
  introduced 2 news ioctl()s to the interface of an RTC. 
  
  We have added 2 new ioctl()s that are specific to the EFI driver:
  
  	Read the current state of the alarm
  	ioctl(d, RTC_WKLAM_RD, &wkt)
  
  	Set the alarm or change its status
  	ioctl(d, RTC_WKALM_SET, &wkt)
  
  The wkt structure encapsulates a struct rtc_time + 2 extra fields to get 
  status information:
  	
  struct rtc_wkalrm {
  
          unsigned char enabled; /* =1 if alarm is enabled */
          unsigned char pending; /* =1 if alarm is pending  */
  
          struct rtc_time time;
  } 
  
  As of today, none of the existing user-level apps supports this feature.
  However writing such a program should be hard by simply using those two 
  ioctl(). 
  
  Root privileges are required to be able to set the alarm.
  
  V/ References.
  
  Checkout the following Web site for more information on EFI:
  
  http://developer.intel.com/technology/efi/