mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 16:14:04 +02:00
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:
parent
f5cea604a6
commit
238f903e8d
@ -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,28 +1207,43 @@ 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 +
|
(EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT *)((UINT8 *)SmmuNode + Offset);
|
||||||
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;
|
||||||
|
|
||||||
|
if (NodeList->ContextInterruptCount != 0) {
|
||||||
|
if (NodeList->ContextInterruptToken == CM_NULL_TOKEN) {
|
||||||
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
|
"ERROR: IORT: Invalid Context Interrupt token,"
|
||||||
|
" Token = 0x%x, Status =%r\n",
|
||||||
|
NodeList->ContextInterruptToken,
|
||||||
|
Status
|
||||||
|
));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
// Add Context Interrupt Array
|
// Add Context Interrupt Array
|
||||||
Status = AddSmmuInterruptArray (
|
Status = AddSmmuInterruptArray (
|
||||||
CfgMgrProtocol,
|
CfgMgrProtocol,
|
||||||
@ -1243,11 +1259,22 @@ AddSmmuV1V2Nodes (
|
|||||||
));
|
));
|
||||||
return 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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user