public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "PierreGondois" <pierre.gondois@arm.com>
To: devel@edk2.groups.io
Cc: Sami Mujawar <sami.mujawar@arm.com>,
	Alexei Fedorov <Alexei.Fedorov@arm.com>
Subject: [PATCH v4 1/8] DynamicTablesPkg: AML Code generation for memory ranges
Date: Thu,  9 Dec 2021 10:24:58 +0100	[thread overview]
Message-ID: <20211209092505.1248326-2-Pierre.Gondois@arm.com> (raw)
In-Reply-To: <20211209092505.1248326-1-Pierre.Gondois@arm.com>

From: Pierre Gondois <Pierre.Gondois@arm.com>

Add helper functions to generate AML Resource Data describing memory
ranges. Memory ranges can be one, double or four words long. They
can be of 'normal', IO or bus number memory type. The following
APIs are exposed:
 - AmlCodeGenRdDWordIo ()
 - AmlCodeGenRdDWordMemory ()
 - AmlCodeGenRdWordBusNumber ()
 - AmlCodeGenRdQWordMemory ()

To: Sami Mujawar <sami.mujawar@arm.com>
To: Alexei Fedorov <Alexei.Fedorov@arm.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---

Notes:
    v2:
    - Correct typos/reformulate descriptions. [Sami]
    - Add brief description about the parameter in addition to the
      specification reference. [Sami]

 .../Include/Library/AmlLib/AmlLib.h           | 272 +++++
 .../AmlLib/CodeGen/AmlResourceDataCodeGen.c   | 951 ++++++++++++++++++
 2 files changed, 1223 insertions(+)

diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
index 094a8f32c6ff..385d2459d273 100644
--- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
+++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
@@ -418,6 +418,278 @@ AmlUpdateRdQWord (
   IN  UINT64                BaseAddressLength
   );
 
+/** Code generation for the "DWordIO ()" ASL function.
+
+  The Resource Data effectively created is a DWord Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.2 "DWord Address Space Descriptor".
+   - s19.6.34 "DWordIO".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.34 for more.
+
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  IsaRanges            Possible values are:
+                                     0-Reserved
+                                     1-NonISAOnly
+                                     2-ISAOnly
+                                     3-EntireRange
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Not supported. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Not supported. Must be NULL.
+  @param [in]  IsDenseTranslation   TranslationDensity parameter.
+  @param [in]  IsTypeStatic         TranslationType parameter.
+  @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
+AmlCodeGenRdDWordIo (
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        BOOLEAN IsPosDecode,
+  IN        UINT8 IsaRanges,
+  IN        UINT32 AddressGranularity,
+  IN        UINT32 AddressMinimum,
+  IN        UINT32 AddressMaximum,
+  IN        UINT32 AddressTranslation,
+  IN        UINT32 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        BOOLEAN IsDenseTranslation,
+  IN        BOOLEAN IsTypeStatic,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  );
+
+/** Code generation for the "DWordMemory ()" ASL function.
+
+  The Resource Data effectively created is a DWord Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.2 "DWord Address Space Descriptor".
+   - s19.6.35 "DWordMemory".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.35 for more.
+
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  Cacheable            Possible values are:
+                                    0-The memory is non-cacheable
+                                    1-The memory is cacheable
+                                    2-The memory is cacheable and supports
+                                      write combining
+                                    3-The memory is cacheable and prefetchable
+  @param [in]  IsReadWrite          ReadAndWrite parameter.
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Not supported. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Not supported. Must be NULL.
+  @param [in]  MemoryRangeType      Possible values are:
+                                      0-AddressRangeMemory
+                                      1-AddressRangeReserved
+                                      2-AddressRangeACPI
+                                      3-AddressRangeNVS
+  @param [in]  IsTypeStatic         TranslationType parameter.
+  @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
+AmlCodeGenRdDWordMemory (
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsPosDecode,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        UINT8 Cacheable,
+  IN        BOOLEAN IsReadWrite,
+  IN        UINT32 AddressGranularity,
+  IN        UINT32 AddressMinimum,
+  IN        UINT32 AddressMaximum,
+  IN        UINT32 AddressTranslation,
+  IN        UINT32 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        UINT8 MemoryRangeType,
+  IN        BOOLEAN IsTypeStatic,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  );
+
+/** Code generation for the "WordBusNumber ()" ASL function.
+
+  The Resource Data effectively created is a Word Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.3 "Word Address Space Descriptor".
+   - s19.6.149 "WordBusNumber".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.149 for more.
+
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Not supported. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Not supported. Must be NULL.
+  @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
+AmlCodeGenRdWordBusNumber (
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        BOOLEAN IsPosDecode,
+  IN        UINT32 AddressGranularity,
+  IN        UINT32 AddressMinimum,
+  IN        UINT32 AddressMaximum,
+  IN        UINT32 AddressTranslation,
+  IN        UINT32 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  );
+
+/** Code generation for the "QWordMemory ()" ASL function.
+
+  The Resource Data effectively created is a QWord Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.1 "QWord Address Space Descriptor".
+   - s19.6.110 "QWordMemory".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.110 for more.
+
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsPosDecode          Decode parameter.
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  Cacheable            Possible values are:
+                                    0-The memory is non-cacheable
+                                    1-The memory is cacheable
+                                    2-The memory is cacheable and supports
+                                      write combining
+                                    3-The memory is cacheable and prefetchable
+  @param [in]  IsReadWrite          ReadAndWrite parameter.
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Not supported. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Not supported. Must be NULL.
+  @param [in]  MemoryRangeType      Possible values are:
+                                      0-AddressRangeMemory
+                                      1-AddressRangeReserved
+                                      2-AddressRangeACPI
+                                      3-AddressRangeNVS
+  @param [in]  IsTypeStatic         TranslationType parameter.
+  @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
+AmlCodeGenRdQWordMemory (
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsPosDecode,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        UINT8 Cacheable,
+  IN        BOOLEAN IsReadWrite,
+  IN        UINT64 AddressGranularity,
+  IN        UINT64 AddressMinimum,
+  IN        UINT64 AddressMaximum,
+  IN        UINT64 AddressTranslation,
+  IN        UINT64 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        UINT8 MemoryRangeType,
+  IN        BOOLEAN IsTypeStatic,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  );
+
 /** Code generation for the "Interrupt ()" ASL function.
 
   The Resource Data effectively created is an Extended Interrupt Resource
diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
index 29854634bf41..40d8c2b07ae3 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
@@ -101,6 +101,957 @@ error_handler:
   return Status;
 }
 
+/** Construct the TypeSpecificFlags field for IO ranges.
+
+  See ACPI 6.4 spec, s19.6.34 for more.
+
+  @param [in]  IsaRanges            Possible values are:
+                                     0-Reserved
+                                     1-NonISAOnly
+                                     2-ISAOnly
+                                     3-EntireRange
+                                    See ACPI 6.4 spec, s19.6.34 for more.
+  @param [in]  IsDenseTranslation   TranslationDensity parameter.
+  @param [in]  IsTypeStatic         TranslationType parameter.
+
+  @return A type specific flags value.
+          MAX_UINT8 if error.
+**/
+STATIC
+UINT8
+EFIAPI
+RdIoRangeSpecificFlags (
+  IN  UINT8    IsaRanges,
+  IN  BOOLEAN  IsDenseTranslation,
+  IN  BOOLEAN  IsTypeStatic
+  )
+{
+  // Only check type specific parameters.
+  if (IsaRanges > 3) {
+    ASSERT (0);
+    return MAX_UINT8;
+  }
+
+  // Construct TypeSpecificFlags and call the generic function.
+  // Cf ACPI 6.4 specification, Table 6.50:
+  // "Table 6.50: I/O Resource Flag (Resource Type = 1) Definitions"
+  return IsaRanges                 |
+         (IsTypeStatic ? 0 : BIT4) |
+         (IsDenseTranslation ? 0 : BIT5);
+}
+
+/** Construct the TypeSpecificFlags field for Memory ranges.
+
+  @param [in]  Cacheable            Possible values are:
+                                    0-The memory is non-cacheable
+                                    1-The memory is cacheable
+                                    2-The memory is cacheable and supports
+                                      write combining
+                                    3-The memory is cacheable and prefetchable
+  @param [in]  IsReadWrite          ReadAndWrite parameter.
+  @param [in]  MemoryRangeType      Possible values are:
+                                      0-AddressRangeMemory
+                                      1-AddressRangeReserved
+                                      2-AddressRangeACPI
+                                      3-AddressRangeNVS
+                                    See ACPI 6.4 spec, s19.6.35 for more.
+  @param [in]  IsTypeStatic         TranslationType parameter.
+
+  @return A type specific flags value.
+          MAX_UINT8 if error.
+**/
+STATIC
+UINT8
+EFIAPI
+MemoryRangeSpecificFlags (
+  IN  UINT8    Cacheable,
+  IN  BOOLEAN  IsReadWrite,
+  IN  UINT8    MemoryRangeType,
+  IN  BOOLEAN  IsTypeStatic
+  )
+{
+  // Only check type specific parameters.
+  if ((Cacheable > 3) ||
+      (MemoryRangeType > 3))
+  {
+    ASSERT (0);
+    return MAX_UINT8;
+  }
+
+  // Construct TypeSpecificFlags and call the generic function.
+  // Cf ACPI 6.4 specification, Table 6.49:
+  // "Memory Resource Flag (Resource Type = 0) Definitions"
+  return (IsReadWrite ? BIT0 : 0)  |
+         (Cacheable << 1)          |
+         (MemoryRangeType << 3)    |
+         (IsTypeStatic ? 0 : BIT5);
+}
+
+/** Construct the GeneralFlags field of any Address Space Resource Descriptors.
+
+  E.g.:
+  ACPI 6.4 specification, s6.4.3.5.1 "QWord Address Space Descriptor"
+  for QWord
+
+  See ACPI 6.4 spec, s19.6.36 for more.
+
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+
+  @return A type specific flags value.
+**/
+STATIC
+UINT8
+EFIAPI
+AddressSpaceGeneralFlags (
+  IN  BOOLEAN  IsPosDecode,
+  IN  BOOLEAN  IsMinFixed,
+  IN  BOOLEAN  IsMaxFixed
+  )
+{
+  return (IsPosDecode ? 0 : BIT1)    |
+         (IsMinFixed ? BIT2 : 0)     |
+         (IsMaxFixed ? BIT3 : 0);
+}
+
+/** Check Address Space Descriptor Fields.
+
+  Cf. ACPI 6.4 Table 6.44:
+  "Valid Combination of Address Space Descriptor Fields"
+
+  See ACPI 6.4 spec, s19.6.36 for more.
+
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+
+  @retval EFI_SUCCESS             The function completed successfully.
+  @retval EFI_INVALID_PARAMETER   Invalid parameter.
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+CheckAddressSpaceFields (
+  IN  BOOLEAN  IsMinFixed,
+  IN  BOOLEAN  IsMaxFixed,
+  IN  UINT64   AddressGranularity,
+  IN  UINT64   AddressMinimum,
+  IN  UINT64   AddressMaximum,
+  IN  UINT64   AddressTranslation,
+  IN  UINT64   RangeLength
+  )
+{
+  if ((AddressMinimum > AddressMaximum)                     ||
+      (RangeLength > (AddressMaximum - AddressMinimum + 1)) ||
+      ((AddressGranularity != 0) &&
+       (((AddressGranularity + 1) & AddressGranularity) != 0)))
+  {
+    ASSERT (0);
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (RangeLength != 0) {
+    if (IsMinFixed ^ IsMaxFixed) {
+      ASSERT (0);
+      return EFI_INVALID_PARAMETER;
+    } else if (IsMinFixed                 &&
+               IsMaxFixed                 &&
+               (AddressGranularity != 0)  &&
+               ((AddressMaximum - AddressMinimum + 1) != RangeLength))
+    {
+      ASSERT (0);
+      return EFI_INVALID_PARAMETER;
+    }
+  } else {
+    if (IsMinFixed && IsMaxFixed) {
+      ASSERT (0);
+      return EFI_INVALID_PARAMETER;
+    } else if (IsMinFixed &&
+               ((AddressMinimum & AddressGranularity) != 0))
+    {
+      ASSERT (0);
+      return EFI_INVALID_PARAMETER;
+    } else if (IsMaxFixed &&
+               (((AddressMaximum + 1) & AddressGranularity) != 0))
+    {
+      ASSERT (0);
+      return EFI_INVALID_PARAMETER;
+    }
+  }
+
+  return EFI_SUCCESS;
+}
+
+/** Code generation for the "DWordSpace ()" ASL function.
+
+  The Resource Data effectively created is a DWord Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.2 "DWord Address Space Descriptor".
+   - s19.6.36 "DWordSpace".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.36 for more.
+
+  @param [in]  ResourceType         Resource type.
+                                    Possible values are:
+                                      0:        Memory range
+                                      1:        I/O range
+                                      2:        Bus number range
+                                      3-191:    Reserved
+                                      192-255:  Hardware Vendor Defined
+                                    See ACPI 6.4 spec, s6.4.3.5.2 for more.
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  TypeSpecificFlags    Type specific flags.
+                                    See ACPI 6.4 spec, s6.4.3.5.5
+                                    "Resource Type Specific Flags".
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Unused. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Unused. Must be NULL.
+  @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.
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+AmlCodeGenRdDWordSpace (
+  IN        UINT8 ResourceType,
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsPosDecode,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        UINT8 TypeSpecificFlags,
+  IN        UINT32 AddressGranularity,
+  IN        UINT32 AddressMinimum,
+  IN        UINT32 AddressMaximum,
+  IN        UINT32 AddressTranslation,
+  IN        UINT32 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  )
+{
+  EFI_STATUS                               Status;
+  AML_DATA_NODE                            *RdNode;
+  EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR  RdDWord;
+
+  // ResourceSource and ResourceSourceIndex are unused.
+  if ((TypeSpecificFlags == MAX_UINT8)  ||
+      (ResourceSourceIndex != 0)        ||
+      (ResourceSource != NULL)          ||
+      ((NameOpNode == NULL) && (NewRdNode == NULL)))
+  {
+    ASSERT (0);
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = CheckAddressSpaceFields (
+             IsMinFixed,
+             IsMaxFixed,
+             AddressGranularity,
+             AddressMinimum,
+             AddressMaximum,
+             AddressTranslation,
+             RangeLength
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    return Status;
+  }
+
+  // Header
+  RdDWord.Header.Header.Bits.Name =
+    ACPI_LARGE_DWORD_ADDRESS_SPACE_DESCRIPTOR_NAME;
+  RdDWord.Header.Header.Bits.Type = ACPI_LARGE_ITEM_FLAG;
+  RdDWord.Header.Length           = sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR) -
+                                    sizeof (ACPI_LARGE_RESOURCE_HEADER);
+
+  // Body
+  RdDWord.ResType = ResourceType;
+  RdDWord.GenFlag = AddressSpaceGeneralFlags (
+                      IsPosDecode,
+                      IsMinFixed,
+                      IsMaxFixed
+                      );
+  RdDWord.SpecificFlag          = TypeSpecificFlags;
+  RdDWord.AddrSpaceGranularity  = AddressGranularity;
+  RdDWord.AddrRangeMin          = AddressMinimum;
+  RdDWord.AddrRangeMax          = AddressMaximum;
+  RdDWord.AddrTranslationOffset = AddressTranslation;
+  RdDWord.AddrLen               = RangeLength;
+
+  Status = AmlCreateDataNode (
+             EAmlNodeDataTypeResourceData,
+             (UINT8 *)&RdDWord,
+             sizeof (EFI_ACPI_DWORD_ADDRESS_SPACE_DESCRIPTOR),
+             &RdNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    return Status;
+  }
+
+  return LinkRdNode (RdNode, NameOpNode, NewRdNode);
+}
+
+/** Code generation for the "DWordIO ()" ASL function.
+
+  The Resource Data effectively created is a DWord Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.2 "DWord Address Space Descriptor".
+   - s19.6.34 "DWordIO".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.34 for more.
+
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  IsaRanges            Possible values are:
+                                     0-Reserved
+                                     1-NonISAOnly
+                                     2-ISAOnly
+                                     3-EntireRange
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Unused. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Unused. Must be NULL.
+  @param [in]  IsDenseTranslation   TranslationDensity parameter.
+  @param [in]  IsTypeStatic         TranslationType parameter.
+  @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
+AmlCodeGenRdDWordIo (
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        BOOLEAN IsPosDecode,
+  IN        UINT8 IsaRanges,
+  IN        UINT32 AddressGranularity,
+  IN        UINT32 AddressMinimum,
+  IN        UINT32 AddressMaximum,
+  IN        UINT32 AddressTranslation,
+  IN        UINT32 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        BOOLEAN IsDenseTranslation,
+  IN        BOOLEAN IsTypeStatic,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  )
+{
+  return AmlCodeGenRdDWordSpace (
+           ACPI_ADDRESS_SPACE_TYPE_IO,
+           IsResourceConsumer,
+           IsPosDecode,
+           IsMinFixed,
+           IsMaxFixed,
+           RdIoRangeSpecificFlags (
+             IsaRanges,
+             IsDenseTranslation,
+             IsTypeStatic
+             ),
+           AddressGranularity,
+           AddressMinimum,
+           AddressMaximum,
+           AddressTranslation,
+           RangeLength,
+           ResourceSourceIndex,
+           ResourceSource,
+           NameOpNode,
+           NewRdNode
+           );
+}
+
+/** Code generation for the "DWordMemory ()" ASL function.
+
+  The Resource Data effectively created is a DWord Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.2 "DWord Address Space Descriptor".
+   - s19.6.35 "DWordMemory".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.35 for more.
+
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  Cacheable            Possible values are:
+                                    0-The memory is non-cacheable
+                                    1-The memory is cacheable
+                                    2-The memory is cacheable and supports
+                                      write combining
+                                    3-The memory is cacheable and prefetchable
+  @param [in]  IsReadWrite          ReadAndWrite parameter.
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Unused. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Unused. Must be NULL.
+  @param [in]  MemoryRangeType      Possible values are:
+                                      0-AddressRangeMemory
+                                      1-AddressRangeReserved
+                                      2-AddressRangeACPI
+                                      3-AddressRangeNVS
+  @param [in]  IsTypeStatic         TranslationType parameter.
+  @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
+AmlCodeGenRdDWordMemory (
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsPosDecode,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        UINT8 Cacheable,
+  IN        BOOLEAN IsReadWrite,
+  IN        UINT32 AddressGranularity,
+  IN        UINT32 AddressMinimum,
+  IN        UINT32 AddressMaximum,
+  IN        UINT32 AddressTranslation,
+  IN        UINT32 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        UINT8 MemoryRangeType,
+  IN        BOOLEAN IsTypeStatic,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  )
+{
+  return AmlCodeGenRdDWordSpace (
+           ACPI_ADDRESS_SPACE_TYPE_MEM,
+           IsResourceConsumer,
+           IsPosDecode,
+           IsMinFixed,
+           IsMaxFixed,
+           MemoryRangeSpecificFlags (
+             Cacheable,
+             IsReadWrite,
+             MemoryRangeType,
+             IsTypeStatic
+             ),
+           AddressGranularity,
+           AddressMinimum,
+           AddressMaximum,
+           AddressTranslation,
+           RangeLength,
+           ResourceSourceIndex,
+           ResourceSource,
+           NameOpNode,
+           NewRdNode
+           );
+}
+
+/** Code generation for the "WordSpace ()" ASL function.
+
+  The Resource Data effectively created is a Word Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.3 "Word Address Space Descriptor".
+   - s19.6.151 "WordSpace".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.151 for more.
+
+  @param [in]  ResourceType         Resource type.
+                                    Possible values are:
+                                      0:        Memory range
+                                      1:        I/O range
+                                      2:        Bus number range
+                                      3-191:    Reserved
+                                      192-255:  Hardware Vendor Defined
+                                    See ACPI 6.4 spec, s6.4.3.5.3 for more.
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  TypeSpecificFlags    Type specific flags.
+                                    See ACPI 6.4 spec, s6.4.3.5.5
+                                    "Resource Type Specific Flags".
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Unused. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Unused. Must be NULL.
+  @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.
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+AmlCodeGenRdWordSpace (
+  IN        UINT8 ResourceType,
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsPosDecode,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        UINT8 TypeSpecificFlags,
+  IN        UINT16 AddressGranularity,
+  IN        UINT16 AddressMinimum,
+  IN        UINT16 AddressMaximum,
+  IN        UINT16 AddressTranslation,
+  IN        UINT16 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  )
+{
+  EFI_STATUS                              Status;
+  AML_DATA_NODE                           *RdNode;
+  EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR  Rdword;
+
+  // ResourceSource and ResourceSourceIndex are unused.
+  if ((TypeSpecificFlags == MAX_UINT8)  ||
+      (ResourceSourceIndex != 0)        ||
+      (ResourceSource != NULL)          ||
+      ((NameOpNode == NULL) && (NewRdNode == NULL)))
+  {
+    ASSERT (0);
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = CheckAddressSpaceFields (
+             IsMinFixed,
+             IsMaxFixed,
+             AddressGranularity,
+             AddressMinimum,
+             AddressMaximum,
+             AddressTranslation,
+             RangeLength
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    return Status;
+  }
+
+  // Header
+  Rdword.Header.Header.Bits.Name =
+    ACPI_LARGE_WORD_ADDRESS_SPACE_DESCRIPTOR_NAME;
+  Rdword.Header.Header.Bits.Type = ACPI_LARGE_ITEM_FLAG;
+  Rdword.Header.Length           = sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR) -
+                                   sizeof (ACPI_LARGE_RESOURCE_HEADER);
+
+  // Body
+  Rdword.ResType = ResourceType;
+  Rdword.GenFlag = AddressSpaceGeneralFlags (
+                     IsPosDecode,
+                     IsMinFixed,
+                     IsMaxFixed
+                     );
+  Rdword.SpecificFlag          = TypeSpecificFlags;
+  Rdword.AddrSpaceGranularity  = AddressGranularity;
+  Rdword.AddrRangeMin          = AddressMinimum;
+  Rdword.AddrRangeMax          = AddressMaximum;
+  Rdword.AddrTranslationOffset = AddressTranslation;
+  Rdword.AddrLen               = RangeLength;
+
+  Status = AmlCreateDataNode (
+             EAmlNodeDataTypeResourceData,
+             (UINT8 *)&Rdword,
+             sizeof (EFI_ACPI_WORD_ADDRESS_SPACE_DESCRIPTOR),
+             &RdNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    return Status;
+  }
+
+  return LinkRdNode (RdNode, NameOpNode, NewRdNode);
+}
+
+/** Code generation for the "WordBusNumber ()" ASL function.
+
+  The Resource Data effectively created is a Word Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.3 "Word Address Space Descriptor".
+   - s19.6.149 "WordBusNumber".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.149 for more.
+
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Unused. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Unused. Must be NULL.
+  @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
+AmlCodeGenRdWordBusNumber (
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        BOOLEAN IsPosDecode,
+  IN        UINT32 AddressGranularity,
+  IN        UINT32 AddressMinimum,
+  IN        UINT32 AddressMaximum,
+  IN        UINT32 AddressTranslation,
+  IN        UINT32 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  )
+{
+  // There is no Type Specific Flags for buses.
+  return AmlCodeGenRdWordSpace (
+           ACPI_ADDRESS_SPACE_TYPE_BUS,
+           IsResourceConsumer,
+           IsPosDecode,
+           IsMinFixed,
+           IsMaxFixed,
+           0,
+           AddressGranularity,
+           AddressMinimum,
+           AddressMaximum,
+           AddressTranslation,
+           RangeLength,
+           ResourceSourceIndex,
+           ResourceSource,
+           NameOpNode,
+           NewRdNode
+           );
+}
+
+/** Code generation for the "QWordSpace ()" ASL function.
+
+  The Resource Data effectively created is a QWord Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.1 "QWord Address Space Descriptor".
+   - s19.6.111 "QWordSpace".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.111 for more.
+
+  @param [in]  ResourceType         Resource type.
+                                    Possible values are:
+                                      0:        Memory range
+                                      1:        I/O range
+                                      2:        Bus number range
+                                      3-191:    Reserved
+                                      192-255:  Hardware Vendor Defined
+                                    See ACPI 6.4 spec, s6.4.3.5.1 for more.
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsPosDecode          Decode parameter
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  TypeSpecificFlags    Type specific flags.
+                                    See ACPI 6.4 spec, s6.4.3.5.5
+                                    "Resource Type Specific Flags".
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Unused. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Unused. Must be NULL.
+  @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.
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+AmlCodeGenRdQWordSpace (
+  IN        UINT8 ResourceType,
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsPosDecode,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        UINT8 TypeSpecificFlags,
+  IN        UINT64 AddressGranularity,
+  IN        UINT64 AddressMinimum,
+  IN        UINT64 AddressMaximum,
+  IN        UINT64 AddressTranslation,
+  IN        UINT64 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  )
+{
+  EFI_STATUS                               Status;
+  AML_DATA_NODE                            *RdNode;
+  EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR  RdQword;
+
+  // ResourceSource and ResourceSourceIndex are unused.
+  if ((TypeSpecificFlags == MAX_UINT8)  ||
+      (ResourceSourceIndex != 0)        ||
+      (ResourceSource != NULL)          ||
+      ((NameOpNode == NULL) && (NewRdNode == NULL)))
+  {
+    ASSERT (0);
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = CheckAddressSpaceFields (
+             IsMinFixed,
+             IsMaxFixed,
+             AddressGranularity,
+             AddressMinimum,
+             AddressMaximum,
+             AddressTranslation,
+             RangeLength
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    return Status;
+  }
+
+  // Header
+  RdQword.Header.Header.Bits.Name =
+    ACPI_LARGE_QWORD_ADDRESS_SPACE_DESCRIPTOR_NAME;
+  RdQword.Header.Header.Bits.Type = ACPI_LARGE_ITEM_FLAG;
+  RdQword.Header.Length           = sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR) -
+                                    sizeof (ACPI_LARGE_RESOURCE_HEADER);
+
+  // Body
+  RdQword.ResType = ResourceType;
+  RdQword.GenFlag = AddressSpaceGeneralFlags (
+                      IsPosDecode,
+                      IsMinFixed,
+                      IsMaxFixed
+                      );
+  RdQword.SpecificFlag          = TypeSpecificFlags;
+  RdQword.AddrSpaceGranularity  = AddressGranularity;
+  RdQword.AddrRangeMin          = AddressMinimum;
+  RdQword.AddrRangeMax          = AddressMaximum;
+  RdQword.AddrTranslationOffset = AddressTranslation;
+  RdQword.AddrLen               = RangeLength;
+
+  Status = AmlCreateDataNode (
+             EAmlNodeDataTypeResourceData,
+             (UINT8 *)&RdQword,
+             sizeof (EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR),
+             &RdNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    return Status;
+  }
+
+  return LinkRdNode (RdNode, NameOpNode, NewRdNode);
+}
+
+/** Code generation for the "QWordMemory ()" ASL function.
+
+  The Resource Data effectively created is a QWord Address Space Resource
+  Data. Cf ACPI 6.4:
+   - s6.4.3.5.1 "QWord Address Space Descriptor".
+   - s19.6.110 "QWordMemory".
+
+  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.
+
+  See ACPI 6.4 spec, s19.6.110 for more.
+
+  @param [in]  IsResourceConsumer   ResourceUsage parameter.
+  @param [in]  IsPosDecode          Decode parameter.
+  @param [in]  IsMinFixed           Minimum address is fixed.
+  @param [in]  IsMaxFixed           Maximum address is fixed.
+  @param [in]  Cacheable            Possible values are:
+                                    0-The memory is non-cacheable
+                                    1-The memory is cacheable
+                                    2-The memory is cacheable and supports
+                                      write combining
+                                    3-The memory is cacheable and prefetchable
+  @param [in]  IsReadWrite          ReadAndWrite parameter.
+  @param [in]  AddressGranularity   Address granularity.
+  @param [in]  AddressMinimum       Minimum address.
+  @param [in]  AddressMaximum       Maximum address.
+  @param [in]  AddressTranslation   Address translation.
+  @param [in]  RangeLength          Range length.
+  @param [in]  ResourceSourceIndex  Resource Source index.
+                                    Unused. Must be 0.
+  @param [in]  ResourceSource       Resource Source.
+                                    Unused. Must be NULL.
+  @param [in]  MemoryRangeType      Possible values are:
+                                      0-AddressRangeMemory
+                                      1-AddressRangeReserved
+                                      2-AddressRangeACPI
+                                      3-AddressRangeNVS
+  @param [in]  IsTypeStatic         TranslationType parameter.
+  @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
+AmlCodeGenRdQWordMemory (
+  IN        BOOLEAN IsResourceConsumer,
+  IN        BOOLEAN IsPosDecode,
+  IN        BOOLEAN IsMinFixed,
+  IN        BOOLEAN IsMaxFixed,
+  IN        UINT8 Cacheable,
+  IN        BOOLEAN IsReadWrite,
+  IN        UINT64 AddressGranularity,
+  IN        UINT64 AddressMinimum,
+  IN        UINT64 AddressMaximum,
+  IN        UINT64 AddressTranslation,
+  IN        UINT64 RangeLength,
+  IN        UINT8 ResourceSourceIndex,
+  IN  CONST CHAR8 *ResourceSource,
+  IN        UINT8 MemoryRangeType,
+  IN        BOOLEAN IsTypeStatic,
+  IN        AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL
+  OUT       AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
+  )
+{
+  return AmlCodeGenRdQWordSpace (
+           ACPI_ADDRESS_SPACE_TYPE_MEM,
+           IsResourceConsumer,
+           IsPosDecode,
+           IsMinFixed,
+           IsMaxFixed,
+           MemoryRangeSpecificFlags (
+             Cacheable,
+             IsReadWrite,
+             MemoryRangeType,
+             IsTypeStatic
+             ),
+           AddressGranularity,
+           AddressMinimum,
+           AddressMaximum,
+           AddressTranslation,
+           RangeLength,
+           ResourceSourceIndex,
+           ResourceSource,
+           NameOpNode,
+           NewRdNode
+           );
+}
+
 /** Code generation for the "Interrupt ()" ASL function.
 
   The Resource Data effectively created is an Extended Interrupt Resource
-- 
2.25.1


  reply	other threads:[~2021-12-09  9:25 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-09  9:24 [PATCH v4 0/8] Create a SSDT PCIe generator PierreGondois
2021-12-09  9:24 ` PierreGondois [this message]
2021-12-09  9:24 ` [PATCH v4 2/8] DynamicTablesPkg: AML Code generation to create a named Package() PierreGondois
2021-12-09  9:25 ` [PATCH v4 3/8] DynamicTablesPkg: AML Code generation to create a named ResourceTemplate() PierreGondois
2021-12-09  9:25 ` [PATCH v4 4/8] DynamicTablesPkg: AML Code generation to add _PRT entries PierreGondois
2021-12-09  9:25 ` [PATCH v4 5/8] DynamicTablesPkg: Add AmlAttachNode() PierreGondois
2021-12-09  9:25 ` [PATCH v4 6/8] DynamicTablesPkg: Add Pci related objects PierreGondois
2021-12-09  9:25 ` [PATCH v4 7/8] DynamicTablesPkg: SSDT Pci express generator PierreGondois
2021-12-09  9:25 ` [PATCH v4 8/8] DynamicTablesPkg: Fix multiple objects parsing PierreGondois
2021-12-13 12:24 ` [PATCH v4 0/8] Create a SSDT PCIe generator Sami Mujawar
2021-12-13 17:19   ` [edk2-devel] " Sami Mujawar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211209092505.1248326-2-Pierre.Gondois@arm.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox