From 5751d608217d0e8250442efb5941733407b8d0c5 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Tue, 1 Feb 2022 16:30:13 +0100 Subject: [PATCH] DynamicTablesPkg: AmlLib: AmlAddPrtEntry() to handle GSI In ACPI 6.4, s6.2.13, _PRT objects describing PCI legacy interrupts can be defined following 2 models. In the first model, _PRT entries reference link devices. Link devices then describe interrupts. This allows to dynamically modify interrupts through _SRS and _PRS objects and to choose exactly the interrupt type (level/edge triggered, active high/low). In the second model, interrupt numbers are described in the _PRT entry. The interrupt type is then assumed by the OS. AmlAddPrtEntry() currently only handles the first model. Make changes to also handle the second model. Signed-off-by: Pierre Gondois Reviewed-by: Ard Biesheuvel --- .../Common/AmlLib/CodeGen/AmlCodeGen.c | 97 +++++++++++-------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c index d245848ce3..2d55db97c7 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c @@ -1,7 +1,7 @@ /** @file AML Code Generation. - Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.
+ Copyright (c) 2020 - 2022, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -881,6 +881,9 @@ AmlCodeGenNameResourceTemplate ( // interrupt, so let it to index 0. } + The 2 models described in ACPI 6.4, s6.2.13 "_PRT (PCI Routing Table)" can + be generated by this function. The example above matches the first model. + The package is added at the tail of the list of the input _PRT node name: Name (_PRT, Package () { @@ -901,8 +904,10 @@ AmlCodeGenNameResourceTemplate ( @param [in] Pin PCI pin number of the device (0-INTA ... 3-INTD). Must be between 0-3. @param [in] LinkName Link Name, i.e. device in the AML NameSpace - describing the interrupt used. - The input string is copied. + describing the interrupt used. The input string + is copied. + If NULL, generate 0 in the 'Source' field (cf. + second model, using GSIV). @param [in] SourceIndex Source index or GSIV. @param [in] PrtNameNode Prt Named node to add the object to .... @@ -930,7 +935,6 @@ AmlAddPrtEntry ( AML_DATA_NODE *DataNode; if ((Pin > 3) || - (LinkName == NULL) || (PrtNameNode == NULL) || (AmlGetNodeType ((AML_NODE_HANDLE)PrtNameNode) != EAmlNodeObject) || (!AmlNodeHasOpCode (PrtNameNode, AML_NAME_OP, 0)) || @@ -999,42 +1003,59 @@ AmlAddPrtEntry ( NewElementNode = NULL; - Status = ConvertAslNameToAmlName (LinkName, &AmlNameString); - if (EFI_ERROR (Status)) { - ASSERT (0); - goto error_handler; + if (LinkName != NULL) { + Status = ConvertAslNameToAmlName (LinkName, &AmlNameString); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status = AmlGetNameStringSize (AmlNameString, &AmlNameStringSize); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status = AmlCreateDataNode ( + EAmlNodeDataTypeNameString, + (UINT8 *)AmlNameString, + AmlNameStringSize, + &DataNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + // AmlNameString will be freed be fore returning. + + Status = AmlVarListAddTail ( + (AML_NODE_HANDLE)PackageNode, + (AML_NODE_HANDLE)DataNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + DataNode = NULL; + } else { + Status = AmlCodeGenInteger (0, &NewElementNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status = AmlVarListAddTail ( + (AML_NODE_HANDLE)PackageNode, + (AML_NODE_HANDLE)NewElementNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } } - Status = AmlGetNameStringSize (AmlNameString, &AmlNameStringSize); - if (EFI_ERROR (Status)) { - ASSERT (0); - goto error_handler; - } - - Status = AmlCreateDataNode ( - EAmlNodeDataTypeNameString, - (UINT8 *)AmlNameString, - AmlNameStringSize, - &DataNode - ); - if (EFI_ERROR (Status)) { - ASSERT (0); - goto error_handler; - } - - // AmlNameString will be freed before returning. - - Status = AmlVarListAddTail ( - (AML_NODE_HANDLE)PackageNode, - (AML_NODE_HANDLE)DataNode - ); - if (EFI_ERROR (Status)) { - ASSERT (0); - goto error_handler; - } - - DataNode = NULL; - Status = AmlCodeGenInteger (SourceIndex, &NewElementNode); if (EFI_ERROR (Status)) { ASSERT (0);