]> git.proxmox.com Git - mirror_edk2.git/blob - PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtcEntry.c
PcAtChipsetPkg: Apply uncrustify changes
[mirror_edk2.git] / PcAtChipsetPkg / PcatRealTimeClockRuntimeDxe / PcRtcEntry.c
1 /** @file
2 Provides Set/Get time operations.
3
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
7
8 **/
9
10 #include <Library/DxeServicesTableLib.h>
11 #include "PcRtc.h"
12
13 PC_RTC_MODULE_GLOBALS mModuleGlobal;
14
15 EFI_HANDLE mHandle = NULL;
16
17 STATIC EFI_EVENT mVirtualAddrChangeEvent;
18
19 UINTN mRtcIndexRegister;
20 UINTN mRtcTargetRegister;
21
22 /**
23 Returns the current time and date information, and the time-keeping capabilities
24 of the hardware platform.
25
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.
29
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.
33
34 **/
35 EFI_STATUS
36 EFIAPI
37 PcRtcEfiGetTime (
38 OUT EFI_TIME *Time,
39 OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
40 )
41 {
42 return PcRtcGetTime (Time, Capabilities, &mModuleGlobal);
43 }
44
45 /**
46 Sets the current local time and date information.
47
48 @param Time A pointer to the current time.
49
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.
53
54 **/
55 EFI_STATUS
56 EFIAPI
57 PcRtcEfiSetTime (
58 IN EFI_TIME *Time
59 )
60 {
61 return PcRtcSetTime (Time, &mModuleGlobal);
62 }
63
64 /**
65 Returns the current wakeup alarm clock setting.
66
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.
70
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.
77
78 **/
79 EFI_STATUS
80 EFIAPI
81 PcRtcEfiGetWakeupTime (
82 OUT BOOLEAN *Enabled,
83 OUT BOOLEAN *Pending,
84 OUT EFI_TIME *Time
85 )
86 {
87 return PcRtcGetWakeupTime (Enabled, Pending, Time, &mModuleGlobal);
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
106 PcRtcEfiSetWakeupTime (
107 IN BOOLEAN Enabled,
108 IN EFI_TIME *Time OPTIONAL
109 )
110 {
111 return PcRtcSetWakeupTime (Enabled, Time, &mModuleGlobal);
112 }
113
114 /**
115 Fixup internal data so that EFI can be called in virtual mode.
116 Call the passed in Child Notify event and convert any pointers in
117 lib to virtual mode.
118
119 @param[in] Event The Event that is being processed
120 @param[in] Context Event Context
121 **/
122 VOID
123 EFIAPI
124 LibRtcVirtualNotifyEvent (
125 IN EFI_EVENT Event,
126 IN VOID *Context
127 )
128 {
129 // Only needed if you are going to support the OS calling RTC functions in
130 // virtual mode. You will need to call EfiConvertPointer (). To convert any
131 // stored physical addresses to virtual address. After the OS transitions to
132 // calling in virtual mode, all future runtime calls will be made in virtual
133 // mode.
134 EfiConvertPointer (0x0, (VOID **)&mRtcIndexRegister);
135 EfiConvertPointer (0x0, (VOID **)&mRtcTargetRegister);
136 }
137
138 /**
139 The user Entry Point for PcRTC module.
140
141 This is the entry point for PcRTC module. It installs the UEFI runtime service
142 including GetTime(),SetTime(),GetWakeupTime(),and SetWakeupTime().
143
144 @param ImageHandle The firmware allocated handle for the EFI image.
145 @param SystemTable A pointer to the EFI System Table.
146
147 @retval EFI_SUCCESS The entry point is executed successfully.
148 @retval Others Some error occurs when executing this entry point.
149
150 **/
151 EFI_STATUS
152 EFIAPI
153 InitializePcRtc (
154 IN EFI_HANDLE ImageHandle,
155 IN EFI_SYSTEM_TABLE *SystemTable
156 )
157 {
158 EFI_STATUS Status;
159 EFI_EVENT Event;
160
161 EfiInitializeLock (&mModuleGlobal.RtcLock, TPL_CALLBACK);
162 mModuleGlobal.CenturyRtcAddress = GetCenturyRtcAddress ();
163
164 if (FeaturePcdGet (PcdRtcUseMmio)) {
165 mRtcIndexRegister = (UINTN)PcdGet64 (PcdRtcIndexRegister64);
166 mRtcTargetRegister = (UINTN)PcdGet64 (PcdRtcTargetRegister64);
167 }
168
169 Status = PcRtcInit (&mModuleGlobal);
170 ASSERT_EFI_ERROR (Status);
171
172 Status = gBS->CreateEventEx (
173 EVT_NOTIFY_SIGNAL,
174 TPL_CALLBACK,
175 PcRtcAcpiTableChangeCallback,
176 NULL,
177 &gEfiAcpi10TableGuid,
178 &Event
179 );
180 ASSERT_EFI_ERROR (Status);
181
182 Status = gBS->CreateEventEx (
183 EVT_NOTIFY_SIGNAL,
184 TPL_CALLBACK,
185 PcRtcAcpiTableChangeCallback,
186 NULL,
187 &gEfiAcpiTableGuid,
188 &Event
189 );
190 ASSERT_EFI_ERROR (Status);
191
192 gRT->GetTime = PcRtcEfiGetTime;
193 gRT->SetTime = PcRtcEfiSetTime;
194 gRT->GetWakeupTime = PcRtcEfiGetWakeupTime;
195 gRT->SetWakeupTime = PcRtcEfiSetWakeupTime;
196
197 Status = gBS->InstallMultipleProtocolInterfaces (
198 &mHandle,
199 &gEfiRealTimeClockArchProtocolGuid,
200 NULL,
201 NULL
202 );
203 if (EFI_ERROR (Status)) {
204 ASSERT_EFI_ERROR (Status);
205 return Status;
206 }
207
208 if (FeaturePcdGet (PcdRtcUseMmio)) {
209 // Register for the virtual address change event
210 Status = gBS->CreateEventEx (
211 EVT_NOTIFY_SIGNAL,
212 TPL_NOTIFY,
213 LibRtcVirtualNotifyEvent,
214 NULL,
215 &gEfiEventVirtualAddressChangeGuid,
216 &mVirtualAddrChangeEvent
217 );
218 ASSERT_EFI_ERROR (Status);
219 }
220
221 return Status;
222 }