From nobody Mon Feb 9 14:50:40 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72988+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72988+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1616006562; cv=none; d=zohomail.com; s=zohoarc; b=SKTXjv7fPP2YyNTuaxlo/GsbLT5Q/y+X7vDAAbn5hvLBSl/3pB+KZsvDw9L7ugz2xwRZYBIrvDxXJqVPBKabrzoA1KcicrI3Svfa3PsWRRLAjAqEy2H1ahC1R2NGNyMV6I0Vw764eUPDdavYLbaSpzjZY6U2QcTtqSgEpNw2brs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616006562; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=eWTHafk+YtC7Qx/cxFleZZRsQ3BT4olxNbpJF5ZgHWI=; b=FxHyFV/Cc1h+2YoRfifJYTGREamIv5+ezDhYIsOB32zYnoPhZm7JpCdOi79McS7MP7oo5WFXVbqoM/gVjUsYgRcUh0O20DlVLMIER1cKDLFfSr0DoW+mUS63CMDxfFyaxDKAU4cf/rRutf2TmhdHeUNTBx4k89ENEKnz2ZG1qSU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72988+1787277+3901457@groups.io Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1616006561814111.14781242798597; Wed, 17 Mar 2021 11:42:41 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id esH9YY1788612xN2Oed672B1; Wed, 17 Mar 2021 11:42:41 -0700 X-Received: from zg8tmja2lje4os4yms4ymjma.icoremail.net (zg8tmja2lje4os4yms4ymjma.icoremail.net [206.189.21.223]) by mx.groups.io with SMTP id smtpd.web09.3187.1615966025468148033 for ; Wed, 17 Mar 2021 00:27:05 -0700 X-Received: from localhost.localdomain (unknown [223.153.147.73]) by c1app7 (Coremail) with SMTP id BwINCgB3HOE4r1FgGIYZAA--.29335S11; Wed, 17 Mar 2021 15:27:01 +0800 (CST) From: "Ling Jia" To: devel@edk2.groups.io Cc: Leif Lindholm , Ling Jia Subject: [edk2-devel] [PATCH v3 09/10] Silicon/Phytium: Added Rtc driver to FT2000/4 Date: Wed, 17 Mar 2021 15:26:46 +0800 Message-Id: <20210317072647.77340-10-jialing@phytium.com.cn> In-Reply-To: <20210317072647.77340-1-jialing@phytium.com.cn> References: <20210317072647.77340-1-jialing@phytium.com.cn> MIME-Version: 1.0 X-CM-TRANSID: BwINCgB3HOE4r1FgGIYZAA--.29335S11 X-Coremail-Antispam: 1UD129KBjvAXoWfGF1UuFy3XFWkZF4xZw4UXFb_yoW8AF45Xo WfGrWIq3y8Jr1rua4Syw1kAFW2grZagan0qr4jvFZ7K3ZrZr1ayFyUt3W2qry3tr9rAw43 KrWfJ3s7AFWaqFs7n29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYM7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r126s0DM28Irc Ia0xkI8VCY1x0267AKxVW5JVCq3wA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l 84ACjcxK6xIIjxv20xvE14v26r4j6ryUM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j6r 4UJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl 6s0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6x IIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_ Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkIecxEwVAFwVW8Cw CF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j 6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jrv_JF1lIxkGc2Ij64 vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_ Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0x vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUvg4hUUUUU= X-CM-SenderInfo: xmldzxdqj61x51wl3zoofrzhdfq/ Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,jialing@phytium.com.cn X-Gm-Message-State: tiEfLJUte8JeSztibmsXRd7tx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1616006561; bh=ol1p4Mio8wcK6vQ+T/dKnuQ+vt6F7yBlIe5jHLWMemE=; h=Cc:Date:From:Reply-To:Subject:To; b=vgBc+BidjiUcZcvuS/dmUICCky674fX5E3nuamcCR8WJVEDTlW2FYH1BdrkSW4jU6o5 jajM6V9xN18sFtBLpGgGfM/FbHIrI9xDDUuHfjRTbt+KVO2jZUePmS9QDcexpcnx8c0x/ Hu/45dXSaSX0aqNe2NQ/W8tz8nHEdtSy1fA= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" The RealTimeClockLib implemented EFI RealTimeClock runtime services via RTC Lib. v3: Optimized the codes to conform to specifications. Signed-off-by: Ling Jia Reviewed-by: Leif Lindholm --- Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec = | 1 + Platform/Phytium/DurianPkg/DurianPkg.dsc = | 6 + Platform/Phytium/DurianPkg/DurianPkg.fdf = | 2 + Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeClockLib.inf = | 39 ++ Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeClockLib.h = | 24 + Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeClockLib.c = | 462 ++++++++++++++++++++ 6 files changed, 534 insertions(+) diff --git a/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec b/Silico= n/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec index 2686ba3cc3..4c6c5c5f11 100644 --- a/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec +++ b/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec @@ -45,6 +45,7 @@ gPhytiumPlatformTokenSpaceGuid.PcdSpiFlashSize|0x0|UINT64|0x00000005 gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerBase|0x0|UINT64|0x00000006 gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerSize|0x0|UINT64|0x00000007 + gPhytiumPlatformTokenSpaceGuid.PcdRtcBaseAddress|0x0|UINT32|0x00000008 =20 [Protocols] gSpiMasterProtocolGuid =3D { 0xdf093560, 0xf955, 0x11ea, { 0x96, 0x42, 0= x43, 0x9d, 0x80, 0xdd, 0x0b, 0x7c}} diff --git a/Platform/Phytium/DurianPkg/DurianPkg.dsc b/Platform/Phytium/Du= rianPkg/DurianPkg.dsc index 99034365d3..9579f8e9b7 100644 --- a/Platform/Phytium/DurianPkg/DurianPkg.dsc +++ b/Platform/Phytium/DurianPkg/DurianPkg.dsc @@ -29,6 +29,10 @@ # Phytium Platform library ArmPlatformLib|Silicon/Phytium/FT2000-4Pkg/Library/PlatformLib/PlatformL= ib.inf =20 + #FT2000-4Pkg RTC Driver + RealTimeClockLib|Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/Re= alTimeClockLib.inf + TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf + # PL011 UART Driver and Dependency Libraries SerialPortLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortL= ib.inf PL011UartClockLib|ArmPlatformPkg/Library/PL011UartClockLib/PL011UartCloc= kLib.inf @@ -168,6 +172,8 @@ NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf } MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf + EmbeddedPkg/ResetRuntimeDxe/ResetRuntimeDxe.inf + EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf =20 # # Common Arm Timer and Gic Components diff --git a/Platform/Phytium/DurianPkg/DurianPkg.fdf b/Platform/Phytium/Du= rianPkg/DurianPkg.fdf index 67458458dd..242f647ca1 100644 --- a/Platform/Phytium/DurianPkg/DurianPkg.fdf +++ b/Platform/Phytium/DurianPkg/DurianPkg.fdf @@ -93,6 +93,8 @@ READ_LOCK_STATUS =3D TRUE # INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf + INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf + INF EmbeddedPkg/ResetRuntimeDxe/ResetRuntimeDxe.inf INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf =20 INF Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.inf diff --git a/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeC= lockLib.inf b/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTime= ClockLib.inf new file mode 100644 index 0000000000..09a06d53ae --- /dev/null +++ b/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeClockLib= .inf @@ -0,0 +1,39 @@ +#/** @file +# Phytium RealTime Clock Library file. +# +# Copyright (C) 2020, Phytium Technology Co, Ltd. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION =3D 0x0001001b + BASE_NAME =3D RealTimeClockLib + FILE_GUID =3D fb320c94-40fe-11eb-b990-171865af292c + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D RealTimeClockLib + +[Sources.common] + RealTimeClockLib.c + RealTimeClockLib.h + +[Packages] + ArmPlatformPkg/ArmPlatformPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec + +[LibraryClasses] + DebugLib + DxeServicesTableLib + IoLib + TimeBaseLib + UefiRuntimeLib + +[Guids] + gEfiEventVirtualAddressChangeGuid + +[Pcd] + gPhytiumPlatformTokenSpaceGuid.PcdRtcBaseAddress diff --git a/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeC= lockLib.h b/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeCl= ockLib.h new file mode 100644 index 0000000000..41ce002dc3 --- /dev/null +++ b/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeClockLib= .h @@ -0,0 +1,24 @@ +/** @file + Phytium RealTime Clock Header. + + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef REAL_TIME_CLOCK_H_ +#define REAL_TIME_CLOCK_H_ + +#define RTC_CMR 0x4 +#define RTC_AES_SEL 0x8 +#define RTC_CCR 0xC +#define RTC_STAT 0x10 +#define RTC_RSTAT 0x14 +#define RTC_EOI 0x18 +#define RTC_CDR_LOW 0x20 +#define RTC_CCVR 0x24 +#define RTC_CLR_LOW 0x28 +#define RTC_CLR 0x2C + +#endif // REAL_TIME_CLOCK_H_ diff --git a/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeC= lockLib.c b/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeCl= ockLib.c new file mode 100644 index 0000000000..bf3047fb67 --- /dev/null +++ b/Silicon/Phytium/FT2000-4Pkg/Library/RealTimeClockLib/RealTimeClockLib= .c @@ -0,0 +1,462 @@ +/** @file + Implement EFI RealTimeClock runtime services via RTC Lib. + + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include "RealTimeClockLib.h" + +STATIC EFI_EVENT mRtcVirtualAddrChangeEvent; +STATIC UINTN mRtcBase; +STATIC CONST CHAR16 mTimeZoneVariableName[] =3D L"RtcTimeZone"; +STATIC CONST CHAR16 mDaylightVariableName[] =3D L"RtcDaylight"; + +/** + Returns the current time and date information, and the time-keeping capa= bilities + of the hardware platform. + + @param Time A pointer to storage to receive a snapsho= t of the current time. + @param Capabilities An optional pointer to a buffer to receiv= e the real time clock + device's capabilities. + + @retval EFI_SUCCESS The operation completed successfully. + @retval EFI_INVALID_PARAMETER Time is NULL. + @retval EFI_DEVICE_ERROR The time could not be retrieved due to ha= rdware error. + @retval EFI_SECURITY_VIOLATION The time could not be retrieved due to an= authentication failure. + +**/ +EFI_STATUS +EFIAPI +LibGetTime ( + OUT EFI_TIME *Time, + OUT EFI_TIME_CAPABILITIES *Capabilities + ) +{ + UINT32 EpochSeconds; + INT16 TimeZone; + UINT8 Daylight; + UINTN Size; + EFI_STATUS Status; + + // Ensure Time is a valid pointer + if (Time =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + MmioWrite32 (mRtcBase + RTC_AES_SEL, 0x100); + // + //read cdr high 32bit + // + EpochSeconds =3D MmioRead32 (mRtcBase + RTC_CCVR); + MmioRead32 (mRtcBase + RTC_CDR_LOW); + // + // Get the current time zone information from non-volatile storage + // + Size =3D sizeof (TimeZone); + Status =3D EfiGetVariable ( + (CHAR16 *)mTimeZoneVariableName, + &gEfiCallerIdGuid, + NULL, + &Size, + (VOID *)&TimeZone + ); + + if (EFI_ERROR (Status)) { + ASSERT (Status !=3D EFI_INVALID_PARAMETER); + ASSERT (Status !=3D EFI_BUFFER_TOO_SMALL); + // + // The time zone variable does not exist in non-volatile storage, so c= reate it. + //UTC+8:00 + // + Time->TimeZone =3D -480; + // + // Store it + // + Status =3D EfiSetVariable ( + (CHAR16 *)mTimeZoneVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_= VARIABLE_RUNTIME_ACCESS, + Size, + (VOID *)&(Time->TimeZone) + ); + if (EFI_ERROR (Status)) { + return Status; + } + } else { + // + // Got the time zone + // + Time->TimeZone =3D TimeZone; + // + // Check TimeZone bounds: -1440 to 1440 or 2047 + // + if (((Time->TimeZone < -1440) || (Time->TimeZone > 1440)) + && (Time->TimeZone !=3D EFI_UNSPECIFIED_TIMEZONE)) { + Time->TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; + } + // + // Adjust for the correct time zone + // + if (Time->TimeZone !=3D EFI_UNSPECIFIED_TIMEZONE) { + EpochSeconds -=3D Time->TimeZone * SEC_PER_MIN; + } + } + // + // Get the current daylight information from non-volatile storage + // + Size =3D sizeof (Daylight); + Status =3D EfiGetVariable ( + (CHAR16 *)mDaylightVariableName, + &gEfiCallerIdGuid, + NULL, + &Size, + (VOID *)&Daylight + ); + + if (EFI_ERROR (Status)) { + ASSERT (Status !=3D EFI_INVALID_PARAMETER); + ASSERT (Status !=3D EFI_BUFFER_TOO_SMALL); + // + // The daylight variable does not exist in non-volatile storage, so cr= eate it. + // + Time->Daylight =3D 0; + // + // Store it + // + Status =3D EfiSetVariable ( + (CHAR16 *)mDaylightVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_= VARIABLE_RUNTIME_ACCESS, + Size, + (VOID *)&(Time->Daylight) + ); + + if (EFI_ERROR (Status)) { + return Status; + } + } else { + // + // Got the daylight information + // + Time->Daylight =3D Daylight; + // + // Adjust for the correct period + // + if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) =3D=3D EFI_TIME_IN_DAYLIGH= T) { + // + // Convert to adjusted time, i.e. spring forwards one hour + // + EpochSeconds +=3D SEC_PER_HOUR; + } + } + + // + // Convert from internal 32-bit time to UEFI time + // + EpochToEfiTime (EpochSeconds, Time); + + return EFI_SUCCESS; +} + + +/** + Sets the current local time and date information. + + @param[in] Time A pointer to the current time. + + @retval EFI_SUCCESS The operation completed successfully. + @retval EFI_INVALID_PARAMETER A time field is out of range. + @retval EFI_DEVICE_ERROR The time could not be set due due to hardw= are error. + +**/ +EFI_STATUS +EFIAPI +LibSetTime ( + IN EFI_TIME *Time + ) +{ + UINTN EpochSeconds; + EFI_STATUS Status; + // + // the maximum time span is just over 136 years. + // Time is stored in Unix Epoch format, so it starts in 1970, + // Therefore it can not exceed the year 2106. + // + if ((Time->Year < 1970) || (Time->Year >=3D 2106)) { + return EFI_UNSUPPORTED; + } + EpochSeconds =3D EfiTimeToEpoch (Time); + // + // Adjust for the correct time zone, i.e. convert to UTC time zone + // + if (Time->TimeZone !=3D EFI_UNSPECIFIED_TIMEZONE) { + EpochSeconds +=3D Time->TimeZone * SEC_PER_MIN; + } + // + // Adjust for the correct period + // + if (((Time->Daylight & EFI_TIME_IN_DAYLIGHT) =3D=3D EFI_TIME_IN_DAYLIGHT) + && (EpochSeconds > SEC_PER_HOUR)) { + // + // Convert to un-adjusted time, i.e. fall back one hour + // + EpochSeconds -=3D SEC_PER_HOUR; + } + // + // Set the Rtc + // + MmioWrite32 (mRtcBase + RTC_AES_SEL, 0x100); + MmioWrite32 (mRtcBase + RTC_CLR_LOW, 0x0); + MmioWrite32 (mRtcBase + RTC_CLR, (UINT32)EpochSeconds); + // + // Save the current time zone information into non-volatile storage + // + Status =3D EfiSetVariable ( + (CHAR16 *)mTimeZoneVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VA= RIABLE_RUNTIME_ACCESS, + sizeof (Time->TimeZone), + (VOID *)&(Time->TimeZone) + ); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Save the current daylight information into non-volatile storage + // + Status =3D EfiSetVariable ( + (CHAR16 *)mDaylightVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VA= RIABLE_RUNTIME_ACCESS, + sizeof (Time->Daylight), + (VOID *)&(Time->Daylight) + ); + if (EFI_ERROR (Status)) { + return Status; + } + return EFI_SUCCESS; +} + + +/** + Returns the current wakeup alarm clock setting. + + @param[out] Enabled Indicates if the alarm is currently e= nabled or disabled. + @param[out] Pending Indicates if the alarm signal is pend= ing and requires acknowledgement. + @param[out] Time The current alarm setting. + + @retval EFI_SUCCESS The alarm settings were returned. + @retval EFI_INVALID_PARAMETER Any parameter is NULL. + @retval EFI_DEVICE_ERROR The wakeup time could not be retrieve= d due to a hardware error. + +**/ +EFI_STATUS +EFIAPI +LibGetWakeupTime ( + OUT BOOLEAN *Enabled, + OUT BOOLEAN *Pending, + OUT EFI_TIME *Time + ) +{ + // Not a required feature + return EFI_UNSUPPORTED; +} + + +/** + Sets the system wakeup alarm clock time. + + @param[in] Enabled Enable or disable the wakeup alarm. + @param[out] Time If Enable is TRUE, the time to set th= e wakeup alarm for. + + @retval EFI_SUCCESS If Enable is TRUE, then the wakeup al= arm was enabled. If + Enable is FALSE, then the wakeup alar= m was disabled. + @retval EFI_INVALID_PARAMETER A time field is out of range. + @retval EFI_DEVICE_ERROR The wakeup time could not be set due = to a hardware error. + @retval EFI_UNSUPPORTED A wakeup timer is not supported on th= is platform. + +**/ +EFI_STATUS +EFIAPI +LibSetWakeupTime ( + IN BOOLEAN Enabled, + OUT EFI_TIME *Time + ) +{ + // Not a required feature + return EFI_UNSUPPORTED; +} + +/** + Fixup internal data so that EFI can be call in virtual mode. + Call the passed in Child Notify event and convert any pointers in + lib to virtual mode. + + @param[in] Event The Event that is being processed + @param[in] Context Event Context + +**/ +VOID +EFIAPI +LibRtcVirtualNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + // + // Only needed if you are going to support the OS calling RTC functions = in virtual mode. + // You will need to call EfiConvertPointer (). To convert any stored phy= sical addresses + // to virtual address. After the OS transitions to calling in virtual mo= de, all future + // runtime calls will be made in virtual mode. + // + EfiConvertPointer (0x0, (VOID **)&mRtcBase); + + return; +} + +/** + This is the declaration of an EFI image entry point. This can be the ent= ry point to an application + written to this specification, an EFI boot service driver, or an EFI run= time driver. + + @param[in] ImageHandle Handle that identifies the loaded imag= e. + @param[in] SystemTable System Table for this image. + + @retval EFI_SUCCESS The operation completed successfully. + +**/ +EFI_STATUS +EFIAPI +LibRtcInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + INT16 TimeZone; + UINTN Size; + EFI_TIME Time; + UINT8 Daylight; + // + // Initialize RTC Base Address + // + mRtcBase =3D PcdGet32 (PcdRtcBaseAddress); + // + // Declare the controller as EFI_MEMORY_RUNTIME + // + Status =3D gDS->AddMemorySpace ( + EfiGcdMemoryTypeMemoryMappedIo, + mRtcBase, + SIZE_4KB, + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME + ); + if (EFI_ERROR (Status)) { + return Status; + } + // + //init timezone + // + Size =3D sizeof (TimeZone); + Status =3D EfiGetVariable ( + (CHAR16 *)mTimeZoneVariableName, + &gEfiCallerIdGuid, + NULL, + &Size, + (VOID *)&TimeZone + ); + if (EFI_ERROR (Status)) { + ASSERT (Status !=3D EFI_INVALID_PARAMETER); + ASSERT (Status !=3D EFI_BUFFER_TOO_SMALL); + // + // The time zone variable does not exist in non-volatile storage, so c= reate it. + //UTC 8:00 + // + Time.TimeZone =3D -480; + // + // Store it + // + Status =3D EfiSetVariable ( + (CHAR16 *)mTimeZoneVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VA= RIABLE_RUNTIME_ACCESS, + Size, + (VOID *)&(Time.TimeZone) + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + // + //daylight init + // + Size =3D sizeof (Daylight); + Status =3D EfiGetVariable ( + (CHAR16 *)mDaylightVariableName, + &gEfiCallerIdGuid, + NULL, + &Size, + (VOID *)&Daylight + ); + if (EFI_ERROR (Status)) { + ASSERT (Status !=3D EFI_INVALID_PARAMETER); + ASSERT (Status !=3D EFI_BUFFER_TOO_SMALL); + // + // The daylight variable does not exist in non-volatile storage, so cr= eate it. + // + Time.Daylight =3D 0; + // + // Store it + // + Status =3D EfiSetVariable ( + (CHAR16 *)mDaylightVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VA= RIABLE_RUNTIME_ACCESS, + Size, + (VOID *)&(Time.Daylight) + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + Status =3D gDS->SetMemorySpaceAttributes (mRtcBase, SIZE_4KB, EFI_MEMORY= _UC | EFI_MEMORY_RUNTIME); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Install the protocol + // + Handle =3D NULL; + Status =3D gBS->InstallMultipleProtocolInterfaces ( + &Handle, + &gEfiRealTimeClockArchProtocolGuid, + NULL, + NULL + ); + ASSERT_EFI_ERROR (Status); + // + // Register for the virtual address change event + // + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_NOTIFY, + LibRtcVirtualNotifyEvent, + NULL, + &gEfiEventVirtualAddressChangeGuid, + &mRtcVirtualAddrChangeEvent + ); + ASSERT_EFI_ERROR (Status); + return Status; +} --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72988): https://edk2.groups.io/g/devel/message/72988 Mute This Topic: https://groups.io/mt/81410920/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-