Re: [edk2] [PATCH v2 2/3] ArmPlatformPkg/LcdGraphicsOutputDxe: check PrimeCell ID before initializing

2015-08-27 Thread Ryan Harkin
On 18 August 2015 at 15:10, Ard Biesheuvel 
wrote:

> To deal gracefully with the absence of the PL111 hardware on
> the Foundation model, check the PrimeCell ID before proceeding
> with the installation.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel 
> Reviewed-by: Leif Lindholm 
> ---
>  ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c |  5
> +
>  ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h |  2 +-
>  ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c | 22
> 
>  ArmPlatformPkg/Include/Drivers/PL111Lcd.h  |  9
> 
>  4 files changed, 37 insertions(+), 1 deletion(-)
>
> diff --git
> a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c
> b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c
> index cbc20343496b..b721061fc1df 100644
> --- a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c
> +++ b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c
> @@ -156,6 +156,11 @@ LcdGraphicsOutputDxeInitialize (
>EFI_STATUS  Status = EFI_SUCCESS;
>LCD_INSTANCE* Instance;
>
> +  Status = LcdIdentify ();
> +  if (EFI_ERROR(Status)) {
> +goto EXIT;
> +  }
> +
>Status = LcdInstanceContructor (&Instance);
>if (EFI_ERROR(Status)) {
>  goto EXIT;
> diff --git
> a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h
> b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h
> index dfbf2ed67122..8856b79901b6 100644
> --- a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h
> +++ b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h
> @@ -106,7 +106,7 @@ InitializeDisplay (
>  );
>
>  EFI_STATUS
> -LcdIndentify (
> +LcdIdentify (
>VOID
>  );
>
> diff --git a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
> b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
> index ad841cd8dcac..b5e113b844d4 100644
> --- a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
> +++ b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
> @@ -27,6 +27,28 @@
>   **/
>
>  EFI_STATUS
> +LcdIdentify (
> +  VOID
> +  )
> +{
> +  DEBUG ((EFI_D_WARN, "Probing ID registers at 0x%lx for a PL111\n",
> +PL111_REG_CLCD_PERIPH_ID_0));
> +
> +  // Check if this is a PL111
> +  if (MmioRead8 (PL111_REG_CLCD_PERIPH_ID_0) == PL111_CLCD_PERIPH_ID_0 &&
> +  MmioRead8 (PL111_REG_CLCD_PERIPH_ID_1) == PL111_CLCD_PERIPH_ID_1 &&
> + (MmioRead8 (PL111_REG_CLCD_PERIPH_ID_2) & 0xf) ==
> PL111_CLCD_PERIPH_ID_2 &&
>

I'd prefer it if we #defined the mask, but I don't really mind as it's
clear enough if you look at this with the spec beside you.


> +  MmioRead8 (PL111_REG_CLCD_PERIPH_ID_3) == PL111_CLCD_PERIPH_ID_3 &&
> +  MmioRead8 (PL111_REG_CLCD_P_CELL_ID_0) == PL111_CLCD_P_CELL_ID_0 &&
> +  MmioRead8 (PL111_REG_CLCD_P_CELL_ID_1) == PL111_CLCD_P_CELL_ID_1 &&
> +  MmioRead8 (PL111_REG_CLCD_P_CELL_ID_2) == PL111_CLCD_P_CELL_ID_2 &&
> +  MmioRead8 (PL111_REG_CLCD_P_CELL_ID_3) == PL111_CLCD_P_CELL_ID_3) {
> +return EFI_SUCCESS;
> +  }
> +  return EFI_NOT_FOUND;
> +}
> +
> +EFI_STATUS
>  LcdInitialize (
>IN EFI_PHYSICAL_ADDRESS   VramBaseAddress
>)
> diff --git a/ArmPlatformPkg/Include/Drivers/PL111Lcd.h
> b/ArmPlatformPkg/Include/Drivers/PL111Lcd.h
> index 8c1c29de6cdd..18e28af805f6 100644
> --- a/ArmPlatformPkg/Include/Drivers/PL111Lcd.h
> +++ b/ArmPlatformPkg/Include/Drivers/PL111Lcd.h
> @@ -47,6 +47,15 @@
>  #define PL111_REG_CLCD_P_CELL_ID_2((UINTN)PcdGet32
> (PcdPL111LcdBase) + 0xFF8)
>  #define PL111_REG_CLCD_P_CELL_ID_3((UINTN)PcdGet32
> (PcdPL111LcdBase) + 0xFFC)
>
> +#define PL111_CLCD_PERIPH_ID_00x11
> +#define PL111_CLCD_PERIPH_ID_10x11
> +#define PL111_CLCD_PERIPH_ID_20x04
> +#define PL111_CLCD_PERIPH_ID_30x00
> +#define PL111_CLCD_P_CELL_ID_00x0D
> +#define PL111_CLCD_P_CELL_ID_10xF0
> +#define PL111_CLCD_P_CELL_ID_20x05
> +#define PL111_CLCD_P_CELL_ID_30xB1
> +
>  /**/
>
>  // Register components (register bits)
> --
> 1.9.1
>
>
Reviewed-by: Ryan Harkin 
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


[edk2] [PATCH v2 2/3] ArmPlatformPkg/LcdGraphicsOutputDxe: check PrimeCell ID before initializing

2015-08-18 Thread Ard Biesheuvel
To deal gracefully with the absence of the PL111 hardware on
the Foundation model, check the PrimeCell ID before proceeding
with the installation.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel 
Reviewed-by: Leif Lindholm 
---
 ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c |  5 +
 ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h |  2 +-
 ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c | 22 

 ArmPlatformPkg/Include/Drivers/PL111Lcd.h  |  9 

 4 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c 
b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c
index cbc20343496b..b721061fc1df 100644
--- a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c
+++ b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c
@@ -156,6 +156,11 @@ LcdGraphicsOutputDxeInitialize (
   EFI_STATUS  Status = EFI_SUCCESS;
   LCD_INSTANCE* Instance;
 
+  Status = LcdIdentify ();
+  if (EFI_ERROR(Status)) {
+goto EXIT;
+  }
+
   Status = LcdInstanceContructor (&Instance);
   if (EFI_ERROR(Status)) {
 goto EXIT;
diff --git a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h 
b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h
index dfbf2ed67122..8856b79901b6 100644
--- a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h
+++ b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h
@@ -106,7 +106,7 @@ InitializeDisplay (
 );
 
 EFI_STATUS
-LcdIndentify (
+LcdIdentify (
   VOID
 );
 
diff --git a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c 
b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
index ad841cd8dcac..b5e113b844d4 100644
--- a/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
+++ b/ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
@@ -27,6 +27,28 @@
  **/
 
 EFI_STATUS
+LcdIdentify (
+  VOID
+  )
+{
+  DEBUG ((EFI_D_WARN, "Probing ID registers at 0x%lx for a PL111\n",
+PL111_REG_CLCD_PERIPH_ID_0));
+
+  // Check if this is a PL111
+  if (MmioRead8 (PL111_REG_CLCD_PERIPH_ID_0) == PL111_CLCD_PERIPH_ID_0 &&
+  MmioRead8 (PL111_REG_CLCD_PERIPH_ID_1) == PL111_CLCD_PERIPH_ID_1 &&
+ (MmioRead8 (PL111_REG_CLCD_PERIPH_ID_2) & 0xf) == PL111_CLCD_PERIPH_ID_2 
&&
+  MmioRead8 (PL111_REG_CLCD_PERIPH_ID_3) == PL111_CLCD_PERIPH_ID_3 &&
+  MmioRead8 (PL111_REG_CLCD_P_CELL_ID_0) == PL111_CLCD_P_CELL_ID_0 &&
+  MmioRead8 (PL111_REG_CLCD_P_CELL_ID_1) == PL111_CLCD_P_CELL_ID_1 &&
+  MmioRead8 (PL111_REG_CLCD_P_CELL_ID_2) == PL111_CLCD_P_CELL_ID_2 &&
+  MmioRead8 (PL111_REG_CLCD_P_CELL_ID_3) == PL111_CLCD_P_CELL_ID_3) {
+return EFI_SUCCESS;
+  }
+  return EFI_NOT_FOUND;
+}
+
+EFI_STATUS
 LcdInitialize (
   IN EFI_PHYSICAL_ADDRESS   VramBaseAddress
   )
diff --git a/ArmPlatformPkg/Include/Drivers/PL111Lcd.h 
b/ArmPlatformPkg/Include/Drivers/PL111Lcd.h
index 8c1c29de6cdd..18e28af805f6 100644
--- a/ArmPlatformPkg/Include/Drivers/PL111Lcd.h
+++ b/ArmPlatformPkg/Include/Drivers/PL111Lcd.h
@@ -47,6 +47,15 @@
 #define PL111_REG_CLCD_P_CELL_ID_2((UINTN)PcdGet32 (PcdPL111LcdBase) + 
0xFF8)
 #define PL111_REG_CLCD_P_CELL_ID_3((UINTN)PcdGet32 (PcdPL111LcdBase) + 
0xFFC)
 
+#define PL111_CLCD_PERIPH_ID_00x11
+#define PL111_CLCD_PERIPH_ID_10x11
+#define PL111_CLCD_PERIPH_ID_20x04
+#define PL111_CLCD_PERIPH_ID_30x00
+#define PL111_CLCD_P_CELL_ID_00x0D
+#define PL111_CLCD_P_CELL_ID_10xF0
+#define PL111_CLCD_P_CELL_ID_20x05
+#define PL111_CLCD_P_CELL_ID_30xB1
+
 /**/
 
 // Register components (register bits)
-- 
1.9.1

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