/** @file
SSDT Serial Port Fixup Library.
Copyright (c) 2026, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
- Arm Server Base Boot Requirements (SBBR), s4.2.1.8 "SPCR".
- Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015.
- ACPI for Arm Components 1.0 - 2020
- Arm Generic Interrupt Controller Architecture Specification,
Issue H, January 2022.
(https://developer.arm.com/documentation/ihi0069/)
**/
#include
#include
#include
#include
#include
/** Validate the Serial Port Architecture Information.
@param [in] SerialPortInfoTable Table of CM_ARCH_COMMON_SERIAL_PORT_INFO.
@retval EFI_SUCCESS Success.
@retval EFI_INVALID_PARAMETER Invalid parameter.
**/
EFI_STATUS
EFIAPI
ArchValidateSerialPortInfo (
IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo
)
{
BOOLEAN ValidInterrupt;
if (SerialPortInfo == NULL) {
return EFI_INVALID_PARAMETER;
}
// If an interrupt is not wired to the serial port, the Configuration
// Manager specifies the interrupt as 0.
// Any other value must be within the SPI or extended SPI range.
if ((SerialPortInfo->Interrupt != 0)) {
ValidInterrupt = FALSE;
if (ArmHasGicV5SystemRegisters ()) {
if ((SerialPortInfo->Interrupt >= ARM_GICV5_ARCH_SPI_MIN) &&
(SerialPortInfo->Interrupt <= ARM_GICV5_ARCH_SPI_MAX))
{
ValidInterrupt = TRUE;
}
} else {
if (((SerialPortInfo->Interrupt >= ARM_GIC_ARCH_SPI_MIN) &&
(SerialPortInfo->Interrupt <= ARM_GIC_ARCH_SPI_MAX)) ||
((SerialPortInfo->Interrupt >= ARM_GIC_ARCH_EXT_SPI_MIN) &&
(SerialPortInfo->Interrupt <= ARM_GIC_ARCH_EXT_SPI_MAX)))
{
ValidInterrupt = TRUE;
}
}
if (!ValidInterrupt) {
DEBUG ((
DEBUG_ERROR,
"ERROR: Invalid UART port interrupt ID. Interrupt = %lu\n",
SerialPortInfo->Interrupt
));
return EFI_INVALID_PARAMETER;
}
}
return EFI_SUCCESS;
}