[edk2-devel] [PATCH v4 1/3] Platform/RaspberryPi: Dynamically build UARTs info in ACPI

Pete Batard pete at akeo.ie
Sat Jun 12 13:39:55 UTC 2021


No more comments on this series for me.

I have also tested this patch using Putty (serial) on Windows ARM64, to 
validate that COM1: was set to the serial output defined in config.txt, 
be it miniUART or PL011.

The only thing I saw was that the baudrate for PL011 was double the one 
set in Putty, but this is an issue with the Windows drivers using 
hardcoded clocks 
(https://github.com/raspberrypi/windows-drivers/issues/33) and unrelated 
to these changes.

With this:

On 2021.06.07 08:53, Sunny Wang wrote:
> Changes:
>    1. Add code to ConfigDxe driver and AcpiTables module to dynamically
>       build either Mini UART or PL011 UART info in ACPI. This also fixes
>       the issue discussed in https://github.com/pftf/RPi4/issues/118.
>    2. Cleanup by moving duplicate Debug Port 2 table related defines and
>       structures to a newly created header file (RpiDebugPort2Table.h).
> 
> Testing Done:
>    - Booted to UEFI shell and use acpiview command to check the result of
>      the different UART settings in config.txt (enabling either Mini UART
>      or PL011) and SPCR, DBG2 tables and device BTH0 are dynamically
>      changed as expected.
> 
> Cc: Samer El-Haj-Mahmoud <samer.el-haj-mahmoud at arm.com>
> Cc: Sami Mujawar <sami.mujawar at arm.com>
> Cc: Jeremy Linton <jeremy.linton at arm.com>
> Cc: Pete Batard <pete at akeo.ie>
> Cc: Ard Biesheuvel <ardb+tianocore at kernel.org>
> Cc: Mario Bălănică <mariobalanica02 at gmail.com>
> Signed-off-by: Sunny Wang <sunny.wang at arm.com>
> ---
>   .../RaspberryPi/AcpiTables/AcpiTables.inf     |   8 +-
>   .../RaspberryPi/AcpiTables/Dbg2MiniUart.aslc  |  81 +++++++++
>   .../AcpiTables/{Dbg2.aslc => Dbg2Pl011.aslc}  |  30 +---
>   .../RaspberryPi/AcpiTables/SpcrMiniUart.aslc  |  91 ++++++++++
>   .../AcpiTables/{Spcr.aslc => SpcrPl011.aslc}  |  10 +-
>   Platform/RaspberryPi/AcpiTables/Uart.asl      | 155 +++++++++++++-----
>   .../RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c |  48 +++++-
>   .../Drivers/ConfigDxe/ConfigDxe.inf           |   1 +
>   .../IndustryStandard/RpiDebugPort2Table.h     |  33 ++++
>   Platform/RaspberryPi/Include/UartSelection.h  |  20 +++
>   Platform/RaspberryPi/RPi3/RPi3.dsc            |   8 +
>   Platform/RaspberryPi/RPi4/RPi4.dsc            |   8 +
>   Platform/RaspberryPi/RaspberryPi.dec          |   1 +
>   13 files changed, 410 insertions(+), 84 deletions(-)
>   create mode 100644 Platform/RaspberryPi/AcpiTables/Dbg2MiniUart.aslc
>   rename Platform/RaspberryPi/AcpiTables/{Dbg2.aslc => Dbg2Pl011.aslc} (72%)
>   create mode 100644 Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc
>   rename Platform/RaspberryPi/AcpiTables/{Spcr.aslc => SpcrPl011.aslc} (87%)
>   create mode 100644 Platform/RaspberryPi/Include/IndustryStandard/RpiDebugPort2Table.h
>   create mode 100644 Platform/RaspberryPi/Include/UartSelection.h
> 
> diff --git a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf b/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
> index d3363a76a1..1ddc9ca5fe 100644
> --- a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
> +++ b/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
> @@ -2,7 +2,7 @@
>   #
>   #  ACPI table data and ASL sources required to boot the platform.
>   #
> -#  Copyright (c) 2019, ARM Limited. All rights reserved.
> +#  Copyright (c) 2019-2021, ARM Limited. All rights reserved.
>   #  Copyright (c) 2017, Andrey Warkentin <andrey.warkentin at gmail.com>
>   #  Copyright (c) Microsoft Corporation. All rights reserved.
>   #
> @@ -28,12 +28,14 @@
>     Emmc.asl
>     Madt.aslc
>     Fadt.aslc
> -  Dbg2.aslc
> +  Dbg2MiniUart.aslc
> +  Dbg2Pl011.aslc
>     Gtdt.aslc
>     Iort.aslc
>     Dsdt.asl
>     Csrt.aslc
> -  Spcr.aslc
> +  SpcrMiniUart.aslc
> +  SpcrPl011.aslc
>     Pptt.aslc
>     SsdtThermal.asl
>   
> diff --git a/Platform/RaspberryPi/AcpiTables/Dbg2MiniUart.aslc b/Platform/RaspberryPi/AcpiTables/Dbg2MiniUart.aslc
> new file mode 100644
> index 0000000000..be7d96c179
> --- /dev/null
> +++ b/Platform/RaspberryPi/AcpiTables/Dbg2MiniUart.aslc
> @@ -0,0 +1,81 @@
> +/** @file
> + *
> + *  Debug Port Table (DBG2)
> + *
> + *  Copyright (c) 2019, Pete Batard <pete at akeo.ie>
> + *  Copyright (c) 2012-2021, ARM Limited. All rights reserved.
> + *
> + *  SPDX-License-Identifier: BSD-2-Clause-Patent
> + *
> + **/
> +
> +#include <IndustryStandard/Acpi.h>
> +#include <IndustryStandard/Bcm2836.h>
> +#include <IndustryStandard/RpiDebugPort2Table.h>
> +#include <Library/AcpiLib.h>
> +#include <Library/PcdLib.h>
> +
> +#include "AcpiTables.h"
> +
> +#pragma pack(1)
> +
> +#define RPI_UART_INTERFACE_TYPE                         EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_BCM2835_UART
> +#define RPI_UART_BASE_ADDRESS                           BCM2836_MINI_UART_BASE_ADDRESS
> +#define RPI_UART_LENGTH                                 BCM2836_MINI_UART_LENGTH
> +//
> +// RPI_UART_STR should match the value used Uart.asl
> +//
> +#define RPI_UART_STR                                    { '\\', '_', 'S', 'B', '.', 'G', 'D', 'V', '0', '.', 'U', 'R', 'T', 'M', 0x00 }
> +
> +#define DBG2_DEBUG_PORT_DDI(NumReg, SubType, UartBase, UartAddrLen, UartNameStr) {                                    \
> +    {                                                                                                                 \
> +      EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT_REVISION,         /* UINT8     Revision */                        \
> +      sizeof (DBG2_DEBUG_DEVICE_INFORMATION),                         /* UINT16    Length */                          \
> +      NumReg,                                                         /* UINT8     NumberofGenericAddressRegisters */ \
> +      RPI_DBG2_NAMESPACESTRING_FIELD_SIZE,                            /* UINT16    NameSpaceStringLength */           \
> +      OFFSET_OF (DBG2_DEBUG_DEVICE_INFORMATION, NameSpaceString),     /* UINT16    NameSpaceStringOffset */           \
> +      0,                                                              /* UINT16    OemDataLength */                   \
> +      0,                                                              /* UINT16    OemDataOffset */                   \
> +      EFI_ACPI_DBG2_PORT_TYPE_SERIAL,                                 /* UINT16    Port Type */                       \
> +      SubType,                                                        /* UINT16    Port Subtype */                    \
> +      {EFI_ACPI_RESERVED_BYTE, EFI_ACPI_RESERVED_BYTE},               /* UINT8     Reserved[2] */                     \
> +      OFFSET_OF (DBG2_DEBUG_DEVICE_INFORMATION, BaseAddressRegister), /* UINT16    BaseAddressRegister Offset */      \
> +      OFFSET_OF (DBG2_DEBUG_DEVICE_INFORMATION, AddressSize)          /* UINT16    AddressSize Offset */              \
> +    },                                                                                                                \
> +    ARM_GAS32 (UartBase),                            /* EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE BaseAddressRegister */ \
> +    UartAddrLen,                                     /* UINT32  AddressSize */                                        \
> +    UartNameStr                                      /* UINT8   NameSpaceString[MAX_DBG2_NAME_LEN] */                 \
> +  }
> +
> +
> +STATIC DBG2_TABLE Dbg2 = {
> +  {
> +    ACPI_HEADER (
> +      EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE,
> +      DBG2_TABLE,
> +      EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT_REVISION
> +    ),
> +    OFFSET_OF (DBG2_TABLE, Dbg2DeviceInfo),
> +    RPI_DBG2_NUM_DEBUG_PORTS                                          /* UINT32  NumberDbgDeviceInfo */
> +  },
> +  {
> +    /*
> +     * Kernel Debug Port
> +     */
> +    DBG2_DEBUG_PORT_DDI (
> +      RPI_DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS,
> +      RPI_UART_INTERFACE_TYPE,
> +      RPI_UART_BASE_ADDRESS,
> +      RPI_UART_LENGTH,
> +      RPI_UART_STR
> +    ),
> +  }
> +};
> +
> +#pragma pack()
> +
> +//
> +// Reference the table being generated to prevent the optimizer from removing
> +// the data structure from the executable
> +//
> +VOID* CONST ReferenceAcpiTable = &Dbg2;
> diff --git a/Platform/RaspberryPi/AcpiTables/Dbg2.aslc b/Platform/RaspberryPi/AcpiTables/Dbg2Pl011.aslc
> similarity index 72%
> rename from Platform/RaspberryPi/AcpiTables/Dbg2.aslc
> rename to Platform/RaspberryPi/AcpiTables/Dbg2Pl011.aslc
> index e3f2adae7e..e07869b027 100644
> --- a/Platform/RaspberryPi/AcpiTables/Dbg2.aslc
> +++ b/Platform/RaspberryPi/AcpiTables/Dbg2Pl011.aslc
> @@ -3,7 +3,7 @@
>    *  Debug Port Table (DBG2)
>    *
>    *  Copyright (c) 2019, Pete Batard <pete at akeo.ie>
> - *  Copyright (c) 2012-2020, ARM Limited. All rights reserved.
> + *  Copyright (c) 2012-2021, ARM Limited. All rights reserved.
>    *
>    *  SPDX-License-Identifier: BSD-2-Clause-Patent
>    *
> @@ -11,7 +11,7 @@
>   
>   #include <IndustryStandard/Acpi.h>
>   #include <IndustryStandard/Bcm2836.h>
> -#include <IndustryStandard/DebugPort2Table.h>
> +#include <IndustryStandard/RpiDebugPort2Table.h>
>   #include <Library/AcpiLib.h>
>   #include <Library/PcdLib.h>
>   
> @@ -19,37 +19,13 @@
>   
>   #pragma pack(1)
>   
> -#define RPI_DBG2_NUM_DEBUG_PORTS                        1
> -#define RPI_DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS    1
> -#define RPI_DBG2_NAMESPACESTRING_FIELD_SIZE             15
> -
> -#if (RPI_MODEL == 4)
>   #define RPI_UART_INTERFACE_TYPE                         EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART
>   #define RPI_UART_BASE_ADDRESS                           BCM2836_PL011_UART_BASE_ADDRESS
>   #define RPI_UART_LENGTH                                 BCM2836_PL011_UART_LENGTH
> -#define RPI_UART_STR                                    { '\\', '_', 'S', 'B', '.', 'G', 'D', 'V', '0', '.', 'U', 'R', 'T', '0', 0x00 }
> -#else
> -#define RPI_UART_INTERFACE_TYPE                         EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_BCM2835_UART
> -#define RPI_UART_BASE_ADDRESS                           BCM2836_MINI_UART_BASE_ADDRESS
> -#define RPI_UART_LENGTH                                 BCM2836_MINI_UART_LENGTH
>   //
>   // RPI_UART_STR should match the value used Uart.asl
>   //
> -#define RPI_UART_STR                                    { '\\', '_', 'S', 'B', '.', 'G', 'D', 'V', '0', '.', 'U', 'R', 'T', 'M', 0x00 }
> -#endif
> -
> -typedef struct {
> -  EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT         Dbg2Device;
> -  EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE                BaseAddressRegister;
> -  UINT32                                                AddressSize;
> -  UINT8                                                 NameSpaceString[RPI_DBG2_NAMESPACESTRING_FIELD_SIZE];
> -} DBG2_DEBUG_DEVICE_INFORMATION;
> -
> -typedef struct {
> -  EFI_ACPI_DEBUG_PORT_2_DESCRIPTION_TABLE               Description;
> -  DBG2_DEBUG_DEVICE_INFORMATION                         Dbg2DeviceInfo[RPI_DBG2_NUM_DEBUG_PORTS];
> -} DBG2_TABLE;
> -
> +#define RPI_UART_STR                                    { '\\', '_', 'S', 'B', '.', 'G', 'D', 'V', '0', '.', 'U', 'R', 'T', '0', 0x00 }
>   
>   #define DBG2_DEBUG_PORT_DDI(NumReg, SubType, UartBase, UartAddrLen, UartNameStr) {                                    \
>       {                                                                                                                 \
> diff --git a/Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc b/Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc
> new file mode 100644
> index 0000000000..2f638c61a5
> --- /dev/null
> +++ b/Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc
> @@ -0,0 +1,91 @@
> +/** @file
> +* SPCR Table
> +*
> +* Copyright (c) 2019 Pete Batard <pete at akeo.ie>
> +* Copyright (c) 2014-2021, ARM Limited. All rights reserved.
> +*
> +* SPDX-License-Identifier: BSD-2-Clause-Patent
> +*
> +**/
> +
> +#include <IndustryStandard/Acpi.h>
> +#include <IndustryStandard/Bcm2836.h>
> +#include <IndustryStandard/SerialPortConsoleRedirectionTable.h>
> +#include <Library/AcpiLib.h>
> +#include <Library/PcdLib.h>
> +
> +#include "AcpiTables.h"
> +
> +#define RPI_UART_FLOW_CONTROL_NONE           0
> +
> +#define RPI_UART_INTERFACE_TYPE              EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART
> +#define RPI_UART_BASE_ADDRESS                BCM2836_MINI_UART_BASE_ADDRESS
> +#define RPI_UART_INTERRUPT                   BCM2836_MINI_UART_INTERRUPT
> +
> +STATIC EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE Spcr = {
> +  ACPI_HEADER (
> +    EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
> +    EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE,
> +    EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_REVISION
> +  ),
> +  // UINT8                                   InterfaceType;
> +  RPI_UART_INTERFACE_TYPE,
> +  // UINT8                                   Reserved1[3];
> +  {
> +    EFI_ACPI_RESERVED_BYTE,
> +    EFI_ACPI_RESERVED_BYTE,
> +    EFI_ACPI_RESERVED_BYTE
> +  },
> +  // EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE  BaseAddress;
> +  ARM_GAS32 (RPI_UART_BASE_ADDRESS),
> +  // UINT8                                   InterruptType;
> +  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC,
> +  // UINT8                                   Irq;
> +  0,                                         // Not used on ARM
> +  // UINT32                                  GlobalSystemInterrupt;
> +  RPI_UART_INTERRUPT,
> +  // 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;
> +  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_STOP_BITS_1,
> +  // UINT8                                   FlowControl;
> +  RPI_UART_FLOW_CONTROL_NONE,
> +  // UINT8                                   TerminalType;
> +  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_TERMINAL_TYPE_VT_UTF8,
> +  // UINT8                                   Reserved2;
> +  EFI_ACPI_RESERVED_BYTE,
> +  // UINT16                                  PciDeviceId;
> +  0xFFFF,
> +  // UINT16                                  PciVendorId;
> +  0xFFFF,
> +  // UINT8                                   PciBusNumber;
> +  0x00,
> +  // UINT8                                   PciDeviceNumber;
> +  0x00,
> +  // UINT8                                   PciFunctionNumber;
> +  0x00,
> +  // UINT32                                  PciFlags;
> +  0x00000000,
> +  // UINT8                                   PciSegment;
> +  0x00,
> +  // UINT32                                  Reserved3;
> +  EFI_ACPI_RESERVED_DWORD
> +};
> +
> +//
> +// Reference the table being generated to prevent the optimizer from removing the
> +// data structure from the executable
> +//
> +VOID* CONST ReferenceAcpiTable = &Spcr;
> diff --git a/Platform/RaspberryPi/AcpiTables/Spcr.aslc b/Platform/RaspberryPi/AcpiTables/SpcrPl011.aslc
> similarity index 87%
> rename from Platform/RaspberryPi/AcpiTables/Spcr.aslc
> rename to Platform/RaspberryPi/AcpiTables/SpcrPl011.aslc
> index 07df3a718d..06e19c1245 100644
> --- a/Platform/RaspberryPi/AcpiTables/Spcr.aslc
> +++ b/Platform/RaspberryPi/AcpiTables/SpcrPl011.aslc
> @@ -2,7 +2,7 @@
>   * SPCR Table
>   *
>   * Copyright (c) 2019 Pete Batard <pete at akeo.ie>
> -* Copyright (c) 2014-2016, ARM Limited. All rights reserved.
> +* Copyright (c) 2014-2021, ARM Limited. All rights reserved.
>   *
>   * SPDX-License-Identifier: BSD-2-Clause-Patent
>   *
> @@ -18,16 +18,10 @@
>   
>   #define RPI_UART_FLOW_CONTROL_NONE           0
>   
> -// Prefer PL011 serial output on the Raspberry Pi 4
> -#if (RPI_MODEL == 4)
>   #define RPI_UART_INTERFACE_TYPE              EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_ARM_PL011_UART
>   #define RPI_UART_BASE_ADDRESS                BCM2836_PL011_UART_BASE_ADDRESS
>   #define RPI_UART_INTERRUPT                   BCM2836_PL011_UART_INTERRUPT
> -#else
> -#define RPI_UART_INTERFACE_TYPE              EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART
> -#define RPI_UART_BASE_ADDRESS                BCM2836_MINI_UART_BASE_ADDRESS
> -#define RPI_UART_INTERRUPT                   BCM2836_MINI_UART_INTERRUPT
> -#endif
> +
>   STATIC EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE Spcr = {
>     ACPI_HEADER (
>       EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
> diff --git a/Platform/RaspberryPi/AcpiTables/Uart.asl b/Platform/RaspberryPi/AcpiTables/Uart.asl
> index 81ae6711af..bac9d791eb 100644
> --- a/Platform/RaspberryPi/AcpiTables/Uart.asl
> +++ b/Platform/RaspberryPi/AcpiTables/Uart.asl
> @@ -2,6 +2,7 @@
>    *
>    *  [DSDT] Serial devices (UART).
>    *
> + *  Copyright (c) 2021, ARM Limited. All rights reserved.
>    *  Copyright (c) 2020, Pete Batard <pete at akeo.ie>
>    *  Copyright (c) 2018, Andrey Warkentin <andrey.warkentin at gmail.com>
>    *  Copyright (c) Microsoft Corporation. All rights reserved.
> @@ -93,57 +94,125 @@ Device(BTH0)
>   {
>     Name (_HID, "BCM2EA6")
>     Name (_CID, "BCM2EA6")
> +
> +  //
> +  // UART In Use will be dynamically updated during boot
> +  // 0x55 0x52 0x49 0x55 0xA 0x2 (Value must > 1)
> +  //
> +  Name (URIU, 0x2)
> +
>     Method (_STA)
>     {
>       Return (0xf)
>     }
> +
> +  //
> +  // Resource for URT0 (PL011)
> +  //
> +  Name (BTPL, ResourceTemplate ()
> +  {
> +    UARTSerialBus(
> +      115200,        // InitialBaudRate: in BPS
> +      ,              // BitsPerByte: default to 8 bits
> +      ,              // StopBits: Defaults to one bit
> +      0x00,          // LinesInUse: 8 1-bit flags to
> +                    //   declare enabled control lines.
> +                    //   Raspberry Pi does not exposed
> +                    //   HW control signals -> not supported.
> +                    //   Optional bits:
> +                    //   - Bit 7 (0x80) Request To Send (RTS)
> +                    //   - Bit 6 (0x40) Clear To Send (CTS)
> +                    //   - Bit 5 (0x20) Data Terminal Ready (DTR)
> +                    //   - Bit 4 (0x10) Data Set Ready (DSR)
> +                    //   - Bit 3 (0x08) Ring Indicator (RI)
> +                    //   - Bit 2 (0x04) Data Carrier Detect (DTD)
> +                    //   - Bit 1 (0x02) Reserved. Must be 0.
> +                    //   - Bit 0 (0x01) Reserved. Must be 0.
> +      ,              // IsBigEndian:
> +                    //   default to LittleEndian.
> +      ,              // Parity: Defaults to no parity
> +      ,              // FlowControl: Defaults to
> +                    //   no flow control.
> +      16,            // ReceiveBufferSize
> +      16,            // TransmitBufferSize
> +      "\\_SB.GDV0.URT0",  // ResourceSource:
> +                    //   UART bus controller name
> +      ,              // ResourceSourceIndex: assumed to be 0
> +      ,              // ResourceUsage: assumed to be
> +                    //   ResourceConsumer
> +      UAR0,          // DescriptorName: creates name
> +                    //   for offset of resource descriptor
> +    )                // Vendor data
> +    //
> +    // RPIQ connection for BT_ON/OFF
> +    //
> +    GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.RPIQ", 0, ResourceConsumer, , ) { 128 }
> +  })
> +
> +  //
> +  // Resource for URTM (miniUART)
> +  //
> +  Name (BTMN, ResourceTemplate ()
> +  {
> +    //
> +    // BT UART: ResourceSource will be dynamically updated to
> +    // either URT0 (PL011) or URTM (miniUART) during boot
> +    //
> +    UARTSerialBus(
> +      115200,        // InitialBaudRate: in BPS
> +      ,              // BitsPerByte: default to 8 bits
> +      ,              // StopBits: Defaults to one bit
> +      0x00,          // LinesInUse: 8 1-bit flags to
> +                    //   declare enabled control lines.
> +                    //   Raspberry Pi does not exposed
> +                    //   HW control signals -> not supported.
> +                    //   Optional bits:
> +                    //   - Bit 7 (0x80) Request To Send (RTS)
> +                    //   - Bit 6 (0x40) Clear To Send (CTS)
> +                    //   - Bit 5 (0x20) Data Terminal Ready (DTR)
> +                    //   - Bit 4 (0x10) Data Set Ready (DSR)
> +                    //   - Bit 3 (0x08) Ring Indicator (RI)
> +                    //   - Bit 2 (0x04) Data Carrier Detect (DTD)
> +                    //   - Bit 1 (0x02) Reserved. Must be 0.
> +                    //   - Bit 0 (0x01) Reserved. Must be 0.
> +      ,              // IsBigEndian:
> +                    //   default to LittleEndian.
> +      ,              // Parity: Defaults to no parity
> +      ,              // FlowControl: Defaults to
> +                    //   no flow control.
> +      16,            // ReceiveBufferSize
> +      16,            // TransmitBufferSize
> +      "\\_SB.GDV0.URTM",  // ResourceSource:
> +                    //   UART bus controller name
> +      ,              // ResourceSourceIndex: assumed to be 0
> +      ,              // ResourceUsage: assumed to be
> +                    //   ResourceConsumer
> +      UARM,          // DescriptorName: creates name
> +                    //   for offset of resource descriptor
> +    )                // Vendor data
> +    //
> +    // RPIQ connection for BT_ON/OFF
> +    //
> +    GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.RPIQ", 0, ResourceConsumer, , ) { 128 }
> +  })
> +
>     Method (_CRS, 0x0, Serialized)
>     {
> -    Name (RBUF, ResourceTemplate ()
> +    if (URIU == 0)
>       {
> -      // BT UART: URT0 (PL011) or URTM (miniUART)
> -      UARTSerialBus(
> -        115200,        // InitialBaudRate: in BPS
> -        ,              // BitsPerByte: default to 8 bits
> -        ,              // StopBits: Defaults to one bit
> -        0x00,          // LinesInUse: 8 1-bit flags to
> -                       //   declare enabled control lines.
> -                       //   Raspberry Pi does not exposed
> -                       //   HW control signals -> not supported.
> -                       //   Optional bits:
> -                       //   - Bit 7 (0x80) Request To Send (RTS)
> -                       //   - Bit 6 (0x40) Clear To Send (CTS)
> -                       //   - Bit 5 (0x20) Data Terminal Ready (DTR)
> -                       //   - Bit 4 (0x10) Data Set Ready (DSR)
> -                       //   - Bit 3 (0x08) Ring Indicator (RI)
> -                       //   - Bit 2 (0x04) Data Carrier Detect (DTD)
> -                       //   - Bit 1 (0x02) Reserved. Must be 0.
> -                       //   - Bit 0 (0x01) Reserved. Must be 0.
> -        ,              // IsBigEndian:
> -                       //   default to LittleEndian.
> -        ,              // Parity: Defaults to no parity
> -        ,              // FlowControl: Defaults to
> -                       //   no flow control.
> -        16,            // ReceiveBufferSize
> -        16,            // TransmitBufferSize
> -#if (RPI_MODEL == 4)
> -        "\\_SB.GDV0.URTM",  // ResourceSource:
> -#else
> -        "\\_SB.GDV0.URT0",  // ResourceSource:
> -#endif
> -                       //   UART bus controller name
> -        ,              // ResourceSourceIndex: assumed to be 0
> -        ,              // ResourceUsage: assumed to be
> -                       //   ResourceConsumer
> -        UAR0,          // DescriptorName: creates name
> -                       //   for offset of resource descriptor
> -      )                // Vendor data
> -
>         //
> -      // RPIQ connection for BT_ON/OFF
> +      // PL011 UART is configured for console output
> +      // Return Mini UART for Bluetooth
>         //
> -      GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.RPIQ", 0, ResourceConsumer, , ) { 128 }
> -    })
> -    Return (RBUF)
> +      return (^BTMN)
> +    }
> +    else
> +    {
> +      //
> +      // Mini UART is configured for console output
> +      // Return PL011 UART for Bluetooth
> +      //
> +      return (^BTPL)
> +    }
>     }
>   }
> diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
> index d3c5869949..d6efb59793 100644
> --- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
> +++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
> @@ -12,6 +12,10 @@
>   #include <IndustryStandard/Bcm2836.h>
>   #include <IndustryStandard/Bcm2836Gpio.h>
>   #include <IndustryStandard/RpiMbox.h>
> +#include <IndustryStandard/SerialPortConsoleRedirectionTable.h>
> +#include <IndustryStandard/RpiDebugPort2Table.h>
> +#include <UartSelection.h>
> +
>   #include <Library/AcpiLib.h>
>   #include <Library/DebugLib.h>
>   #include <Library/DevicePathLib.h>
> @@ -23,6 +27,7 @@
>   #include <Library/NetLib.h>
>   #include <Library/UefiBootServicesTableLib.h>
>   #include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Library/PcdLib.h>
>   #include <Protocol/AcpiTable.h>
>   #include <Protocol/BcmGenetPlatformDevice.h>
>   #include <Protocol/RpiFirmware.h>
> @@ -743,6 +748,11 @@ STATIC CONST AML_NAME_OP_REPLACE SsdtEmmcNameOpReplace[] = {
>     { }
>   };
>   
> +STATIC CONST AML_NAME_OP_REPLACE DsdtNameOpReplace[] = {
> +  { "URIU", PcdToken (PcdUartInUse) },
> +  { }
> +};
> +
>   STATIC CONST NAMESPACE_TABLES SdtTables[] = {
>     {
>       SIGNATURE_64 ('R', 'P', 'I', 'T', 'H', 'F', 'A', 'N'),
> @@ -756,11 +766,11 @@ STATIC CONST NAMESPACE_TABLES SdtTables[] = {
>       PcdToken(PcdSdIsArasan),
>       SsdtEmmcNameOpReplace
>     },
> -  {
> +  { // DSDT
>       SIGNATURE_64 ('R', 'P', 'I', 0, 0, 0, 0, 0),
>       0,
>       0,
> -    NULL
> +    DsdtNameOpReplace
>     },
>     { }
>   };
> @@ -779,6 +789,9 @@ HandleDynamicNamespace (
>   {
>     UINTN Tables;
>   
> +  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE *SpcrTable;
> +  DBG2_TABLE                                     *Dbg2Table;
> +
>     switch (AcpiHeader->Signature) {
>     case SIGNATURE_32 ('D', 'S', 'D', 'T'):
>     case SIGNATURE_32 ('S', 'S', 'D', 'T'):
> @@ -788,14 +801,37 @@ HandleDynamicNamespace (
>         }
>       }
>       DEBUG ((DEBUG_ERROR, "Found namespace table not in table list.\n"));
> -
>       return FALSE;
> +
>     case SIGNATURE_32 ('I', 'O', 'R', 'T'):
>       // only enable the IORT on machines with >3G and no limit
>       // to avoid problems with rhel/centos and other older OSs
>       if (PcdGet32 (PcdRamLimitTo3GB) || !PcdGet32 (PcdRamMoreThan3GB)) {
>         return FALSE;
>       }
> +    return TRUE;
> +
> +  case SIGNATURE_32 ('S', 'P', 'C', 'R'):
> +    SpcrTable = (EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE *)AcpiHeader;
> +    if ((PcdGet32 (PcdUartInUse) == PL011_UART_IN_USE) &&
> +        (SpcrTable->InterfaceType == EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_ARM_PL011_UART)) {
> +      return TRUE;
> +    } else if ((PcdGet32 (PcdUartInUse) == MINI_UART_IN_USE) &&
> +               (SpcrTable->InterfaceType == EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART)) {
> +      return TRUE;
> +    }
> +    return FALSE;
> +
> +  case SIGNATURE_32 ('D', 'B', 'G', '2'):
> +    Dbg2Table = (DBG2_TABLE *)AcpiHeader;
> +    if ((PcdGet32 (PcdUartInUse) == PL011_UART_IN_USE) &&
> +        (Dbg2Table->Dbg2DeviceInfo[0].Dbg2Device.PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART)) {
> +      return TRUE;
> +    } else if ((PcdGet32 (PcdUartInUse) == MINI_UART_IN_USE) &&
> +               (Dbg2Table->Dbg2DeviceInfo[0].Dbg2Device.PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_BCM2835_UART)) {
> +      return TRUE;
> +    }
> +    return FALSE;
>     }
>   
>     return TRUE;
> @@ -812,6 +848,12 @@ ConfigInitialize (
>     EFI_STATUS                      Status;
>     EFI_EVENT                       EndOfDxeEvent;
>   
> +  if ((MmioRead32(GPIO_GPFSEL1) & GPFSEL1_UART_MASK) == PL011_UART_IN_USE_REG_VALUE) {
> +    PcdSet32S (PcdUartInUse, PL011_UART_IN_USE);
> +  } else if ((MmioRead32(GPIO_GPFSEL1) & GPFSEL1_UART_MASK) == MINI_UART_IN_USE_REG_VALUE) {
> +    PcdSet32S (PcdUartInUse, MINI_UART_IN_USE);
> +  }
> +
>     Status = gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid,
>                     NULL, (VOID**)&mFwProtocol);
>     ASSERT_EFI_ERROR (Status);
> diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf
> index 032e40b0c3..597e1b4205 100644
> --- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf
> +++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf
> @@ -94,6 +94,7 @@
>     gRaspberryPiTokenSpaceGuid.PcdFanOnGpio
>     gRaspberryPiTokenSpaceGuid.PcdFanTemp
>     gRaspberryPiTokenSpaceGuid.PcdBootPolicy
> +  gRaspberryPiTokenSpaceGuid.PcdUartInUse
>   
>   [Depex]
>     gPcdProtocolGuid AND gRaspberryPiFirmwareProtocolGuid
> diff --git a/Platform/RaspberryPi/Include/IndustryStandard/RpiDebugPort2Table.h b/Platform/RaspberryPi/Include/IndustryStandard/RpiDebugPort2Table.h
> new file mode 100644
> index 0000000000..73134dfdc2
> --- /dev/null
> +++ b/Platform/RaspberryPi/Include/IndustryStandard/RpiDebugPort2Table.h
> @@ -0,0 +1,33 @@
> +/** @file
> +
> +  Copyright (c) 2021, ARM Limited. All rights reserved.
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> + **/
> +#ifndef __RPI_DEBUG_PORT_2_H__
> +#define __RPI_DEBUG_PORT_2_H__
> +
> +#include <IndustryStandard/DebugPort2Table.h>
> +
> +#define RPI_DBG2_NUM_DEBUG_PORTS                        1
> +#define RPI_DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS    1
> +#define RPI_DBG2_NAMESPACESTRING_FIELD_SIZE             15
> +
> +#pragma pack(1)
> +
> +
> +typedef struct {
> +  EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT         Dbg2Device;
> +  EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE                BaseAddressRegister;
> +  UINT32                                                AddressSize;
> +  UINT8                                                 NameSpaceString[RPI_DBG2_NAMESPACESTRING_FIELD_SIZE];
> +} DBG2_DEBUG_DEVICE_INFORMATION;
> +
> +typedef struct {
> +  EFI_ACPI_DEBUG_PORT_2_DESCRIPTION_TABLE               Description;
> +  DBG2_DEBUG_DEVICE_INFORMATION                         Dbg2DeviceInfo[RPI_DBG2_NUM_DEBUG_PORTS];
> +} DBG2_TABLE;
> +
> +#pragma pack()
> +#endif  //__RPI_DEBUG_PORT_2_H__
> diff --git a/Platform/RaspberryPi/Include/UartSelection.h b/Platform/RaspberryPi/Include/UartSelection.h
> new file mode 100644
> index 0000000000..803bf860bb
> --- /dev/null
> +++ b/Platform/RaspberryPi/Include/UartSelection.h
> @@ -0,0 +1,20 @@
> +/** @file
> + *
> + *  Copyright (c) 2021, ARM Limited. All rights reserved.
> + *
> + *  SPDX-License-Identifier: BSD-2-Clause-Patent
> + *
> + **/
> +
> +#ifndef UART_SELECTION_H
> +#define UART_SELECTION_H
> +
> +#define GPFSEL1_UART_MASK             (BIT17 | BIT16 | BIT15 | BIT14 | BIT13 | BIT12)
> +
> +#define PL011_UART_IN_USE_REG_VALUE   (BIT17 | BIT14)      // ALT0 - 0x24000
> +#define MINI_UART_IN_USE_REG_VALUE    (BIT16 | BIT13)      // ALT5 - 0x12000
> +
> +#define PL011_UART_IN_USE             0
> +#define MINI_UART_IN_USE              1
> +
> +#endif /* UART_SELECTION_H */
> diff --git a/Platform/RaspberryPi/RPi3/RPi3.dsc b/Platform/RaspberryPi/RPi3/RPi3.dsc
> index 425c7ff9ec..53825bcf62 100644
> --- a/Platform/RaspberryPi/RPi3/RPi3.dsc
> +++ b/Platform/RaspberryPi/RPi3/RPi3.dsc
> @@ -552,6 +552,14 @@
>     gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0
>     gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0
>   
> +  #
> +  # UART in use
> +  # This value will be synchronized with the setting in config.txt
> +  # 0  - PL011_UART_IN_USE
> +  # 1  - MINI_UART_IN_USE
> +  #
> +  gRaspberryPiTokenSpaceGuid.PcdUartInUse|1
> +
>   ################################################################################
>   #
>   # Components Section - list of all EDK II Modules needed by this Platform
> diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc b/Platform/RaspberryPi/RPi4/RPi4.dsc
> index d8c6fdd4bd..fd73c4d14b 100644
> --- a/Platform/RaspberryPi/RPi4/RPi4.dsc
> +++ b/Platform/RaspberryPi/RPi4/RPi4.dsc
> @@ -568,6 +568,14 @@
>     gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0
>     gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0
>   
> +  #
> +  # UART in use
> +  # This value will be synchronized with the setting in config.txt
> +  # 0  - PL011_UART_IN_USE
> +  # 1  - MINI_UART_IN_USE
> +  #
> +  gRaspberryPiTokenSpaceGuid.PcdUartInUse|0
> +
>   ################################################################################
>   #
>   # Components Section - list of all EDK II Modules needed by this Platform
> diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryPi/RaspberryPi.dec
> index 8eb1c2bac7..f1dd8ac0ed 100644
> --- a/Platform/RaspberryPi/RaspberryPi.dec
> +++ b/Platform/RaspberryPi/RaspberryPi.dec
> @@ -72,3 +72,4 @@
>     gRaspberryPiTokenSpaceGuid.PcdPlatformResetDelay|0|UINT32|0x0000001E
>     gRaspberryPiTokenSpaceGuid.PcdMmcEnableDma|0|UINT32|0x0000001F
>     gRaspberryPiTokenSpaceGuid.PcdBootPolicy|0|UINT32|0x00000020
> +  gRaspberryPiTokenSpaceGuid.PcdUartInUse|1|UINT32|0x00000021
> 

Reviewed-by: Pete Batard <pete at akeo.ie>
Tested-by: Pete Batard <pete at akeo.ie>


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#76431): https://edk2.groups.io/g/devel/message/76431
Mute This Topic: https://groups.io/mt/83365131/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list