Re: [edk2] [PATCH edk2-platforms v2 22/43] Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06

2018-08-22 Thread Leif Lindholm
On Tue, Aug 14, 2018 at 04:08:42PM +0800, Ming Huang wrote:
> I2C may enable failed in D06, so retry I2C enable while
> enable failed.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang 
> ---
>  Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 18 --
>  1 file changed, 12 insertions(+), 6 deletions(-)

Please change subject line to:
Silicon/Hisilicon: Fix I2CLib enable fail issue
and reorder it before the first D06 patch.

With that:
Reviewed-by: Leif Lindholm 

> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c 
> b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> index 9174e50dd4..d67ddc7f9b 100644
> --- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> @@ -86,6 +86,7 @@ I2C_Enable (
>  {
>I2C0_ENABLE_U   I2cEnableReg;
>I2C0_ENABLE_STATUS_UI2cEnableStatusReg;
> +  UINT32  TimeCnt = I2C_READ_TIMEOUT;
>  
>UINTN Base = GetI2cBase (Socket, Port);
>  
> @@ -93,13 +94,18 @@ I2C_Enable (
>I2cEnableReg.bits.enable = 1;
>I2C_REG_WRITE (Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
>  
> +  do {
> +// This is a empirical value for I2C delay. MemoryFance is no need here.
> +I2C_Delay (1);
>  
> -  I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
> -  if (I2cEnableStatusReg.bits.ic_en == 1) {
> -return EFI_SUCCESS;
> -  } else {
> -return EFI_DEVICE_ERROR;
> -  }
> +TimeCnt--;
> +I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
> +if (TimeCnt == 0) {
> +  return EFI_DEVICE_ERROR;
> +}
> +  } while (I2cEnableStatusReg.bits.ic_en == 0);
> +
> +  return EFI_SUCCESS;
>  }
>  
>  VOID
> -- 
> 2.17.0
> 
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


[edk2] [PATCH edk2-platforms v2 22/43] Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06

2018-08-14 Thread Ming Huang
I2C may enable failed in D06, so retry I2C enable while
enable failed.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang 
---
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 18 --
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c 
b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
index 9174e50dd4..d67ddc7f9b 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
@@ -86,6 +86,7 @@ I2C_Enable (
 {
   I2C0_ENABLE_U   I2cEnableReg;
   I2C0_ENABLE_STATUS_UI2cEnableStatusReg;
+  UINT32  TimeCnt = I2C_READ_TIMEOUT;
 
   UINTN Base = GetI2cBase (Socket, Port);
 
@@ -93,13 +94,18 @@ I2C_Enable (
   I2cEnableReg.bits.enable = 1;
   I2C_REG_WRITE (Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
 
+  do {
+// This is a empirical value for I2C delay. MemoryFance is no need here.
+I2C_Delay (1);
 
-  I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
-  if (I2cEnableStatusReg.bits.ic_en == 1) {
-return EFI_SUCCESS;
-  } else {
-return EFI_DEVICE_ERROR;
-  }
+TimeCnt--;
+I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
+if (TimeCnt == 0) {
+  return EFI_DEVICE_ERROR;
+}
+  } while (I2cEnableStatusReg.bits.ic_en == 0);
+
+  return EFI_SUCCESS;
 }
 
 VOID
-- 
2.17.0

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