public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Sunny (Hsuan-Wen) Wang" <sunny.hsuanwen.wang@gmail.com>
To: Pete Batard <pete@akeo.ie>
Cc: devel@edk2.groups.io,
	Samer El-Haj-Mahmoud <samer.el-haj-mahmoud@arm.com>,
	 Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Leif Lindholm <leif@nuviainc.com>
Subject: Re: [PATCH] Platform/RaspberryPi: Dynamically build UARTs info in ACPI
Date: Thu, 11 Mar 2021 14:50:46 +0800	[thread overview]
Message-ID: <CALA6k4FQbZVVOt493yftffAW_1TWeyBP20cnPGqd4PPZJ4Sxww@mail.gmail.com> (raw)
In-Reply-To: <f01a5ca4-e63a-adcc-4070-7172312d6855@akeo.ie>

[-- Attachment #1: Type: text/plain, Size: 46338 bytes --]

Thanks for the review and good comments, Pete.
Since I'm busy with other things, I will work on your comments next week or
later.

Regards,
Sunny

On Tue, Mar 9, 2021 at 12:58 AM Pete Batard <pete@akeo.ie> wrote:

> Hi Sunny,
>
> Thanks a lot for submitting this patch!
>
> This is something that has been on the Raspberry Pi platform TODO list
> for some time, so your contribution is much appreciated.
>
> Please find 4 comments inline:
>
> On 2021.03.06 09:24, Sunny Hsuan-Wen 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 fixes the
> >
> >       issue discussed in https://github.com/pftf/RPi4/issues/118.
> >
> >    2. Merge changes in edk2-platforms-raspberrypi-pl011-bth-noflow.diff
> >
> >       in https://github.com/worproject/RPi-Bluetooth-Testing/
> >
> >       for enabling Bluetooth and serial port (Mini UART) in Windows OS.
> >
> >    3. Cleanup by moving duplicate Debug Port 2 table related defines and
> >
> >       structures to a newly created header file (RpiDebugPort2Table.h).
>
> Ideally, I would prefer if 1-3 and 2 were submitted as separate patches
> in a series, as one can consider that the ACPI assigning of the
> Spcr/Dbg2 tables is independent of the Bluetooth related changes.
>
> For instance, regardless of Bluetooth usage, one of course wants the
> serial ports used by Windows to match the ones defined in config.txt. So
> I would say that we have at least two separate functional changes in
> this patch, that should probably be made more explicit by splitting them
> into separare commits.
>
> > 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.
> >
> >    - Successfully booted Windows 10 (20279.1) on SD (made by WOR) with
> >
> >      the RPi-Windows-Drivers release ver 0.5 downloaded from
> >
> >      https://github.com/worproject/RPi-Windows-Drivers/releases
> >
> >      and checked that both Bluetooth and serial port (Mini UART) can
> >
> >      work fine.
> >
> >
> >
> > Cc: Samer El-Haj-Mahmoud <samer.el-haj-mahmoud@arm.com>
> >
> > Cc: Pete Batard <pete@akeo.ie>
> >
> > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
> >
> > Cc: Leif Lindholm <leif@nuviainc.com>
> >
> > Signed-off-by: Sunny Hsuan-Wen Wang <sunny.hsuanwen.wang@gmail.com>
> >
> > ---
> >
> >   .../RaspberryPi/AcpiTables/AcpiTables.inf     |   7 +-
> >
> >   .../RaspberryPi/AcpiTables/Dbg2MiniUart.aslc  |  82 ++++++++
> >
> >   .../AcpiTables/{Dbg2.aslc => Dbg2Pl011.aslc}  | 187 ++++++++---------
> >
> >   .../RaspberryPi/AcpiTables/SpcrMiniUart.aslc  |  92 +++++++++
> >
> >   .../AcpiTables/{Spcr.aslc => SpcrPl011.aslc}  | 189 +++++++++---------
> >
> >   Platform/RaspberryPi/AcpiTables/Uart.asl      |  18 +-
> >
> >   .../RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c | 123 +++++++++++-
> >
> >   .../IndustryStandard/RpiDebugPort2Table.h     |  33 +++
> >
> >   8 files changed, 516 insertions(+), 215 deletions(-)
> >
> >   create mode 100644 Platform/RaspberryPi/AcpiTables/Dbg2MiniUart.aslc
> >
> >   rename Platform/RaspberryPi/AcpiTables/{Dbg2.aslc => Dbg2Pl011.aslc}
> (73%)
> >
> >   create mode 100644 Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc
> >
> >   rename Platform/RaspberryPi/AcpiTables/{Spcr.aslc => SpcrPl011.aslc}
> (88%)
> >
> >   create mode 100644
> Platform/RaspberryPi/Include/IndustryStandard/RpiDebugPort2Table.h
> >
> >
> >
> > diff --git a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
> b/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
> >
> > index d2cce074e5..6c08cacbb3 100644
> >
> > --- a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
> >
> > +++ b/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
> >
> > @@ -2,6 +2,7 @@
> >
> >   #
> >
> >   #  ACPI table data and ASL sources required to boot the platform.
> >
> >   #
> >
> > +#  Copyright (c) 2021, Sunny Hsuan-Wen Wang <
> sunny.hsuanwen.wang@gmail.com>
> >
> >   #  Copyright (c) 2019, ARM Limited. All rights reserved.
> >
> >   #  Copyright (c) 2017, Andrey Warkentin <andrey.warkentin@gmail.com>
> >
> >   #  Copyright (c) Microsoft Corporation. All rights reserved.
> >
> > @@ -27,12 +28,14 @@
> >
> >     AcpiTables.h
> >
> >     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..eec4ba1562
> >
> > --- /dev/null
> >
> > +++ b/Platform/RaspberryPi/AcpiTables/Dbg2MiniUart.aslc
> >
> > @@ -0,0 +1,82 @@
> >
> > +/** @file
> >
> > + *
> >
> > + *  Debug Port Table (DBG2)
> >
> > + *
> >
> > + *  Copyright (c) 2021, Sunny Hsuan-Wen Wang <
> sunny.hsuanwen.wang@gmail.com>
> >
> > + *  Copyright (c) 2019, Pete Batard <pete@akeo.ie>
> >
> > + *  Copyright (c) 2012-2020, 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 73%
> >
> > rename from Platform/RaspberryPi/AcpiTables/Dbg2.aslc
> >
> > rename to Platform/RaspberryPi/AcpiTables/Dbg2Pl011.aslc
> >
> > index e3f2adae7e..5ef58f14a1 100644
> >
> > --- a/Platform/RaspberryPi/AcpiTables/Dbg2.aslc
> >
> > +++ b/Platform/RaspberryPi/AcpiTables/Dbg2Pl011.aslc
> >
> > @@ -1,105 +1,82 @@
> >
> > -/** @file
> >
> > - *
> >
> > - *  Debug Port Table (DBG2)
> >
> > - *
> >
> > - *  Copyright (c) 2019, Pete Batard <pete@akeo.ie>
> >
> > - *  Copyright (c) 2012-2020, ARM Limited. All rights reserved.
> >
> > - *
> >
> > - *  SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> > - *
> >
> > - **/
> >
> > -
> >
> > -#include <IndustryStandard/Acpi.h>
> >
> > -#include <IndustryStandard/Bcm2836.h>
> >
> > -#include <IndustryStandard/DebugPort2Table.h>
> >
> > -#include <Library/AcpiLib.h>
> >
> > -#include <Library/PcdLib.h>
> >
> > -
> >
> > -#include "AcpiTables.h"
> >
> > -
> >
> > -#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 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;
> >
> > +/** @file
> >
> > + *
> >
> > + *  Debug Port Table (DBG2)
> >
> > + *
> >
> > + *  Copyright (c) 2021, Sunny Hsuan-Wen Wang <
> sunny.hsuanwen.wang@gmail.com>
> >
> > + *  Copyright (c) 2019, Pete Batard <pete@akeo.ie>
> >
> > + *  Copyright (c) 2012-2020, 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_ARM_PL011_UART
> >
> > +#define RPI_UART_BASE_ADDRESS
>  BCM2836_PL011_UART_BASE_ADDRESS
> >
> > +#define RPI_UART_LENGTH
>  BCM2836_PL011_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', '0', 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/SpcrMiniUart.aslc
> b/Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc
> >
> > new file mode 100644
> >
> > index 0000000000..988d6aec0a
> >
> > --- /dev/null
> >
> > +++ b/Platform/RaspberryPi/AcpiTables/SpcrMiniUart.aslc
> >
> > @@ -0,0 +1,92 @@
> >
> > +/** @file
> >
> > +* SPCR Table
> >
> > +*
> >
> > +* Copyright (c) 2021, Sunny Hsuan-Wen Wang <
> sunny.hsuanwen.wang@gmail.com>
> >
> > +* Copyright (c) 2019 Pete Batard <pete@akeo.ie>
> >
> > +* Copyright (c) 2014-2016, 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 88%
> >
> > rename from Platform/RaspberryPi/AcpiTables/Spcr.aslc
> >
> > rename to Platform/RaspberryPi/AcpiTables/SpcrPl011.aslc
> >
> > index 07df3a718d..34656cf9a6 100644
> >
> > --- a/Platform/RaspberryPi/AcpiTables/Spcr.aslc
> >
> > +++ b/Platform/RaspberryPi/AcpiTables/SpcrPl011.aslc
> >
> > @@ -1,97 +1,92 @@
> >
> > -/** @file
> >
> > -* SPCR Table
> >
> > -*
> >
> > -* Copyright (c) 2019 Pete Batard <pete@akeo.ie>
> >
> > -* Copyright (c) 2014-2016, 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
> >
> > -
> >
> > -// 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,
> >
> > -    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;
> >
> > +/** @file
> >
> > +* SPCR Table
> >
> > +*
> >
> > +* Copyright (c) 2021, Sunny Hsuan-Wen Wang <
> sunny.hsuanwen.wang@gmail.com>
> >
> > +* Copyright (c) 2019 Pete Batard <pete@akeo.ie>
> >
> > +* Copyright (c) 2014-2016, 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_ARM_PL011_UART
> >
> > +#define RPI_UART_BASE_ADDRESS
> BCM2836_PL011_UART_BASE_ADDRESS
> >
> > +#define RPI_UART_INTERRUPT
>  BCM2836_PL011_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/Uart.asl
> b/Platform/RaspberryPi/AcpiTables/Uart.asl
> >
> > index 81ae6711af..0f6719a27f 100644
> >
> > --- a/Platform/RaspberryPi/AcpiTables/Uart.asl
> >
> > +++ b/Platform/RaspberryPi/AcpiTables/Uart.asl
> >
> > @@ -2,6 +2,7 @@
> >
> >    *
> >
> >    *  [DSDT] Serial devices (UART).
> >
> >    *
> >
> > + *  Copyright (c) 2021, Sunny Hsuan-Wen Wang <
> sunny.hsuanwen.wang@gmail.com>
> >
> >    *  Copyright (c) 2020, Pete Batard <pete@akeo.ie>
> >
> >    *  Copyright (c) 2018, Andrey Warkentin <andrey.warkentin@gmail.com>
> >
> >    *  Copyright (c) Microsoft Corporation. All rights reserved.
> >
> > @@ -29,6 +30,12 @@ Device (URT0)
> >
> >     {
> >
> >       MEMORY32FIXED (ReadWrite, 0, BCM2836_PL011_UART_LENGTH, RMEM)
> >
> >       Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) {
> BCM2836_PL011_UART_INTERRUPT }
> >
> > +
> >
> > +    PinFunction (Exclusive, PullDown, BCM_ALT3, "\\_SB.GDV0.GPI0", 0,
> ResourceConsumer, , ) { 32, 33 }
> >
> > +
> >
> > +    // fake the CTS signal as we don't support HW flow control yet
> >
> > +    // BCM_ALT2 is set as output (low) by default
> >
> > +    PinFunction (Exclusive, PullNone, BCM_ALT2, "\\_SB.GDV0.GPI0", 0,
> ResourceConsumer, , ) { 31 }
> >
> >     })
> >
> >     Method (_CRS, 0x0, Serialized)
> >
> >     {
> >
> > @@ -101,7 +108,10 @@ Device(BTH0)
> >
> >     {
> >
> >       Name (RBUF, ResourceTemplate ()
> >
> >       {
> >
> > -      // BT UART: URT0 (PL011) or URTM (miniUART)
> >
> > +      //
> >
> > +      // 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
> >
> > @@ -126,11 +136,7 @@ Device(BTH0)
> >
> >                          //   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
> >
> > @@ -142,7 +148,7 @@ Device(BTH0)
> >
> >         //
> >
> >         // RPIQ connection for BT_ON/OFF
> >
> >         //
> >
> > -      GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone,
> "\\_SB.GDV0.RPIQ", 0, ResourceConsumer, , ) { 128 }
> >
> > +      //GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone,
> "\\_SB.GDV0.RPIQ", 0, ResourceConsumer, , ) { 128 }
> >
> >       })
> >
> >       Return (RBUF)
> >
> >     }
> >
> > diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
> b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
> >
> > index 19ef950f10..a0335b0d24 100644
> >
> > --- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
> >
> > +++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
> >
> > @@ -1,5 +1,6 @@
> >
> >   /** @file
> >
> >    *
> >
> > + *  Copyright (c) 2021, Sunny Hsuan-Wen Wang <
> sunny.hsuanwen.wang@gmail.com>
> >
> >    *  Copyright (c) 2019 - 2020, ARM Limited. All rights reserved.
> >
> >    *  Copyright (c) 2018 - 2020, Andrei Warkentin <
> andrey.warkentin@gmail.com>
> >
> >    *
> >
> > @@ -12,6 +13,9 @@
> >
> >   #include <IndustryStandard/Bcm2836.h>
> >
> >   #include <IndustryStandard/Bcm2836Gpio.h>
> >
> >   #include <IndustryStandard/RpiMbox.h>
> >
> > +#include <IndustryStandard/SerialPortConsoleRedirectionTable.h>
> >
> > +#include <IndustryStandard/RpiDebugPort2Table.h>
> >
> > +
> >
> >   #include <Library/AcpiLib.h>
> >
> >   #include <Library/DebugLib.h>
> >
> >   #include <Library/DevicePathLib.h>
> >
> > @@ -40,6 +44,8 @@ STATIC UINT32 mModelFamily = 0;
> >
> >   STATIC UINT32 mModelInstalledMB = 0;
> >
> >
> >
> >   STATIC EFI_MAC_ADDRESS  mMacAddress;
> >
> > +BOOLEAN mUsePl011Uart;
> >
> > +BOOLEAN mUseMiniUart;
> >
> >
> >
> >   /*
> >
> >    * The GUID inside Platform/RaspberryPi/RPi3/AcpiTables/AcpiTables.inf
> and
> >
> > @@ -689,6 +695,71 @@ UpdateSdtNameOps (
> >
> >     }
> >
> >   }
> >
> >
> >
> > +//
> >
> > +// BTH0._HID.BCM2EA6
> >
> > +//
> >
> > +#define BTH0_HID_PATTERN_LEN 17
> >
> > +
> >
> > +//
> >
> > +// \_SB.GDV0.URT
> >
> > +//
> >
> > +#define RESOURCE_SOURCE_PATTERN_LEN 13
> >
> > +
> >
> > +//
> >
> > +// Scan the given namespace table (DSDT/SSDT) for AML NameOps
> >
> > +// listed in the NameOpReplace structure. If one is found then
> >
> > +// update the value in the table from the specified Pcd
> >
> > +//
> >
> > +// This allows us to have conditionals in AML controlled
> >
> > +// by options in the BDS or detected during firmware bootstrap.
> >
> > +// We could extend this concept for strings/etc but due to len
> >
> > +// variations its probably easier to encode the strings
> >
> > +// in the ASL and pick the correct one based off a variable.
> >
> > +//
> >
> > +STATIC
> >
> > +VOID
> >
> > +UpdateDevBth0 (
> >
> > +  EFI_ACPI_DESCRIPTION_HEADER  *AcpiTable
> >
> > +  )
> >
> > +{
> >
> > +  UINTN   Index;
> >
> > +  CHAR8   Bth0HidPattern[BTH0_HID_PATTERN_LEN] = {0x42, 0x54, 0x48,
> 0x30, 0x08, 0x5F, 0X48, 0x49, 0x44, 0x0D, 0x42, 0x43, 0x4D, 0x32, 0x45,
> 0x41, 0x36};
> >
> > +  CHAR8   ResourceSourcePattern[BTH0_HID_PATTERN_LEN] = {0x5C, 0x5F,
> 0x53, 0x42, 0x2E, 0x47, 0X44, 0x56, 0x30, 0x2E, 0x55, 0x52, 0x54};
> >
> > +  BOOLEAN FoundBth0HidPattern;
> >
> > +  UINT8   *SdtPtr;
> >
> > +  UINT32  SdtSize;
> >
> > +
> >
> > +  FoundBth0HidPattern = FALSE;
> >
> > +  SdtSize = AcpiTable->Length;
> >
> > +
> >
> > +  if (SdtSize > 0) {
> >
> > +    SdtPtr = (UINT8 *)AcpiTable;
> >
> > +    for (Index = 0; Index < (SdtSize - BTH0_HID_PATTERN_LEN); Index++) {
> >
> > +      if (!FoundBth0HidPattern) {
> >
> > +        if (CompareMem (SdtPtr + Index, Bth0HidPattern,
> BTH0_HID_PATTERN_LEN) == 0) {
> >
> > +          FoundBth0HidPattern = TRUE;
> >
> > +        }
> >
> > +      } else {
> >
> > +        if (CompareMem (SdtPtr + Index, ResourceSourcePattern,
> RESOURCE_SOURCE_PATTERN_LEN) == 0) {
> >
> > +          if (mUsePl011Uart) {
> >
> > +            //
> >
> > +            // Since PL011 has been set as Primary UART, set the last
> char in
> >
> > +            // ResourceSource string to 'M' (0x4D) so that Mini UART
> can be used as Secondary UART for BlueTooth.
> >
> > +            //
> >
> > +            SdtPtr[Index + RESOURCE_SOURCE_PATTERN_LEN] = 0x4D;
> >
> > +          } else if (mUseMiniUart) {
> >
> > +            //
> >
> > +            // Since Mini UART has been set as Primary UART, set the
> last char in
> >
> > +            // ResourceSource string to '0' (0x30) so that PL011 can be
> used as Secondary UART for BlueTooth.
> >
> > +            //
> >
> > +            SdtPtr[Index + RESOURCE_SOURCE_PATTERN_LEN] = 0x30;
> >
> > +          }
> >
> > +          break;
> >
> > +        }
> >
> > +      }
> >
> > +    }
> >
> > +  }
> >
> > +}
> >
> >
> >
> >   STATIC
> >
> >   BOOLEAN
> >
> > @@ -700,13 +771,22 @@ VerifyUpdateTable (
> >
> >     BOOLEAN Result;
> >
> >
> >
> >     Result = TRUE;
> >
> > -  if (SdtTable->PcdToken && !LibPcdGet32 (SdtTable->PcdToken)) {
> >
> > -    Result = FALSE;
> >
> > -  }
> >
> > +
> >
> >     if (Result && SdtTable->SdtNameOpReplace) {
> >
> > -    UpdateSdtNameOps (AcpiHeader, SdtTable->SdtNameOpReplace);
> >
> > +    if (SdtTable->PcdToken && LibPcdGet32 (SdtTable->PcdToken)) {
> >
> > +      UpdateSdtNameOps (AcpiHeader, SdtTable->SdtNameOpReplace);
> >
> > +    } else {
> >
> > +      //
> >
> > +      // PcdToken and PCD value are invalid or setting is disabled, so
> >
> > +      // no need to update and report the SSDT.
> >
> > +      //
> >
> > +      return FALSE;
> >
> > +    }
> >
> >     }
> >
> >
> >
> > +  if (AcpiHeader->Signature == SIGNATURE_32 ('D', 'S', 'D', 'T')) {
> >
> > +    UpdateDevBth0 (AcpiHeader);
> >
> > +  }
> >
> >     return Result;
> >
> >   }
> >
> >
> >
> > @@ -744,8 +824,14 @@ HandleDynamicNamespace (
> >
> >   {
> >
> >     UINTN Tables;
> >
> >
> >
> > +  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE *SpcrTable;
> >
> > +  DBG2_TABLE                                     *Dbg2Table;
> >
> > +
> >
> >     switch (AcpiHeader->Signature) {
> >
> >     case SIGNATURE_32 ('D', 'S', 'D', 'T'):
> >
> > +    UpdateDevBth0 (AcpiHeader);
> >
> > +    return TRUE;
> >
> > +
> >
> >     case SIGNATURE_32 ('S', 'S', 'D', 'T'):
> >
> >       for (Tables = 0; SdtTables[Tables].OemTableId; Tables++) {
> >
> >         if (AcpiHeader->OemTableId == SdtTables[Tables].OemTableId) {
> >
> > @@ -753,8 +839,30 @@ HandleDynamicNamespace (
> >
> >         }
> >
> >       }
> >
> >       DEBUG ((DEBUG_ERROR, "Found namespace table not in table
> list.\n"));
> >
> > -
> >
> >       return FALSE;
>
> The version of ConfidDxe.c you based your changes on appears to be
> missing the commit for
>
> https://github.com/tianocore/edk2-platforms/commit/41b54dbb68036743768c53de9586f68a6d2c986f
>
> This can result in a conflict here when trying to apply your patch.
>
> Can you please rebase on an up to date edk2-platform tree?
>
> >
> > +
> >
> > +  case SIGNATURE_32 ('S', 'P', 'C', 'R'):
> >
> > +    SpcrTable = (EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE
> *)AcpiHeader;
> >
> > +    if (mUsePl011Uart && (SpcrTable->InterfaceType ==
> EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_ARM_PL011_UART))
> {
> >
> > +      return TRUE;
> >
> > +    } else if (mUseMiniUart && (SpcrTable->InterfaceType ==
> EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART))
> {
> >
> > +      return TRUE;
> >
> > +    } else {
> >
> > +      return FALSE;
> >
> > +    }
> >
> > +
> >
> > +    return TRUE;
> >
> > +
> >
> > +  case SIGNATURE_32 ('D', 'B', 'G', '2'):
> >
> > +    Dbg2Table = (DBG2_TABLE *)AcpiHeader;
> >
> > +    if (mUsePl011Uart &&
> (Dbg2Table->Dbg2DeviceInfo[0].Dbg2Device.PortSubtype ==
> EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART)) {
> >
> > +      return TRUE;
> >
> > +    } else if (mUseMiniUart &&
> (Dbg2Table->Dbg2DeviceInfo[0].Dbg2Device.PortSubtype ==
> EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_BCM2835_UART)) {
> >
> > +      return TRUE;
> >
> > +    } else {
> >
> > +      return FALSE;
> >
> > +    }
> >
> > +    return TRUE;
> >
> >     }
> >
> >
> >
> >     return TRUE;
> >
> > @@ -771,6 +879,11 @@ ConfigInitialize (
> >
> >     EFI_STATUS                      Status;
> >
> >     EFI_EVENT                       EndOfDxeEvent;
> >
> >
> >
> > +  mUsePl011Uart = 0;
> >
> > +  mUseMiniUart  = 0;
>
> The above assignment is pointless, since we are reassigning the same
> variables right below. These 2 lines should be removed.
>
> >
> > +  mUsePl011Uart = ((MmioRead32(GPIO_BASE_ADDRESS + 4) & 0x0003F000) ==
> 0x00024000);
> >
> > +  mUseMiniUart  = ((MmioRead32(GPIO_BASE_ADDRESS + 4) & 0x0003F000) ==
> 0x00012000);
> >
> > +
> >
> >     Status = gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid,
> >
> >                     NULL, (VOID**)&mFwProtocol);
> >
> >     ASSERT_EFI_ERROR (Status);
> >
> > diff --git
> a/Platform/RaspberryPi/Include/IndustryStandard/RpiDebugPort2Table.h
> b/Platform/RaspberryPi/Include/IndustryStandard/RpiDebugPort2Table.h
> >
> > new file mode 100644
> >
> > index 0000000000..41038e8cce
> >
> > --- /dev/null
> >
> > +++ b/Platform/RaspberryPi/Include/IndustryStandard/RpiDebugPort2Table.h
> >
> > @@ -0,0 +1,33 @@
> >
> > +/** @file
> >
> > +
> >
> > +  Copyright (c) 2021, Sunny Hsuan-Wen Wang <
> sunny.hsuanwen.wang@gmail.com>
> >
> > +
> >
> > +  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__
> >
> > \ No newline at end of file
>
> You probably want to add a newline there, as suggested by git.
>
> Regards,
>
> /Pete
>
> >
> > --
> >
> > 2.30.1.windows.1
> >
> >
> >
>
>

[-- Attachment #2: Type: text/html, Size: 68562 bytes --]

  reply	other threads:[~2021-03-11  6:50 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-06  9:24 [PATCH] Platform/RaspberryPi: Dynamically build UARTs info in ACPI sunny.hsuanwen.wang
2021-03-08 16:57 ` Pete Batard
2021-03-11  6:50   ` Sunny (Hsuan-Wen) Wang [this message]
2021-03-11 15:57 ` [edk2-devel] " Mario Bălănică

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=CALA6k4FQbZVVOt493yftffAW_1TWeyBP20cnPGqd4PPZJ4Sxww@mail.gmail.com \
    --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