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.10571.1633704405766240838 for ; Fri, 08 Oct 2021 07:46:52 -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 AC2FA1063; Fri, 8 Oct 2021 07:46:51 -0700 (PDT) Received: from e120189.arm.com (unknown [10.57.73.60]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id A1E633F66F; Fri, 8 Oct 2021 07:46:50 -0700 (PDT) From: "PierreGondois" To: devel@edk2.groups.io, Sami Mujawar , Alexei.Fedorov@arm.com Subject: [PATCH v3 10/21] DynamicTablesPkg: AML Code generation for Register() Date: Fri, 8 Oct 2021 15:46:21 +0100 Message-Id: <20211008144632.31894-11-Pierre.Gondois@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211008144632.31894-1-Pierre.Gondois@arm.com> References: <20211008144632.31894-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(). Reviewed-by: Sami Mujawar 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 cba942c0fd1a..20b745f27a2b 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -193,6 +193,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_4_UNDEFINED) + 1 - Byte access (EFI_ACPI_6_4_BYTE) + 2 - Word access (EFI_ACPI_6_4_WORD) + 3 - DWord access (EFI_ACPI_6_4_DWORD) + 4 - QWord access (EFI_ACPI_6_4_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_4_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..831d6a7462ae 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_4_UNDEFINED) + 1 - Byte access (EFI_ACPI_6_4_BYTE) + 2 - Word access (EFI_ACPI_6_4_WORD) + 3 - DWord access (EFI_ACPI_6_4_DWORD) + 4 - QWord access (EFI_ACPI_6_4_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