Because I2C Port5 salve device connect under I2C extender
(9545 device), it will cost more time to access I2C slave
device, so add delay time for HNS auto config.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.hu...@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindh...@linaro.org>
---
 Silicon/Hisilicon/Library/I2CLib/I2CHw.h  |  3 +++
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 21 +++++++++++++++-----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h 
b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
index 083545448b..6fd7b8183e 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
@@ -19,6 +19,9 @@
 #include <Uefi.h>
 #include <Library/IoLib.h>
 
+// The HNS I2C port 5 is under I2C extender
+#define I2C_EXTENDER_PORT_HNS        5
+
 #define I2C_READ_TIMEOUT             500
 #define I2C_DRV_ONCE_WRITE_BYTES_NUM 8
 #define I2C_DRV_ONCE_READ_BYTES_NUM  8
diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c 
b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
index e3d9906135..b8c92fa8ea 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
@@ -258,8 +258,13 @@ CheckI2CTimeOut (
   if (Transfer == I2CTx) {
     Fifo = I2C_GetTxStatus (Socket, Port);
     while (Fifo != 0) {
-      // This is a empirical value for I2C delay. MemoryFence is no need here.
-      I2C_Delay (2);
+      if (Port == I2C_EXTENDER_PORT_HNS) {
+        // This is a empirical value for I2C delay. MemoryFence is no need 
here.
+        I2C_Delay (1000);
+      } else {
+        // This is a empirical value for I2C delay. MemoryFence is no need 
here.
+        I2C_Delay (2);
+      }
       if (++Times > I2C_READ_TIMEOUT) {
         (VOID)I2C_Disable (Socket, Port);
         return EFI_TIMEOUT;
@@ -269,8 +274,13 @@ CheckI2CTimeOut (
   } else {
     Fifo = I2C_GetRxStatus (Socket, Port);
     while (Fifo == 0) {
-      // This is a empirical value for I2C delay. MemoryFence is no need here.
-      I2C_Delay (2);
+      if (Port == I2C_EXTENDER_PORT_HNS) {
+        // This is a empirical value for I2C delay. MemoryFence is no need 
here.
+        I2C_Delay (1000);
+      } else {
+        // This is a empirical value for I2C delay. MemoryFence is no need 
here.
+        I2C_Delay (2);
+      }
       if (++Times > I2C_READ_TIMEOUT) {
         (VOID)I2C_Disable (Socket, Port);
         return EFI_TIMEOUT;
@@ -369,7 +379,8 @@ I2CWrite(
     Times = 0;
     Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
     while (Fifo > I2C_TXRX_THRESHOLD) {
-      I2C_Delay (2);
+      // This is a empirical value for I2C delay. MemoryFence is no need here.
+      I2C_Delay (1000);
       if (++Times > I2C_READ_TIMEOUT) {
         (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
         return EFI_TIMEOUT;
-- 
2.18.0

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to