[edk2-devel] [PATCH v5 5/8] MdePkg: IORT header update for IORT Rev E.d spec

Sami Mujawar sami.mujawar at arm.com
Tue Jul 12 14:31:38 UTC 2022


Bugzilla: 3458 - Add support IORT Rev E.d specification updates
          (https://bugzilla.tianocore.org/show_bug.cgi?id=3458)

The IO Remapping Table, Platform Design Document, Revision E.d,
Feb 2022 (https://developer.arm.com/documentation/den0049/)
introduces the following updates, collectively including the
updates and errata fixes to Rev E, Rev E.a, Rev E.b, Rev E.c:
  - increments the IORT table revision to 5.
  - updates the node definition to add an 'Identifier' field.
  - adds definition of node type 6 - Reserved Memory Range node.
  - adds definition for Memory Range Descriptors.
  - adds flag to indicate PRI support for root complexes.
  - adds flag to indicate if the root complex supports forwarding
    of PASID information on translated transactions to the SMMU.
  - adds flag to indicate if the root complex supports PASID.
  - adds flags to define access privilege and attributes for the
    memory ranges.

Therefore, update the IORT header file to reflect these changes,
and also rename the EFI_ACPI_IO_REMAPPING_TABLE_REVISION macro to
EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00.

Also update the IORT generator in DynamicTablesPkg to fix the
compilation errors so that Git Bisect can work.

Signed-off-by: Sami Mujawar <sami.mujawar at arm.com>
---

Notes:
    v5:
     - Change IORT revision macro name to make it similar to         [THOMAS]
       macro names for other ACPI tables.
     - Updated IORT revision macros from                             [SAMI]
       EFI_ACPI_IO_REMAPPING_TABLE_REVx to
       EFI_ACPI_IO_REMAPPING_TABLE_REVISION_0x
       Ref: https://edk2.groups.io/g/devel/message/91119
     - Keep EFI_ACPI_IO_REMAPPING_TABLE_REVISION and set to          [LIMING]
       EFI_ACPI_IO_REMAPPING_TABLE_REVISION_05.
       Ref: https://edk2.groups.io/g/devel/message/91137
     - Added EFI_ACPI_IO_REMAPPING_TABLE_REVISION and set it         [SAMI]
       to the latest IORT revision.
     - Updated IORT generator in DynamicTablesPkg and included       [SAMI]
       in this patch so that Git bisect does not break.
    
    v4:
      - Updated patch series to IORT specification revision E.d.     [SAMI]
      - Add flag to indicate if the root complex supports PASID.     [SAMI]
      - Add flags to define access privilege and attributes for      [SAMI]
        the memory ranges.
    v3:
      - Submit patch series to update platform code to use the       [LIMING]
        EFI_ACPI_IO_REMAPPING_TABLE_REV0 macro.
        Ref: https://edk2.groups.io/g/devel/topic/83618423#76799
      - Removed definition of EFI_ACPI_IO_REMAPPING_TABLE_REVISION   [SAMI]
        as EFI_ACPI_IO_REMAPPING_TABLE_REV0 has been provided for
        representing Rev 0. Also, a corresponding patch series
        for updating the platforms in edk2-platforms repository
        shall be submitted to the edk2 mailing list.
      - Include r-b received from v2 series.                         [SAMI]
        Ref: https://edk2.groups.io/g/devel/topic/83600724#76660
    
    v2:
      - Set EFI_ACPI_IO_REMAPPING_TABLE_REVISION to Rev 0 as     [SAMI]
        setting to Rev 3 will break existing platforms. The
        problem is that existing code would not be populating
        the Identifier field in the nodes. This can lead to
        non-unique values in the Identifier field.

 DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c | 19 +++--
 MdePkg/Include/IndustryStandard/IoRemappingTable.h               | 83 ++++++++++++++++++--
 2 files changed, 84 insertions(+), 18 deletions(-)

diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c
index abef9e5a7f90a38e1d697227d3cd2c110db364a4..63381441e2d6515a7cc9731c89b9739a12c65599 100644
--- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c
+++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c
@@ -766,7 +766,7 @@ AddItsGroupNodes (
     ItsGroupNode->Node.Type          = EFI_ACPI_IORT_TYPE_ITS_GROUP;
     ItsGroupNode->Node.Length        = (UINT16)NodeLength;
     ItsGroupNode->Node.Revision      = 0;
-    ItsGroupNode->Node.Reserved      = EFI_ACPI_RESERVED_DWORD;
+    ItsGroupNode->Node.Identifier    = EFI_ACPI_RESERVED_DWORD;
     ItsGroupNode->Node.NumIdMappings = 0;
     ItsGroupNode->Node.IdReference   = 0;
 
@@ -872,7 +872,7 @@ AddNamedComponentNodes (
     NcNode->Node.Type          = EFI_ACPI_IORT_TYPE_NAMED_COMP;
     NcNode->Node.Length        = (UINT16)NodeLength;
     NcNode->Node.Revision      = 2;
-    NcNode->Node.Reserved      = EFI_ACPI_RESERVED_DWORD;
+    NcNode->Node.Identifier    = EFI_ACPI_RESERVED_DWORD;
     NcNode->Node.NumIdMappings = NodeList->IdMappingCount;
 
     ObjectNameLength         = AsciiStrLen (NodeList->ObjectName) + 1;
@@ -1005,7 +1005,7 @@ AddRootComplexNodes (
     RcNode->Node.Type          = EFI_ACPI_IORT_TYPE_ROOT_COMPLEX;
     RcNode->Node.Length        = (UINT16)NodeLength;
     RcNode->Node.Revision      = 1;
-    RcNode->Node.Reserved      = EFI_ACPI_RESERVED_DWORD;
+    RcNode->Node.Identifier    = EFI_ACPI_RESERVED_DWORD;
     RcNode->Node.NumIdMappings = NodeList->IdMappingCount;
     RcNode->Node.IdReference   = (NodeList->IdMappingCount == 0) ?
                                  0 : sizeof (EFI_ACPI_6_0_IO_REMAPPING_RC_NODE);
@@ -1018,9 +1018,8 @@ AddRootComplexNodes (
     RcNode->AtsAttribute      = NodeList->AtsAttribute;
     RcNode->PciSegmentNumber  = NodeList->PciSegmentNumber;
     RcNode->MemoryAddressSize = NodeList->MemoryAddressSize;
+    RcNode->PasidCapabilities = EFI_ACPI_RESERVED_WORD;
     RcNode->Reserved1[0]      = EFI_ACPI_RESERVED_BYTE;
-    RcNode->Reserved1[1]      = EFI_ACPI_RESERVED_BYTE;
-    RcNode->Reserved1[2]      = EFI_ACPI_RESERVED_BYTE;
 
     if (NodeList->IdMappingCount > 0) {
       if (NodeList->IdMappingToken == CM_NULL_TOKEN) {
@@ -1188,7 +1187,7 @@ AddSmmuV1V2Nodes (
     SmmuNode->Node.Type          = EFI_ACPI_IORT_TYPE_SMMUv1v2;
     SmmuNode->Node.Length        = (UINT16)NodeLength;
     SmmuNode->Node.Revision      = 0;
-    SmmuNode->Node.Reserved      = EFI_ACPI_RESERVED_DWORD;
+    SmmuNode->Node.Identifier    = EFI_ACPI_RESERVED_DWORD;
     SmmuNode->Node.NumIdMappings = NodeList->IdMappingCount;
     SmmuNode->Node.IdReference   = (NodeList->IdMappingCount == 0) ?
                                    0 : (sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE) +
@@ -1387,7 +1386,7 @@ AddSmmuV3Nodes (
     SmmuV3Node->Node.Type          = EFI_ACPI_IORT_TYPE_SMMUv3;
     SmmuV3Node->Node.Length        = (UINT16)NodeLength;
     SmmuV3Node->Node.Revision      = 2;
-    SmmuV3Node->Node.Reserved      = EFI_ACPI_RESERVED_DWORD;
+    SmmuV3Node->Node.Identifier    = EFI_ACPI_RESERVED_DWORD;
     SmmuV3Node->Node.NumIdMappings = NodeList->IdMappingCount;
     SmmuV3Node->Node.IdReference   = (NodeList->IdMappingCount == 0) ?
                                      0 : sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE);
@@ -1518,7 +1517,7 @@ AddPmcgNodes (
     PmcgNode->Node.Type          = EFI_ACPI_IORT_TYPE_PMCG;
     PmcgNode->Node.Length        = (UINT16)NodeLength;
     PmcgNode->Node.Revision      = 1;
-    PmcgNode->Node.Reserved      = EFI_ACPI_RESERVED_DWORD;
+    PmcgNode->Node.Identifier    = EFI_ACPI_RESERVED_DWORD;
     PmcgNode->Node.NumIdMappings = NodeList->IdMappingCount;
     PmcgNode->Node.IdReference   = (NodeList->IdMappingCount == 0) ?
                                    0 : sizeof (EFI_ACPI_6_0_IO_REMAPPING_PMCG_NODE);
@@ -2258,9 +2257,9 @@ ACPI_IORT_GENERATOR  IortGenerator = {
     // ACPI Table Signature
     EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE,
     // ACPI Table Revision supported by this Generator
-    EFI_ACPI_IO_REMAPPING_TABLE_REVISION,
+    EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00,
     // Minimum supported ACPI Table Revision
-    EFI_ACPI_IO_REMAPPING_TABLE_REVISION,
+    EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00,
     // Creator ID
     TABLE_GENERATOR_CREATOR_ID_ARM,
     // Creator Revision
diff --git a/MdePkg/Include/IndustryStandard/IoRemappingTable.h b/MdePkg/Include/IndustryStandard/IoRemappingTable.h
index 79a34678681d45b2982dc8573db6bd447f42e429..ba8349ca8deb39b7ae9a86b0ff30c531bbd8ddf9 100644
--- a/MdePkg/Include/IndustryStandard/IoRemappingTable.h
+++ b/MdePkg/Include/IndustryStandard/IoRemappingTable.h
@@ -1,12 +1,19 @@
 /** @file
-  ACPI IO Remapping Table (IORT) as specified in ARM spec DEN0049D
-
-  http://infocenter.arm.com/help/topic/com.arm.doc.den0049d/DEN0049D_IO_Remapping_Table.pdf
+  ACPI IO Remapping Table (IORT) definitions.
 
   Copyright (c) 2017, Linaro Limited. All rights reserved.<BR>
-  Copyright (c) 2018, ARM Limited. All rights reserved.<BR>
+  Copyright (c) 2018 - 2022, Arm Limited. All rights reserved.<BR>
 
   SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - IO Remapping Table, Platform Design Document, Revision E.d, Feb 2022
+    (https://developer.arm.com/documentation/den0049/)
+
+  @par Glossary:
+  - Ref  : Reference
+  - Mem  : Memory
+  - Desc : Descriptor
 **/
 
 #ifndef __IO_REMAPPING_TABLE_H__
@@ -14,7 +21,8 @@
 
 #include <IndustryStandard/Acpi.h>
 
-#define EFI_ACPI_IO_REMAPPING_TABLE_REVISION  0x0
+#define EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00  0x0
+#define EFI_ACPI_IO_REMAPPING_TABLE_REVISION_05  0x5
 
 #define EFI_ACPI_IORT_TYPE_ITS_GROUP     0x0
 #define EFI_ACPI_IORT_TYPE_NAMED_COMP    0x1
@@ -22,6 +30,7 @@
 #define EFI_ACPI_IORT_TYPE_SMMUv1v2      0x3
 #define EFI_ACPI_IORT_TYPE_SMMUv3        0x4
 #define EFI_ACPI_IORT_TYPE_PMCG          0x5
+#define EFI_ACPI_IORT_TYPE_RMR           0x6
 
 #define EFI_ACPI_IORT_MEM_ACCESS_PROP_CCA  BIT0
 
@@ -55,7 +64,29 @@
 #define EFI_ACPI_IORT_SMMUv3_MODEL_CAVIUM_CN99XX     0x2
 
 #define EFI_ACPI_IORT_ROOT_COMPLEX_ATS_UNSUPPORTED  0x0
-#define EFI_ACPI_IORT_ROOT_COMPLEX_ATS_SUPPORTED    0x1
+#define EFI_ACPI_IORT_ROOT_COMPLEX_ATS_SUPPORTED    BIT0
+
+#define EFI_ACPI_IORT_ROOT_COMPLEX_PRI_UNSUPPORTED  0x0
+#define EFI_ACPI_IORT_ROOT_COMPLEX_PRI_SUPPORTED    BIT1
+
+#define EFI_ACPI_IORT_ROOT_COMPLEX_PASID_FWD_UNSUPPORTED  0x0
+#define EFI_ACPI_IORT_ROOT_COMPLEX_PASID_FWD_SUPPORTED    BIT2
+
+#define EFI_ACPI_IORT_ROOT_COMPLEX_PASID_UNSUPPORTED  0x0
+#define EFI_ACPI_IORT_ROOT_COMPLEX_PASID_SUPPORTED    BIT1
+
+#define EFI_ACPI_IORT_RMR_REMAP_NOT_PERMITTED  0x0
+#define EFI_ACPI_IORT_RMR_REMAP_PERMITTED      BIT0
+
+#define EFI_ACPI_IORT_RMR_ACCESS_REQ_NOT_PRIVILEGED  0x0
+#define EFI_ACPI_IORT_RMR_ACCESS_REQ_PRIVILEGED      BIT1
+
+#define EFI_ACPI_IORT_RMR_ACCESS_ATTRIB_DEV_NGNRNE             0x0
+#define EFI_ACPI_IORT_RMR_ACCESS_ATTRIB_DEV_NGNRE              0x1
+#define EFI_ACPI_IORT_RMR_ACCESS_ATTRIB_DEV_NGRE               0x2
+#define EFI_ACPI_IORT_RMR_ACCESS_ATTRIB_DEV_GRE                0x3
+#define EFI_ACPI_IORT_RMR_ACCESS_ATTRIB_NORM_IN_NC_OUT_NC      0x4
+#define EFI_ACPI_IORT_RMR_ACCESS_ATTRIB_NORM_IN_WB_OUT_WB_ISH  0x5
 
 #define EFI_ACPI_IORT_ID_MAPPING_FLAGS_SINGLE  BIT0
 
@@ -89,7 +120,7 @@ typedef struct {
   UINT8     Type;
   UINT16    Length;
   UINT8     Revision;
-  UINT32    Reserved;
+  UINT32    Identifier;
   UINT32    NumIdMappings;
   UINT32    IdReference;
 } EFI_ACPI_6_0_IO_REMAPPING_NODE;
@@ -118,7 +149,9 @@ typedef struct {
   UINT32                            AtsAttribute;
   UINT32                            PciSegmentNumber;
   UINT8                             MemoryAddressSize;
-  UINT8                             Reserved1[3];
+  UINT16                            PasidCapabilities;
+  UINT8                             Reserved1[1];
+  UINT32                            Flags;
 } EFI_ACPI_6_0_IO_REMAPPING_RC_NODE;
 
 ///
@@ -198,6 +231,40 @@ typedef struct {
   // EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE      OverflowInterruptMsiMapping[1];
 } EFI_ACPI_6_0_IO_REMAPPING_PMCG_NODE;
 
+///
+/// Memory Range Descriptor.
+///
+typedef struct {
+  /// Base address of Reserved Memory Range,
+  /// aligned to a page size of 64K.
+  UINT64    Base;
+
+  /// Length of the Reserved Memory range.
+  /// Must be a multiple of the page size of 64K.
+  UINT64    Length;
+
+  /// Reserved, must be zero.
+  UINT32    Reserved;
+} EFI_ACPI_6_0_IO_REMAPPING_MEM_RANGE_DESC;
+
+///
+/// Node type 6: Reserved Memory Range (RMR) node
+///
+typedef struct {
+  EFI_ACPI_6_0_IO_REMAPPING_NODE    Node;
+
+  /// RMR flags
+  UINT32                            Flags;
+
+  /// Memory range descriptor count.
+  UINT32                            NumMemRangeDesc;
+
+  /// Offset of the memory range descriptor array.
+  UINT32                            MemRangeDescRef;
+  // EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE         IdMapping[1];
+  // EFI_ACPI_6_0_IO_REMAPPING_MEM_RANGE_DESC   MemRangeDesc[1];
+} EFI_ACPI_6_0_IO_REMAPPING_RMR_NODE;
+
 #pragma pack()
 
 #endif
-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91266): https://edk2.groups.io/g/devel/message/91266
Mute This Topic: https://groups.io/mt/92334078/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list