ArmPlatformPkg/LcdGraphicsOutputDxe: check PrimeCell ID before initializing
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 25 Aug 2015 13:11:11 +0000 (13:11 +0000)
committerabiesheuvel <abiesheuvel@Edk2>
Tue, 25 Aug 2015 13:11:11 +0000 (13:11 +0000)
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 <ard.biesheuvel@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18308 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c
ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.h
ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/PL111Lcd.c
ArmPlatformPkg/Include/Drivers/PL111Lcd.h

index cbc2034..b721061 100644 (file)
@@ -156,6 +156,11 @@ LcdGraphicsOutputDxeInitialize (
   EFI_STATUS  Status = EFI_SUCCESS;\r
   LCD_INSTANCE* Instance;\r
 \r
+  Status = LcdIdentify ();\r
+  if (EFI_ERROR(Status)) {\r
+    goto EXIT;\r
+  }\r
+\r
   Status = LcdInstanceContructor (&Instance);\r
   if (EFI_ERROR(Status)) {\r
     goto EXIT;\r
index ad841cd..b5e113b 100644 (file)
  *\r
  **********************************************************************/\r
 \r
+EFI_STATUS\r
+LcdIdentify (\r
+  VOID\r
+  )\r
+{\r
+  DEBUG ((EFI_D_WARN, "Probing ID registers at 0x%lx for a PL111\n",\r
+    PL111_REG_CLCD_PERIPH_ID_0));\r
+\r
+  // Check if this is a PL111\r
+  if (MmioRead8 (PL111_REG_CLCD_PERIPH_ID_0) == PL111_CLCD_PERIPH_ID_0 &&\r
+      MmioRead8 (PL111_REG_CLCD_PERIPH_ID_1) == PL111_CLCD_PERIPH_ID_1 &&\r
+     (MmioRead8 (PL111_REG_CLCD_PERIPH_ID_2) & 0xf) == PL111_CLCD_PERIPH_ID_2 &&\r
+      MmioRead8 (PL111_REG_CLCD_PERIPH_ID_3) == PL111_CLCD_PERIPH_ID_3 &&\r
+      MmioRead8 (PL111_REG_CLCD_P_CELL_ID_0) == PL111_CLCD_P_CELL_ID_0 &&\r
+      MmioRead8 (PL111_REG_CLCD_P_CELL_ID_1) == PL111_CLCD_P_CELL_ID_1 &&\r
+      MmioRead8 (PL111_REG_CLCD_P_CELL_ID_2) == PL111_CLCD_P_CELL_ID_2 &&\r
+      MmioRead8 (PL111_REG_CLCD_P_CELL_ID_3) == PL111_CLCD_P_CELL_ID_3) {\r
+    return EFI_SUCCESS;\r
+  }\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
 EFI_STATUS\r
 LcdInitialize (\r
   IN EFI_PHYSICAL_ADDRESS   VramBaseAddress\r
index 8c1c29d..18e28af 100644 (file)
 #define PL111_REG_CLCD_P_CELL_ID_2        ((UINTN)PcdGet32 (PcdPL111LcdBase) + 0xFF8)\r
 #define PL111_REG_CLCD_P_CELL_ID_3        ((UINTN)PcdGet32 (PcdPL111LcdBase) + 0xFFC)\r
 \r
+#define PL111_CLCD_PERIPH_ID_0            0x11\r
+#define PL111_CLCD_PERIPH_ID_1            0x11\r
+#define PL111_CLCD_PERIPH_ID_2            0x04\r
+#define PL111_CLCD_PERIPH_ID_3            0x00\r
+#define PL111_CLCD_P_CELL_ID_0            0x0D\r
+#define PL111_CLCD_P_CELL_ID_1            0xF0\r
+#define PL111_CLCD_P_CELL_ID_2            0x05\r
+#define PL111_CLCD_P_CELL_ID_3            0xB1\r
+\r
 /**********************************************************************/\r
 \r
 // Register components (register bits)\r