From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web09.6438.1624448495532089260 for ; Wed, 23 Jun 2021 04:41:35 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: pierre.gondois@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 25A7031B; Wed, 23 Jun 2021 04:41:35 -0700 (PDT) Received: from e120189.arm.com (unknown [10.57.78.245]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 03E6C3F719; Wed, 23 Jun 2021 04:41:33 -0700 (PDT) From: "PierreGondois" To: devel@edk2.groups.io, Sami Mujawar , Alexei Fedorov Cc: Akanksha Jain , Alexandru Elisei Subject: [PATCH v1 02/13] DynamicTablesPkg: AML Code generation for Register() Date: Wed, 23 Jun 2021 12:40:27 +0100 Message-Id: <20210623114039.24491-3-Pierre.Gondois@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210623114039.24491-1-Pierre.Gondois@arm.com> References: <20210623114039.24491-1-Pierre.Gondois@arm.com> From: Pierre Gondois Add AmlCodeGenRegister() to generate AML code for the Generic Register Resource Descriptor. This function is equivalent to the ASL macro Register(). Signed-off-by: Pierre Gondois --- .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 87 +++++++++++++++++++ .../AmlLib/CodeGen/AmlResourceDataCodeGen.h | 49 +++++++++++ 2 files changed, 136 insertions(+) diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c index 089597a6c906..07a96725a4ef 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -187,6 +187,93 @@ AmlCodeGenRdInterrupt ( return LinkRdNode (RdNode, NameOpNode, NewRdNode); } +/** Code generation for the "Register ()" ASL function. + + The Resource Data effectively created is a Generic Register Descriptor. + Data. Cf ACPI 6.4: + - s6.4.3.7 "Generic Register Descriptor". + - s19.6.114 "Register". + + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. + + @param [in] AddressSpace Address space where the register exists. + Can be one of I/O space, System Memory, etc. + @param [in] BitWidth Number of bits in the register. + @param [in] BitOffset Offset in bits from the start of the register + indicated by the Address. + @param [in] Address Register address. + @param [in] AccessSize Size of data values used when accessing the + address space. Can be one of: + 0 - Undefined, legacy (EFI_ACPI_6_3_UNDEFINED) + 1 - Byte access (EFI_ACPI_6_3_BYTE) + 2 - Word access (EFI_ACPI_6_3_WORD) + 3 - DWord access (EFI_ACPI_6_3_DWORD) + 4 - QWord access (EFI_ACPI_6_3_QWORD) + @param [in] NameOpNode NameOp object node defining a named object. + If provided, append the new resource data node + to the list of resource data elements of this + node. + @param [out] NewRdNode If provided and success, + contain the created node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenRdRegister ( + IN UINT8 AddressSpace, + IN UINT8 BitWidth, + IN UINT8 BitOffset, + IN UINT64 Address, + IN UINT8 AccessSize, + IN AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL + ) +{ + EFI_STATUS Status; + AML_DATA_NODE * RdNode; + EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR RdRegister; + + if ((AccessSize > EFI_ACPI_6_3_QWORD) || + ((NameOpNode == NULL) && (NewRdNode == NULL))) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Header + RdRegister.Header.Header.Bits.Name = + ACPI_LARGE_GENERIC_REGISTER_DESCRIPTOR_NAME; + RdRegister.Header.Header.Bits.Type = ACPI_LARGE_ITEM_FLAG; + RdRegister.Header.Length = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR) - + sizeof (ACPI_LARGE_RESOURCE_HEADER); + + // Body + RdRegister.AddressSpaceId = AddressSpace; + RdRegister.RegisterBitWidth = BitWidth; + RdRegister.RegisterBitOffset = BitOffset; + RdRegister.AddressSize = AccessSize; + RdRegister.RegisterAddress = Address; + + Status = AmlCreateDataNode ( + EAmlNodeDataTypeResourceData, + (UINT8*)&RdRegister, + sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR), + &RdNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + return LinkRdNode (RdNode, NameOpNode, NewRdNode); +} + // DEPRECATED APIS #ifndef DISABLE_NEW_DEPRECATED_INTERFACES diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h index 764051e3d7c9..3c9217d9ddab 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h @@ -55,4 +55,53 @@ AmlCodeGenRdInterrupt ( OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL ); +/** Code generation for the "Register ()" ASL function. + + The Resource Data effectively created is a Generic Register Descriptor. + Data. Cf ACPI 6.4: + - s6.4.3.7 "Generic Register Descriptor". + - s19.6.114 "Register". + + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. + + @param [in] AddressSpace Address space where the register exists. + Can be one of I/O space, System Memory, etc. + @param [in] BitWidth Number of bits in the register. + @param [in] BitOffset Offset in bits from the start of the register + indicated by the Address. + @param [in] Address Register address. + @param [in] AccessSize Size of data values used when accessing the + address space. Can be one of: + 0 - Undefined, legacy (EFI_ACPI_6_3_UNDEFINED) + 1 - Byte access (EFI_ACPI_6_3_BYTE) + 2 - Word access (EFI_ACPI_6_3_WORD) + 3 - DWord access (EFI_ACPI_6_3_DWORD) + 4 - QWord access (EFI_ACPI_6_3_QWORD) + @param [in] NameOpNode NameOp object node defining a named object. + If provided, append the new resource data node + to the list of resource data elements of this + node. + @param [out] NewRdNode If provided and success, + contain the created node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenRdRegister ( + IN UINT8 AddressSpace, + IN UINT8 BitWidth, + IN UINT8 BitOffset, + IN UINT64 Address, + IN UINT8 AccessSize, + IN AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL + ); + #endif // AML_RESOURCE_DATA_CODE_GEN_H_ -- 2.17.1