From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from huawei.com (huawei.com [45.249.212.32]) by mx.groups.io with SMTP id smtpd.web10.11509.1589894782075138008 for ; Tue, 19 May 2020 06:26:22 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: huawei.com, ip: 45.249.212.32, mailfrom: huangming23@huawei.com) Received: from DGGEMS406-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 65324C4A89011E866340; Tue, 19 May 2020 21:26:19 +0800 (CST) Received: from [127.0.0.1] (10.78.51.60) by DGGEMS406-HUB.china.huawei.com (10.3.19.206) with Microsoft SMTP Server id 14.3.487.0; Tue, 19 May 2020 21:26:13 +0800 Subject: Re: [RFC edk2-platforms v2 2/3] Hisilicon/Library: Move two functions to RtcHelperLib To: Leif Lindholm CC: , , , , , References: <1589886521-82250-1-git-send-email-huangming23@huawei.com> <1589886521-82250-3-git-send-email-huangming23@huawei.com> <20200519121632.GO10467@vanye> From: Ming Huang Message-ID: <2f416ae5-b3da-f580-673f-ac31fa8a3241@huawei.com> Date: Tue, 19 May 2020 21:26:13 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <20200519121632.GO10467@vanye> X-Originating-IP: [10.78.51.60] X-CFilter-Loop: Reflected Content-Type: text/plain; charset="gbk" Content-Transfer-Encoding: quoted-printable =D4=DA 2020/5/19 20:16, Leif Lindholm =D0=B4=B5=C0: > On Tue, May 19, 2020 at 19:08:40 +0800, Ming Huang wrote: >> 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. >> >> Contributed-under: TianoCore Contribution Agreement 1.1 >=20 > We don't use this anymore - it is not required now the codebase is > under BSD+Patent. Please drop the tag from v3. Ok. >=20 >> Signed-off-by: Ming Huang >> --- >> Platform/Hisilicon/D06/D06.dsc = | 1 + >> Silicon/Hisilicon/Include/Library/RtcHelperLib.h = | 29 ++++++ >> Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.= h | 7 -- >> Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockL= ib.c | 92 ++----------------- >> Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockL= ib.inf | 1 + >> Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.c = | 94 ++++++++++++++++++++ >> Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.inf = | 32 +++++++ >> 7 files changed, 164 insertions(+), 92 deletions(-) >> >> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D= 06.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.in= f >> RealTimeClockLib|Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M= 41T83RealTimeClockLib.inf >> OemMiscLib|Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD= 06.inf >> OemAddressMapLib|Platform/Hisilicon/D06/Library/OemAddressMapD06/Oe= mAddressMapD06.inf >> diff --git a/Silicon/Hisilicon/Include/Library/RtcHelperLib.h b/Silico= n/Hisilicon/Include/Library/RtcHelperLib.h >> new file mode 100644 >> index 0000000..29ec900 >> --- /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. Mem= oryFence is no need. >> +#define RTC_DELAY_30_MS 30000 >> +// The delay is need for cpld and I2C. This is a empirical value. Mem= oryFence is no need. >> +#define RTC_DELAY_1000_MICROSECOND 1000 >> +// The delay is need for cpld and I2C. This is a empirical value. Mem= oryFence is no need. >> +#define RTC_DELAY_2_MICROSECOND 2 >> + >> +EFI_STATUS >> +OemSwitchRtcI2cChannelAndLock ( >> + VOID >> + ); >> + >> +VOID >> +OemReleaseOwnershipOfRtc ( >=20 > These two helper functions have been renamed since v1, which is now > being obscured by the move. If you want to rename them, that should be > a separate patch submitted *after* this set has been merged. >=20 > Undoing this will mean changes to both 2/3 and 3/3, so please send a > v3 also dropping the Contributed-under tags - including in v1 which is > otherwise fine. Ok, I will send v3 out soon. Thanks, Ming >=20 > / > Leif >=20 >> + VOID >> + ); >> + >> +#endif >> diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83Re= alTimeClock.h b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83Re= alTimeClock.h >> index 81ff459..09329c4 100644 >> --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeC= lock.h >> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeC= lock.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. Mem= oryFence is no need. >> -#define RTC_DELAY_30_MS 30000 >> -// The delay is need for cpld and I2C. This is a empirical value. Mem= oryFence is no need. >> -#define RTC_DELAY_1000_MICROSECOND 1000 >> -// The delay is need for cpld and I2C. This is a empirical value. Mem= oryFence 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/M41T83Re= alTimeClockLib.c b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T8= 3RealTimeClockLib.c >> index f339bcc..db356ca 100644 >> --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeC= lockLib.c >> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeC= lockLib.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 preem= ption failed >> - if (Count =3D=3D 99) { >> - if (!EfiAtRuntime ()) { >> - DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state 10= 0 times 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 idle >> - // 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 >> @@ -172,7 +94,7 @@ InitializeM41T83 ( >> return Status; >> } >> =20 >> - Status =3D SwitchRtcI2cChannelAndLock (); >> + Status =3D OemSwitchRtcI2cChannelAndLock (); >> if (EFI_ERROR (Status)) { >> DEBUG ((DEBUG_ERROR, "Get i2c preemption failed: %r\n", Status)); >> if (!EfiAtRuntime ()) { >> @@ -225,7 +147,7 @@ InitializeM41T83 ( >> =20 >> Exit: >> // Release RTC Lock. >> - ReleaseOwnershipOfRtc (); >> + OemReleaseOwnershipOfRtc (); >> if (!EfiAtRuntime ()) { >> EfiReleaseLock (&mRtcLock); >> } >> @@ -268,7 +190,7 @@ LibSetTime ( >> return EFI_INVALID_PARAMETER; >> } >> =20 >> - Status =3D SwitchRtcI2cChannelAndLock (); >> + Status =3D OemSwitchRtcI2cChannelAndLock (); >> if (EFI_ERROR (Status)) { >> return Status; >> } >> @@ -326,7 +248,7 @@ LibSetTime ( >> } >> =20 >> Exit: >> - ReleaseOwnershipOfRtc (); >> + OemReleaseOwnershipOfRtc (); >> // Release RTC Lock. >> if (!EfiAtRuntime ()) { >> if (EFI_ERROR (Status)) { >> @@ -371,7 +293,7 @@ LibGetTime ( >> return EFI_INVALID_PARAMETER; >> } >> =20 >> - Status =3D SwitchRtcI2cChannelAndLock (); >> + Status =3D OemSwitchRtcI2cChannelAndLock (); >> if (EFI_ERROR (Status)) { >> return Status; >> } >> @@ -416,7 +338,7 @@ LibGetTime ( >> } >> =20 >> Exit: >> - ReleaseOwnershipOfRtc (); >> + OemReleaseOwnershipOfRtc (); >> // Release RTC Lock. >> if (!EfiAtRuntime ()) { >> if (EFI_ERROR (Status)) { >> diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83Re= alTimeClockLib.inf b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41= T83RealTimeClockLib.inf >> index 9344c6d..5970c0e 100644 >> --- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeC= lockLib.inf >> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeC= lockLib.inf >> @@ -31,6 +31,7 @@ >> I2CLib >> IoLib >> PcdLib >> + RtcHelperLib >> TimeBaseLib >> TimerLib >> UefiLib >> diff --git a/Silicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.c b/S= ilicon/Hisilicon/Library/RtcHelperLib/RtcHelperLib.c >> new file mode 100644 >> index 0000000..af6b8dc >> --- /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 >> +OemSwitchRtcI2cChannelAndLock ( >> + 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 preem= ption failed >> + if (Count =3D=3D 99) { >> + if (!EfiAtRuntime ()) { >> + DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state 10= 0 times 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 fai= l !!! \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 idle >> + // 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 >> +OemReleaseOwnershipOfRtc ( >> + 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= /Silicon/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-d5d04ff6= a91f >> + 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 >> >=20 > . >=20