]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg: IORT header update for IORT Rev E.d spec
authorSami Mujawar <sami.mujawar@arm.com>
Thu, 14 Jul 2022 16:50:28 +0000 (17:50 +0100)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 29 Jul 2022 19:22:15 +0000 (19:22 +0000)
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@arm.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
Reviewed-by: Zhichao Gao <zhichao.gao@intel.com>
DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/IortGenerator.c
MdePkg/Include/IndustryStandard/IoRemappingTable.h

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