/** @file\r
DBG2 Table Generator\r
\r
- Copyright (c) 2017 - 2020, Arm Limited. All rights reserved.<BR>\r
+ Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
\r
/** The number of debug ports represented by the Table.\r
*/\r
-#define DBG2_NUM_DEBUG_PORTS 1\r
+#define DBG2_NUM_DEBUG_PORTS 1\r
\r
/** The number of Generic Address Registers\r
presented in the debug device information.\r
*/\r
-#define DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS 1\r
+#define DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS 1\r
\r
/** The index for the debug port 0 in the Debug port information list.\r
*/\r
-#define INDEX_DBG_PORT0 0\r
+#define INDEX_DBG_PORT0 0\r
\r
/** A string representing the name of the debug port 0.\r
*/\r
-#define NAME_STR_DBG_PORT0 "COM0"\r
+#define NAME_STR_DBG_PORT0 "COM0"\r
\r
/** An UID representing the debug port 0.\r
*/\r
-#define UID_DBG_PORT0 0\r
+#define UID_DBG_PORT0 0\r
\r
/** The length of the namespace string.\r
*/\r
-#define DBG2_NAMESPACESTRING_FIELD_SIZE sizeof (NAME_STR_DBG_PORT0)\r
+#define DBG2_NAMESPACESTRING_FIELD_SIZE sizeof (NAME_STR_DBG_PORT0)\r
\r
/** The PL011 UART address range length.\r
*/\r
-#define PL011_UART_LENGTH 0x1000\r
+#define PL011_UART_LENGTH 0x1000\r
\r
/** A structure that provides the OS with the required information\r
for initializing a debugger connection.\r
*/\r
typedef struct {\r
/// The debug device information for the platform\r
- EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT Dbg2Device;\r
+ EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT Dbg2Device;\r
\r
/// The base address register for the serial port\r
- EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE BaseAddressRegister;\r
+ EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE BaseAddressRegister;\r
\r
/// The address size\r
- UINT32 AddressSize;\r
+ UINT32 AddressSize;\r
\r
/// The debug port name string\r
- UINT8 NameSpaceString[DBG2_NAMESPACESTRING_FIELD_SIZE];\r
+ UINT8 NameSpaceString[DBG2_NAMESPACESTRING_FIELD_SIZE];\r
} DBG2_DEBUG_DEVICE_INFORMATION;\r
\r
/** A structure representing the information about the debug port(s)\r
*/\r
typedef struct {\r
/// The DBG2 table header\r
- EFI_ACPI_DEBUG_PORT_2_DESCRIPTION_TABLE Description;\r
+ EFI_ACPI_DEBUG_PORT_2_DESCRIPTION_TABLE Description;\r
\r
/// Debug port information list\r
- DBG2_DEBUG_DEVICE_INFORMATION Dbg2DeviceInfo[DBG2_NUM_DEBUG_PORTS];\r
+ DBG2_DEBUG_DEVICE_INFORMATION Dbg2DeviceInfo[DBG2_NUM_DEBUG_PORTS];\r
} DBG2_TABLE;\r
\r
/** A helper macro used for initializing the debug port device\r
@param [in] UartNameStr The UART port name string.\r
**/\r
#define DBG2_DEBUG_PORT_DDI( \\r
- SubType, \\r
- UartBase, \\r
- UartAddrLen, \\r
- UartNameStr \\r
- ) { \\r
+ SubType, \\r
+ UartBase, \\r
+ UartAddrLen, \\r
+ UartNameStr \\r
+ ) {\\r
{ \\r
- /* UINT8 Revision */ \\r
+ /* UINT8 Revision */ \\r
EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT_REVISION, \\r
- /* UINT16 Length */ \\r
+ /* UINT16 Length */ \\r
sizeof (DBG2_DEBUG_DEVICE_INFORMATION), \\r
- /* UINT8 NumberofGenericAddressRegisters */ \\r
+ /* UINT8 NumberofGenericAddressRegisters */ \\r
DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS, \\r
- /* UINT16 NameSpaceStringLength */ \\r
+ /* UINT16 NameSpaceStringLength */ \\r
DBG2_NAMESPACESTRING_FIELD_SIZE, \\r
- /* UINT16 NameSpaceStringOffset */ \\r
+ /* UINT16 NameSpaceStringOffset */ \\r
OFFSET_OF (DBG2_DEBUG_DEVICE_INFORMATION, NameSpaceString), \\r
- /* UINT16 OemDataLength */ \\r
+ /* UINT16 OemDataLength */ \\r
0, \\r
- /* UINT16 OemDataOffset */ \\r
+ /* UINT16 OemDataOffset */ \\r
0, \\r
- /* UINT16 Port Type */ \\r
+ /* UINT16 Port Type */ \\r
EFI_ACPI_DBG2_PORT_TYPE_SERIAL, \\r
- /* UINT16 Port Subtype */ \\r
+ /* UINT16 Port Subtype */ \\r
SubType, \\r
- /* UINT8 Reserved[2] */ \\r
+ /* UINT8 Reserved[2] */ \\r
{EFI_ACPI_RESERVED_BYTE, EFI_ACPI_RESERVED_BYTE}, \\r
- /* UINT16 BaseAddressRegister Offset */ \\r
+ /* UINT16 BaseAddressRegister Offset */ \\r
OFFSET_OF (DBG2_DEBUG_DEVICE_INFORMATION, BaseAddressRegister), \\r
- /* UINT16 AddressSize Offset */ \\r
+ /* UINT16 AddressSize Offset */ \\r
OFFSET_OF (DBG2_DEBUG_DEVICE_INFORMATION, AddressSize) \\r
}, \\r
- /* EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE BaseAddressRegister */ \\r
+ /* EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE BaseAddressRegister */ \\r
ARM_GAS32 (UartBase), \\r
- /* UINT32 AddressSize */ \\r
+ /* UINT32 AddressSize */ \\r
UartAddrLen, \\r
- /* UINT8 NameSpaceString[MAX_DBG2_NAME_LEN] */ \\r
+ /* UINT8 NameSpaceString[MAX_DBG2_NAME_LEN] */ \\r
UartNameStr \\r
}\r
\r
Note: fields marked with "{Template}" will be set dynamically\r
*/\r
STATIC\r
-DBG2_TABLE AcpiDbg2 = {\r
+DBG2_TABLE AcpiDbg2 = {\r
{\r
ACPI_HEADER (\r
EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE,\r
STATIC\r
EFI_STATUS\r
SetupDebugUart (\r
- IN CONST CM_ARM_SERIAL_PORT_INFO * CONST SerialPortInfo\r
+ IN CONST CM_ARM_SERIAL_PORT_INFO *CONST SerialPortInfo\r
)\r
{\r
EFI_STATUS Status;\r
// Initialize the Serial Debug UART\r
DEBUG ((DEBUG_INFO, "Initializing Serial Debug UART...\n"));\r
ReceiveFifoDepth = 0; // Use the default value for FIFO depth\r
- Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity);\r
- DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);\r
- StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits);\r
+ Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity);\r
+ DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);\r
+ StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits);\r
\r
BaudRate = SerialPortInfo->BaudRate;\r
- Status = PL011UartInitializePort (\r
- (UINTN)SerialPortInfo->BaseAddress,\r
- SerialPortInfo->Clock,\r
- &BaudRate,\r
- &ReceiveFifoDepth,\r
- &Parity,\r
- &DataBits,\r
- &StopBits\r
- );\r
+ Status = PL011UartInitializePort (\r
+ (UINTN)SerialPortInfo->BaseAddress,\r
+ SerialPortInfo->Clock,\r
+ &BaudRate,\r
+ &ReceiveFifoDepth,\r
+ &Parity,\r
+ &DataBits,\r
+ &StopBits\r
+ );\r
\r
ASSERT_EFI_ERROR (Status);\r
return Status;\r
EFI_STATUS\r
EFIAPI\r
FreeDbg2TableEx (\r
- IN CONST ACPI_TABLE_GENERATOR * CONST This,\r
- IN CONST CM_STD_OBJ_ACPI_TABLE_INFO * CONST AcpiTableInfo,\r
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,\r
- IN OUT EFI_ACPI_DESCRIPTION_HEADER *** CONST Table,\r
+ IN CONST ACPI_TABLE_GENERATOR *CONST This,\r
+ IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo,\r
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,\r
+ IN OUT EFI_ACPI_DESCRIPTION_HEADER ***CONST Table,\r
IN CONST UINTN TableCount\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_ACPI_DESCRIPTION_HEADER ** TableList;\r
+ EFI_STATUS Status;\r
+ EFI_ACPI_DESCRIPTION_HEADER **TableList;\r
\r
ASSERT (This != NULL);\r
ASSERT (AcpiTableInfo != NULL);\r
\r
if ((Table == NULL) ||\r
(*Table == NULL) ||\r
- (TableCount != 2)) {\r
+ (TableCount != 2))\r
+ {\r
DEBUG ((DEBUG_ERROR, "ERROR: DBG2: Invalid Table Pointer\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if ((TableList[1] == NULL) ||\r
(TableList[1]->Signature !=\r
- EFI_ACPI_6_3_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE)) {\r
+ EFI_ACPI_6_3_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE))\r
+ {\r
DEBUG ((DEBUG_ERROR, "ERROR: DBG2: Invalid SSDT table pointer.\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
EFI_STATUS\r
EFIAPI\r
BuildDbg2TableEx (\r
- IN CONST ACPI_TABLE_GENERATOR * This,\r
- IN CONST CM_STD_OBJ_ACPI_TABLE_INFO * CONST AcpiTableInfo,\r
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,\r
- OUT EFI_ACPI_DESCRIPTION_HEADER *** Table,\r
- OUT UINTN * CONST TableCount\r
+ IN CONST ACPI_TABLE_GENERATOR *This,\r
+ IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo,\r
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,\r
+ OUT EFI_ACPI_DESCRIPTION_HEADER ***Table,\r
+ OUT UINTN *CONST TableCount\r
)\r
{\r
- EFI_STATUS Status;\r
- CM_ARM_SERIAL_PORT_INFO * SerialPortInfo;\r
- UINT32 SerialPortCount;\r
- EFI_ACPI_DESCRIPTION_HEADER ** TableList;\r
+ EFI_STATUS Status;\r
+ CM_ARM_SERIAL_PORT_INFO *SerialPortInfo;\r
+ UINT32 SerialPortCount;\r
+ EFI_ACPI_DESCRIPTION_HEADER **TableList;\r
\r
ASSERT (This != NULL);\r
ASSERT (AcpiTableInfo != NULL);\r
ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);\r
\r
if ((AcpiTableInfo->AcpiTableRevision < This->MinAcpiTableRevision) ||\r
- (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision)) {\r
+ (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision))\r
+ {\r
DEBUG ((\r
DEBUG_ERROR,\r
"ERROR: DBG2: Requested table revision = %d, is not supported."\r
}\r
\r
// Allocate a table to store pointers to the DBG2 and SSDT tables.\r
- TableList = (EFI_ACPI_DESCRIPTION_HEADER**)\r
- AllocateZeroPool (sizeof (EFI_ACPI_DESCRIPTION_HEADER*) * 2);\r
+ TableList = (EFI_ACPI_DESCRIPTION_HEADER **)\r
+ AllocateZeroPool (sizeof (EFI_ACPI_DESCRIPTION_HEADER *) * 2);\r
if (TableList == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
DEBUG ((\r
Status = AddAcpiHeader (\r
CfgMgrProtocol,\r
This,\r
- (EFI_ACPI_DESCRIPTION_HEADER*)&AcpiDbg2,\r
+ (EFI_ACPI_DESCRIPTION_HEADER *)&AcpiDbg2,\r
AcpiTableInfo,\r
sizeof (DBG2_TABLE)\r
);\r
AcpiDbg2.Dbg2DeviceInfo[INDEX_DBG_PORT0].BaseAddressRegister.Address =\r
SerialPortInfo->BaseAddress;\r
\r
+ // Set the access size\r
+ if (SerialPortInfo->AccessSize >= EFI_ACPI_6_3_QWORD) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: DBG2: Access size must be <= 3 (DWORD). Status = %r\n",\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ } else if (SerialPortInfo->AccessSize == EFI_ACPI_6_3_UNDEFINED) {\r
+ // 0 Undefined (legacy reasons)\r
+ // Default to DWORD access size as the access\r
+ // size field was introduced at a later date\r
+ // and some ConfigurationManager implementations\r
+ // may not be providing this field data\r
+ AcpiDbg2.Dbg2DeviceInfo[INDEX_DBG_PORT0].BaseAddressRegister.AccessSize =\r
+ EFI_ACPI_6_3_DWORD;\r
+ } else {\r
+ AcpiDbg2.Dbg2DeviceInfo[INDEX_DBG_PORT0].BaseAddressRegister.AccessSize =\r
+ SerialPortInfo->AccessSize;\r
+ }\r
+\r
// Update the serial port subtype\r
AcpiDbg2.Dbg2DeviceInfo[INDEX_DBG_PORT0].Dbg2Device.PortSubtype =\r
SerialPortInfo->PortSubtype;\r
\r
if ((SerialPortInfo->PortSubtype ==\r
- EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART) ||\r
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART) ||\r
(SerialPortInfo->PortSubtype ==\r
- EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART_2X) ||\r
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART_2X) ||\r
(SerialPortInfo->PortSubtype ==\r
- EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART)) {\r
+ EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART))\r
+ {\r
// Initialize the serial port\r
Status = SetupDebugUart (SerialPortInfo);\r
if (EFI_ERROR (Status)) {\r
}\r
}\r
\r
- TableList[0] = (EFI_ACPI_DESCRIPTION_HEADER*)&AcpiDbg2;\r
+ TableList[0] = (EFI_ACPI_DESCRIPTION_HEADER *)&AcpiDbg2;\r
\r
// Build a SSDT table describing the serial port.\r
Status = BuildSsdtSerialPortTable (\r
}\r
\r
*TableCount = 2;\r
- *Table = TableList;\r
+ *Table = TableList;\r
\r
return Status;\r
\r
\r
/** This macro defines the DBG2 Table Generator revision.\r
*/\r
-#define DBG2_GENERATOR_REVISION CREATE_REVISION (1, 0)\r
+#define DBG2_GENERATOR_REVISION CREATE_REVISION (1, 0)\r
\r
/** The interface for the DBG2 Table Generator.\r
*/\r
STATIC\r
CONST\r
-ACPI_TABLE_GENERATOR Dbg2Generator = {\r
+ACPI_TABLE_GENERATOR Dbg2Generator = {\r
// Generator ID\r
CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdDbg2),\r
// Generator Description\r
EFI_STATUS\r
EFIAPI\r
AcpiDbg2LibConstructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE * SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
EFI_STATUS Status;\r
+\r
Status = RegisterAcpiTableGenerator (&Dbg2Generator);\r
DEBUG ((DEBUG_INFO, "DBG2: Register Generator. Status = %r\n", Status));\r
ASSERT_EFI_ERROR (Status);\r
EFI_STATUS\r
EFIAPI\r
AcpiDbg2LibDestructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE * SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
EFI_STATUS Status;\r
+\r
Status = DeregisterAcpiTableGenerator (&Dbg2Generator);\r
DEBUG ((DEBUG_INFO, "DBG2: Deregister Generator. Status = %r\n", Status));\r
ASSERT_EFI_ERROR (Status);\r