Browse Source

ArmPlatformPkg: PCD to swap red/blue format for HDLCD

This change adds a new PCD PcdArmHdlcdSwapBlueRedSelect
to swap values for HDLCD RED_SELECT and BLUE_SELECT registers
on platforms where blue and red hardware lines are swapped.

If set to TRUE in the platform dsc, HDLCD library will swap the values
while setting RED_SELECT and BLUE_SELECT registers. The default
value of the PCD is FALSE.

NOTE: The motive for this is that a discrepancy in the Red/Blue lines
exists between some VersatileExpress platforms.  Rather than have
divergent code, this build switch allows a simple, pragmatic solution.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Girish Pathak <girish.pathak@arm.com>
Signed-off-by: Evan Lloyd <evan.lloyd@arm.com>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
Girish Pathak 6 years ago
parent
commit
268aad6744

+ 3 - 0
ArmPlatformPkg/ArmPlatformPkg.dec

@@ -100,6 +100,9 @@
   # Default is set to UEFI console font format PixelBlueGreenRedReserved8BitPerColor
   gArmPlatformTokenSpaceGuid.PcdGopPixelFormat|0x00000001|UINT32|0x00000040
 
+  ## If set, this will swap settings for HDLCD RED_SELECT and BLUE_SELECT registers
+  gArmPlatformTokenSpaceGuid.PcdArmHdLcdSwapBlueRedSelect|FALSE|BOOLEAN|0x00000045
+
 [PcdsFixedAtBuild.common,PcdsDynamic.common]
   ## PL031 RealTimeClock
   gArmPlatformTokenSpaceGuid.PcdPL031RtcBase|0x0|UINT32|0x00000024

+ 10 - 1
ArmPlatformPkg/Library/HdLcd/HdLcd.c

@@ -73,6 +73,8 @@ LcdSetMode (
   SCAN_TIMINGS      *Horizontal;
   SCAN_TIMINGS      *Vertical;
 
+  EFI_GRAPHICS_PIXEL_FORMAT  PixelFormat;
+
   EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  ModeInfo;
 
   // Set the video mode timings and other relevant information
@@ -96,7 +98,14 @@ LcdSetMode (
     return Status;
   }
 
-  if (ModeInfo.PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
+  // By default PcdArmHdLcdSwapBlueRedSelect is set to false
+  // However on the Juno platform HW lines for BLUE and RED are swapped
+  // Therefore PcdArmHdLcdSwapBlueRedSelect is set to TRUE for the Juno platform
+  PixelFormat = FixedPcdGetBool (PcdArmHdLcdSwapBlueRedSelect)
+                ? PixelRedGreenBlueReserved8BitPerColor
+                : PixelBlueGreenRedReserved8BitPerColor;
+
+  if (ModeInfo.PixelFormat == PixelFormat) {
     MmioWrite32 (HDLCD_REG_RED_SELECT,  (8 << 8) | 16);
     MmioWrite32 (HDLCD_REG_BLUE_SELECT, (8 << 8) | 0);
   } else {

+ 3 - 1
ArmPlatformPkg/Library/HdLcd/HdLcd.inf

@@ -2,7 +2,7 @@
 #
 #  Component description file for HDLCD module
 #
-#  Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
+#  Copyright (c) 2011-2018, ARM Ltd. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD License
@@ -40,3 +40,5 @@
 
 [FixedPcd]
   gArmPlatformTokenSpaceGuid.PcdArmHdLcdBase
+  gArmPlatformTokenSpaceGuid.PcdArmHdLcdSwapBlueRedSelect
+