From nobody Thu Apr 25 12:50:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+59827+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+59827+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1589899278; cv=none; d=zohomail.com; s=zohoarc; b=jpQJtMYU5tZrIlgq+Gulq/BDBUTrRoKErEb1DDlW4iRpGTvbQviRarNoRSo/E/7NykZ14yU4yQM/gcvyPW0znluay0V2miYSXj56llOQxKvilnG8MSbxmzXKBNMpEsjc5DjMvRqHvz7aKCEsRm+fvYSe5hMLBi6LQZ55GXj3kP4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1589899278; h=Content-Type:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=7GXHxd2TPiT4+Rm7MlEn7mz+aEtJeRU9Bvw586IsHUQ=; b=U7PdjPnLyxrMoqJrG3NMoDwn5BhvAAQD1eF00KFF1a8cvjk9+2LY72Bd/Dp6Qah0qqigefYUa4kygUdybmBkjlMnAo3+33IqUUrrLKEsS5KkdQmX7uct3wgIVlt7wWXC3FJH1Q7WeWvF5pX5Xur6/lZ6gpXybc7D7RMJ+HE/R6Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+59827+1787277+3901457@groups.io Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1589899278654849.6832793109294; Tue, 19 May 2020 07:41:18 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 0N0YYY1788612xqvnOhKASWq; Tue, 19 May 2020 07:41:18 -0700 X-Received: from huawei.com (huawei.com [45.249.212.32]) by mx.groups.io with SMTP id smtpd.web11.12272.1589897475608452401 for ; Tue, 19 May 2020 07:11:16 -0700 X-Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 96CEF54942C550C55CCB; Tue, 19 May 2020 22:11:11 +0800 (CST) X-Received: from HGH1000039998.huawei.com (10.184.68.188) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.487.0; Tue, 19 May 2020 22:11:02 +0800 From: Ming Huang To: , , CC: , , , , Subject: [edk2-devel] [RFC edk2-platforms v3 1/3] Silicon/Hisilicon: Fix a typo issue in M41T83RealTimeClockLib Date: Tue, 19 May 2020 22:09:00 +0800 Message-ID: <1589897342-109203-2-git-send-email-huangming23@huawei.com> In-Reply-To: <1589897342-109203-1-git-send-email-huangming23@huawei.com> References: <1589897342-109203-1-git-send-email-huangming23@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.184.68.188] X-CFilter-Loop: Reflected 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,huangming23@huawei.com X-Gm-Message-State: eI6Qi78p7MxbLbyhKVRhoX7Jx1787277AA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1589899278; bh=u/0GBrERF4MqEnsmAm68COcUrkkHDQhHPFf1LCMHkUM=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=nlDfWVvBGwmIeHv0ekrKWJT2wdWC4sQIc3oUqrWuXUnwFuJ+vPSd5oI2T8FuBb6T/4s EXkGoPqzoKT5ujnFcNaE3MSNZxTeWj9ddrn6XoAJA46P56s2EuLZvURhAcantbw4IyhGF tjMa1yzY4ZrIFSMV1eIZe4XNESNgFYo5bB4= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" There is a typo issue in M41T83RealTimeClockLib. The MACROSECOND should be MICROSECOND. Signed-off-by: Ming Huang Reviewed-by: Leif Lindholm --- Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h = | 4 ++-- Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c = | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTim= eClock.h b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeC= lock.h index 67b8657..81ff459 100644 --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h @@ -13,9 +13,9 @@ // The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. #define RTC_DELAY_30_MS 30000 // The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. -#define RTC_DELAY_1000_MACROSECOND 1000 +#define RTC_DELAY_1000_MICROSECOND 1000 // The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. -#define RTC_DELAY_2_MACROSECOND 2 +#define RTC_DELAY_2_MICROSECOND 2 =20 #define M41T83_REGADDR_DOTSECONDS 0x00 #define M41T83_REGADDR_SECONDS 0x01 diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTim= eClockLib.c b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTi= meClockLib.c index 5131ce7..f339bcc 100644 --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockL= ib.c +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockL= ib.c @@ -55,7 +55,7 @@ SwitchRtcI2cChannelAndLock ( Temp =3D Temp | CPU_GET_I2C_CONTROL; // CPU occupied RTC I2C State WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp); - (VOID) MicroSecondDelay (RTC_DELAY_2_MACROSECOND); + (VOID) MicroSecondDelay (RTC_DELAY_2_MICROSECOND); Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); // Is preempt success if(CPU_GET_I2C_CONTROL =3D=3D (Temp & CPU_GET_I2C_CONTROL)) { @@ -109,7 +109,7 @@ RtcRead ( EFI_STATUS Status; =20 Status =3D I2CRead (&gRtcDevice, Address, Size, Data); - MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); + MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); return Status; } =20 @@ -132,7 +132,7 @@ RtcWrite ( EFI_STATUS Status; =20 Status =3D I2CWrite (&gRtcDevice, Address, Size, Data); - MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); + MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); return Status; } =20 @@ -164,7 +164,7 @@ InitializeM41T83 ( } =20 Status =3D I2CInit (gRtcDevice.Socket, gRtcDevice.Port, Normal); - MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); + MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); if (EFI_ERROR (Status)) { if (!EfiAtRuntime ()) { EfiReleaseLock (&mRtcLock); @@ -181,7 +181,7 @@ InitializeM41T83 ( return Status; } =20 - MicroSecondDelay(RTC_DELAY_1000_MACROSECOND); + MicroSecondDelay(RTC_DELAY_1000_MICROSECOND); =20 // Set ST at Power up to clear Oscillator fail detection(OF) Status =3D RtcRead (M41T83_REGADDR_SECONDS, 1, &Second.Uint8); @@ -272,7 +272,7 @@ LibSetTime ( if (EFI_ERROR (Status)) { return Status; } - (VOID)MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); + (VOID)MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); =20 SetMem (&BcdTime, sizeof (RTC_M41T83_TIME), 0); =20 @@ -376,7 +376,7 @@ LibGetTime ( return Status; } =20 - MicroSecondDelay(RTC_DELAY_1000_MACROSECOND); + MicroSecondDelay(RTC_DELAY_1000_MICROSECOND); =20 SetMem (&BcdTime, sizeof (RTC_M41T83_TIME), 0); SetMem (Time , sizeof (EFI_TIME), 0); --=20 2.8.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 (#59827): https://edk2.groups.io/g/devel/message/59827 Mute This Topic: https://groups.io/mt/74326374/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- From nobody Thu Apr 25 12:50:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+59829+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+59829+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1589899277; cv=none; d=zohomail.com; s=zohoarc; b=PT4k55TYv9kOefhG9Iv/4ns4+whfhbyjOhorR0AqFU54FKBmCeCcf6PemSletMpxdYXXTh4fccEAIuLABZgDObS7DLO958W9sM/L/YNZnpCczyMVUpK6PZhqWwyP26QXZ3OFmuoUVk47qyGb1vLev/c1ThQl/ZYiuoSy1+zdyLs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1589899277; h=Content-Type:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=deeRKtcoWbadle9aIJpQ+XPWWJ3Ht0gqZPcf96gWx5k=; b=QQJl/O7n8cQweQV/3l8/FOxmfAvjERpc2G7xCdczNlMOFTpIyRyGuP9wnDv9EmE0Oi+bAwnPq0sDlH+PaUdjIML4+alWcVFgufaWf21tpehTU1vHwTzt0OSGppKGb3/Ua54YOW+4zQI0GwYo81ruDT910Ml6YSfPS0N6iV4MRCU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+59829+1787277+3901457@groups.io Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1589899277905582.7449784399666; Tue, 19 May 2020 07:41:17 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 4XY5YY1788612xI5UzqKv1tj; Tue, 19 May 2020 07:41:17 -0700 X-Received: from huawei.com (huawei.com [45.249.212.32]) by mx.groups.io with SMTP id smtpd.web11.12273.1589897476793001450 for ; Tue, 19 May 2020 07:11:18 -0700 X-Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 9B521126402E14017B40; Tue, 19 May 2020 22:11:11 +0800 (CST) X-Received: from HGH1000039998.huawei.com (10.184.68.188) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.487.0; Tue, 19 May 2020 22:11:02 +0800 From: Ming Huang To: , , CC: , , , , Subject: [edk2-devel] [RFC edk2-platforms v3 2/3] Hisilicon/Library: Move two functions to RtcHelperLib Date: Tue, 19 May 2020 22:09:01 +0800 Message-ID: <1589897342-109203-3-git-send-email-huangming23@huawei.com> In-Reply-To: <1589897342-109203-1-git-send-email-huangming23@huawei.com> References: <1589897342-109203-1-git-send-email-huangming23@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.184.68.188] X-CFilter-Loop: Reflected 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,huangming23@huawei.com X-Gm-Message-State: TfnPNYXmhMmu5vU1onyWHN2Bx1787277AA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1589899277; bh=l1zjQmdIcg179ATcASJTsQU+wwE6ziPs0V2ON42CF7I=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=r5ghK7hncmk23nji12UkvxvWMReey+RkHVe+HcbdLb44bPXjkvCbcjXcCOCz49kSmBB 0i5hLjESH1sLkjbM0mtDZbIFIXNHfRtAkD6Gt+nvkETLkDer0awUMRBhz8SvqZKEefWim S8hkIxcAyALL+2oN0KwVAPSOtd2/tx8yX20= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The functions of acquiring ownership of RTC will be used for other RTC library, so move them to RtcHelperLib. Rename them by add leading Oem for uniform. Signed-off-by: Ming Huang Reviewed-by: Leif Lindholm --- Platform/Hisilicon/D06/D06.dsc = | 1 + Silicon/Hisilicon/Include/Library/RtcHelperLib.h = | 29 ++++++ Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h = | 7 -- Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c = | 80 +---------------- Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.in= f | 1 + Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.c = | 94 ++++++++++++++++++++ Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.inf = | 32 +++++++ 7 files changed, 158 insertions(+), 86 deletions(-) diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc index 000a4ee..eb20224 100644 --- a/Platform/Hisilicon/D06/D06.dsc +++ b/Platform/Hisilicon/D06/D06.dsc @@ -54,6 +54,7 @@ CpldIoLib|Silicon/Hisilicon/Library/CpldIoLib/CpldIoLib.inf =20 TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf + RtcHelperLib|Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.inf RealTimeClockLib|Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83= RealTimeClockLib.inf OemMiscLib|Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf OemAddressMapLib|Platform/Hisilicon/D06/Library/OemAddressMapD06/OemAddr= essMapD06.inf diff --git a/Silicon/Hisilicon/Include/Library/RtcHelperLib.h b/Silicon/His= ilicon/Include/Library/RtcHelperLib.h new file mode 100644 index 0000000..39dbc96 --- /dev/null +++ b/Silicon/Hisilicon/Include/Library/RtcHelperLib.h @@ -0,0 +1,29 @@ +/** @file + + Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef RTC_HELPER_LIB_H__ +#define RTC_HELPER_LIB_H__ + +// The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. +#define RTC_DELAY_30_MS 30000 +// The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. +#define RTC_DELAY_1000_MICROSECOND 1000 +// The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. +#define RTC_DELAY_2_MICROSECOND 2 + +EFI_STATUS +SwitchRtcI2cChannelAndLock ( + VOID + ); + +VOID +ReleaseOwnershipOfRtc ( + VOID + ); + +#endif diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTim= eClock.h b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeC= lock.h index 81ff459..09329c4 100644 --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h @@ -10,13 +10,6 @@ #ifndef __M41T83_REAL_TIME_CLOCK_H__ #define __M41T83_REAL_TIME_CLOCK_H__ =20 -// The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. -#define RTC_DELAY_30_MS 30000 -// The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. -#define RTC_DELAY_1000_MICROSECOND 1000 -// The delay is need for cpld and I2C. This is a empirical value. MemoryFe= nce is no need. -#define RTC_DELAY_2_MICROSECOND 2 - #define M41T83_REGADDR_DOTSECONDS 0x00 #define M41T83_REGADDR_SECONDS 0x01 #define M41T83_REGADDR_MINUTES 0x02 diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTim= eClockLib.c b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTi= meClockLib.c index f339bcc..5f94658 100644 --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockL= ib.c +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockL= ib.c @@ -11,10 +11,9 @@ #include #include #include -#include -#include #include #include +#include #include #include #include @@ -26,70 +25,6 @@ extern I2C_DEVICE gRtcDevice; =20 STATIC EFI_LOCK mRtcLock; =20 -EFI_STATUS -SwitchRtcI2cChannelAndLock ( - VOID - ) -{ - UINT8 Temp; - UINT8 Count; - - for (Count =3D 0; Count < 100; Count++) { - // To get the other side's state is idle first - Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); - if ((Temp & BIT3) !=3D 0) { - (VOID) MicroSecondDelay (RTC_DELAY_30_MS); - // Try 100 times, if BMC has not released the bus, return preemption= failed - if (Count =3D=3D 99) { - if (!EfiAtRuntime ()) { - DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state 100 tim= es fail!\n", - __FUNCTION__, __LINE__)); - } - return EFI_DEVICE_ERROR; - } - continue; - } - - // if BMC free the bus, can be set 1 preemption - Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); - Temp =3D Temp | CPU_GET_I2C_CONTROL; - // CPU occupied RTC I2C State - WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp); - (VOID) MicroSecondDelay (RTC_DELAY_2_MICROSECOND); - Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); - // Is preempt success - if(CPU_GET_I2C_CONTROL =3D=3D (Temp & CPU_GET_I2C_CONTROL)) { - break; - } - if (Count =3D=3D 99) { - if (!EfiAtRuntime ()) { - DEBUG((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state fail !!! = \n", - __FUNCTION__, __LINE__)); - } - return EFI_DEVICE_ERROR; - } - (VOID) MicroSecondDelay (RTC_DELAY_30_MS); - } - - //Polling BMC RTC I2C status - for (Count =3D 0; Count < 100; Count++) { - Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); - if ((Temp & BIT3) =3D=3D 0) { - return EFI_SUCCESS; - } - (VOID) MicroSecondDelay (RTC_DELAY_30_MS); - } - - //If the BMC occupies the RTC I2C Channel, write back the CPU side is id= le - // or the subsequent BMC will not preempt - Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); - Temp =3D Temp & (~CPU_GET_I2C_CONTROL); - WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp); - - return EFI_NOT_READY; -} - - /** Read RTC content through its registers. =20 @@ -136,19 +71,6 @@ RtcWrite ( return Status; } =20 -VOID -ReleaseOwnershipOfRtc ( - VOID - ) -{ - UINT8 Temp; - - Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); - Temp =3D Temp & ~CPU_GET_I2C_CONTROL; - WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp); -} - - EFI_STATUS InitializeM41T83 ( VOID diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTim= eClockLib.inf b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83Real= TimeClockLib.inf index 9344c6d..5970c0e 100644 --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockL= ib.inf +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockL= ib.inf @@ -31,6 +31,7 @@ I2CLib IoLib PcdLib + RtcHelperLib TimeBaseLib TimerLib UefiLib diff --git a/Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.c b/Silico= n/Hisilicon/Library/RtcHelperLib/RtcHelperLib.c new file mode 100644 index 0000000..811885f --- /dev/null +++ b/Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.c @@ -0,0 +1,94 @@ +/** @file + + Copyright (c) 2020, Hisilicon Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +EFI_STATUS +SwitchRtcI2cChannelAndLock ( + VOID + ) +{ + UINT8 Temp; + UINT8 Count; + + for (Count =3D 0; Count < 100; Count++) { + // To get the other side's state is idle first + Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); + if ((Temp & BIT3) !=3D 0) { + (VOID) MicroSecondDelay (RTC_DELAY_30_MS); + // Try 100 times, if BMC has not released the bus, return preemption= failed + if (Count =3D=3D 99) { + if (!EfiAtRuntime ()) { + DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state 100 tim= es fail!\n", + __FUNCTION__, __LINE__)); + } + return EFI_DEVICE_ERROR; + } + continue; + } + + // if BMC free the bus, can be set 1 preemption + Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); + Temp =3D Temp | CPU_GET_I2C_CONTROL; + // CPU occupied RTC I2C State + WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp); + (VOID)MicroSecondDelay (RTC_DELAY_2_MICROSECOND); + Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); + // Is preempt success + if (CPU_GET_I2C_CONTROL =3D=3D (Temp & CPU_GET_I2C_CONTROL)) { + break; + } + if (Count =3D=3D 99) { + if (!EfiAtRuntime ()) { + DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state fail !!!= \n", + __FUNCTION__, __LINE__)); + } + return EFI_DEVICE_ERROR; + } + (VOID)MicroSecondDelay (RTC_DELAY_30_MS); + } + + //Polling BMC RTC I2C status + for (Count =3D 0; Count < 100; Count++) { + Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); + if ((Temp & BIT3) =3D=3D 0) { + return EFI_SUCCESS; + } + (VOID)MicroSecondDelay (RTC_DELAY_30_MS); + } + + //If the BMC occupies the RTC I2C Channel, write back the CPU side is id= le + // or the subsequent BMC will not preempt + Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); + Temp =3D Temp & (~CPU_GET_I2C_CONTROL); + WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp); + + return EFI_NOT_READY; +} + +VOID +ReleaseOwnershipOfRtc ( + VOID + ) +{ + UINT8 Temp; + + Temp =3D ReadCpldReg (CPLD_I2C_SWITCH_FLAG); + Temp =3D Temp & ~CPU_GET_I2C_CONTROL; + WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp); + return ; +} diff --git a/Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.inf b/Sili= con/Hisilicon/Library/RtcHelperLib/RtcHelperLib.inf new file mode 100644 index 0000000..1a36e64 --- /dev/null +++ b/Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.inf @@ -0,0 +1,32 @@ +#/** @file +# +# Copyright (c) 2020, Hisilicon Limited. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D RtcHelperLib + FILE_GUID =3D 5cb1a98f-2408-4fef-b68f-d5d04ff6a91f + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D RtcHelperLib + +[Sources.common] + RtcHelperLib.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + Platform/Hisilicon/D06/D06.dec + Silicon/Hisilicon/HisiPkg.dec + +[LibraryClasses] + CpldIoLib + DebugLib + IoLib + +[Depex] + TRUE --=20 2.8.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 (#59829): https://edk2.groups.io/g/devel/message/59829 Mute This Topic: https://groups.io/mt/74326376/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- From nobody Thu Apr 25 12:50:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+59828+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+59828+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1589899278; cv=none; d=zohomail.com; s=zohoarc; b=MNoK8W95mlEw6ONwziPDYxpZdGjpuZs3zWTUz6uSSZTMYfu+KCiRd31p8rkBzj6eb3uOgVe8ByAuNV+CDM2CwCBawuWzVy0kSuw9gxc3kieHzd6SF79VhqQbOf5LZ3oHtGKfrFVi1ydz1bG8g89smpKvBtAWs2qpqlvRnCBGZ1I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1589899278; h=Content-Type:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=E+iG6MenNKw/jyQaWXvTv+S6Y/5sQlwJfr6rejDAAx4=; b=UP12IbEfd4S4FwbcfTZMmFD1wP1EVA7TtJaY9fQX/pb/QzKNBZ3XOJjHBlozb3LioggXHN4lfPN6P+NfNXbbZkQlCQMgu72A9vO6xNNapFM1Ig2nPYON/31PDp6cZtpezF4dMCB1igWn3avJBS8o1loR4vZscYs8W9BRG/9uahg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+59828+1787277+3901457@groups.io Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1589899278380829.7184017416332; Tue, 19 May 2020 07:41:18 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 7zO2YY1788612x19S9kUGmWJ; Tue, 19 May 2020 07:41:18 -0700 X-Received: from huawei.com (huawei.com [45.249.212.32]) by mx.groups.io with SMTP id smtpd.web12.12643.1589897475609344986 for ; Tue, 19 May 2020 07:11:16 -0700 X-Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 91142671104BCCF71F66; Tue, 19 May 2020 22:11:11 +0800 (CST) X-Received: from HGH1000039998.huawei.com (10.184.68.188) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.487.0; Tue, 19 May 2020 22:11:03 +0800 From: Ming Huang To: , , CC: , , , , Subject: [edk2-devel] [RFC edk2-platforms v3 3/3] Silicon/Hisilicon: Add RX8900RealTimeClockLib Date: Tue, 19 May 2020 22:09:02 +0800 Message-ID: <1589897342-109203-4-git-send-email-huangming23@huawei.com> In-Reply-To: <1589897342-109203-1-git-send-email-huangming23@huawei.com> References: <1589897342-109203-1-git-send-email-huangming23@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.184.68.188] X-CFilter-Loop: Reflected 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,huangming23@huawei.com X-Gm-Message-State: v3J4cF2To9FgS3gny8XOpeZ8x1787277AA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1589899278; bh=aL+ZQ2CNNCtg/ZjbHIi1qJiMFzldrtcd0GGBmrqYfKM=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=RMVOADymzzzoC/p3EpXyruka0xhipi54bAbrcwdtv/yOTs87MKjAvw0qTnMS//kNdKs NPeZPV0227ADfi/YnSPY70ynwDTjnzKAft7x+thIXou719OqBBA1jlH1sxRWbOrZGfM1G E1rnZiDHkQn+5ZBwRvHw56at7U1kv0Un79U= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" There are some boards base on D06, but use RX8900 RTC, so upstream the RX8900RealTimeClockLib. Signed-off-by: Ming Huang Reviewed-by: Leif Lindholm --- Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClock.h = | 39 ++ Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClockLib.c = | 468 ++++++++++++++++++++ Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClockLib.in= f | 33 ++ 3 files changed, 540 insertions(+) diff --git a/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTim= eClock.h b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeC= lock.h new file mode 100644 index 0000000..ac2be7e --- /dev/null +++ b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClock.h @@ -0,0 +1,39 @@ +/** @file + + Copyright (c) 2020, Hisilicon Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef RX8900_REAL_TIME_CLOCK_H__ +#define RX8900_REAL_TIME_CLOCK_H__ + +#define RX8900_REGADDR_SECONDS 0x00 +#define RX8900_REGADDR_MIUTES 0x01 +#define RX8900_REGADDR_HOURS 0x02 +#define RX8900_REGADDR_DAY 0x03 +#define RX8900_REGADDR_DATE 0x04 +#define RX8900_REGADDR_MONTH 0x05 +#define RX8900_REGADDR_YEAR 0x06 +#define RX8900_REGADDR_RAM 0x07 +#define RX8900_REGADDR_ALARMMIN 0x08 +#define RX8900_REGADDR_ALARMHOUR 0x09 +#define RX8900_REGADDR_ALARMDAY 0x0A +#define RX8900_REGADDR_ALARMWEEK 0x0A +#define RX8900_REGADDR_TIMECOUNTER_0 0x0B +#define RX8900_REGADDR_TIMECOUNTER_1 0x0C +#define RX8900_REGADDR_EXTENSIONREG 0x0D +#define RX8900_REGADDR_FLAGREG 0x0E +#define RX8900_REGADDR_CONTRLREG 0xF +#define RX8900_REGADDR_BACKUP_FUN 0x18 + +#define RX8900_VDETOFF_SWOFF 0x0C +#define TEMPERATURE_COMPENSATION_2S 0x40 +#define OUTPUT_FREQUENCY_32768 0x0C +#define FLAG_REG_DEFAULT 0x00 +#define RX8900_RAM_REG_DEFAULT 0x5A + +#define EFI_TIMEOFFSET_TIMEZONE 0x5A0 + +#endif diff --git a/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTim= eClockLib.c b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTi= meClockLib.c new file mode 100644 index 0000000..b6c9e67 --- /dev/null +++ b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClockL= ib.c @@ -0,0 +1,468 @@ +/** @file + + Copyright (c) 2020, Hisilicon Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "RX8900RealTimeClock.h" + +extern I2C_DEVICE gRtcDevice; + +STATIC BOOLEAN mRX8900Initialized =3D FALSE; +STATIC CONST CHAR16 mTimeZoneVariableName[] =3D L"RX8900RtcTimeZone"; +STATIC CONST CHAR16 mDaylightVariableName[] =3D L"RX8900RtcDaylight"; + +EFI_STATUS +InitializeRX8900 ( + VOID + ) +{ + EFI_STATUS Status; + unsigned char writeTemp; + + Status =3D SwitchRtcI2cChannelAndLock (); + if (EFI_ERROR (Status)) { + goto EXIT; + } + + Status =3D I2CInit (gRtcDevice.Socket, gRtcDevice.Port, Normal); + if (EFI_ERROR (Status)) { + goto EXIT; + } + + writeTemp =3D RX8900_VDETOFF_SWOFF; + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_BACKUP_FUN, 1, &writeTe= mp); + if (EFI_ERROR (Status)) { + goto EXIT; + } + writeTemp =3D TEMPERATURE_COMPENSATION_2S; + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_CONTRLREG, 1, &writeTem= p); + if (EFI_ERROR (Status)) { + goto EXIT; + } + writeTemp =3D OUTPUT_FREQUENCY_32768; + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_EXTENSIONREG, 1, &write= Temp); + if (EFI_ERROR (Status)) { + goto EXIT; + } + + writeTemp =3D FLAG_REG_DEFAULT; + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_FLAGREG, 1, &writeTemp); + if (EFI_ERROR (Status)) { + goto EXIT; + } + writeTemp =3D RX8900_RAM_REG_DEFAULT; + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_RAM, 1, &writeTemp); + if (EFI_ERROR (Status)) { + goto EXIT; + } + + mRX8900Initialized =3D TRUE; + + EXIT: + + ReleaseOwnershipOfRtc (); + return Status; +} + +STATIC +INT16 +GetTimeZone ( + VOID + ) +{ + EFI_STATUS Status; + INT16 TimeZone; + UINTN Size; + + TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; + Size =3D sizeof (TimeZone); + Status =3D EfiGetVariable ( + (CHAR16 *)mTimeZoneVariableName, + &gEfiCallerIdGuid, + NULL, + &Size, + (VOID *)&TimeZone + ); + + if (EFI_ERROR (Status)) { + TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; + // The time zone variable does not exist in non-volatile storage, so c= reate it. + Status =3D EfiSetVariable ( + (CHAR16 *)mTimeZoneVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS= | EFI_VARIABLE_RUNTIME_ACCESS, + Size, + (VOID *)&TimeZone + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "Failed to save %s variable, Status =3D %r\n", + mTimeZoneVariableName, Status)); + } + } else { + // Check TimeZone bounds: -1440 to 1440 or 2047 + if ((TimeZone < -EFI_TIMEOFFSET_TIMEZONE) || (TimeZone > EFI_TIMEOFFSE= T_TIMEZONE)) { + TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; + } + } + + return TimeZone; +} + +STATIC +UINT8 +GetDayLight ( + VOID + ) +{ + EFI_STATUS Status; + UINT8 DayLight; + UINTN Size; + + DayLight =3D 0; + // 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)) { + DayLight =3D 0; + // The daylight variable does not exist in non-volatile storage, so cr= eate it. + Status =3D EfiSetVariable ( + (CHAR16 *)mDaylightVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS= | EFI_VARIABLE_RUNTIME_ACCESS, + Size, + (VOID *)&DayLight + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "Failed to save %s variable, Status =3D %r\n", + mDaylightVariableName, Status)); + } + } + + return DayLight; +} + +EFI_STATUS +EFIAPI +LibGetTime ( + OUT EFI_TIME *Time, + OUT EFI_TIME_CAPABILITIES *Capabilities + ) +{ + EFI_STATUS Status; + UINT8 Temp[7] =3D {0}; + UINT16 BaseYear =3D 2000; + UINTN EpochSeconds; + UINT8 TryCount =3D 0; + + // Ensure Time is a valid pointer + if (Time =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + // Initialize the hardware if not already done + if (!mRX8900Initialized) { + Status =3D InitializeRX8900 (); + if (EFI_ERROR (Status)) { + return EFI_NOT_READY; + } + } + + Status =3D SwitchRtcI2cChannelAndLock (); + if (EFI_ERROR (Status)) { + ReleaseOwnershipOfRtc (); + return Status; + } + + do { + Status =3D I2CRead (&gRtcDevice, RX8900_REGADDR_SECONDS, 7, Temp); + if (EFI_ERROR (Status)) { + Status =3D EFI_DEVICE_ERROR; + goto Err; + } + + Time->Second =3D BcdToDecimal8 (Temp[0]); + Time->Minute =3D BcdToDecimal8 (Temp[1]); + Time->Hour =3D BcdToDecimal8 (Temp[2]); + Time->Day =3D BcdToDecimal8 (Temp[4]); + Time->Month =3D BcdToDecimal8 (Temp[5]); + Time->Year =3D BaseYear + BcdToDecimal8 (Temp[6]); + Time->Nanosecond =3D 0; + + EpochSeconds =3D EfiTimeToEpoch (Time); + + Time->TimeZone =3D GetTimeZone (); + // Adjust for the correct time zone + if (Time->TimeZone !=3D EFI_UNSPECIFIED_TIMEZONE) { + EpochSeconds +=3D Time->TimeZone * SEC_PER_MIN; + } + + Time->Daylight =3D GetDayLight (); + // 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); + if ((!IsTimeValid (Time)) || ((Time->Year - BaseYear) > 99) || (Time->= Year < 2000)) { + DEBUG ((DEBUG_INFO, "LibGetTime: %d-%d-%d %d-%d-%d EpochSeconds:%llx= is invalid time!\n", + Time->Second, Time->Minute, Time->Hour, Time->Day, Time->Month, + Time->Year, EpochSeconds)); + Status =3D EFI_DEVICE_ERROR; + } + +Err: + TryCount++; + } while ((TryCount < 3) && (EFI_ERROR (Status))); + + ReleaseOwnershipOfRtc (); + return Status; +} + +STATIC +EFI_STATUS +SetTimeToRX8900 ( + IN EFI_TIME *Time + ) +{ + EFI_STATUS Status; + UINT8 Temp; + + (VOID)MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); + Temp =3D DecimalToBcd8 (Time->Second); + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_SECONDS, 1, &Temp); + if(EFI_ERROR (Status)) { + Status =3D EFI_DEVICE_ERROR; + return Status; + } + + Temp =3D DecimalToBcd8 (Time->Minute); + (VOID)MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_MIUTES, 1, &Temp); + if(EFI_ERROR (Status)) { + Status =3D EFI_DEVICE_ERROR; + return Status; + } + + Temp =3D DecimalToBcd8 (Time->Hour); + (VOID)MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_HOURS, 1, &Temp); + if(EFI_ERROR (Status)) { + Status =3D EFI_DEVICE_ERROR; + return Status; + } + + Temp =3D DecimalToBcd8 (Time->Day); + (VOID)MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_DATE, 1, &Temp); + if(EFI_ERROR (Status)) { + Status =3D EFI_DEVICE_ERROR; + return Status; + } + + Temp =3D DecimalToBcd8 (Time->Month); + (VOID)MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_MONTH, 1, &Temp); + if(EFI_ERROR (Status)) { + Status =3D EFI_DEVICE_ERROR; + return Status; + } + + Time->Year=3D Time->Year % 100; + Temp =3D Time->Year; + Temp =3D DecimalToBcd8 (Temp); + (VOID)MicroSecondDelay (RTC_DELAY_1000_MICROSECOND); + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_YEAR, 1, &Temp); + if(EFI_ERROR (Status)) { + Status =3D EFI_DEVICE_ERROR; + return Status; + } + + return Status; +} + +EFI_STATUS +EFIAPI +LibSetTime ( + IN EFI_TIME *Time + ) +{ + EFI_STATUS Status; + UINTN EpochSeconds; + + // Initialize the hardware if not already done + if (!mRX8900Initialized) { + Status =3D InitializeRX8900 (); + if (EFI_ERROR (Status)) { + goto EXIT; + } + } + + Status =3D SwitchRtcI2cChannelAndLock (); + if (EFI_ERROR (Status)) { + goto EXIT; + } + + if(!IsTimeValid(Time)){ + return EFI_INVALID_PARAMETER; + } + + 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)= { + // Convert to un-adjusted time, i.e. fall back one hour + EpochSeconds -=3D SEC_PER_HOUR; + } + + EpochToEfiTime (EpochSeconds, Time); + Status =3D SetTimeToRX8900 (Time); + if (EFI_ERROR (Status)) { + goto EXIT; + } + + // 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_VARIABLE_RUNTIME_ACCESS, + sizeof (Time->TimeZone), + (VOID *)&(Time->TimeZone) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "LibSetTime: Failed to save %s variable, Status = =3D %r\n", + mTimeZoneVariableName, Status)); + goto EXIT; + } + + // Save the current daylight information into non-volatile storage + Status =3D EfiSetVariable ( + (CHAR16 *)mDaylightVariableName, + &gEfiCallerIdGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS |= EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(Time->Daylight), + (VOID *)&(Time->Daylight) + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "LibSetTime: Failed to save %s variable, Status = =3D %r\n", + mDaylightVariableName, Status)); + goto EXIT; + } + + EXIT: + ReleaseOwnershipOfRtc (); + return Status; +} + +EFI_STATUS +EFIAPI +LibGetWakeupTime ( + OUT BOOLEAN *Enabled, + OUT BOOLEAN *Pending, + OUT EFI_TIME *Time + ) +{ + // Not a required feature + return EFI_UNSUPPORTED; +} + +EFI_STATUS +EFIAPI +LibSetWakeupTime ( + IN BOOLEAN Enabled, + OUT EFI_TIME *Time + ) +{ + // Not a required feature + return EFI_UNSUPPORTED; +} + + +EFI_STATUS +EFIAPI +LibRtcInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + EFI_TIME EfiTime; + + // Setup the setters and getters + gRT->GetTime =3D LibGetTime; + gRT->SetTime =3D LibSetTime; + gRT->GetWakeupTime =3D LibGetWakeupTime; + gRT->SetWakeupTime =3D LibSetWakeupTime; + + Status =3D gRT->GetTime (&EfiTime, NULL); + if (EFI_ERROR (Status) || (EfiTime.Year < 2000) || (EfiTime.Year > 2099)= || + (!IsTimeValid (&EfiTime))) { + EfiTime.Year =3D 2000; + EfiTime.Month =3D 1; + EfiTime.Day =3D 1; + EfiTime.Hour =3D 0; + EfiTime.Minute =3D 0; + EfiTime.Second =3D 0; + EfiTime.Nanosecond =3D 0; + EfiTime.Daylight =3D 0; + EfiTime.TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; + + Status =3D gRT->SetTime (&EfiTime); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "SetTime Status : %r\n", Status)); + } + } + + Handle =3D NULL; + Status =3D gBS->InstallMultipleProtocolInterfaces ( + &Handle, + &gEfiRealTimeClockArchProtocolGuid, + NULL, + NULL + ); + + return Status; +} + + +VOID +EFIAPI +LibRtcVirtualNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + return; +} diff --git a/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTim= eClockLib.inf b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900Real= TimeClockLib.inf new file mode 100644 index 0000000..aa07a06 --- /dev/null +++ b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClockL= ib.inf @@ -0,0 +1,33 @@ +/** @file + + Copyright (c) 2020, Hisilicon Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D RX8900RealTimeClockLib + FILE_GUID =3D 55BBD010-EA76-4836-8FEA-99CBAA6664F4 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D RealTimeClockLib + +[Sources.common] + RX8900RealTimeClockLib.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + Silicon/Hisilicon/HisiPkg.dec + +[LibraryClasses] + DebugLib + I2CLib + IoLib + RtcHelperLib + TimeBaseLib + TimerLib + UefiLib + UefiRuntimeLib --=20 2.8.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 (#59828): https://edk2.groups.io/g/devel/message/59828 Mute This Topic: https://groups.io/mt/74326375/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-