TianoCore EDK2 master
Loading...
Searching...
No Matches
RealTimeClock.c
Go to the documentation of this file.
1
12#include <PiDxe.h>
13#include <Library/DebugLib.h>
15#include <Library/TimeBaseLib.h>
16#include <Library/UefiLib.h>
20
21EFI_HANDLE mHandle = NULL;
22
23//
24// These values can be set by SetTime () and need to be returned by GetTime ()
25// but cannot usually be kept by the RTC hardware, so we store them in a UEFI
26// variable instead.
27//
28typedef struct {
29 INT16 TimeZone;
30 UINT8 Daylight;
32
33STATIC CONST CHAR16 mTimeSettingsVariableName[] = L"RtcTimeSettings";
35
53EFIAPI
55 OUT EFI_TIME *Time,
56 OUT EFI_TIME_CAPABILITIES *Capabilities
57 )
58{
59 if (Time == NULL) {
60 return EFI_INVALID_PARAMETER;
61 }
62
63 //
64 // Set these first so the RealTimeClockLib implementation
65 // can override them based on its own settings.
66 //
67 Time->TimeZone = mTimeSettings.TimeZone;
68 Time->Daylight = mTimeSettings.Daylight;
69
70 return LibGetTime (Time, Capabilities);
71}
72
87EFIAPI
89 IN EFI_TIME *Time
90 )
91{
92 EFI_STATUS Status;
93 BOOLEAN TimeSettingsChanged;
94
95 if ((Time == NULL) || !IsTimeValid (Time)) {
96 return EFI_INVALID_PARAMETER;
97 }
98
99 TimeSettingsChanged = FALSE;
100 if ((mTimeSettings.TimeZone != Time->TimeZone) ||
101 (mTimeSettings.Daylight != Time->Daylight))
102 {
103 mTimeSettings.TimeZone = Time->TimeZone;
104 mTimeSettings.Daylight = Time->Daylight;
105 TimeSettingsChanged = TRUE;
106 }
107
108 Status = LibSetTime (Time);
109 if (EFI_ERROR (Status)) {
110 return Status;
111 }
112
113 if (TimeSettingsChanged) {
114 Status = EfiSetVariable (
115 (CHAR16 *)mTimeSettingsVariableName,
116 &gEfiCallerIdGuid,
118 EFI_VARIABLE_BOOTSERVICE_ACCESS |
119 EFI_VARIABLE_RUNTIME_ACCESS,
120 sizeof (mTimeSettings),
121 (VOID *)&mTimeSettings
122 );
123 if (EFI_ERROR (Status)) {
124 return EFI_DEVICE_ERROR;
125 }
126 }
127
128 return EFI_SUCCESS;
129}
130
147EFIAPI
149 OUT BOOLEAN *Enabled,
150 OUT BOOLEAN *Pending,
151 OUT EFI_TIME *Time
152 )
153{
154 if ((Time == NULL) || (Enabled == NULL) || (Pending == NULL)) {
155 return EFI_INVALID_PARAMETER;
156 }
157
158 //
159 // Set these first so the RealTimeClockLib implementation
160 // can override them based on its own settings.
161 //
162 Time->TimeZone = mTimeSettings.TimeZone;
163 Time->Daylight = mTimeSettings.Daylight;
164
165 return LibGetWakeupTime (Enabled, Pending, Time);
166}
167
184EFIAPI
186 IN BOOLEAN Enabled,
187 OUT EFI_TIME *Time
188 )
189{
190 return LibSetWakeupTime (Enabled, Time);
191}
192
204EFIAPI
206 IN EFI_HANDLE ImageHandle,
207 IN EFI_SYSTEM_TABLE *SystemTable
208 )
209{
210 EFI_STATUS Status;
211 UINTN Size;
212
213 Status = LibRtcInitialize (ImageHandle, SystemTable);
214 if (EFI_ERROR (Status)) {
215 return Status;
216 }
217
218 Size = sizeof (mTimeSettings);
219 Status = EfiGetVariable (
220 (CHAR16 *)mTimeSettingsVariableName,
221 &gEfiCallerIdGuid,
222 NULL,
223 &Size,
224 (VOID *)&mTimeSettings
225 );
226 if (EFI_ERROR (Status) ||
227 !IsValidTimeZone (mTimeSettings.TimeZone) ||
228 !IsValidDaylight (mTimeSettings.Daylight))
229 {
230 DEBUG ((
231 DEBUG_WARN,
232 "%a: using default timezone/daylight settings\n",
233 __func__
234 ));
235
236 mTimeSettings.TimeZone = EFI_UNSPECIFIED_TIMEZONE;
237 mTimeSettings.Daylight = 0;
238 }
239
240 SystemTable->RuntimeServices->GetTime = GetTime;
241 SystemTable->RuntimeServices->SetTime = SetTime;
242 SystemTable->RuntimeServices->GetWakeupTime = GetWakeupTime;
243 SystemTable->RuntimeServices->SetWakeupTime = SetWakeupTime;
244
245 Status = gBS->InstallMultipleProtocolInterfaces (
246 &mHandle,
247 &gEfiRealTimeClockArchProtocolGuid,
248 NULL,
249 NULL
250 );
251
252 return Status;
253}
UINT64 UINTN
EFI_STATUS EFIAPI GetWakeupTime(OUT BOOLEAN *Enabled, OUT BOOLEAN *Pending, OUT EFI_TIME *Time)
EFI_STATUS EFIAPI SetTime(IN EFI_TIME *Time)
Definition: RealTimeClock.c:88
EFI_STATUS EFIAPI InitializeRealTimeClock(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
EFI_STATUS EFIAPI SetWakeupTime(IN BOOLEAN Enabled, OUT EFI_TIME *Time)
EFI_STATUS EFIAPI GetTime(OUT EFI_TIME *Time, OUT EFI_TIME_CAPABILITIES *Capabilities)
Definition: RealTimeClock.c:54
#define NULL
Definition: Base.h:319
#define CONST
Definition: Base.h:259
#define STATIC
Definition: Base.h:264
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define DEBUG(Expression)
Definition: DebugLib.h:434
EFI_STATUS EFIAPI LibSetWakeupTime(IN BOOLEAN Enabled, OUT EFI_TIME *Time)
EFI_STATUS EFIAPI LibRtcInitialize(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
EFI_STATUS EFIAPI LibGetWakeupTime(OUT BOOLEAN *Enabled, OUT BOOLEAN *Pending, OUT EFI_TIME *Time)
EFI_STATUS EFIAPI LibSetTime(IN EFI_TIME *Time)
EFI_STATUS EFIAPI LibGetTime(OUT EFI_TIME *Time, OUT EFI_TIME_CAPABILITIES *Capabilities)
BOOLEAN EFIAPI IsValidTimeZone(IN INT16 TimeZone)
Definition: TimeBaseLib.c:225
BOOLEAN EFIAPI IsTimeValid(IN EFI_TIME *Time)
Definition: TimeBaseLib.c:269
BOOLEAN EFIAPI IsValidDaylight(IN INT8 Daylight)
Definition: TimeBaseLib.c:249
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
EFI_BOOT_SERVICES * gBS
#define EFI_VARIABLE_NON_VOLATILE
EFI_STATUS EFIAPI EfiGetVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, OUT UINT32 *Attributes OPTIONAL, IN OUT UINTN *DataSize, OUT VOID *Data)
Definition: RuntimeLib.c:408
EFI_STATUS EFIAPI EfiSetVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN UINT32 Attributes, IN UINTN DataSize, IN VOID *Data)
Definition: RuntimeLib.c:498
#define EFI_UNSPECIFIED_TIMEZONE
Definition: UefiSpec.h:58