[Linaro-uefi,2/2] Platforms/ARM/Juno: Use PCDs for SPCR info

Message ID 20160627162325.7888-3-evan.lloyd@arm.com
State New
Headers show

Commit Message

Evan Lloyd June 27, 2016, 4:23 p.m.
From: Evan Lloyd <evan.lloyd@arm.com>

The original SPCR used explicit constants for hardware details.
That made it difficult to readilly adjust the use of serial ports.
This change modifies the explicit constants to use PCDs, so the serial
port usage can be adjusted at build.  This can help avoid problems where
sharing ports (e.g. between UEFI trace and host debug) causes fails.

Because the SPCR baud rate selection does not map directly to the PCD
used, a compile time error has been added for baud rates not matching
the SPCR specification.  This is beneficial as it is quite difficult
to diagnose an invalid baud rate otherwise.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Evan Lloyd <evan.lloyd@arm.com>
---

Notes:
    SPCR_v3:
    - Split into 2 commits (aslc then PCDs) [Leif Lindholm]

 Platforms/ARM/Juno/ArmJuno.dsc               |  1 +
 Platforms/ARM/Juno/AcpiTables/AcpiTables.inf |  8 ++++++++
 Platforms/ARM/Juno/AcpiTables/Spcr.aslc      | 14 ++++++++++++--
 3 files changed, 21 insertions(+), 2 deletions(-)

Patch

diff --git a/Platforms/ARM/Juno/ArmJuno.dsc b/Platforms/ARM/Juno/ArmJuno.dsc
index 2caa7413dec3f9f8969b5de28d0a49402fe71e86..3626dfb6e5834f36d136214550ecfde7ed41e4e5 100644
--- a/Platforms/ARM/Juno/ArmJuno.dsc
+++ b/Platforms/ARM/Juno/ArmJuno.dsc
@@ -124,6 +124,7 @@ 
   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultReceiveFifoDepth|0
   gArmPlatformTokenSpaceGuid.PL011UartInteger|4
   gArmPlatformTokenSpaceGuid.PL011UartFractional|0
+  gArmPlatformTokenSpaceGuid.PL011UartInterrupt|115
 
   ## PL031 RealTimeClock
   gArmPlatformTokenSpaceGuid.PcdPL031RtcBase|0x1C170000
diff --git a/Platforms/ARM/Juno/AcpiTables/AcpiTables.inf b/Platforms/ARM/Juno/AcpiTables/AcpiTables.inf
index 3caf4afdc82f9cd6b275d155857b09f3c9a6b8d0..d62068d65846d9032bc0771cfa7c80e7fd559ee3 100644
--- a/Platforms/ARM/Juno/AcpiTables/AcpiTables.inf
+++ b/Platforms/ARM/Juno/AcpiTables/AcpiTables.inf
@@ -51,3 +51,11 @@ 
 
   gArmTokenSpaceGuid.PcdGenericWatchdogControlBase
   gArmTokenSpaceGuid.PcdGenericWatchdogRefreshBase
+
+  #
+  # PL011 UART Settings for Serial Port Console Redirection
+  #
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
+  gArmPlatformTokenSpaceGuid.PL011UartClkInHz
+  gArmPlatformTokenSpaceGuid.PL011UartInterrupt
diff --git a/Platforms/ARM/Juno/AcpiTables/Spcr.aslc b/Platforms/ARM/Juno/AcpiTables/Spcr.aslc
index 6fea989b13ea2cce389c898e290080327e4202e2..8371669b7beb3a213b78379803f631ff17b21ce8 100644
--- a/Platforms/ARM/Juno/AcpiTables/Spcr.aslc
+++ b/Platforms/ARM/Juno/AcpiTables/Spcr.aslc
@@ -45,15 +45,25 @@  STATIC EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE Spcr = {
     EFI_ACPI_RESERVED_BYTE
   },
   // EFI_ACPI_5_0_GENERIC_ADDRESS_STRUCTURE  BaseAddress;
-  ARM_GAS32 (0x7FF80000),
+  ARM_GAS32 (FixedPcdGet64 (PcdSerialRegisterBase)),
   // UINT8                                   InterruptType;
   EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC,
   // UINT8                                   Irq;
   0,                                         // Not used on ARM
   // UINT32                                  GlobalSystemInterrupt;
-  0x73,
+  FixedPcdGet32 (PL011UartInterrupt),
   // UINT8                                   BaudRate;
+#if (FixedPcdGet64 (PcdUartDefaultBaudRate) == 9600)
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_BAUD_RATE_9600,
+#elif (FixedPcdGet64 (PcdUartDefaultBaudRate) == 19200)
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_BAUD_RATE_19200,
+#elif (FixedPcdGet64 (PcdUartDefaultBaudRate) == 57600)
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_BAUD_RATE_57600,
+#elif (FixedPcdGet64 (PcdUartDefaultBaudRate) == 115200)
   EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_BAUD_RATE_115200,
+#else
+#error Unsupported SPCR Baud Rate
+#endif
   // UINT8                                   Parity;
   EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_PARITY_NO_PARITY,
   // UINT8                                   StopBits;