From nobody Tue Feb 10 04:13:15 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+72825+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+72825+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1615842149; cv=none; d=zohomail.com; s=zohoarc; b=lWTCIFvgC0J0g7xy2mt4Z62AxdaOsSdxaorX8dX2VLDHadx1qzOiC+HuP+mdOkgE/wxFkt53915Q9TEaAfycDTGmAddQN9GQSa5DJaqf4tNotehuYNrSn8XYauE037G8Wx0n4BWEAjC4KnFPDFZh91Dx8QHVvEsxooArwgfHX1E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615842149; 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=BA0na9GW3K/OLqEeLxr9FeBSShMTcxk8j6eVe9Fnrw8=; b=GClCFNJeNT028qWGha9fKMMpDXKfEkGi6/ktWn8oT13iDO04WZQ7JGjRXBljZu/JidGpamuvK7LfXkZ1Y7zObYwise/D4d1ZltwU3hayELWvdVLnt6x/PX05L0JDNTNK3UJzk3R49Rh1QZqBp0ufj7Mk2Y/c9uUiQODJyRjcobU= 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+72825+1787277+3901457@groups.io Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1615842149558617.7002691533468; Mon, 15 Mar 2021 14:02:29 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id P9mKYY1788612xEyKwhRnxUs; Mon, 15 Mar 2021 14:02:29 -0700 X-Received: from zg8tmty1ljiyny4xntqumjca.icoremail.net (zg8tmty1ljiyny4xntqumjca.icoremail.net [165.227.154.27]) by mx.groups.io with SMTP id smtpd.web10.6612.1615546933114138934 for ; Fri, 12 Mar 2021 03:02:13 -0800 X-Received: from localhost.localdomain (unknown [223.104.131.160]) by c1app4 (Coremail) with SMTP id BAINCgC3mwEVSktgMY01BQ--.34795S12; Fri, 12 Mar 2021 19:02:05 +0800 (CST) From: Ling Jia To: devel@edk2.groups.io Cc: Leif Lindholm , Peng Xie , Yiqi Shu , Ling Jia Subject: [edk2-devel] [PATCH v3 22/46] Silicon/Phytium: Added Rtc driver to FT2000/4 Date: Fri, 12 Mar 2021 19:01:30 +0800 Message-Id: <20210312110141.75749-11-jialing@phytium.com.cn> In-Reply-To: <20210312110141.75749-1-jialing@phytium.com.cn> References: <20210312110141.75749-1-jialing@phytium.com.cn> MIME-Version: 1.0 X-CM-TRANSID: BAINCgC3mwEVSktgMY01BQ--.34795S12 X-Coremail-Antispam: 1UD129KBjvAXoWfGF1UuFy3XFWkZF4xZw4UXFb_yoW8AFyUWo WfGrWIq3y8Gr1rua4Syw1kArWjgrsagan0qr4jvFZ7K3ZrZr13tFyUt3W2qry3tr9rAw43 KrWfJas7AFWaqF4kn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUY_7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r126s0DM28Irc Ia0xkI8VCY1x0267AKxVW5JVCq3wA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l 84ACjcxK6xIIjxv20xvE14v26r4j6ryUM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j6r 4UJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl 6s0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6x IIjxv20xvE14v26r106r15McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_ Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkIecxEwVAFwVW8Kw CF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j 6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_JF0_Jw1lIxkGc2Ij64 vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_ Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJwCI42 IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOsjjDUUUU X-Originating-IP: [223.104.131.160] 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: cdZQZXAwx4tjm2W0x9knnrrWx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1615842149; bh=6586B/iCd5WIwhWlT17E+ChSm65IoRe/TI43j6hlFJs=; h=Cc:Date:From:Reply-To:Subject:To; b=O6ORrBjdVcU4j638Kv2Y1VhtO/w7GDLd5HxIZJ7QXnLH1SSVfLKtLOvgfAqCs3m30LF 1kbooKqpI+ZIBitFgtGp9AjQfmrX27BV7Cbp25t8f5SHiHKUbY0gd4exKELj4uTn60gkl KUPm3GosyhMWwRLd8R4caHx4yxyZ4FZbelg= 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 2686ba3cc3a2..4c6c5c5f1118 100644 --- a/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec +++ b/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec @@ -45,6 +45,7 @@ [PcdsFixedAtBuild.common] 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 99034365d38f..9579f8e9b7d0 100644 --- a/Platform/Phytium/DurianPkg/DurianPkg.dsc +++ b/Platform/Phytium/DurianPkg/DurianPkg.dsc @@ -29,6 +29,10 @@ [LibraryClasses.common] # 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 @@ [Components.common] 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 67458458ddd5..242f647ca1b1 100644 --- a/Platform/Phytium/DurianPkg/DurianPkg.fdf +++ b/Platform/Phytium/DurianPkg/DurianPkg.fdf @@ -93,6 +93,8 @@ [FV.FvMain] # 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 000000000000..09a06d53aef7 --- /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 000000000000..41ce002dc3be --- /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 000000000000..bf3047fb6795 --- /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 (#72825): https://edk2.groups.io/g/devel/message/72825 Mute This Topic: https://groups.io/mt/81361279/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-