]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/Library/PL031RealTimeClockLib/PL031RealTimeClockLib.c
ArmPlatformPkg: Apply uncrustify changes
[mirror_edk2.git] / ArmPlatformPkg / Library / PL031RealTimeClockLib / PL031RealTimeClockLib.c
index 516b45675c69b10245ef2b77a51f25f60ee48044..a203299c0637166d2fa98501f40e315f9b0b280d 100644 (file)
@@ -2,77 +2,69 @@
   Implement EFI RealTimeClock runtime services via RTC Lib.\r
 \r
   Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>\r
-  Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2011 - 2020, Arm Limited. All rights reserved.<BR>\r
+  Copyright (c) 2019, Linaro Ltd. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
-#include <Uefi.h>\r
 #include <PiDxe.h>\r
+\r
+#include <Guid/EventGroup.h>\r
+#include <Guid/GlobalVariable.h>\r
+\r
 #include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
-#include <Library/UefiLib.h>\r
+#include <Library/DxeServicesTableLib.h>\r
 #include <Library/IoLib.h>\r
-#include <Library/RealTimeClockLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/PcdLib.h>\r
-#include <Library/ArmPlatformSysConfigLib.h>\r
-#include <Library/DxeServicesTableLib.h>\r
+#include <Library/RealTimeClockLib.h>\r
+#include <Library/TimeBaseLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
 #include <Library/UefiRuntimeServicesTableLib.h>\r
 #include <Library/UefiRuntimeLib.h>\r
 \r
 #include <Protocol/RealTimeClock.h>\r
 \r
-#include <Guid/GlobalVariable.h>\r
-#include <Guid/EventGroup.h>\r
-\r
-#include <Drivers/PL031RealTimeClock.h>\r
-\r
-#include <ArmPlatform.h>\r
+#include "PL031RealTimeClock.h"\r
 \r
-STATIC CONST CHAR16           mTimeZoneVariableName[] = L"PL031RtcTimeZone";\r
-STATIC CONST CHAR16           mDaylightVariableName[] = L"PL031RtcDaylight";\r
-STATIC BOOLEAN                mPL031Initialized = FALSE;\r
-STATIC EFI_EVENT              mRtcVirtualAddrChangeEvent;\r
-STATIC UINTN                  mPL031RtcBase;\r
-STATIC EFI_RUNTIME_SERVICES   *mRT;\r
+STATIC BOOLEAN    mPL031Initialized = FALSE;\r
+STATIC EFI_EVENT  mRtcVirtualAddrChangeEvent;\r
+STATIC UINTN      mPL031RtcBase;\r
 \r
 EFI_STATUS\r
 IdentifyPL031 (\r
   VOID\r
   )\r
 {\r
-  EFI_STATUS    Status;\r
+  EFI_STATUS  Status;\r
 \r
   // Check if this is a PrimeCell Peripheral\r
   if (  (MmioRead8 (mPL031RtcBase + PL031_RTC_PCELL_ID0) != 0x0D)\r
-      || (MmioRead8 (mPL031RtcBase + PL031_RTC_PCELL_ID1) != 0xF0)\r
-      || (MmioRead8 (mPL031RtcBase + PL031_RTC_PCELL_ID2) != 0x05)\r
-      || (MmioRead8 (mPL031RtcBase + PL031_RTC_PCELL_ID3) != 0xB1)) {\r
+     || (MmioRead8 (mPL031RtcBase + PL031_RTC_PCELL_ID1) != 0xF0)\r
+     || (MmioRead8 (mPL031RtcBase + PL031_RTC_PCELL_ID2) != 0x05)\r
+     || (MmioRead8 (mPL031RtcBase + PL031_RTC_PCELL_ID3) != 0xB1))\r
+  {\r
     Status = EFI_NOT_FOUND;\r
     goto EXIT;\r
   }\r
 \r
   // Check if this PrimeCell Peripheral is the PL031 Real Time Clock\r
   if (  (MmioRead8 (mPL031RtcBase + PL031_RTC_PERIPH_ID0) != 0x31)\r
-      || (MmioRead8 (mPL031RtcBase + PL031_RTC_PERIPH_ID1) != 0x10)\r
-      || ((MmioRead8 (mPL031RtcBase + PL031_RTC_PERIPH_ID2) & 0xF) != 0x04)\r
-      || (MmioRead8 (mPL031RtcBase + PL031_RTC_PERIPH_ID3) != 0x00)) {\r
+     || (MmioRead8 (mPL031RtcBase + PL031_RTC_PERIPH_ID1) != 0x10)\r
+     || ((MmioRead8 (mPL031RtcBase + PL031_RTC_PERIPH_ID2) & 0xF) != 0x04)\r
+     || (MmioRead8 (mPL031RtcBase + PL031_RTC_PERIPH_ID3) != 0x00))\r
+  {\r
     Status = EFI_NOT_FOUND;\r
     goto EXIT;\r
   }\r
 \r
   Status = EFI_SUCCESS;\r
 \r
-  EXIT:\r
+EXIT:\r
   return Status;\r
 }\r
 \r
@@ -81,17 +73,17 @@ InitializePL031 (
   VOID\r
   )\r
 {\r
-  EFI_STATUS    Status;\r
+  EFI_STATUS  Status;\r
 \r
   // Prepare the hardware\r
-  Status = IdentifyPL031();\r
+  Status = IdentifyPL031 ();\r
   if (EFI_ERROR (Status)) {\r
     goto EXIT;\r
   }\r
 \r
   // Ensure interrupts are masked. We do not want RTC interrupts in UEFI\r
-  if ((MmioRead32 (mPL031RtcBase + PL031_RTC_IMSC_IRQ_MASK_SET_CLEAR_REGISTER) & PL031_SET_IRQ_MASK) != PL031_SET_IRQ_MASK) {\r
-    MmioOr32 (mPL031RtcBase + PL031_RTC_IMSC_IRQ_MASK_SET_CLEAR_REGISTER, PL031_SET_IRQ_MASK);\r
+  if ((MmioRead32 (mPL031RtcBase + PL031_RTC_IMSC_IRQ_MASK_SET_CLEAR_REGISTER) & PL031_SET_IRQ_MASK) != 0) {\r
+    MmioWrite32 (mPL031RtcBase + PL031_RTC_IMSC_IRQ_MASK_SET_CLEAR_REGISTER, 0);\r
   }\r
 \r
   // Clear any existing interrupts\r
@@ -106,133 +98,10 @@ InitializePL031 (
 \r
   mPL031Initialized = TRUE;\r
 \r
-  EXIT:\r
+EXIT:\r
   return Status;\r
 }\r
 \r
-/**\r
-  Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME\r
- **/\r
-VOID\r
-EpochToEfiTime (\r
-  IN  UINTN     EpochSeconds,\r
-  OUT EFI_TIME  *Time\r
-  )\r
-{\r
-  UINTN         a;\r
-  UINTN         b;\r
-  UINTN         c;\r
-  UINTN         d;\r
-  UINTN         g;\r
-  UINTN         j;\r
-  UINTN         m;\r
-  UINTN         y;\r
-  UINTN         da;\r
-  UINTN         db;\r
-  UINTN         dc;\r
-  UINTN         dg;\r
-  UINTN         hh;\r
-  UINTN         mm;\r
-  UINTN         ss;\r
-  UINTN         J;\r
-\r
-  J  = (EpochSeconds / 86400) + 2440588;\r
-  j  = J + 32044;\r
-  g  = j / 146097;\r
-  dg = j % 146097;\r
-  c  = (((dg / 36524) + 1) * 3) / 4;\r
-  dc = dg - (c * 36524);\r
-  b  = dc / 1461;\r
-  db = dc % 1461;\r
-  a  = (((db / 365) + 1) * 3) / 4;\r
-  da = db - (a * 365);\r
-  y  = (g * 400) + (c * 100) + (b * 4) + a;\r
-  m  = (((da * 5) + 308) / 153) - 2;\r
-  d  = da - (((m + 4) * 153) / 5) + 122;\r
-\r
-  Time->Year  = y - 4800 + ((m + 2) / 12);\r
-  Time->Month = ((m + 2) % 12) + 1;\r
-  Time->Day   = d + 1;\r
-\r
-  ss = EpochSeconds % 60;\r
-  a  = (EpochSeconds - ss) / 60;\r
-  mm = a % 60;\r
-  b = (a - mm) / 60;\r
-  hh = b % 24;\r
-\r
-  Time->Hour        = hh;\r
-  Time->Minute      = mm;\r
-  Time->Second      = ss;\r
-  Time->Nanosecond  = 0;\r
-\r
-}\r
-\r
-/**\r
-  Converts EFI_TIME to Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC)\r
- **/\r
-UINTN\r
-EfiTimeToEpoch (\r
-  IN  EFI_TIME  *Time\r
-  )\r
-{\r
-  UINTN a;\r
-  UINTN y;\r
-  UINTN m;\r
-  UINTN JulianDate;  // Absolute Julian Date representation of the supplied Time\r
-  UINTN EpochDays;   // Number of days elapsed since EPOCH_JULIAN_DAY\r
-  UINTN EpochSeconds;\r
-\r
-  a = (14 - Time->Month) / 12 ;\r
-  y = Time->Year + 4800 - a;\r
-  m = Time->Month + (12*a) - 3;\r
-\r
-  JulianDate = Time->Day + ((153*m + 2)/5) + (365*y) + (y/4) - (y/100) + (y/400) - 32045;\r
-\r
-  ASSERT (JulianDate >= EPOCH_JULIAN_DATE);\r
-  EpochDays = JulianDate - EPOCH_JULIAN_DATE;\r
-\r
-  EpochSeconds = (EpochDays * SEC_PER_DAY) + ((UINTN)Time->Hour * SEC_PER_HOUR) + (Time->Minute * SEC_PER_MIN) + Time->Second;\r
-\r
-  return EpochSeconds;\r
-}\r
-\r
-BOOLEAN\r
-IsLeapYear (\r
-  IN EFI_TIME   *Time\r
-  )\r
-{\r
-  if (Time->Year % 4 == 0) {\r
-    if (Time->Year % 100 == 0) {\r
-      if (Time->Year % 400 == 0) {\r
-        return TRUE;\r
-      } else {\r
-        return FALSE;\r
-      }\r
-    } else {\r
-      return TRUE;\r
-    }\r
-  } else {\r
-    return FALSE;\r
-  }\r
-}\r
-\r
-BOOLEAN\r
-DayValid (\r
-  IN  EFI_TIME  *Time\r
-  )\r
-{\r
-  STATIC CONST INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
-\r
-  if (Time->Day < 1 ||\r
-      Time->Day > DayOfMonth[Time->Month - 1] ||\r
-      (Time->Month == 2 && (!IsLeapYear (Time) && Time->Day > 28))\r
-     ) {\r
-    return FALSE;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
 /**\r
   Returns the current time and date information, and the time-keeping capabilities\r
   of the hardware platform.\r
@@ -250,144 +119,35 @@ DayValid (
 EFI_STATUS\r
 EFIAPI\r
 LibGetTime (\r
-  OUT EFI_TIME                *Time,\r
-  OUT EFI_TIME_CAPABILITIES   *Capabilities\r
+  OUT EFI_TIME               *Time,\r
+  OUT EFI_TIME_CAPABILITIES  *Capabilities\r
   )\r
 {\r
-  EFI_STATUS  Status = EFI_SUCCESS;\r
+  EFI_STATUS  Status;\r
   UINT32      EpochSeconds;\r
-  INT16       TimeZone;\r
-  UINT8       Daylight;\r
-  UINTN       Size;\r
-\r
-  // Initialize the hardware if not already done\r
-  if (!mPL031Initialized) {\r
-    Status = InitializePL031 ();\r
-    if (EFI_ERROR (Status)) {\r
-      goto EXIT;\r
-    }\r
-  }\r
-\r
-  // Snapshot the time as early in the function call as possible\r
-  // On some platforms we may have access to a battery backed up hardware clock.\r
-  // If such RTC exists try to use it first.\r
-  Status = ArmPlatformSysConfigGet (SYS_CFG_RTC, &EpochSeconds);\r
-  if (Status == EFI_UNSUPPORTED) {\r
-    // Battery backed up hardware RTC does not exist, revert to PL031\r
-    EpochSeconds = MmioRead32 (mPL031RtcBase + PL031_RTC_DR_DATA_REGISTER);\r
-    Status = EFI_SUCCESS;\r
-  } else if (EFI_ERROR (Status)) {\r
-    // Battery backed up hardware RTC exists but could not be read due to error. Abort.\r
-    goto EXIT;\r
-  } else {\r
-    // Battery backed up hardware RTC exists and we read the time correctly from it.\r
-    // Now sync the PL031 to the new time.\r
-    MmioWrite32 (mPL031RtcBase + PL031_RTC_LR_LOAD_REGISTER, EpochSeconds);\r
-  }\r
 \r
   // Ensure Time is a valid pointer\r
   if (Time == NULL) {\r
-    Status = EFI_INVALID_PARAMETER;\r
-    goto EXIT;\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  // Get the current time zone information from non-volatile storage\r
-  Size = sizeof (TimeZone);\r
-  Status = mRT->GetVariable (\r
-                  (CHAR16 *)mTimeZoneVariableName,\r
-                  &gEfiCallerIdGuid,\r
-                  NULL,\r
-                  &Size,\r
-                  (VOID *)&TimeZone\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    ASSERT(Status != EFI_INVALID_PARAMETER);\r
-    ASSERT(Status != EFI_BUFFER_TOO_SMALL);\r
-\r
-    if (Status != EFI_NOT_FOUND)\r
-      goto EXIT;\r
-\r
-    // The time zone variable does not exist in non-volatile storage, so create it.\r
-    Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE;\r
-    // Store it\r
-    Status = mRT->SetVariable (\r
-                    (CHAR16 *)mTimeZoneVariableName,\r
-                    &gEfiCallerIdGuid,\r
-                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                    Size,\r
-                    (VOID *)&(Time->TimeZone)\r
-                    );\r
+  // Initialize the hardware if not already done\r
+  if (!mPL031Initialized) {\r
+    Status = InitializePL031 ();\r
     if (EFI_ERROR (Status)) {\r
-      DEBUG ((\r
-        EFI_D_ERROR,\r
-        "LibGetTime: Failed to save %s variable to non-volatile storage, Status = %r\n",\r
-        mTimeZoneVariableName,\r
-        Status\r
-        ));\r
-      goto EXIT;\r
-    }\r
-  } else {\r
-    // Got the time zone\r
-    Time->TimeZone = TimeZone;\r
-\r
-    // Check TimeZone bounds:   -1440 to 1440 or 2047\r
-    if (((Time->TimeZone < -1440) || (Time->TimeZone > 1440))\r
-        && (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE)) {\r
-      Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE;\r
-    }\r
-\r
-    // Adjust for the correct time zone\r
-    if (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE) {\r
-      EpochSeconds += Time->TimeZone * SEC_PER_MIN;\r
+      return Status;\r
     }\r
   }\r
 \r
-  // Get the current daylight information from non-volatile storage\r
-  Size = sizeof (Daylight);\r
-  Status = mRT->GetVariable (\r
-                  (CHAR16 *)mDaylightVariableName,\r
-                  &gEfiCallerIdGuid,\r
-                  NULL,\r
-                  &Size,\r
-                  (VOID *)&Daylight\r
-                  );\r
+  EpochSeconds = MmioRead32 (mPL031RtcBase + PL031_RTC_DR_DATA_REGISTER);\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    ASSERT(Status != EFI_INVALID_PARAMETER);\r
-    ASSERT(Status != EFI_BUFFER_TOO_SMALL);\r
-\r
-    if (Status != EFI_NOT_FOUND)\r
-      goto EXIT;\r
-\r
-    // The daylight variable does not exist in non-volatile storage, so create it.\r
-    Time->Daylight = 0;\r
-    // Store it\r
-    Status = mRT->SetVariable (\r
-                    (CHAR16 *)mDaylightVariableName,\r
-                    &gEfiCallerIdGuid,\r
-                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                    Size,\r
-                    (VOID *)&(Time->Daylight)\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      DEBUG ((\r
-        EFI_D_ERROR,\r
-        "LibGetTime: Failed to save %s variable to non-volatile storage, Status = %r\n",\r
-        mDaylightVariableName,\r
-        Status\r
-        ));\r
-      goto EXIT;\r
-    }\r
-  } else {\r
-    // Got the daylight information\r
-    Time->Daylight = Daylight;\r
-\r
-    // Adjust for the correct period\r
-    if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) == EFI_TIME_IN_DAYLIGHT) {\r
-      // Convert to adjusted time, i.e. spring forwards one hour\r
-      EpochSeconds += SEC_PER_HOUR;\r
-    }\r
+  // Adjust for the correct time zone\r
+  // The timezone setting also reflects the DST setting of the clock\r
+  if (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE) {\r
+    EpochSeconds += Time->TimeZone * SEC_PER_MIN;\r
+  } else if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) == EFI_TIME_IN_DAYLIGHT) {\r
+    // Convert to adjusted time, i.e. spring forwards one hour\r
+    EpochSeconds += SEC_PER_HOUR;\r
   }\r
 \r
   // Convert from internal 32-bit time to UEFI time\r
@@ -396,18 +156,16 @@ LibGetTime (
   // Update the Capabilities info\r
   if (Capabilities != NULL) {\r
     // PL031 runs at frequency 1Hz\r
-    Capabilities->Resolution  = PL031_COUNTS_PER_SECOND;\r
+    Capabilities->Resolution = PL031_COUNTS_PER_SECOND;\r
     // Accuracy in ppm multiplied by 1,000,000, e.g. for 50ppm set 50,000,000\r
-    Capabilities->Accuracy    = (UINT32)PcdGet32 (PcdPL031RtcPpmAccuracy);\r
+    Capabilities->Accuracy = (UINT32)PcdGet32 (PcdPL031RtcPpmAccuracy);\r
     // FALSE: Setting the time does not clear the values below the resolution level\r
-    Capabilities->SetsToZero  = FALSE;\r
+    Capabilities->SetsToZero = FALSE;\r
   }\r
 \r
-  EXIT:\r
-  return Status;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Sets the current local time and date information.\r
 \r
@@ -421,122 +179,45 @@ LibGetTime (
 EFI_STATUS\r
 EFIAPI\r
 LibSetTime (\r
-  IN  EFI_TIME                *Time\r
+  IN  EFI_TIME  *Time\r
   )\r
 {\r
   EFI_STATUS  Status;\r
-  UINTN       EpochSeconds;\r
-\r
-  // Check the input parameters are within the range specified by UEFI\r
-  if ((Time->Year   < 1900) ||\r
-       (Time->Year   > 9999) ||\r
-       (Time->Month  < 1   ) ||\r
-       (Time->Month  > 12  ) ||\r
-       (!DayValid (Time)    ) ||\r
-       (Time->Hour   > 23  ) ||\r
-       (Time->Minute > 59  ) ||\r
-       (Time->Second > 59  ) ||\r
-       (Time->Nanosecond > 999999999) ||\r
-       (!((Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE) || ((Time->TimeZone >= -1440) && (Time->TimeZone <= 1440)))) ||\r
-       (Time->Daylight & (~(EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT)))\r
-    ) {\r
-    Status = EFI_INVALID_PARAMETER;\r
-    goto EXIT;\r
-  }\r
+  UINT32      EpochSeconds;\r
 \r
   // Because the PL031 is a 32-bit counter counting seconds,\r
   // the maximum time span is just over 136 years.\r
   // Time is stored in Unix Epoch format, so it starts in 1970,\r
   // Therefore it can not exceed the year 2106.\r
   if ((Time->Year < 1970) || (Time->Year >= 2106)) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto EXIT;\r
+    return EFI_UNSUPPORTED;\r
   }\r
 \r
   // Initialize the hardware if not already done\r
   if (!mPL031Initialized) {\r
     Status = InitializePL031 ();\r
     if (EFI_ERROR (Status)) {\r
-      goto EXIT;\r
+      return Status;\r
     }\r
   }\r
 \r
-  EpochSeconds = EfiTimeToEpoch (Time);\r
+  EpochSeconds = (UINT32)EfiTimeToEpoch (Time);\r
 \r
   // Adjust for the correct time zone, i.e. convert to UTC time zone\r
+  // The timezone setting also reflects the DST setting of the clock\r
   if (Time->TimeZone != EFI_UNSPECIFIED_TIMEZONE) {\r
     EpochSeconds -= Time->TimeZone * SEC_PER_MIN;\r
-  }\r
-\r
-  // TODO: Automatic Daylight activation\r
-\r
-  // Adjust for the correct period\r
-  if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) == EFI_TIME_IN_DAYLIGHT) {\r
+  } else if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) == EFI_TIME_IN_DAYLIGHT) {\r
     // Convert to un-adjusted time, i.e. fall back one hour\r
     EpochSeconds -= SEC_PER_HOUR;\r
   }\r
 \r
-  // On some platforms we may have access to a battery backed up hardware clock.\r
-  //\r
-  // If such RTC exists then it must be updated first, before the PL031,\r
-  // to minimise any time drift. This is important because the battery backed-up\r
-  // RTC maintains the master time for the platform across reboots.\r
-  //\r
-  // If such RTC does not exist then the following function returns UNSUPPORTED.\r
-  Status = ArmPlatformSysConfigSet (SYS_CFG_RTC, EpochSeconds);\r
-  if ((EFI_ERROR (Status)) && (Status != EFI_UNSUPPORTED)){\r
-    // Any status message except SUCCESS and UNSUPPORTED indicates a hardware failure.\r
-    goto EXIT;\r
-  }\r
-\r
-\r
   // Set the PL031\r
   MmioWrite32 (mPL031RtcBase + PL031_RTC_LR_LOAD_REGISTER, EpochSeconds);\r
 \r
-  // The accesses to Variable Services can be very slow, because we may be writing to Flash.\r
-  // Do this after having set the RTC.\r
-\r
-  // Save the current time zone information into non-volatile storage\r
-  Status = mRT->SetVariable (\r
-                  (CHAR16 *)mTimeZoneVariableName,\r
-                  &gEfiCallerIdGuid,\r
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                  sizeof (Time->TimeZone),\r
-                  (VOID *)&(Time->TimeZone)\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-      DEBUG ((\r
-        EFI_D_ERROR,\r
-        "LibSetTime: Failed to save %s variable to non-volatile storage, Status = %r\n",\r
-        mTimeZoneVariableName,\r
-        Status\r
-        ));\r
-    goto EXIT;\r
-  }\r
-\r
-  // Save the current daylight information into non-volatile storage\r
-  Status = mRT->SetVariable (\r
-                  (CHAR16 *)mDaylightVariableName,\r
-                  &gEfiCallerIdGuid,\r
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                  sizeof(Time->Daylight),\r
-                  (VOID *)&(Time->Daylight)\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((\r
-      EFI_D_ERROR,\r
-      "LibSetTime: Failed to save %s variable to non-volatile storage, Status = %r\n",\r
-      mDaylightVariableName,\r
-      Status\r
-      ));\r
-    goto EXIT;\r
-  }\r
-\r
-  EXIT:\r
-  return Status;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Returns the current wakeup alarm clock setting.\r
 \r
@@ -552,16 +233,15 @@ LibSetTime (
 EFI_STATUS\r
 EFIAPI\r
 LibGetWakeupTime (\r
-  OUT BOOLEAN     *Enabled,\r
-  OUT BOOLEAN     *Pending,\r
-  OUT EFI_TIME    *Time\r
+  OUT BOOLEAN   *Enabled,\r
+  OUT BOOLEAN   *Pending,\r
+  OUT EFI_TIME  *Time\r
   )\r
 {\r
   // Not a required feature\r
   return EFI_UNSUPPORTED;\r
 }\r
 \r
-\r
 /**\r
   Sets the system wakeup alarm clock time.\r
 \r
@@ -578,8 +258,8 @@ LibGetWakeupTime (
 EFI_STATUS\r
 EFIAPI\r
 LibSetWakeupTime (\r
-  IN BOOLEAN      Enabled,\r
-  OUT EFI_TIME    *Time\r
+  IN BOOLEAN    Enabled,\r
+  OUT EFI_TIME  *Time\r
   )\r
 {\r
   // Not a required feature\r
@@ -597,8 +277,8 @@ LibSetWakeupTime (
 VOID\r
 EFIAPI\r
 LibRtcVirtualNotifyEvent (\r
-  IN EFI_EVENT        Event,\r
-  IN VOID             *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
   //\r
@@ -607,8 +287,7 @@ LibRtcVirtualNotifyEvent (
   // to virtual address. After the OS transitions to calling in virtual mode, all future\r
   // runtime calls will be made in virtual mode.\r
   //\r
-  EfiConvertPointer (0x0, (VOID**)&mPL031RtcBase);\r
-  EfiConvertPointer (0x0, (VOID**)&mRT);\r
+  EfiConvertPointer (0x0, (VOID **)&mPL031RtcBase);\r
   return;\r
 }\r
 \r
@@ -625,12 +304,12 @@ LibRtcVirtualNotifyEvent (
 EFI_STATUS\r
 EFIAPI\r
 LibRtcInitialize (\r
-  IN EFI_HANDLE                            ImageHandle,\r
-  IN EFI_SYSTEM_TABLE                      *SystemTable\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS    Status;\r
-  EFI_HANDLE    Handle;\r
+  EFI_STATUS  Status;\r
+  EFI_HANDLE  Handle;\r
 \r
   // Initialize RTC Base Address\r
   mPL031RtcBase = PcdGet32 (PcdPL031RtcBase);\r
@@ -638,7 +317,8 @@ LibRtcInitialize (
   // Declare the controller as EFI_MEMORY_RUNTIME\r
   Status = gDS->AddMemorySpace (\r
                   EfiGcdMemoryTypeMemoryMappedIo,\r
-                  mPL031RtcBase, SIZE_4KB,\r
+                  mPL031RtcBase,\r
+                  SIZE_4KB,\r
                   EFI_MEMORY_UC | EFI_MEMORY_RUNTIME\r
                   );\r
   if (EFI_ERROR (Status)) {\r
@@ -650,15 +330,14 @@ LibRtcInitialize (
     return Status;\r
   }\r
 \r
-  mRT = gRT;\r
-\r
   // Install the protocol\r
   Handle = NULL;\r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &Handle,\r
-                  &gEfiRealTimeClockArchProtocolGuid,  NULL,\r
+                  &gEfiRealTimeClockArchProtocolGuid,\r
+                  NULL,\r
                   NULL\r
-                 );\r
+                  );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r