From: "Pete Batard" <pete@akeo.ie>
To: Sunny Wang <Sunny.Wang@arm.com>, devel@edk2.groups.io
Cc: "Samer El-Haj-Mahmoud" <samer.el-haj-mahmoud@arm.com>,
"Sami Mujawar" <sami.mujawar@arm.com>,
"Jeremy Linton" <jeremy.linton@arm.com>,
"Ard Biesheuvel" <ardb+tianocore@kernel.org>,
"Mario Bălănică" <mariobalanica02@gmail.com>
Subject: Re: [PATCH v4 1/3] Platform/RaspberryPi: Dynamically build UARTs info in ACPI
Date: Sat, 12 Jun 2021 14:39:55 +0100 [thread overview]
Message-ID: <192c4221-1ec9-34f2-38bb-b4fa40673184@akeo.ie> (raw)
In-Reply-To: <20210607075339.342-2-Sunny.Wang@arm.com>
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@arm.com>
> Cc: Sami Mujawar <sami.mujawar@arm.com>
> Cc: Jeremy Linton <jeremy.linton@arm.com>
> Cc: Pete Batard <pete@akeo.ie>
> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
> Cc: Mario Bălănică <mariobalanica02@gmail.com>
> Signed-off-by: Sunny Wang <sunny.wang@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@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@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@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@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@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@akeo.ie>
> * Copyright (c) 2018, Andrey Warkentin <andrey.warkentin@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@akeo.ie>
Tested-by: Pete Batard <pete@akeo.ie>
next prev parent reply other threads:[~2021-06-12 13:40 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-07 7:53 [PATCH v4 0/3] Dynamically build UARTs info in ACPI Sunny Wang
2021-06-07 7:53 ` [PATCH v4 1/3] Platform/RaspberryPi: " Sunny Wang
2021-06-12 13:39 ` Pete Batard [this message]
2021-06-12 20:08 ` Ard Biesheuvel
2021-06-07 7:53 ` [PATCH v4 2/3] Silicon/Broadcom/Bcm283x: Clean up GpioPinSet function Sunny Wang
2021-06-12 13:40 ` Pete Batard
2021-06-07 7:53 ` [PATCH v4 3/3] Platform/RaspberryPi: Enable Bluetooth and UART in Windows OS Sunny Wang
2021-06-07 15:04 ` Mario Bălănică
2021-06-12 13:40 ` Pete Batard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=192c4221-1ec9-34f2-38bb-b4fa40673184@akeo.ie \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox