DynamicTablesPkg: IORT set reference to interrupt array if present

The IORT generator is populating the reference field for Context and
PMU interrupts even if their count is zero.

Update the IORT generator to set the references only if the interrupt
count is not 0. Also add checks to ensure a valid reference token has
been provided.

Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
This commit is contained in:
Sami Mujawar 2022-07-14 17:50:27 +01:00 committed by mergify[bot]
parent f5cea604a6
commit 238f903e8d

View File

@ -1164,6 +1164,7 @@ AddSmmuV1V2Nodes (
EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *ContextInterruptArray; EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *ContextInterruptArray;
EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *PmuInterruptArray; EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *PmuInterruptArray;
UINT64 NodeLength; UINT64 NodeLength;
UINT32 Offset;
ASSERT (Iort != NULL); ASSERT (Iort != NULL);
@ -1206,48 +1207,74 @@ AddSmmuV1V2Nodes (
SmmuNode->GlobalInterruptArrayRef = SmmuNode->GlobalInterruptArrayRef =
OFFSET_OF (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE, SMMU_NSgIrpt); OFFSET_OF (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE, SMMU_NSgIrpt);
Offset = sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE);
// Context Interrupt // Context Interrupt
SmmuNode->NumContextInterrupts = NodeList->ContextInterruptCount; SmmuNode->NumContextInterrupts = NodeList->ContextInterruptCount;
SmmuNode->ContextInterruptArrayRef = if (NodeList->ContextInterruptCount != 0) {
sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE); SmmuNode->ContextInterruptArrayRef = Offset;
ContextInterruptArray = ContextInterruptArray =
(EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *)((UINT8 *)SmmuNode + (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *)((UINT8 *)SmmuNode + Offset);
sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE)); Offset += (NodeList->ContextInterruptCount *
sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT));
}
// PMU Interrupt // PMU Interrupt
SmmuNode->NumPmuInterrupts = NodeList->PmuInterruptCount; SmmuNode->NumPmuInterrupts = NodeList->PmuInterruptCount;
SmmuNode->PmuInterruptArrayRef = SmmuNode->ContextInterruptArrayRef + if (NodeList->PmuInterruptCount != 0) {
(NodeList->ContextInterruptCount * SmmuNode->PmuInterruptArrayRef = Offset;
sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT)); PmuInterruptArray =
PmuInterruptArray = (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *)((UINT8 *)SmmuNode + Offset);
(EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *)((UINT8 *)SmmuNode + }
SmmuNode->PmuInterruptArrayRef);
SmmuNode->SMMU_NSgIrpt = NodeList->SMMU_NSgIrpt; SmmuNode->SMMU_NSgIrpt = NodeList->SMMU_NSgIrpt;
SmmuNode->SMMU_NSgIrptFlags = NodeList->SMMU_NSgIrptFlags; SmmuNode->SMMU_NSgIrptFlags = NodeList->SMMU_NSgIrptFlags;
SmmuNode->SMMU_NSgCfgIrpt = NodeList->SMMU_NSgCfgIrpt; SmmuNode->SMMU_NSgCfgIrpt = NodeList->SMMU_NSgCfgIrpt;
SmmuNode->SMMU_NSgCfgIrptFlags = NodeList->SMMU_NSgCfgIrptFlags; SmmuNode->SMMU_NSgCfgIrptFlags = NodeList->SMMU_NSgCfgIrptFlags;
// Add Context Interrupt Array if (NodeList->ContextInterruptCount != 0) {
Status = AddSmmuInterruptArray ( if (NodeList->ContextInterruptToken == CM_NULL_TOKEN) {
CfgMgrProtocol, Status = EFI_INVALID_PARAMETER;
ContextInterruptArray, DEBUG ((
SmmuNode->NumContextInterrupts, DEBUG_ERROR,
NodeList->ContextInterruptToken "ERROR: IORT: Invalid Context Interrupt token,"
); " Token = 0x%x, Status =%r\n",
if (EFI_ERROR (Status)) { NodeList->ContextInterruptToken,
DEBUG (( Status
DEBUG_ERROR, ));
"ERROR: IORT: Failed to Context Interrupt Array. Status = %r\n", return Status;
Status }
));
return Status; // Add Context Interrupt Array
Status = AddSmmuInterruptArray (
CfgMgrProtocol,
ContextInterruptArray,
SmmuNode->NumContextInterrupts,
NodeList->ContextInterruptToken
);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_ERROR,
"ERROR: IORT: Failed to Context Interrupt Array. Status = %r\n",
Status
));
return Status;
}
} }
// Add PMU Interrupt Array // Add PMU Interrupt Array
if ((SmmuNode->NumPmuInterrupts > 0) && if (SmmuNode->NumPmuInterrupts != 0) {
(NodeList->PmuInterruptToken != CM_NULL_TOKEN)) if (NodeList->PmuInterruptToken == CM_NULL_TOKEN) {
{ Status = EFI_INVALID_PARAMETER;
DEBUG ((
DEBUG_ERROR,
"ERROR: IORT: Invalid PMU Interrupt token,"
" Token = 0x%x, Status =%r\n",
NodeList->PmuInterruptToken,
Status
));
return Status;
}
Status = AddSmmuInterruptArray ( Status = AddSmmuInterruptArray (
CfgMgrProtocol, CfgMgrProtocol,
PmuInterruptArray, PmuInterruptArray,