summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoey Gouly <joey.gouly@arm.com>2021-04-15 13:17:19 +0100
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2021-04-19 13:28:26 +0000
commita300f2a3f54c2ab1c9a74fc8fbf67f240c3a68ec (patch)
tree6e9f18f7b863440e50f12968e2f4902e1a5e67c1
parentc8cf71ec9c2518a0e35983c03bb1f8e594593a49 (diff)
downloadedk2-a300f2a3f54c2ab1c9a74fc8fbf67f240c3a68ec.tar.gz
edk2-a300f2a3f54c2ab1c9a74fc8fbf67f240c3a68ec.tar.bz2
edk2-a300f2a3f54c2ab1c9a74fc8fbf67f240c3a68ec.zip
DynamicTablesPkg: Set the Access size for the SPCR table
The SPCR table generator set the access size for the UART to DWORD (4 bytes) by default. However, according to Section B Generic UART, Arm Base System Architecture 1.0, Platform Design Document, a Generic UART can have BYTE, WORD or DWORD access sizes. To address this an AccessSize field has been introduced in CM_ARM_SERIAL_PORT_INFO object. This patch updates the SPCR generator to setup the AccessSize field in the Generic Address Structure (GAS) for the UART in the SPCR table with information provided by the platform. Signed-off-by: Joey Gouly <joey.gouly@arm.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
-rw-r--r--DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/SpcrGenerator.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/SpcrGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/SpcrGenerator.c
index 24bb5c0146..fecfd6bbab 100644
--- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/SpcrGenerator.c
+++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/SpcrGenerator.c
@@ -1,7 +1,7 @@
/** @file
SPCR Table Generator
- Copyright (c) 2017 - 2020, Arm Limited. All rights reserved.<BR>
+ Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -313,6 +313,26 @@ BuildSpcrTableEx (
// Update the base address
AcpiSpcr.BaseAddress.Address = SerialPortInfo->BaseAddress;
+ // Set the access size
+ if (SerialPortInfo->AccessSize >= EFI_ACPI_6_3_QWORD) {
+ Status = EFI_INVALID_PARAMETER;
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: SPCR: Access size must be <= 3 (DWORD). Status = %r\n",
+ Status
+ ));
+ goto error_handler;
+ } else if (SerialPortInfo->AccessSize == EFI_ACPI_6_3_UNDEFINED) {
+ // 0 Undefined (legacy reasons)
+ // Default to DWORD access size as the access
+ // size field was introduced at a later date
+ // and some ConfigurationManager implementations
+ // may not be providing this field data
+ AcpiSpcr.BaseAddress.AccessSize = EFI_ACPI_6_3_DWORD;
+ } else {
+ AcpiSpcr.BaseAddress.AccessSize = SerialPortInfo->AccessSize;
+ }
+
// Update the UART interrupt
AcpiSpcr.GlobalSystemInterrupt = SerialPortInfo->Interrupt;