2 Provides Set/Get time operations.
4 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
5 Copyright (c) 2018 - 2020, ARM Limited. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include <Library/DxeServicesTableLib.h>
13 PC_RTC_MODULE_GLOBALS mModuleGlobal
;
15 EFI_HANDLE mHandle
= NULL
;
17 STATIC EFI_EVENT mVirtualAddrChangeEvent
;
19 UINTN mRtcIndexRegister
;
20 UINTN mRtcTargetRegister
;
23 Returns the current time and date information, and the time-keeping capabilities
24 of the hardware platform.
26 @param Time A pointer to storage to receive a snapshot of the current time.
27 @param Capabilities An optional pointer to a buffer to receive the real time
28 clock device's capabilities.
30 @retval EFI_SUCCESS The operation completed successfully.
31 @retval EFI_INVALID_PARAMETER Time is NULL.
32 @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware error.
39 OUT EFI_TIME_CAPABILITIES
*Capabilities OPTIONAL
42 return PcRtcGetTime (Time
, Capabilities
, &mModuleGlobal
);
46 Sets the current local time and date information.
48 @param Time A pointer to the current time.
50 @retval EFI_SUCCESS The operation completed successfully.
51 @retval EFI_INVALID_PARAMETER A time field is out of range.
52 @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error.
61 return PcRtcSetTime (Time
, &mModuleGlobal
);
65 Returns the current wakeup alarm clock setting.
67 @param Enabled Indicates if the alarm is currently enabled or disabled.
68 @param Pending Indicates if the alarm signal is pending and requires acknowledgement.
69 @param Time The current alarm setting.
71 @retval EFI_SUCCESS The alarm settings were returned.
72 @retval EFI_INVALID_PARAMETER Enabled is NULL.
73 @retval EFI_INVALID_PARAMETER Pending is NULL.
74 @retval EFI_INVALID_PARAMETER Time is NULL.
75 @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a hardware error.
76 @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform.
81 PcRtcEfiGetWakeupTime (
87 return PcRtcGetWakeupTime (Enabled
, Pending
, Time
, &mModuleGlobal
);
92 Sets the system wakeup alarm clock time.
94 @param Enabled Enable or disable the wakeup alarm.
95 @param Time If Enable is TRUE, the time to set the wakeup alarm for.
96 If Enable is FALSE, then this parameter is optional, and may be NULL.
98 @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was enabled.
99 If Enable is FALSE, then the wakeup alarm was disabled.
100 @retval EFI_INVALID_PARAMETER A time field is out of range.
101 @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a hardware error.
102 @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform.
107 PcRtcEfiSetWakeupTime (
109 IN EFI_TIME
*Time OPTIONAL
112 return PcRtcSetWakeupTime (Enabled
, Time
, &mModuleGlobal
);
116 Fixup internal data so that EFI can be called in virtual mode.
117 Call the passed in Child Notify event and convert any pointers in
120 @param[in] Event The Event that is being processed
121 @param[in] Context Event Context
125 LibRtcVirtualNotifyEvent (
130 // Only needed if you are going to support the OS calling RTC functions in
131 // virtual mode. You will need to call EfiConvertPointer (). To convert any
132 // stored physical addresses to virtual address. After the OS transitions to
133 // calling in virtual mode, all future runtime calls will be made in virtual
135 EfiConvertPointer (0x0, (VOID
**)&mRtcIndexRegister
);
136 EfiConvertPointer (0x0, (VOID
**)&mRtcTargetRegister
);
140 The user Entry Point for PcRTC module.
142 This is the entry point for PcRTC module. It installs the UEFI runtime service
143 including GetTime(),SetTime(),GetWakeupTime(),and SetWakeupTime().
145 @param ImageHandle The firmware allocated handle for the EFI image.
146 @param SystemTable A pointer to the EFI System Table.
148 @retval EFI_SUCCESS The entry point is executed successfully.
149 @retval Others Some error occurs when executing this entry point.
155 IN EFI_HANDLE ImageHandle
,
156 IN EFI_SYSTEM_TABLE
*SystemTable
162 EfiInitializeLock (&mModuleGlobal
.RtcLock
, TPL_CALLBACK
);
163 mModuleGlobal
.CenturyRtcAddress
= GetCenturyRtcAddress ();
165 if (FeaturePcdGet (PcdRtcUseMmio
)) {
166 mRtcIndexRegister
= (UINTN
)PcdGet64 (PcdRtcIndexRegister64
);
167 mRtcTargetRegister
= (UINTN
)PcdGet64 (PcdRtcTargetRegister64
);
170 Status
= PcRtcInit (&mModuleGlobal
);
171 ASSERT_EFI_ERROR (Status
);
173 Status
= gBS
->CreateEventEx (
176 PcRtcAcpiTableChangeCallback
,
178 &gEfiAcpi10TableGuid
,
181 ASSERT_EFI_ERROR (Status
);
183 Status
= gBS
->CreateEventEx (
186 PcRtcAcpiTableChangeCallback
,
191 ASSERT_EFI_ERROR (Status
);
193 gRT
->GetTime
= PcRtcEfiGetTime
;
194 gRT
->SetTime
= PcRtcEfiSetTime
;
195 gRT
->GetWakeupTime
= PcRtcEfiGetWakeupTime
;
196 gRT
->SetWakeupTime
= PcRtcEfiSetWakeupTime
;
198 Status
= gBS
->InstallMultipleProtocolInterfaces (
200 &gEfiRealTimeClockArchProtocolGuid
,
204 if (EFI_ERROR (Status
)) {
205 ASSERT_EFI_ERROR (Status
);
209 if (FeaturePcdGet (PcdRtcUseMmio
)) {
210 // Register for the virtual address change event
211 Status
= gBS
->CreateEventEx (
214 LibRtcVirtualNotifyEvent
,
216 &gEfiEventVirtualAddressChangeGuid
,
217 &mVirtualAddrChangeEvent
219 ASSERT_EFI_ERROR (Status
);