From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) by mx.groups.io with SMTP id smtpd.web11.5989.1623505199311663480 for ; Sat, 12 Jun 2021 06:40:00 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@akeo-ie.20150623.gappssmtp.com header.s=20150623 header.b=SQVUnb9F; spf=pass (domain: akeo.ie, ip: 209.85.128.52, mailfrom: pete@akeo.ie) Received: by mail-wm1-f52.google.com with SMTP id f16-20020a05600c1550b02901b00c1be4abso10213150wmg.2 for ; Sat, 12 Jun 2021 06:39:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=eBIqCrxS4dyj4hDMO8nllHKfBmT1UyhxXWbgq/b+rGI=; b=SQVUnb9FEzJVHbqc0/Vgyx9rulEi1qPrMA1fwSDD0oLB6NPb5zkoaaCkuvpfZqlOxa e4cuINLe2CkknutpfKcTzUKuDSp6ueHqJnTC/WUNYsdVJaEw2B8enzImPP/XwCwVqYKc wkO17wZkF/xQst8+JFen8GV5ZXE9Hw3kM3UjWZ/V7/0DZoZY5ssziR5puR3e0aEA/rCE XRbJRLYN4AcaNqlYLxYM67IHDOjApX7x1J7TfuETHzBpEF8miJF1sHHkEJmmS+/a00iX /rXyuugSyILbhGoRRRT12kj9NQbEquxggK9P9yXTkEUlAKJKVxZp38zXSY+cFROqjru9 Db6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=eBIqCrxS4dyj4hDMO8nllHKfBmT1UyhxXWbgq/b+rGI=; b=W7/TIqkhmjTEfUe8LWeDxTh/OPwDShFEYfcfE6wlK5mvKwWVzwvYS66aIWdBpvrloG 8WqR+kMGoPAi0g3Nb5xUM3fzrq/9s77xf0mFBtptyjIkpX8xxhYMPkmhyUzYreWTVk4V Rm8M9luMqcr3Xw06f2lZ4l+NZ6fh9C3AXoFASW086NKpEVePZMQ+p/FUdokAPFwPHb+F No06xw79Bmrv02+K8kwi+MaZEfEuJt6ad1L6/qDYSvyBk7gPhjpPip/7zUFsGEkWV404 75CWAfJBjoWrQb/IMuqVYcwlSbQcJKhpKvrHVjDK8rpT4gGfbLlxvEZ4QwNSXlqHn5GB Iqwg== X-Gm-Message-State: AOAM530pmek9Fws9eDyjietb0G6W8J0ZsYChQsaTegUaFV7zD8M9i7yi FF43QrVbm00xg0IUzYF2n2Nr+w== X-Google-Smtp-Source: ABdhPJzz2m6PbgBBlDL+c+8IKoMRLh44XhL/Acf4sVwLvwy0cWujURhU+Tahxp02F9WJl6UCoGYJCw== X-Received: by 2002:a1c:dcc3:: with SMTP id t186mr8747419wmg.23.1623505197617; Sat, 12 Jun 2021 06:39:57 -0700 (PDT) Return-Path: Received: from [10.0.0.122] ([84.203.35.112]) by smtp.googlemail.com with ESMTPSA id v15sm10107313wrw.24.2021.06.12.06.39.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 12 Jun 2021 06:39:57 -0700 (PDT) Subject: Re: [PATCH v4 1/3] Platform/RaspberryPi: Dynamically build UARTs info in ACPI To: Sunny Wang , devel@edk2.groups.io Cc: Samer El-Haj-Mahmoud , Sami Mujawar , Jeremy Linton , Ard Biesheuvel , =?UTF-8?B?TWFyaW8gQsSDbMSDbmljxIM=?= References: <20210607075339.342-1-Sunny.Wang@arm.com> <20210607075339.342-2-Sunny.Wang@arm.com> From: "Pete Batard" Message-ID: <192c4221-1ec9-34f2-38bb-b4fa40673184@akeo.ie> Date: Sat, 12 Jun 2021 14:39:55 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <20210607075339.342-2-Sunny.Wang@arm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit 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 > Cc: Sami Mujawar > Cc: Jeremy Linton > Cc: Pete Batard > Cc: Ard Biesheuvel > Cc: Mario Bălănică > Signed-off-by: Sunny Wang > --- > .../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 > # 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 > + * 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_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 > - * 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 == 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 > +* 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_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 > -* 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 > * 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 == 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 > #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 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 > + > +#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 Tested-by: Pete Batard