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