1 /** @file
2 Provides Set/Get time operations.
3
4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "PcRtc.h"
16
17 PC_RTC_MODULE_GLOBALS mModuleGlobal;
18
19 EFI_HANDLE mHandle = NULL;
20
21 /**
22 Returns the current time and date information, and the time-keeping capabilities
23 of the hardware platform.
24
25 @param Time A pointer to storage to receive a snapshot of the current time.
26 @param Capabilities An optional pointer to a buffer to receive the real time
27 clock device's capabilities.
28
29 @retval EFI_SUCCESS The operation completed successfully.
30 @retval EFI_INVALID_PARAMETER Time is NULL.
31 @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware error.
32
33 **/
34 EFI_STATUS
35 EFIAPI
PcRtcEfiGetTime(OUT EFI_TIME * Time,OUT EFI_TIME_CAPABILITIES * Capabilities OPTIONAL)36 PcRtcEfiGetTime (
37 OUT EFI_TIME *Time,
38 OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
39 )
40 {
41 return PcRtcGetTime (Time, Capabilities, &mModuleGlobal);
42 }
43
44 /**
45 Sets the current local time and date information.
46
47 @param Time A pointer to the current time.
48
49 @retval EFI_SUCCESS The operation completed successfully.
50 @retval EFI_INVALID_PARAMETER A time field is out of range.
51 @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error.
52
53 **/
54 EFI_STATUS
55 EFIAPI
PcRtcEfiSetTime(IN EFI_TIME * Time)56 PcRtcEfiSetTime (
57 IN EFI_TIME *Time
58 )
59 {
60 return PcRtcSetTime (Time, &mModuleGlobal);
61 }
62
63 /**
64 Returns the current wakeup alarm clock setting.
65
66 @param Enabled Indicates if the alarm is currently enabled or disabled.
67 @param Pending Indicates if the alarm signal is pending and requires acknowledgement.
68 @param Time The current alarm setting.
69
70 @retval EFI_SUCCESS The alarm settings were returned.
71 @retval EFI_INVALID_PARAMETER Enabled is NULL.
72 @retval EFI_INVALID_PARAMETER Pending is NULL.
73 @retval EFI_INVALID_PARAMETER Time is NULL.
74 @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a hardware error.
75 @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform.
76
77 **/
78 EFI_STATUS
79 EFIAPI
PcRtcEfiGetWakeupTime(OUT BOOLEAN * Enabled,OUT BOOLEAN * Pending,OUT EFI_TIME * Time)80 PcRtcEfiGetWakeupTime (
81 OUT BOOLEAN *Enabled,
82 OUT BOOLEAN *Pending,
83 OUT EFI_TIME *Time
84 )
85 {
86 return PcRtcGetWakeupTime (Enabled, Pending, Time, &mModuleGlobal);
87 }
88
89
90 /**
91 Sets the system wakeup alarm clock time.
92
93 @param Enabled Enable or disable the wakeup alarm.
94 @param Time If Enable is TRUE, the time to set the wakeup alarm for.
95 If Enable is FALSE, then this parameter is optional, and may be NULL.
96
97 @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was enabled.
98 If Enable is FALSE, then the wakeup alarm was disabled.
99 @retval EFI_INVALID_PARAMETER A time field is out of range.
100 @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a hardware error.
101 @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform.
102
103 **/
104 EFI_STATUS
105 EFIAPI
PcRtcEfiSetWakeupTime(IN BOOLEAN Enabled,IN EFI_TIME * Time OPTIONAL)106 PcRtcEfiSetWakeupTime (
107 IN BOOLEAN Enabled,
108 IN EFI_TIME *Time OPTIONAL
109 )
110 {
111 return PcRtcSetWakeupTime (Enabled, Time, &mModuleGlobal);
112 }
113
114 /**
115 The user Entry Point for PcRTC module.
116
117 This is the entrhy point for PcRTC module. It installs the UEFI runtime service
118 including GetTime(),SetTime(),GetWakeupTime(),and SetWakeupTime().
119
120 @param ImageHandle The firmware allocated handle for the EFI image.
121 @param SystemTable A pointer to the EFI System Table.
122
123 @retval EFI_SUCCESS The entry point is executed successfully.
124 @retval Others Some error occurs when executing this entry point.
125
126 **/
127 EFI_STATUS
128 EFIAPI
InitializePcRtc(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)129 InitializePcRtc (
130 IN EFI_HANDLE ImageHandle,
131 IN EFI_SYSTEM_TABLE *SystemTable
132 )
133 {
134 EFI_STATUS Status;
135 EFI_EVENT Event;
136
137 EfiInitializeLock (&mModuleGlobal.RtcLock, TPL_CALLBACK);
138 mModuleGlobal.CenturyRtcAddress = 0;
139
140 Status = PcRtcInit (&mModuleGlobal);
141 ASSERT_EFI_ERROR (Status);
142
143 Status = gBS->CreateEventEx (
144 EVT_NOTIFY_SIGNAL,
145 TPL_CALLBACK,
146 PcRtcAcpiTableChangeCallback,
147 NULL,
148 &gEfiAcpi10TableGuid,
149 &Event
150 );
151 ASSERT_EFI_ERROR (Status);
152
153 Status = gBS->CreateEventEx (
154 EVT_NOTIFY_SIGNAL,
155 TPL_CALLBACK,
156 PcRtcAcpiTableChangeCallback,
157 NULL,
158 &gEfiAcpiTableGuid,
159 &Event
160 );
161 ASSERT_EFI_ERROR (Status);
162
163 gRT->GetTime = PcRtcEfiGetTime;
164 gRT->SetTime = PcRtcEfiSetTime;
165 gRT->GetWakeupTime = PcRtcEfiGetWakeupTime;
166 gRT->SetWakeupTime = PcRtcEfiSetWakeupTime;
167
168 Status = gBS->InstallMultipleProtocolInterfaces (
169 &mHandle,
170 &gEfiRealTimeClockArchProtocolGuid,
171 NULL,
172 NULL
173 );
174 ASSERT_EFI_ERROR (Status);
175
176 return Status;
177 }
178