]> git.proxmox.com Git - mirror_edk2.git/commitdiff
DynamicTablesPkg: AML Code generation for Register()
authorPierre Gondois <Pierre.Gondois@arm.com>
Fri, 8 Oct 2021 14:46:21 +0000 (15:46 +0100)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 8 Oct 2021 15:39:42 +0000 (15:39 +0000)
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 <sami.mujawar@arm.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h

index cba942c0fd1a4a251aaf8cd7c0de69cd53867e2a..20b745f27a2b855281fb198757fb440fe1a0cab4 100644 (file)
@@ -193,6 +193,93 @@ AmlCodeGenRdInterrupt (
   return LinkRdNode (RdNode, NameOpNode, NewRdNode);\r
 }\r
 \r
+/** Code generation for the "Register ()" ASL function.\r
+\r
+  The Resource Data effectively created is a Generic Register Descriptor.\r
+  Data. Cf ACPI 6.4:\r
+   - s6.4.3.7 "Generic Register Descriptor".\r
+   - s19.6.114 "Register".\r
+\r
+  The created resource data node can be:\r
+   - appended to the list of resource data elements of the NameOpNode.\r
+     In such case NameOpNode must be defined by a the "Name ()" ASL statement\r
+     and initially contain a "ResourceTemplate ()".\r
+   - returned through the NewRdNode parameter.\r
+\r
+  @param [in]  AddressSpace    Address space where the register exists.\r
+                               Can be one of I/O space, System Memory, etc.\r
+  @param [in]  BitWidth        Number of bits in the register.\r
+  @param [in]  BitOffset       Offset in bits from the start of the register\r
+                               indicated by the Address.\r
+  @param [in]  Address         Register address.\r
+  @param [in]  AccessSize      Size of data values used when accessing the\r
+                               address space. Can be one of:\r
+                                 0 - Undefined, legacy (EFI_ACPI_6_4_UNDEFINED)\r
+                                 1 - Byte access (EFI_ACPI_6_4_BYTE)\r
+                                 2 - Word access (EFI_ACPI_6_4_WORD)\r
+                                 3 - DWord access (EFI_ACPI_6_4_DWORD)\r
+                                 4 - QWord access (EFI_ACPI_6_4_QWORD)\r
+  @param  [in]  NameOpNode       NameOp object node defining a named object.\r
+                                 If provided, append the new resource data node\r
+                                 to the list of resource data elements of this\r
+                                 node.\r
+  @param  [out] NewRdNode        If provided and success,\r
+                                 contain the created node.\r
+\r
+  @retval EFI_SUCCESS             The function completed successfully.\r
+  @retval EFI_INVALID_PARAMETER   Invalid parameter.\r
+  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+AmlCodeGenRdRegister (\r
+  IN  UINT8                   AddressSpace,\r
+  IN  UINT8                   BitWidth,\r
+  IN  UINT8                   BitOffset,\r
+  IN  UINT64                  Address,\r
+  IN  UINT8                   AccessSize,\r
+  IN  AML_OBJECT_NODE_HANDLE  NameOpNode, OPTIONAL\r
+  OUT AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS                             Status;\r
+  AML_DATA_NODE                        * RdNode;\r
+  EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR   RdRegister;\r
+\r
+  if ((AccessSize > EFI_ACPI_6_4_QWORD)  ||\r
+      ((NameOpNode == NULL) && (NewRdNode == NULL))) {\r
+    ASSERT (0);\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  // Header\r
+  RdRegister.Header.Header.Bits.Name =\r
+    ACPI_LARGE_GENERIC_REGISTER_DESCRIPTOR_NAME;\r
+  RdRegister.Header.Header.Bits.Type = ACPI_LARGE_ITEM_FLAG;\r
+  RdRegister.Header.Length = sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR) -\r
+                               sizeof (ACPI_LARGE_RESOURCE_HEADER);\r
+\r
+  // Body\r
+  RdRegister.AddressSpaceId = AddressSpace;\r
+  RdRegister.RegisterBitWidth = BitWidth;\r
+  RdRegister.RegisterBitOffset = BitOffset;\r
+  RdRegister.AddressSize = AccessSize;\r
+  RdRegister.RegisterAddress = Address;\r
+\r
+  Status = AmlCreateDataNode (\r
+             EAmlNodeDataTypeResourceData,\r
+             (UINT8*)&RdRegister,\r
+             sizeof (EFI_ACPI_GENERIC_REGISTER_DESCRIPTOR),\r
+             &RdNode\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    ASSERT (0);\r
+    return Status;\r
+  }\r
+\r
+  return LinkRdNode (RdNode, NameOpNode, NewRdNode);\r
+}\r
+\r
 // DEPRECATED APIS\r
 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
 \r
index 764051e3d7c9d65354fe09242e9798ff9185f898..831d6a7462ae872b84ab8e960b100a42a93133ae 100644 (file)
@@ -55,4 +55,53 @@ AmlCodeGenRdInterrupt (
   OUT AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL\r
   );\r
 \r
+/** Code generation for the "Register ()" ASL function.\r
+\r
+  The Resource Data effectively created is a Generic Register Descriptor.\r
+  Data. Cf ACPI 6.4:\r
+   - s6.4.3.7 "Generic Register Descriptor".\r
+   - s19.6.114 "Register".\r
+\r
+  The created resource data node can be:\r
+   - appended to the list of resource data elements of the NameOpNode.\r
+     In such case NameOpNode must be defined by a the "Name ()" ASL statement\r
+     and initially contain a "ResourceTemplate ()".\r
+   - returned through the NewRdNode parameter.\r
+\r
+  @param [in]  AddressSpace    Address space where the register exists.\r
+                               Can be one of I/O space, System Memory, etc.\r
+  @param [in]  BitWidth        Number of bits in the register.\r
+  @param [in]  BitOffset       Offset in bits from the start of the register\r
+                               indicated by the Address.\r
+  @param [in]  Address         Register address.\r
+  @param [in]  AccessSize      Size of data values used when accessing the\r
+                               address space. Can be one of:\r
+                                 0 - Undefined, legacy (EFI_ACPI_6_4_UNDEFINED)\r
+                                 1 - Byte access (EFI_ACPI_6_4_BYTE)\r
+                                 2 - Word access (EFI_ACPI_6_4_WORD)\r
+                                 3 - DWord access (EFI_ACPI_6_4_DWORD)\r
+                                 4 - QWord access (EFI_ACPI_6_4_QWORD)\r
+  @param  [in]  NameOpNode       NameOp object node defining a named object.\r
+                                 If provided, append the new resource data node\r
+                                 to the list of resource data elements of this\r
+                                 node.\r
+  @param  [out] NewRdNode        If provided and success,\r
+                                 contain the created node.\r
+\r
+  @retval EFI_SUCCESS             The function completed successfully.\r
+  @retval EFI_INVALID_PARAMETER   Invalid parameter.\r
+  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+AmlCodeGenRdRegister (\r
+  IN  UINT8                   AddressSpace,\r
+  IN  UINT8                   BitWidth,\r
+  IN  UINT8                   BitOffset,\r
+  IN  UINT64                  Address,\r
+  IN  UINT8                   AccessSize,\r
+  IN  AML_OBJECT_NODE_HANDLE  NameOpNode, OPTIONAL\r
+  OUT AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL\r
+  );\r
+\r
 #endif // AML_RESOURCE_DATA_CODE_GEN_H_\r