diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf index 32dcd20c08..ed049ea4a2 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf @@ -18,6 +18,13 @@ [Sources] Dbg2Generator.c + Dbg2Generator.h + +[Sources.ARM, Sources.AARCH64] + Arm/ArmDbg2Generator.c + +[Sources.IA32, Sources.X86] + Dbg2GeneratorNull.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 0000000000..a063f49829 --- /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.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015. +**/ + +#include +#include +#include +#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/Dbg2Generator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.c index fbf2ba3733..6f49e6a270 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2Generator.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -26,9 +25,11 @@ #include #include +#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 0000000000..5424be47b8 --- /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.
+ 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_ diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2GeneratorNull.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2GeneratorNull.c new file mode 100644 index 0000000000..3219f6f909 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/Dbg2GeneratorNull.c @@ -0,0 +1,60 @@ +/** @file + Common DBG2 Table Generator + + Copyright (c) 2024, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015. +**/ + +#include +#include +#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_UNSUPPORTED Not supported. + @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 + ) +{ + // Not implemented. + return RETURN_UNSUPPORTED; +}