[edk2-devel] [PATCH v2 6/8] DynamicTablesPkg: IORT set reference to interrupt array if present
PierreGondois
pierre.gondois at arm.com
Mon Oct 18 15:48:15 UTC 2021
Hi Sami,
With the small modification:
Reviewed-by: Pierre Gondois <pierre.gondois at arm.com>
On 6/17/21 10:55, Sami Mujawar via groups.io wrote:
> 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 at arm.com>
> ---
>
> Notes:
> v2:
> - No code change since v1. Re-sending with v2 series. [SAMI]
>
> DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c | 82 +++++++++++++-------
> 1 file changed, 55 insertions(+), 27 deletions(-)
>
> diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c
> index bdf839eab25e2b84b40c50da38f2bf961cdc5f42..9ccf72594db378878d4e3abbafe98e749d9963da 100644
> --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c
> +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c
> @@ -1136,6 +1136,7 @@ AddSmmuV1V2Nodes (
> EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT * ContextInterruptArray;
> EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT * PmuInterruptArray;
> UINT64 NodeLength;
> + UINT32 Offset;
>
> ASSERT (Iort != NULL);
>
> @@ -1178,47 +1179,74 @@ AddSmmuV1V2Nodes (
> SmmuNode->GlobalInterruptArrayRef =
> OFFSET_OF (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE, SMMU_NSgIrpt);
>
> + Offset = sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE);
> // Context Interrupt
> SmmuNode->NumContextInterrupts = NodeList->ContextInterruptCount;
> - SmmuNode->ContextInterruptArrayRef =
> - sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE);
> - ContextInterruptArray =
> - (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT*)((UINT8*)SmmuNode +
> - sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE));
> + if (NodeList->ContextInterruptCount != 0) {
> + SmmuNode->ContextInterruptArrayRef = Offset;
> + ContextInterruptArray =
> + (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT*)((UINT8*)SmmuNode + Offset);
> + Offset += (NodeList->ContextInterruptCount *
> + sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT));
> + }
>
> // PMU Interrupt
> SmmuNode->NumPmuInterrupts = NodeList->PmuInterruptCount;
> - SmmuNode->PmuInterruptArrayRef = SmmuNode->ContextInterruptArrayRef +
> - (NodeList->ContextInterruptCount *
> - sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT));
> - PmuInterruptArray =
> - (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT*)((UINT8*)SmmuNode +
> - SmmuNode->PmuInterruptArrayRef);
> + if (NodeList->PmuInterruptCount != 0) {
> + SmmuNode->PmuInterruptArrayRef = Offset;
> + PmuInterruptArray =
> + (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT*)((UINT8*)SmmuNode + Offset);
> + }
>
> SmmuNode->SMMU_NSgIrpt = NodeList->SMMU_NSgIrpt;
> SmmuNode->SMMU_NSgIrptFlags = NodeList->SMMU_NSgIrptFlags;
> SmmuNode->SMMU_NSgCfgIrpt = NodeList->SMMU_NSgCfgIrpt;
> SmmuNode->SMMU_NSgCfgIrptFlags = NodeList->SMMU_NSgCfgIrptFlags;
>
> - // 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;
> + 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
> + 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
> - if ((SmmuNode->NumPmuInterrupts > 0) &&
> - (NodeList->PmuInterruptToken != CM_NULL_TOKEN)) {
> + if (SmmuNode->NumPmuInterrupts != 0) {
> + 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;
> + }
> +
Some similar modifications are done in the last patch of the serie:
[PATCH v2 8/8] DynamicTablesPkg: IORT generator updates for Rev E.b spec
For instance, the same change is done in the AddPmcgNodes() function.
Would it be possible to group them ?
> Status = AddSmmuInterruptArray (
> CfgMgrProtocol,
> PmuInterruptArray,
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#82239): https://edk2.groups.io/g/devel/message/82239
Mute This Topic: https://groups.io/mt/83600728/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list