From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by mx.groups.io with SMTP id smtpd.web12.10114.1623528495061411438 for ; Sat, 12 Jun 2021 13:08:15 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=PNXUiW5A; spf=pass (domain: kernel.org, ip: 198.145.29.99, mailfrom: ardb@kernel.org) Received: by mail.kernel.org (Postfix) with ESMTPSA id 43DCD611CD for ; Sat, 12 Jun 2021 20:08:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1623528494; bh=OkDU0cFf5J49I+KSlHVhVsFvL+XinLln/XL6pdYc1JE=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=PNXUiW5AJ6s5E3/gD8Ea4MltUQUO/wq7r9Lqqj8effDj5jWKXiH6KXWfwxJ1loBNH MuJ8haNcqK7JUYDjPajMeEzLJNYlnM3NDCDVWrgkAOLsXMcmlbUG5+B6UVNRTlD+H7 ROkrFf3gJ8dHINApZWwB5wlMVjo1GsYEAd5gFLz4F7/qGTMjAwIw08cor8ig5Ne96J iDnCH++GAX057wAcCPpa3G+aQ2lkXBNfP+hD6zKPcmcqC42laBb8EkCCtEpJwlt0Fk 5KlKaI0UCqOPNvmOqgz8XIAofo9vDqEfApDz16JHWcaACYY7JthVRVi4OV/kdBTZPC AdAY8WJ5spGIg== Received: by mail-oo1-f54.google.com with SMTP id n17-20020a4ae1d10000b029024a49ea822bso1628392oot.5 for ; Sat, 12 Jun 2021 13:08:14 -0700 (PDT) X-Gm-Message-State: AOAM532LdFSTIIKsyp7hRDTe+88JXbY91vuheThl9kvrh106sg+r2/Q6 6yHlDonGgfia95jjZj5zkc+AIfi1J3x4T6NIwyA= X-Google-Smtp-Source: ABdhPJz0RAoD8vuQfsx+b8fh+Q1KqqxfUBIZBF5mJdHm9ZgtjjJYilE9iQ8e5YFMQi9jKlMtbYf5wWavjmJl6+7QWeQ= X-Received: by 2002:a4a:b202:: with SMTP id d2mr7927184ooo.13.1623528493478; Sat, 12 Jun 2021 13:08:13 -0700 (PDT) MIME-Version: 1.0 References: <20210607075339.342-1-Sunny.Wang@arm.com> <20210607075339.342-2-Sunny.Wang@arm.com> <192c4221-1ec9-34f2-38bb-b4fa40673184@akeo.ie> In-Reply-To: <192c4221-1ec9-34f2-38bb-b4fa40673184@akeo.ie> From: "Ard Biesheuvel" Date: Sat, 12 Jun 2021 22:08:01 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v4 1/3] Platform/RaspberryPi: Dynamically build UARTs info in ACPI To: Pete Batard Cc: Sunny Wang , edk2-devel-groups-io , Samer El-Haj-Mahmoud , Sami Mujawar , Jeremy Linton , Ard Biesheuvel , =?UTF-8?B?TWFyaW8gQsSDbMSDbmljxIM=?= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, 12 Jun 2021 at 15:40, Pete Batard 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 fixe= s > > the issue discussed in https://github.com/pftf/RPi4/issues/118. > > 2. Cleanup by moving duplicate Debug Port 2 table related defines an= d > > 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 UA= RT > > or PL011) and SPCR, DBG2 tables and device BTH0 are dynamically > > changed as expected. > > > > Cc: Samer El-Haj-Mahmoud > > Cc: Sami Mujawar > > Cc: Jeremy Linton > > Cc: Pete Batard > > Cc: Ard Biesheuvel > > Cc: Mario B=C4=83l=C4=83nic=C4=83 > > Signed-off-by: Sunny Wang > > --- > > .../RaspberryPi/AcpiTables/AcpiTables.inf | 8 +- > > .../RaspberryPi/AcpiTables/Dbg2MiniUart.aslc | 81 +++++++++ > > .../AcpiTables/{Dbg2.aslc =3D> Dbg2Pl011.aslc} | 30 +--- > > .../RaspberryPi/AcpiTables/SpcrMiniUart.aslc | 91 ++++++++++ > > .../AcpiTables/{Spcr.aslc =3D> 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 =3D> Dbg2Pl011.aslc= } (72%) > > create mode 100644 Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc > > rename Platform/RaspberryPi/AcpiTables/{Spcr.aslc =3D> SpcrPl011.aslc= } (87%) > > create mode 100644 Platform/RaspberryPi/Include/IndustryStandard/RpiD= ebugPort2Table.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 > > # 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/Platfo= rm/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 > > + * Copyright (c) 2012-2021, ARM Limited. All rights reserved. > > + * > > + * SPDX-License-Identifier: BSD-2-Clause-Patent > > + * > > + **/ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#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_U= ART_BASE_ADDRESS > > +#define RPI_UART_LENGTH BCM2836_MINI_U= ART_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, Ua= rtNameStr) { \ > > + { = \ > > + 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_G= ENERIC_ADDRESS_STRUCTURE BaseAddressRegister */ \ > > + UartAddrLen, /* UINT32 Addres= sSize */ \ > > + UartNameStr /* UINT8 NameSp= aceString[MAX_DBG2_NAME_LEN] */ \ > > + } > > + > > + > > +STATIC DBG2_TABLE Dbg2 =3D { > > + { > > + 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 r= emoving > > +// the data structure from the executable > > +// > > +VOID* CONST ReferenceAcpiTable =3D &Dbg2; > > diff --git a/Platform/RaspberryPi/AcpiTables/Dbg2.aslc b/Platform/Raspb= erryPi/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 > > - * 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 > > #include > > -#include > > +#include > > #include > > #include > > > > @@ -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 =3D=3D 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_U= ART_BASE_ADDRESS > > -#define RPI_UART_LENGTH BCM2836_MINI_U= ART_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 BaseAddressReg= ister; > > - UINT32 AddressSize; > > - UINT8 NameSpaceStrin= g[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, U= artNameStr) { \ > > { = \ > > diff --git a/Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc b/Platfo= rm/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 > > +* Copyright (c) 2014-2021, ARM Limited. All rights reserved. > > +* > > +* SPDX-License-Identifier: BSD-2-Clause-Patent > > +* > > +**/ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "AcpiTables.h" > > + > > +#define RPI_UART_FLOW_CONTROL_NONE 0 > > + > > +#define RPI_UART_INTERFACE_TYPE EFI_ACPI_SERIAL_PORT_CONS= OLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART > > +#define RPI_UART_BASE_ADDRESS BCM2836_MINI_UART_BASE_AD= DRESS > > +#define RPI_UART_INTERRUPT BCM2836_MINI_UART_INTERRU= PT > > + > > +STATIC EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE Spcr =3D { > > + 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) =3D=3D 9600) > > + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_BAUD_RATE_9600, > > +#elif (FixedPcdGet64 (PcdUartDefaultBaudRate) =3D=3D 19200) > > + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_BAUD_RATE_19200, > > +#elif (FixedPcdGet64 (PcdUartDefaultBaudRate) =3D=3D 57600) > > + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_BAUD_RATE_57600, > > +#elif (FixedPcdGet64 (PcdUartDefaultBaudRate) =3D=3D 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 r= emoving the > > +// data structure from the executable > > +// > > +VOID* CONST ReferenceAcpiTable =3D &Spcr; > > diff --git a/Platform/RaspberryPi/AcpiTables/Spcr.aslc b/Platform/Raspb= erryPi/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 > > -* 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 =3D=3D 4) > > #define RPI_UART_INTERFACE_TYPE EFI_ACPI_SERIAL_PORT_CON= SOLE_REDIRECTION_TABLE_INTERFACE_TYPE_ARM_PL011_UART > > #define RPI_UART_BASE_ADDRESS BCM2836_PL011_UART_BASE_= ADDRESS > > #define RPI_UART_INTERRUPT BCM2836_PL011_UART_INTER= RUPT > > -#else > > -#define RPI_UART_INTERFACE_TYPE EFI_ACPI_SERIAL_PORT_CONS= OLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART > > -#define RPI_UART_BASE_ADDRESS BCM2836_MINI_UART_BASE_AD= DRESS > > -#define RPI_UART_INTERRUPT BCM2836_MINI_UART_INTERRU= PT > > -#endif > > + > > STATIC EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE Spcr =3D { > > ACPI_HEADER ( > > EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, > > diff --git a/Platform/RaspberryPi/AcpiTables/Uart.asl b/Platform/Raspbe= rryPi/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 > > * Copyright (c) 2018, Andrey Warkentin > > * 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 =3D=3D 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 =3D=3D 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.RPI= Q", 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/Platf= orm/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 > > #include > > #include > > +#include > > +#include > > +#include > > + > > #include > > #include > > #include > > @@ -23,6 +27,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > @@ -743,6 +748,11 @@ STATIC CONST AML_NAME_OP_REPLACE SsdtEmmcNameOpRep= lace[] =3D { > > { } > > }; > > > > +STATIC CONST AML_NAME_OP_REPLACE DsdtNameOpReplace[] =3D { > > + { "URIU", PcdToken (PcdUartInUse) }, > > + { } > > +}; > > + > > STATIC CONST NAMESPACE_TABLES SdtTables[] =3D { > > { > > SIGNATURE_64 ('R', 'P', 'I', 'T', 'H', 'F', 'A', 'N'), > > @@ -756,11 +766,11 @@ STATIC CONST NAMESPACE_TABLES SdtTables[] =3D { > > 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 =3D (EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE *)Ac= piHeader; > > + if ((PcdGet32 (PcdUartInUse) =3D=3D PL011_UART_IN_USE) && > > + (SpcrTable->InterfaceType =3D=3D EFI_ACPI_SERIAL_PORT_CONSOLE_= REDIRECTION_TABLE_INTERFACE_TYPE_ARM_PL011_UART)) { > > + return TRUE; > > + } else if ((PcdGet32 (PcdUartInUse) =3D=3D MINI_UART_IN_USE) && > > + (SpcrTable->InterfaceType =3D=3D EFI_ACPI_SERIAL_PORT_C= ONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART)) { > > + return TRUE; > > + } > > + return FALSE; > > + > > + case SIGNATURE_32 ('D', 'B', 'G', '2'): > > + Dbg2Table =3D (DBG2_TABLE *)AcpiHeader; > > + if ((PcdGet32 (PcdUartInUse) =3D=3D PL011_UART_IN_USE) && > > + (Dbg2Table->Dbg2DeviceInfo[0].Dbg2Device.PortSubtype =3D=3D EF= I_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART)) { > > + return TRUE; > > + } else if ((PcdGet32 (PcdUartInUse) =3D=3D MINI_UART_IN_USE) && > > + (Dbg2Table->Dbg2DeviceInfo[0].Dbg2Device.PortSubtype = =3D=3D 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) =3D=3D PL011_UART= _IN_USE_REG_VALUE) { > > + PcdSet32S (PcdUartInUse, PL011_UART_IN_USE); > > + } else if ((MmioRead32(GPIO_GPFSEL1) & GPFSEL1_UART_MASK) =3D=3D MIN= I_UART_IN_USE_REG_VALUE) { > > + PcdSet32S (PcdUartInUse, MINI_UART_IN_USE); > > + } > > + > > Status =3D gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid, > > NULL, (VOID**)&mFwProtocol); > > ASSERT_EFI_ERROR (Status); > > diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf b/Pla= tform/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/RpiDebugPort= 2Table.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 > > + > > +#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 BaseAddressReg= ister; > > + UINT32 AddressSize; > > + UINT8 NameSpaceStrin= g[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/Ra= spberryPi/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 - 0= x24000 > > +#define MINI_UART_IN_USE_REG_VALUE (BIT16 | BIT13) // ALT5 - 0= x12000 > > + > > +#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 Plat= form > > 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 Plat= form > > diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryP= i/RaspberryPi.dec > > index 8eb1c2bac7..f1dd8ac0ed 100644 > > --- a/Platform/RaspberryPi/RaspberryPi.dec > > +++ b/Platform/RaspberryPi/RaspberryPi.dec > > @@ -72,3 +72,4 @@ > > gRaspberryPiTokenSpaceGuid.PcdPlatformResetDelay|0|UINT32|0x0000001= E > > gRaspberryPiTokenSpaceGuid.PcdMmcEnableDma|0|UINT32|0x0000001F > > gRaspberryPiTokenSpaceGuid.PcdBootPolicy|0|UINT32|0x00000020 > > + gRaspberryPiTokenSpaceGuid.PcdUartInUse|1|UINT32|0x00000021 > > > > Reviewed-by: Pete Batard > Tested-by: Pete Batard Pushed as 4deb510cb00d..086a3a3ce6c4 Thanks all,