On Sat, 12 Jun 2021 at 15:40, Pete Batard <p...@akeo.ie> wrote: > > 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-mahm...@arm.com> > > Cc: Sami Mujawar <sami.muja...@arm.com> > > Cc: Jeremy Linton <jeremy.lin...@arm.com> > > Cc: Pete Batard <p...@akeo.ie> > > Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org> > > Cc: Mario Bălănică <mariobalanic...@gmail.com> > > Signed-off-by: Sunny Wang <sunny.w...@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.warken...@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 <p...@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 <p...@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 <p...@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 <p...@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 <p...@akeo.ie> > > * Copyright (c) 2018, Andrey Warkentin <andrey.warken...@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 <p...@akeo.ie> > Tested-by: Pete Batard <p...@akeo.ie>
Pushed as 4deb510cb00d..086a3a3ce6c4 Thanks all, -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#76435): https://edk2.groups.io/g/devel/message/76435 Mute This Topic: https://groups.io/mt/83365131/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-