From: Ming Huang <ming.huang@linaro.org>
To: leif.lindholm@linaro.org, linaro-uefi@lists.linaro.org,
edk2-devel@lists.01.org, graeme.gregory@linaro.org
Cc: ard.biesheuvel@linaro.org, michael.d.kinney@intel.com,
lersek@redhat.com, wanghuiqiang@huawei.com,
huangming23@huawei.com, zhangjinsong2@huawei.com,
huangdaode@hisilicon.com, john.garry@huawei.com,
xinliang.liu@linaro.org, zhangfeng56@huawei.com,
Ming Huang <ming.huang@linaro.org>
Subject: [PATCH edk2-platforms v1 05/12] Hisilicon/D06: Move some functions to OemMiscLib
Date: Mon, 29 Oct 2018 11:32:42 +0800 [thread overview]
Message-ID: <20181029033249.45363-6-ming.huang@linaro.org> (raw)
In-Reply-To: <20181029033249.45363-1-ming.huang@linaro.org>
As M41T83RealTimeClockLib is common library, so move two cpld
relative functions to OemMiscLib and rename this two functions.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf | 1 -
Silicon/Hisilicon/Include/Library/OemMiscLib.h | 9 ++
Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h | 4 -
Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c | 82 ++++++++++++++++++
Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c | 90 ++------------------
5 files changed, 98 insertions(+), 88 deletions(-)
diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
index e0bf6b3f24..4e963fd453 100644
--- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
+++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
@@ -27,7 +27,6 @@
[Packages]
EmbeddedPkg/EmbeddedPkg.dec
MdePkg/MdePkg.dec
- Platform/Hisilicon/D06/D06.dec
Silicon/Hisilicon/HisiPkg.dec
[LibraryClasses]
diff --git a/Silicon/Hisilicon/Include/Library/OemMiscLib.h b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
index 86ea6a1b3d..0d7bf71b17 100644
--- a/Silicon/Hisilicon/Include/Library/OemMiscLib.h
+++ b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
@@ -53,4 +53,13 @@ BOOLEAN OemIsNeedDisableExpanderBuffer(VOID);
extern EFI_STRING_ID gDimmToDevLocator[MAX_SOCKET][MAX_CHANNEL][MAX_DIMM];
EFI_HII_HANDLE EFIAPI OemGetPackages ();
+
+VOID
+OemReleaseOwnershipOfRtc (
+ VOID
+ );
+EFI_STATUS
+OemSwitchRtcI2cChannelAndLock (
+ VOID
+ );
#endif
diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
index d985055d9b..f329108858 100644
--- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
+++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
@@ -16,12 +16,8 @@
#ifndef __M41T83_REAL_TIME_CLOCK_H__
#define __M41T83_REAL_TIME_CLOCK_H__
-// The delay is need for cpld and I2C. This is a empirical value. MemoryFence is no need.
-#define RTC_DELAY_30_MS 30000
// The delay is need for cpld and I2C. This is a empirical value. MemoryFence is no need.
#define RTC_DELAY_1000_MACROSECOND 1000
-// The delay is need for cpld and I2C. This is a empirical value. MemoryFence is no need.
-#define RTC_DELAY_2_MACROSECOND 2
#define M41T83_REGADDR_DOTSECONDS 0x00
#define M41T83_REGADDR_SECONDS 0x01
diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
index 2a9db46d1f..64d167d18a 100644
--- a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
+++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
@@ -17,6 +17,7 @@
#include <PlatformArch.h>
#include <Library/BaseMemoryLib.h>
#include <Library/CpldD06.h>
+#include <Library/CpldIoLib.h>
#include <Library/DebugLib.h>
#include <Library/IoLib.h>
#include <Library/LpcLib.h>
@@ -27,6 +28,12 @@
#include <Library/SerdesLib.h>
#include <Library/SerialPortLib.h>
#include <Library/TimerLib.h>
+#include <Library/UefiRuntimeLib.h>
+
+// The delay is need for cpld and I2C. This is a empirical value. MemoryFence is no need.
+#define RTC_DELAY_30_MS 30000
+// The delay is need for cpld and I2C. This is a empirical value. MemoryFence is no need.
+#define RTC_DELAY_2_MACROSECOND 2
REPORT_PCIEDIDVID2BMC PcieDeviceToReport[PCIEDEVICE_REPORT_MAX] = {
{67,0,0,0},
@@ -207,3 +214,78 @@ OemIsNeedDisableExpanderBuffer (
{
return TRUE;
}
+
+EFI_STATUS
+OemSwitchRtcI2cChannelAndLock (
+ VOID
+ )
+{
+ UINT8 Temp;
+ UINT8 Count;
+
+ for (Count = 0; Count < 100; Count++) {
+ // To get the other side's state is idle first
+ Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+ if ((Temp & BIT3) != 0) {
+ (VOID) MicroSecondDelay (RTC_DELAY_30_MS);
+ // Try 100 times, if BMC has not released the bus, return preemption failed
+ if (Count == 99) {
+ if (!EfiAtRuntime ()) {
+ DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state 100 times fail!\n",
+ __FUNCTION__, __LINE__));
+ }
+ return EFI_DEVICE_ERROR;
+ }
+ continue;
+ }
+
+ // if BMC free the bus, can be set 1 preemption
+ Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+ Temp = Temp | CPU_GET_I2C_CONTROL;
+ // CPU occupied RTC I2C State
+ WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
+ (VOID) MicroSecondDelay (RTC_DELAY_2_MACROSECOND);
+ Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+ // Is preempt success
+ if(CPU_GET_I2C_CONTROL == (Temp & CPU_GET_I2C_CONTROL)) {
+ break;
+ }
+ if (Count == 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 = 0; Count < 100; Count++) {
+ Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+ if ((Temp & BIT3) == 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 = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+ Temp = Temp & (~CPU_GET_I2C_CONTROL);
+ WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
+
+ return EFI_NOT_READY;
+}
+
+VOID
+OemReleaseOwnershipOfRtc (
+ VOID
+ )
+{
+ UINT8 Temp;
+
+ Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+ Temp = Temp & ~CPU_GET_I2C_CONTROL;
+ WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
+}
diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
index 0670f9c5f4..1f50ad4b64 100644
--- a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
+++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
@@ -17,10 +17,10 @@
#include <PiDxe.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
-#include <Library/CpldD06.h>
#include <Library/CpldIoLib.h>
#include <Library/DebugLib.h>
#include <Library/I2CLib.h>
+#include <Library/OemMiscLib.h>
#include <Library/TimeBaseLib.h>
#include <Library/TimerLib.h>
#include <Library/UefiLib.h>
@@ -32,70 +32,6 @@ extern I2C_DEVICE gRtcDevice;
STATIC EFI_LOCK mRtcLock;
-EFI_STATUS
-SwitchRtcI2cChannelAndLock (
- VOID
- )
-{
- UINT8 Temp;
- UINT8 Count;
-
- for (Count = 0; Count < 100; Count++) {
- // To get the other side's state is idle first
- Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
- if ((Temp & BIT3) != 0) {
- (VOID) MicroSecondDelay (RTC_DELAY_30_MS);
- // Try 100 times, if BMC has not released the bus, return preemption failed
- if (Count == 99) {
- if (!EfiAtRuntime ()) {
- DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state 100 times fail!\n",
- __FUNCTION__, __LINE__));
- }
- return EFI_DEVICE_ERROR;
- }
- continue;
- }
-
- // if BMC free the bus, can be set 1 preemption
- Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
- Temp = Temp | CPU_GET_I2C_CONTROL;
- // CPU occupied RTC I2C State
- WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
- (VOID) MicroSecondDelay (RTC_DELAY_2_MACROSECOND);
- Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
- // Is preempt success
- if(CPU_GET_I2C_CONTROL == (Temp & CPU_GET_I2C_CONTROL)) {
- break;
- }
- if (Count == 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 = 0; Count < 100; Count++) {
- Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
- if ((Temp & BIT3) == 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 = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
- Temp = Temp & (~CPU_GET_I2C_CONTROL);
- WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
-
- return EFI_NOT_READY;
-}
-
-
/**
Read RTC content through its registers.
@@ -142,18 +78,6 @@ RtcWrite (
return Status;
}
-VOID
-ReleaseOwnershipOfRtc (
- VOID
- )
-{
- UINT8 Temp;
-
- Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
- Temp = Temp & ~CPU_GET_I2C_CONTROL;
- WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
-}
-
EFI_STATUS
InitializeM41T83 (
@@ -178,7 +102,7 @@ InitializeM41T83 (
return Status;
}
- Status = SwitchRtcI2cChannelAndLock ();
+ Status = OemSwitchRtcI2cChannelAndLock ();
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Get i2c preemption failed: %r\n", Status));
if (!EfiAtRuntime ()) {
@@ -231,7 +155,7 @@ InitializeM41T83 (
Exit:
// Release RTC Lock.
- ReleaseOwnershipOfRtc ();
+ OemReleaseOwnershipOfRtc ();
if (!EfiAtRuntime ()) {
EfiReleaseLock (&mRtcLock);
}
@@ -274,7 +198,7 @@ LibSetTime (
return EFI_INVALID_PARAMETER;
}
- Status = SwitchRtcI2cChannelAndLock ();
+ Status = OemSwitchRtcI2cChannelAndLock ();
if (EFI_ERROR (Status)) {
return Status;
}
@@ -332,7 +256,7 @@ LibSetTime (
}
Exit:
- ReleaseOwnershipOfRtc ();
+ OemReleaseOwnershipOfRtc ();
// Release RTC Lock.
if (!EfiAtRuntime ()) {
if (EFI_ERROR (Status)) {
@@ -377,7 +301,7 @@ LibGetTime (
return EFI_INVALID_PARAMETER;
}
- Status = SwitchRtcI2cChannelAndLock ();
+ Status = OemSwitchRtcI2cChannelAndLock ();
if (EFI_ERROR (Status)) {
return Status;
}
@@ -422,7 +346,7 @@ LibGetTime (
}
Exit:
- ReleaseOwnershipOfRtc ();
+ OemReleaseOwnershipOfRtc ();
// Release RTC Lock.
if (!EfiAtRuntime ()) {
if (EFI_ERROR (Status)) {
--
2.18.0
next prev parent reply other threads:[~2018-10-29 3:33 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-29 3:32 [PATCH edk2-platforms v1 00/12] Fix D06 SBSA/SBBR issue and improve Ming Huang
2018-10-29 3:32 ` [PATCH edk2-platforms v1 01/12] Silicon/Hisilicon/D06: Add watchdog to GTDT Ming Huang
2018-11-14 0:39 ` Leif Lindholm
2018-10-29 3:32 ` [PATCH edk2-platforms v1 02/12] Silicon/Hisilicon/D06: Drop _CID for fwts issue Ming Huang
2018-11-14 0:48 ` Leif Lindholm
2018-10-29 3:32 ` [PATCH edk2-platforms v1 03/12] Silicon/Hisilicon/D06: Fix fwts issue in Dbg2 Ming Huang
2018-11-14 0:50 ` Leif Lindholm
2018-10-29 3:32 ` [PATCH edk2-platforms v1 04/12] Silicon/Hisilicon/D06: Fix fwts issue in FADT Ming Huang
2018-11-14 0:50 ` Leif Lindholm
2018-10-29 3:32 ` Ming Huang [this message]
2018-11-14 0:04 ` [PATCH edk2-platforms v1 05/12] Hisilicon/D06: Move some functions to OemMiscLib Leif Lindholm
2018-11-14 14:30 ` Ming Huang
2018-10-29 3:32 ` [PATCH edk2-platforms v1 06/12] Silicon/Hisilicon: Modify for SBBR fwts SetTime_Func test case Ming Huang
[not found] ` <20181113235222.amykmhqlh5gltg7p@bivouac.eciton.net>
2018-11-14 14:31 ` Ming Huang
2018-11-14 17:20 ` Leif Lindholm
2018-10-29 3:32 ` [PATCH edk2-platforms v1 07/12] Hisilicon/D0x: Fix secure boot bug in FlashFvbDxe Ming Huang
2018-11-13 23:57 ` Leif Lindholm
2018-11-15 7:09 ` Ming Huang
2018-10-29 3:32 ` [PATCH edk2-platforms v1 08/12] Hisilicon/D06: Fix SBBR-SCT AuthVar issue Ming Huang
2018-11-14 0:18 ` Leif Lindholm
2018-11-14 14:31 ` Ming Huang
2018-10-29 3:32 ` [PATCH edk2-platforms v1 09/12] Silicon/Hisilicon/D06: Reserve ECAM resource in DSDT Ming Huang
2018-11-14 0:23 ` Leif Lindholm
2018-10-29 3:32 ` [PATCH edk2-platforms v1 10/12] Silicon/Hisilicon/D06: Modify GTDT timer flag Ming Huang
2018-11-14 0:24 ` Leif Lindholm
2018-10-29 3:32 ` [PATCH edk2-platforms v1 11/12] Hisilicon/D06: Modify Gic base Ming Huang
2018-11-14 0:29 ` Leif Lindholm
2018-11-14 14:31 ` Ming Huang
2018-10-29 3:32 ` [PATCH edk2-platforms v1 12/12] Silicon/Hisilicon/D06: Set TA as Node 0 for TA boot Ming Huang
2018-11-14 0:36 ` Leif Lindholm
2018-11-14 14:32 ` Ming Huang
2018-10-29 11:43 ` [PATCH edk2-platforms v1 00/12] Fix D06 SBSA/SBBR issue and improve Leif Lindholm
2018-10-29 15:01 ` Ming Huang
2018-10-29 16:14 ` Leif Lindholm
[not found] ` <5eaaf9d7-e76b-2e98-f4c8-bb0a27007cfc@huawei.com>
2018-10-30 9:37 ` Leif Lindholm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181029033249.45363-6-ming.huang@linaro.org \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox