Allow other architectures to reuse the AcpiDbg2Lib by extracting the Arm specific part of the table generation.
Signed-off-by: Pierre Gondois <pierre.gond...@arm.com> --- .../Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf | 7 ++ .../Common/AcpiDbg2Lib/Arm/ArmDbg2Generator.c | 67 +++++++++++++++++++ .../AcpiDbg2Lib/Common/CommonDbg2Generator.c | 59 ++++++++++++++++ .../Acpi/Common/AcpiDbg2Lib/Dbg2Generator.c | 24 +++++-- .../Acpi/Common/AcpiDbg2Lib/Dbg2Generator.h | 56 ++++++++++++++++ 5 files changed, 206 insertions(+), 7 deletions(-) create mode 100644 DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Arm/ArmDbg2Generator.c create mode 100644 DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Common/CommonDbg2Generator.c create mode 100644 DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.h diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf index 32dcd20c082b..1e0ce347c0fa 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf @@ -18,6 +18,13 @@ [Defines] [Sources] Dbg2Generator.c + Dbg2Generator.h + +[Sources.ARM, Sources.AARCH64] + Arm/ArmDbg2Generator.c + +[Sources.IA32, Sources.X86] + Common/CommonDbg2Generator.c [Packages.ARM, Packages.AARCH64] ArmPlatformPkg/ArmPlatformPkg.dec diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Arm/ArmDbg2Generator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Arm/ArmDbg2Generator.c new file mode 100644 index 000000000000..a063f49829e5 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Arm/ArmDbg2Generator.c @@ -0,0 +1,67 @@ +/** @file + Arm DBG2 Table Generator + + Copyright (c) 2024, Arm Limited. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015. +**/ + +#include <ConfigurationManagerObject.h> +#include <Library/PL011UartLib.h> +#include <Protocol/SerialIo.h> +#include "Dbg2Generator.h" + +/** + Initialise the serial port to the specified settings. + The serial port is re-configured only if the specified settings + are different from the current settings. + All unspecified settings will be set to the default values. + + @param SerialPortInfo CM_ARCH_COMMON_SERIAL_PORT_INFO object describing + the serial port. + @param BaudRate The baud rate of the serial device. If the + baud rate is not supported, the speed will be + reduced to the nearest supported one and the + variable's value will be updated accordingly. + @param ReceiveFifoDepth The number of characters the device will + buffer on input. Value of 0 will use the + device's default FIFO depth. + @param Parity If applicable, this is the EFI_PARITY_TYPE + that is computed or checked as each character + is transmitted or received. If the device + does not support parity, the value is the + default parity value. + @param DataBits The number of data bits in each character. + @param StopBits If applicable, the EFI_STOP_BITS_TYPE number + of stop bits per character. + If the device does not support stop bits, the + value is the default stop bit value. + + @retval RETURN_SUCCESS All attributes were set correctly on the + serial device. + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an + unsupported value. +**/ +RETURN_STATUS +EFIAPI +Dbg2InitializePort ( + IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo, + IN OUT UINT64 *BaudRate, + IN OUT UINT32 *ReceiveFifoDepth, + IN OUT EFI_PARITY_TYPE *Parity, + IN OUT UINT8 *DataBits, + IN OUT EFI_STOP_BITS_TYPE *StopBits + ) +{ + return PL011UartInitializePort ( + (UINTN)SerialPortInfo->BaseAddress, + SerialPortInfo->Clock, + BaudRate, + ReceiveFifoDepth, + Parity, + DataBits, + StopBits + ); +} diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Common/CommonDbg2Generator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Common/CommonDbg2Generator.c new file mode 100644 index 000000000000..936f3ca46604 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Common/CommonDbg2Generator.c @@ -0,0 +1,59 @@ +/** @file + Common DBG2 Table Generator + + Copyright (c) 2024, Arm Limited. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015. +**/ + +#include <ConfigurationManagerObject.h> +#include <Protocol/SerialIo.h> +#include "Dbg2Generator.h" + +/** + Initialise the serial port to the specified settings. + The serial port is re-configured only if the specified settings + are different from the current settings. + All unspecified settings will be set to the default values. + + @param SerialPortInfo CM_ARCH_COMMON_SERIAL_PORT_INFO object describing + the serial port. + @param BaudRate The baud rate of the serial device. If the + baud rate is not supported, the speed will be + reduced to the nearest supported one and the + variable's value will be updated accordingly. + @param ReceiveFifoDepth The number of characters the device will + buffer on input. Value of 0 will use the + device's default FIFO depth. + @param Parity If applicable, this is the EFI_PARITY_TYPE + that is computed or checked as each character + is transmitted or received. If the device + does not support parity, the value is the + default parity value. + @param DataBits The number of data bits in each character. + @param StopBits If applicable, the EFI_STOP_BITS_TYPE number + of stop bits per character. + If the device does not support stop bits, the + value is the default stop bit value. + + @retval RETURN_SUCCESS All attributes were set correctly on the + serial device. + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an + unsupported value. +**/ +RETURN_STATUS +EFIAPI +Dbg2InitializePort ( + IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo, + IN OUT UINT64 *BaudRate, + IN OUT UINT32 *ReceiveFifoDepth, + IN OUT EFI_PARITY_TYPE *Parity, + IN OUT UINT8 *DataBits, + IN OUT EFI_STOP_BITS_TYPE *StopBits + ) +{ + // Nothing to do. + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.c index fbf2ba37331d..6f49e6a27053 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.c @@ -14,7 +14,6 @@ #include <Library/AcpiLib.h> #include <Library/DebugLib.h> #include <Library/MemoryAllocationLib.h> -#include <Library/PL011UartLib.h> #include <Protocol/AcpiTable.h> #include <Protocol/SerialIo.h> @@ -26,9 +25,11 @@ #include <Library/TableHelperLib.h> #include <Protocol/ConfigurationManagerProtocol.h> +#include "Dbg2Generator.h" + /** ARM standard DBG2 Table Generator - Constructs the DBG2 table for PL011 or SBSA UART peripherals. + Constructs the DBG2 table for corresponding DBG2 peripheral. Requirements: The following Configuration Manager Object(s) are required by @@ -169,7 +170,7 @@ DBG2_TABLE AcpiDbg2 = { DBG2_DEBUG_PORT_DDI ( 0, // {Template}: Serial Port Subtype 0, // {Template}: Serial Port Base Address - PL011_UART_LENGTH, + 0, // {Template}: Serial Port Base Address Size NAMESPACE_STR_DBG_PORT0 ) } @@ -186,7 +187,7 @@ GET_OBJECT_LIST ( CM_ARCH_COMMON_SERIAL_PORT_INFO ); -/** Initialize the PL011/SBSA UART with the parameters obtained from +/** Initialize the DBG2 UART with the parameters obtained from the Configuration Manager. @param [in] SerialPortInfo Pointer to the Serial Port Information. @@ -218,9 +219,8 @@ SetupDebugUart ( StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits); BaudRate = SerialPortInfo->BaudRate; - Status = PL011UartInitializePort ( - (UINTN)SerialPortInfo->BaseAddress, - SerialPortInfo->Clock, + Status = Dbg2InitializePort ( + SerialPortInfo, &BaudRate, &ReceiveFifoDepth, &Parity, @@ -460,6 +460,9 @@ BuildDbg2TableEx ( (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART)) { + // Setup the PL011 length. + AcpiDbg2.Dbg2DeviceInfo[INDEX_DBG_PORT0].AddressSize = PL011_UART_LENGTH; + // Initialize the serial port Status = SetupDebugUart (SerialPortInfo); if (EFI_ERROR (Status)) { @@ -470,6 +473,13 @@ BuildDbg2TableEx ( )); goto error_handler; } + } else if ((SerialPortInfo->PortSubtype == + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS)) + { + AcpiDbg2.Dbg2DeviceInfo[INDEX_DBG_PORT0].AddressSize = SIZE_4KB; + } else { + // Try to catch other serial ports, but don't return an error. + ASSERT (0); } TableList[0] = (EFI_ACPI_DESCRIPTION_HEADER *)&AcpiDbg2; diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.h b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.h new file mode 100644 index 000000000000..5424be47b8ec --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.h @@ -0,0 +1,56 @@ +/** @file + DBG2 Table Generator + + Copyright (c) 2024, Arm Limited. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015. +**/ + +#ifndef DBG2_GENERATOR_H_ +#define DBG2_GENERATOR_H_ + +/** + Initialise the serial port to the specified settings. + The serial port is re-configured only if the specified settings + are different from the current settings. + All unspecified settings will be set to the default values. + + @param SerialPortInfo CM_ARCH_COMMON_SERIAL_PORT_INFO object describing + the serial port. + @param BaudRate The baud rate of the serial device. If the + baud rate is not supported, the speed will be + reduced to the nearest supported one and the + variable's value will be updated accordingly. + @param ReceiveFifoDepth The number of characters the device will + buffer on input. Value of 0 will use the + device's default FIFO depth. + @param Parity If applicable, this is the EFI_PARITY_TYPE + that is computed or checked as each character + is transmitted or received. If the device + does not support parity, the value is the + default parity value. + @param DataBits The number of data bits in each character. + @param StopBits If applicable, the EFI_STOP_BITS_TYPE number + of stop bits per character. + If the device does not support stop bits, the + value is the default stop bit value. + + @retval RETURN_SUCCESS All attributes were set correctly on the + serial device. + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an + unsupported value. +**/ +RETURN_STATUS +EFIAPI +Dbg2InitializePort ( + IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo, + IN OUT UINT64 *BaudRate, + IN OUT UINT32 *ReceiveFifoDepth, + IN OUT EFI_PARITY_TYPE *Parity, + IN OUT UINT8 *DataBits, + IN OUT EFI_STOP_BITS_TYPE *StopBits + ); + +#endif // DBG2_GENERATOR_H_ -- 2.25.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119636): https://edk2.groups.io/g/devel/message/119636 Mute This Topic: https://groups.io/mt/106770155/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-