[edk2-devel] [PATCH v5 6/8] ShellPkg: Acpiview: IORT parser update for IORT Rev E.d spec

Sami Mujawar posted 8 patches 3 years, 7 months ago
There is a newer version of this series
[edk2-devel] [PATCH v5 6/8] ShellPkg: Acpiview: IORT parser update for IORT Rev E.d spec
Posted by Sami Mujawar 3 years, 7 months ago
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 parser to:
  - parse the Identifier field.
  - parse Reserved Memory Range node.
  - parse Memory Range Descriptors.
  - add validations to check that the physical range base
    and size of the Memory Range Descriptor is 64KB aligned.
  - add validation to check that the IORT Table Revision is
    not 4 as IORT Rev E.c is deprecated.
  - add validation to check that the IORT RMR node revision
    is not 2 as it breaks backward compatibility and was
    deprecated as part of IORT Rev E.c.

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

Notes:
    v5:
     - No code change since v4. Included r-b received for       [SAMI]
       v5 series.
    
    v4:
     - Add validation to check that the IORT Table Revision is  [SAMI]
       not 4 as IORT Rev E.c is deprecated.
     - Add validation to check that the IORT RMR node revision  [SAMI]
       is not 2 as it breaks backward compatibility and was
       deprecated as part of IORT Rev E.c.
    
    v3:
     - No code change since v1. Included r-b received for       [SAMI]
       v2 series.
       Ref: https://edk2.groups.io/g/devel/topic/83600720#7665
    
    v2:
      - No code change since v1. Re-sending with v2 series.     [SAMI]

 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Iort/IortParser.c | 221 ++++++++++++++++++--
 1 file changed, 203 insertions(+), 18 deletions(-)

diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Iort/IortParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Iort/IortParser.c
index 44d633c5282463078a4cc990bb24ca1992f95634..0b42ff3b354a7cf54cdc2e6e15d0617fadda17f2 100644
--- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Iort/IortParser.c
+++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Iort/IortParser.c
@@ -1,14 +1,16 @@
 /** @file
   IORT table parser
 
-  Copyright (c) 2016 - 2021, Arm Limited. All rights reserved.
+  Copyright (c) 2016 - 2022, Arm Limited. All rights reserved.
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
   @par Reference(s):
-  - IO Remapping Table, Platform Design Document, Revision D, March 2018
+    - IO Remapping Table, Platform Design Document, Revision E.d, Feb 2022
+      (https://developer.arm.com/documentation/den0049/)
 
   @par Glossary:
     - Ref  - Reference
+    - Desc - Descriptor
 **/
 
 #include <IndustryStandard/IoRemappingTable.h>
@@ -26,6 +28,7 @@ STATIC CONST UINT32  *IortNodeOffset;
 
 STATIC CONST UINT8   *IortNodeType;
 STATIC CONST UINT16  *IortNodeLength;
+STATIC CONST UINT8   *IortNodeRevision;
 STATIC CONST UINT32  *IortIdMappingCount;
 STATIC CONST UINT32  *IortIdMappingOffset;
 
@@ -36,6 +39,9 @@ STATIC CONST UINT32  *PmuInterruptOffset;
 
 STATIC CONST UINT32  *ItsCount;
 
+STATIC CONST UINT32  *RmrMemDescCount;
+STATIC CONST UINT32  *RmrMemDescOffset;
+
 /**
   This function validates the ID Mapping array count for the ITS node.
 
@@ -100,6 +106,52 @@ ValidateItsIdArrayReference (
   }
 }
 
+/**
+  This function validates that the Physical Range address or length is not zero
+  and is 64K aligned.
+
+  @param [in] Ptr     Pointer to the start of the field data.
+  @param [in] Context Pointer to context specific information e.g. this
+                      could be a pointer to the ACPI table header.
+**/
+STATIC
+VOID
+EFIAPI
+ValidatePhysicalRange (
+  IN UINT8  *Ptr,
+  IN VOID   *Context
+  )
+{
+  UINT64  Value;
+
+  Value = *(UINT64 *)Ptr;
+  if ((Value == 0) || ((Value & (SIZE_64KB - 1)) != 0)) {
+    IncrementErrorCount ();
+    Print (L"\nERROR: Physical Range must be 64K aligned and cannot be zero.");
+  }
+}
+
+/**
+  This function validates that the RMR memory range descriptor count.
+
+  @param [in] Ptr     Pointer to the start of the field data.
+  @param [in] Context Pointer to context specific information e.g. this
+                      could be a pointer to the ACPI table header.
+**/
+STATIC
+VOID
+EFIAPI
+ValidateRmrMemDescCount (
+  IN UINT8  *Ptr,
+  IN VOID   *Context
+  )
+{
+  if (*(UINT32 *)Ptr == 0) {
+    IncrementErrorCount ();
+    Print (L"\nERROR: Memory Range Descriptor count must be >=1.");
+  }
+}
+
 /**
   Helper Macro for populating the IORT Node header in the ACPI_PARSER array.
 
@@ -108,15 +160,15 @@ ValidateItsIdArrayReference (
   @param [out] ValidateIdArrayReference  Optional pointer to a function for
                                          validating the ID Array reference.
 **/
-#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount,                   \
-                               ValidateIdArrayReference)                 \
-  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL },     \
-  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, NULL }, \
-  { L"Revision", 1, 3, L"%d", NULL, NULL, NULL, NULL },                  \
-  { L"Reserved", 4, 4, L"0x%x", NULL, NULL, NULL, NULL },                \
-  { L"Number of ID mappings", 4, 8, L"%d", NULL,                         \
-    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL },         \
-  { L"Reference to ID Array", 4, 12, L"0x%x", NULL,                      \
+#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount,                        \
+                               ValidateIdArrayReference)                      \
+  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL },          \
+  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, NULL },      \
+  { L"Revision", 1, 3, L"%d", NULL, (VOID**)&IortNodeRevision, NULL, NULL },  \
+  { L"Identifier", 4, 4, L"0x%x", NULL, NULL, NULL, NULL },                   \
+  { L"Number of ID mappings", 4, 8, L"%d", NULL,                              \
+    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL },              \
+  { L"Reference to ID Array", 4, 12, L"0x%x", NULL,                           \
     (VOID**)&IortIdMappingOffset, ValidateIdArrayReference, NULL }
 
 /**
@@ -235,11 +287,13 @@ STATIC CONST ACPI_PARSER  IortNodeNamedComponentParser[] = {
 **/
 STATIC CONST ACPI_PARSER  IortNodeRootComplexParser[] = {
   PARSE_IORT_NODE_HEADER (NULL, NULL),
-  { L"Memory access properties",8,    16,  L"0x%lx",    NULL,       NULL, NULL, NULL },
-  { L"ATS Attribute",           4,    24,  L"0x%x",     NULL,       NULL, NULL, NULL },
-  { L"PCI Segment number",      4,    28,  L"0x%x",     NULL,       NULL, NULL, NULL },
-  { L"Memory access size limit",1,    32,  L"0x%x",     NULL,       NULL, NULL, NULL },
-  { L"Reserved",                3,    33,  L"%x %x %x", Dump3Chars, NULL, NULL, NULL }
+  { L"Memory access properties",8,    16,  L"0x%lx", NULL, NULL, NULL, NULL },
+  { L"ATS Attribute",           4,    24,  L"0x%x",  NULL, NULL, NULL, NULL },
+  { L"PCI Segment number",      4,    28,  L"0x%x",  NULL, NULL, NULL, NULL },
+  { L"Memory access size limit",1,    32,  L"0x%x",  NULL, NULL, NULL, NULL },
+  { L"PASID capabilities",      2,    33,  L"0x%x",  NULL, NULL, NULL, NULL },
+  { L"Reserved",                1,    35,  L"%x",    NULL, NULL, NULL, NULL },
+  { L"Flags",                   4,    36,  L"%x",    NULL, NULL, NULL, NULL },
 };
 
 /**
@@ -253,6 +307,29 @@ STATIC CONST ACPI_PARSER  IortNodePmcgParser[] = {
   { L"Page 1 Base Address",                           8,    32,  L"0x%lx", NULL, NULL, NULL, NULL }
 };
 
+/**
+  An ACPI_PARSER array describing the IORT RMR node.
+**/
+STATIC CONST ACPI_PARSER  IortNodeRmrParser[] = {
+  PARSE_IORT_NODE_HEADER (NULL, NULL),
+  { L"Flags",                   4,                      16,  L"0x%x", NULL, NULL, NULL, NULL },
+  { L"Memory Range Desc count", 4,                      20,  L"%d",   NULL,
+    (VOID **)&RmrMemDescCount,  ValidateRmrMemDescCount,NULL },
+  { L"Memory Range Desc Ref",   4,                      24,  L"0x%x", NULL,
+    (VOID **)&RmrMemDescOffset, NULL,                   NULL }
+};
+
+/**
+  An ACPI_PARSER array describing the IORT RMR Memory Range Descriptor.
+**/
+STATIC CONST ACPI_PARSER  IortNodeRmrMemRangeDescParser[] = {
+  { L"Physical Range offset", 8, 0,  L"0x%lx", NULL, NULL, ValidatePhysicalRange,
+    NULL },
+  { L"Physical Range length", 8, 8,  L"0x%lx", NULL, NULL, ValidatePhysicalRange,
+    NULL },
+  { L"Reserved",              4, 16, L"0x%x",  NULL, NULL, NULL,                 NULL}
+};
+
 /**
   This function parses the IORT Node Id Mapping array.
 
@@ -607,9 +684,102 @@ DumpIortNodePmcg (
     );
 }
 
+/**
+  This function parses the IORT RMR Node Memory Range Descriptor array.
+
+  @param [in] Ptr         Pointer to the start of the Memory Range Descriptor
+                          array.
+  @param [in] Length      Length of the buffer.
+  @param [in] DescCount   Memory Range Descriptor count.
+**/
+STATIC
+VOID
+DumpIortNodeRmrMemRangeDesc (
+  IN UINT8   *Ptr,
+  IN UINT32  Length,
+  IN UINT32  DescCount
+  )
+{
+  UINT32  Index;
+  UINT32  Offset;
+  CHAR8   Buffer[40]; // Used for AsciiName param of ParseAcpi
+
+  Index  = 0;
+  Offset = 0;
+
+  while ((Index < DescCount) &&
+         (Offset < Length))
+  {
+    AsciiSPrint (
+      Buffer,
+      sizeof (Buffer),
+      "Mem range Descriptor [%d]",
+      Index
+      );
+    Offset += ParseAcpi (
+                TRUE,
+                4,
+                Buffer,
+                Ptr + Offset,
+                Length - Offset,
+                PARSER_PARAMS (IortNodeRmrMemRangeDescParser)
+                );
+    Index++;
+  }
+}
+
+/**
+  This function parses the IORT RMR node.
+
+  @param [in] Ptr            Pointer to the start of the buffer.
+  @param [in] Length         Length of the buffer.
+  @param [in] MappingCount   The ID Mapping count.
+  @param [in] MappingOffset  The offset of the ID Mapping array
+                             from the start of the IORT table.
+**/
+STATIC
+VOID
+DumpIortNodeRmr (
+  IN UINT8   *Ptr,
+  IN UINT16  Length,
+  IN UINT32  MappingCount,
+  IN UINT32  MappingOffset
+  )
+{
+  ParseAcpi (
+    TRUE,
+    2,
+    "RMR Node",
+    Ptr,
+    Length,
+    PARSER_PARAMS (IortNodeRmrParser)
+    );
+
+  if (*IortNodeRevision == 2) {
+    IncrementErrorCount ();
+    Print (
+      L"ERROR: RMR node Rev 2 (defined in IORT Rev E.c) must not be used."
+      L" IORT tabe Revision E.c is deprecated and must not be used.\n"
+      );
+  }
+
+  DumpIortNodeIdMappings (
+    Ptr + MappingOffset,
+    Length - MappingOffset,
+    MappingCount
+    );
+
+  DumpIortNodeRmrMemRangeDesc (
+    Ptr + (*RmrMemDescOffset),
+    Length - (*RmrMemDescOffset),
+    *RmrMemDescCount
+    );
+}
+
 /**
   This function parses the ACPI IORT table.
-  When trace is enabled this function parses the IORT table and traces the ACPI fields.
+  When trace is enabled this function parses the IORT table and traces the ACPI
+  fields.
 
   This function also parses the following nodes:
     - ITS Group
@@ -618,6 +788,7 @@ DumpIortNodePmcg (
     - SMMUv1/2
     - SMMUv3
     - PMCG
+    - RMR
 
   This function also performs validation of the ACPI table fields.
 
@@ -643,6 +814,13 @@ ParseAcpiIort (
     return;
   }
 
+  if (AcpiTableRevision == 4) {
+    IncrementErrorCount ();
+    Print (
+      L"ERROR: IORT tabe Revision E.c is deprecated and must not be used.\n"
+      );
+  }
+
   ParseAcpi (
     TRUE,
     0,
@@ -765,7 +943,14 @@ ParseAcpiIort (
           *IortIdMappingOffset
           );
         break;
-
+      case EFI_ACPI_IORT_TYPE_RMR:
+        DumpIortNodeRmr (
+          NodePtr,
+          *IortNodeLength,
+          *IortIdMappingCount,
+          *IortIdMappingOffset
+          );
+        break;
       default:
         IncrementErrorCount ();
         Print (L"ERROR: Unsupported IORT Node type = %d\n", *IortNodeType);
-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91265): https://edk2.groups.io/g/devel/message/91265
Mute This Topic: https://groups.io/mt/92334076/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v5 6/8] ShellPkg: Acpiview: IORT parser update for IORT Rev E.d spec
Posted by PierreGondois 3 years, 7 months ago
Hi Sami,

> +
>   /**
>     Helper Macro for populating the IORT Node header in the ACPI_PARSER array.
>   
> @@ -108,15 +160,15 @@ ValidateItsIdArrayReference (
>     @param [out] ValidateIdArrayReference  Optional pointer to a function for
>                                            validating the ID Array reference.
>   **/
> -#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount,                   \
> -                               ValidateIdArrayReference)                 \
> -  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL },     \
> -  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, NULL }, \
> -  { L"Revision", 1, 3, L"%d", NULL, NULL, NULL, NULL },                  \
> -  { L"Reserved", 4, 4, L"0x%x", NULL, NULL, NULL, NULL },                \
> -  { L"Number of ID mappings", 4, 8, L"%d", NULL,                         \
> -    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL },         \
> -  { L"Reference to ID Array", 4, 12, L"0x%x", NULL,                      \
> +#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount,                        \
> +                               ValidateIdArrayReference)                      \
> +  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL },          \
> +  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, NULL },      \
> +  { L"Revision", 1, 3, L"%d", NULL, (VOID**)&IortNodeRevision, NULL, NULL },  \
> +  { L"Identifier", 4, 4, L"0x%x", NULL, NULL, NULL, NULL },                   \
> +  { L"Number of ID mappings", 4, 8, L"%d", NULL,                              \
> +    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL },              \
> +  { L"Reference to ID Array", 4, 12, L"0x%x", NULL,                           \
>       (VOID**)&IortIdMappingOffset, ValidateIdArrayReference, NULL }

Sorry to come back on this patch, but it seems the identifier field was
16 bits long in rev E (=1) and increased to 32 bits in rev E.a (=2),
so unfortunately, an extra case should be created for this I believe.

Regards,
Pierre


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91310): https://edk2.groups.io/g/devel/message/91310
Mute This Topic: https://groups.io/mt/92334076/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v5 6/8] ShellPkg: Acpiview: IORT parser update for IORT Rev E.d spec
Posted by PierreGondois 3 years, 7 months ago
Hi Sami,

> +
>   /**
>     Helper Macro for populating the IORT Node header in the ACPI_PARSER array.
>   
> @@ -108,15 +160,15 @@ ValidateItsIdArrayReference (
>     @param [out] ValidateIdArrayReference  Optional pointer to a function for
>                                            validating the ID Array reference.
>   **/
> -#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount,                   \
> -                               ValidateIdArrayReference)                 \
> -  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL },     \
> -  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, NULL }, \
> -  { L"Revision", 1, 3, L"%d", NULL, NULL, NULL, NULL },                  \
> -  { L"Reserved", 4, 4, L"0x%x", NULL, NULL, NULL, NULL },                \
> -  { L"Number of ID mappings", 4, 8, L"%d", NULL,                         \
> -    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL },         \
> -  { L"Reference to ID Array", 4, 12, L"0x%x", NULL,                      \
> +#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount,                        \
> +                               ValidateIdArrayReference)                      \
> +  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL },          \
> +  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, NULL },      \
> +  { L"Revision", 1, 3, L"%d", NULL, (VOID**)&IortNodeRevision, NULL, NULL },  \
> +  { L"Identifier", 4, 4, L"0x%x", NULL, NULL, NULL, NULL },                   \
> +  { L"Number of ID mappings", 4, 8, L"%d", NULL,                              \
> +    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL },              \
> +  { L"Reference to ID Array", 4, 12, L"0x%x", NULL,                           \
>       (VOID**)&IortIdMappingOffset, ValidateIdArrayReference, NULL }
>   
>   /**
> @@ -235,11 +287,13 @@ STATIC CONST ACPI_PARSER  IortNodeNamedComponentParser[] = {
>   **/
>   STATIC CONST ACPI_PARSER  IortNodeRootComplexParser[] = {
>     PARSE_IORT_NODE_HEADER (NULL, NULL),
> -  { L"Memory access properties",8,    16,  L"0x%lx",    NULL,       NULL, NULL, NULL },
> -  { L"ATS Attribute",           4,    24,  L"0x%x",     NULL,       NULL, NULL, NULL },
> -  { L"PCI Segment number",      4,    28,  L"0x%x",     NULL,       NULL, NULL, NULL },
> -  { L"Memory access size limit",1,    32,  L"0x%x",     NULL,       NULL, NULL, NULL },
> -  { L"Reserved",                3,    33,  L"%x %x %x", Dump3Chars, NULL, NULL, NULL }
> +  { L"Memory access properties",8,    16,  L"0x%lx", NULL, NULL, NULL, NULL },
> +  { L"ATS Attribute",           4,    24,  L"0x%x",  NULL, NULL, NULL, NULL },
> +  { L"PCI Segment number",      4,    28,  L"0x%x",  NULL, NULL, NULL, NULL },
> +  { L"Memory access size limit",1,    32,  L"0x%x",  NULL, NULL, NULL, NULL },
> +  { L"PASID capabilities",      2,    33,  L"0x%x",  NULL, NULL, NULL, NULL },
> +  { L"Reserved",                1,    35,  L"%x",    NULL, NULL, NULL, NULL },
> +  { L"Flags",                   4,    36,  L"%x",    NULL, NULL, NULL, NULL },

It seems flags are usually printed as L"0x%x"

>   };
>   
>   /**
> @@ -253,6 +307,29 @@ STATIC CONST ACPI_PARSER  IortNodePmcgParser[] = {
>     { L"Page 1 Base Address",                           8,    32,  L"0x%lx", NULL, NULL, NULL, NULL }
>   };
>   
> +/**
> +  An ACPI_PARSER array describing the IORT RMR node.
> +**/
> +STATIC CONST ACPI_PARSER  IortNodeRmrParser[] = {
> +  PARSE_IORT_NODE_HEADER (NULL, NULL),
> +  { L"Flags",                   4,                      16,  L"0x%x", NULL, NULL, NULL, NULL },
> +  { L"Memory Range Desc count", 4,                      20,  L"%d",   NULL,
> +    (VOID **)&RmrMemDescCount,  ValidateRmrMemDescCount,NULL },
> +  { L"Memory Range Desc Ref",   4,                      24,  L"0x%x", NULL,
> +    (VOID **)&RmrMemDescOffset, NULL,                   NULL }
> +};
> +
> +/**
> +  An ACPI_PARSER array describing the IORT RMR Memory Range Descriptor.
> +**/
> +STATIC CONST ACPI_PARSER  IortNodeRmrMemRangeDescParser[] = {
> +  { L"Physical Range offset", 8, 0,  L"0x%lx", NULL, NULL, ValidatePhysicalRange,
> +    NULL },
> +  { L"Physical Range length", 8, 8,  L"0x%lx", NULL, NULL, ValidatePhysicalRange,
> +    NULL },
> +  { L"Reserved",              4, 16, L"0x%x",  NULL, NULL, NULL,                 NULL}
> +};
> +
>   /**

[snip]

>   /**
>     This function parses the ACPI IORT table.
> -  When trace is enabled this function parses the IORT table and traces the ACPI fields.
> +  When trace is enabled this function parses the IORT table and traces the ACPI
> +  fields.
>   
>     This function also parses the following nodes:
>       - ITS Group
> @@ -618,6 +788,7 @@ DumpIortNodePmcg (
>       - SMMUv1/2
>       - SMMUv3
>       - PMCG
> +    - RMR
>   
>     This function also performs validation of the ACPI table fields.
>   
> @@ -643,6 +814,13 @@ ParseAcpiIort (
>       return;
>     }
>   
> +  if (AcpiTableRevision == 4) {
> +    IncrementErrorCount ();
> +    Print (
> +      L"ERROR: IORT tabe Revision E.c is deprecated and must not be used.\n"
> +      );
> +  }
> +

I think a macro corresponding to rev E.c should be added in MdePkg
so we can identify the deprecated revision easily.
Similar comment for the Rmr revision (=2) which is checked in DumpIortNodeRmr().


>     ParseAcpi (
>       TRUE,
>       0,
> @@ -765,7 +943,14 @@ ParseAcpiIort (
>             *IortIdMappingOffset
>             );
>           break;
> -
> +      case EFI_ACPI_IORT_TYPE_RMR:
> +        DumpIortNodeRmr (
> +          NodePtr,
> +          *IortNodeLength,
> +          *IortIdMappingCount,
> +          *IortIdMappingOffset
> +          );
> +        break;
>         default:
>           IncrementErrorCount ();
>           Print (L"ERROR: Unsupported IORT Node type = %d\n", *IortNodeType);


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91308): https://edk2.groups.io/g/devel/message/91308
Mute This Topic: https://groups.io/mt/92334076/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v5 6/8] ShellPkg: Acpiview: IORT parser update for IORT Rev E.d spec
Posted by Sami Mujawar 3 years, 7 months ago
Hi Pierre,

Thank you for the feedback.

Please find my response inline marked [SAMI].

Regards,

Sami Mujawar

On 13/07/2022 01:10 pm, Pierre Gondois wrote:
> Hi Sami,
>
>> +
>>   /**
>>     Helper Macro for populating the IORT Node header in the 
>> ACPI_PARSER array.
>>   @@ -108,15 +160,15 @@ ValidateItsIdArrayReference (
>>     @param [out] ValidateIdArrayReference  Optional pointer to a 
>> function for
>>                                            validating the ID Array 
>> reference.
>>   **/
>> -#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount, \
>> - ValidateIdArrayReference)                 \
>> -  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL 
>> },     \
>> -  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, 
>> NULL }, \
>> -  { L"Revision", 1, 3, L"%d", NULL, NULL, NULL, NULL 
>> },                  \
>> -  { L"Reserved", 4, 4, L"0x%x", NULL, NULL, NULL, NULL 
>> },                \
>> -  { L"Number of ID mappings", 4, 8, L"%d", 
>> NULL,                         \
>> -    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL 
>> },         \
>> -  { L"Reference to ID Array", 4, 12, L"0x%x", 
>> NULL,                      \
>> +#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount, \
>> + ValidateIdArrayReference)                      \
>> +  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL 
>> },          \
>> +  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, 
>> NULL },      \
>> +  { L"Revision", 1, 3, L"%d", NULL, (VOID**)&IortNodeRevision, NULL, 
>> NULL },  \
>> +  { L"Identifier", 4, 4, L"0x%x", NULL, NULL, NULL, NULL 
>> },                   \
>> +  { L"Number of ID mappings", 4, 8, L"%d", 
>> NULL,                              \
>> +    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL 
>> },              \
>> +  { L"Reference to ID Array", 4, 12, L"0x%x", 
>> NULL,                           \
>>       (VOID**)&IortIdMappingOffset, ValidateIdArrayReference, NULL }
>>     /**
>> @@ -235,11 +287,13 @@ STATIC CONST ACPI_PARSER 
>> IortNodeNamedComponentParser[] = {
>>   **/
>>   STATIC CONST ACPI_PARSER  IortNodeRootComplexParser[] = {
>>     PARSE_IORT_NODE_HEADER (NULL, NULL),
>> -  { L"Memory access properties",8,    16,  L"0x%lx", NULL,       
>> NULL, NULL, NULL },
>> -  { L"ATS Attribute",           4,    24,  L"0x%x", NULL,       
>> NULL, NULL, NULL },
>> -  { L"PCI Segment number",      4,    28,  L"0x%x", NULL,       
>> NULL, NULL, NULL },
>> -  { L"Memory access size limit",1,    32,  L"0x%x", NULL,       
>> NULL, NULL, NULL },
>> -  { L"Reserved",                3,    33,  L"%x %x %x", Dump3Chars, 
>> NULL, NULL, NULL }
>> +  { L"Memory access properties",8,    16,  L"0x%lx", NULL, NULL, 
>> NULL, NULL },
>> +  { L"ATS Attribute",           4,    24,  L"0x%x",  NULL, NULL, 
>> NULL, NULL },
>> +  { L"PCI Segment number",      4,    28,  L"0x%x",  NULL, NULL, 
>> NULL, NULL },
>> +  { L"Memory access size limit",1,    32,  L"0x%x",  NULL, NULL, 
>> NULL, NULL },
>> +  { L"PASID capabilities",      2,    33,  L"0x%x",  NULL, NULL, 
>> NULL, NULL },
>> +  { L"Reserved",                1,    35,  L"%x",    NULL, NULL, 
>> NULL, NULL },
>> +  { L"Flags",                   4,    36,  L"%x",    NULL, NULL, 
>> NULL, NULL },
>
> It seems flags are usually printed as L"0x%x"
[SAMI] Ack.
>
>>   };
>>     /**
>> @@ -253,6 +307,29 @@ STATIC CONST ACPI_PARSER IortNodePmcgParser[] = {
>>     { L"Page 1 Base Address",                           8, 32,  
>> L"0x%lx", NULL, NULL, NULL, NULL }
>>   };
>>   +/**
>> +  An ACPI_PARSER array describing the IORT RMR node.
>> +**/
>> +STATIC CONST ACPI_PARSER  IortNodeRmrParser[] = {
>> +  PARSE_IORT_NODE_HEADER (NULL, NULL),
>> +  { L"Flags",                   4,                      16, L"0x%x", 
>> NULL, NULL, NULL, NULL },
>> +  { L"Memory Range Desc count", 4,                      20, L"%d",   
>> NULL,
>> +    (VOID **)&RmrMemDescCount, ValidateRmrMemDescCount,NULL },
>> +  { L"Memory Range Desc Ref",   4,                      24, L"0x%x", 
>> NULL,
>> +    (VOID **)&RmrMemDescOffset, NULL, NULL }
>> +};
>> +
>> +/**
>> +  An ACPI_PARSER array describing the IORT RMR Memory Range Descriptor.
>> +**/
>> +STATIC CONST ACPI_PARSER  IortNodeRmrMemRangeDescParser[] = {
>> +  { L"Physical Range offset", 8, 0,  L"0x%lx", NULL, NULL, 
>> ValidatePhysicalRange,
>> +    NULL },
>> +  { L"Physical Range length", 8, 8,  L"0x%lx", NULL, NULL, 
>> ValidatePhysicalRange,
>> +    NULL },
>> +  { L"Reserved",              4, 16, L"0x%x",  NULL, NULL, 
>> NULL,                 NULL}
>> +};
>> +
>>   /**
>
> [snip]
>
>>   /**
>>     This function parses the ACPI IORT table.
>> -  When trace is enabled this function parses the IORT table and 
>> traces the ACPI fields.
>> +  When trace is enabled this function parses the IORT table and 
>> traces the ACPI
>> +  fields.
>>       This function also parses the following nodes:
>>       - ITS Group
>> @@ -618,6 +788,7 @@ DumpIortNodePmcg (
>>       - SMMUv1/2
>>       - SMMUv3
>>       - PMCG
>> +    - RMR
>>       This function also performs validation of the ACPI table fields.
>>   @@ -643,6 +814,13 @@ ParseAcpiIort (
>>       return;
>>     }
>>   +  if (AcpiTableRevision == 4) {
>> +    IncrementErrorCount ();
>> +    Print (
>> +      L"ERROR: IORT tabe Revision E.c is deprecated and must not be 
>> used.\n"
>> +      );
>> +  }
>> +
>
> I think a macro corresponding to rev E.c should be added in MdePkg
> so we can identify the deprecated revision easily.
> Similar comment for the Rmr revision (=2) which is checked in 
> DumpIortNodeRmr().
>
[SAMI] Ack.
>
>>     ParseAcpi (
>>       TRUE,
>>       0,
>> @@ -765,7 +943,14 @@ ParseAcpiIort (
>>             *IortIdMappingOffset
>>             );
>>           break;
>> -
>> +      case EFI_ACPI_IORT_TYPE_RMR:
>> +        DumpIortNodeRmr (
>> +          NodePtr,
>> +          *IortNodeLength,
>> +          *IortIdMappingCount,
>> +          *IortIdMappingOffset
>> +          );
>> +        break;
>>         default:
>>           IncrementErrorCount ();
>>           Print (L"ERROR: Unsupported IORT Node type = %d\n", 
>> *IortNodeType);


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91317): https://edk2.groups.io/g/devel/message/91317
Mute This Topic: https://groups.io/mt/92334076/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v5 6/8] ShellPkg: Acpiview: IORT parser update for IORT Rev E.d spec
Posted by Sami Mujawar 3 years, 7 months ago
Hi Pierre,

Thank you for the feedback.

Please find my response inline marked [SAMI]

On 13/07/2022 01:10 pm, Pierre Gondois wrote:
> Hi Sami,
>
>> +
>>   /**
>>     Helper Macro for populating the IORT Node header in the 
>> ACPI_PARSER array.
>>   @@ -108,15 +160,15 @@ ValidateItsIdArrayReference (
>>     @param [out] ValidateIdArrayReference  Optional pointer to a 
>> function for
>>                                            validating the ID Array 
>> reference.
>>   **/
>> -#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount, \
>> - ValidateIdArrayReference)                 \
>> -  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL 
>> },     \
>> -  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, 
>> NULL }, \
>> -  { L"Revision", 1, 3, L"%d", NULL, NULL, NULL, NULL 
>> },                  \
>> -  { L"Reserved", 4, 4, L"0x%x", NULL, NULL, NULL, NULL 
>> },                \
>> -  { L"Number of ID mappings", 4, 8, L"%d", 
>> NULL,                         \
>> -    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL 
>> },         \
>> -  { L"Reference to ID Array", 4, 12, L"0x%x", 
>> NULL,                      \
>> +#define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount, \
>> + ValidateIdArrayReference)                      \
>> +  { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL 
>> },          \
>> +  { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, 
>> NULL },      \
>> +  { L"Revision", 1, 3, L"%d", NULL, (VOID**)&IortNodeRevision, NULL, 
>> NULL },  \
>> +  { L"Identifier", 4, 4, L"0x%x", NULL, NULL, NULL, NULL 
>> },                   \
>> +  { L"Number of ID mappings", 4, 8, L"%d", 
>> NULL,                              \
>> +    (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL 
>> },              \
>> +  { L"Reference to ID Array", 4, 12, L"0x%x", 
>> NULL,                           \
>>       (VOID**)&IortIdMappingOffset, ValidateIdArrayReference, NULL }
>>     /**
>> @@ -235,11 +287,13 @@ STATIC CONST ACPI_PARSER 
>> IortNodeNamedComponentParser[] = {
>>   **/
>>   STATIC CONST ACPI_PARSER  IortNodeRootComplexParser[] = {
>>     PARSE_IORT_NODE_HEADER (NULL, NULL),
>> -  { L"Memory access properties",8,    16,  L"0x%lx", NULL,       
>> NULL, NULL, NULL },
>> -  { L"ATS Attribute",           4,    24,  L"0x%x", NULL,       
>> NULL, NULL, NULL },
>> -  { L"PCI Segment number",      4,    28,  L"0x%x", NULL,       
>> NULL, NULL, NULL },
>> -  { L"Memory access size limit",1,    32,  L"0x%x", NULL,       
>> NULL, NULL, NULL },
>> -  { L"Reserved",                3,    33,  L"%x %x %x", Dump3Chars, 
>> NULL, NULL, NULL }
>> +  { L"Memory access properties",8,    16,  L"0x%lx", NULL, NULL, 
>> NULL, NULL },
>> +  { L"ATS Attribute",           4,    24,  L"0x%x",  NULL, NULL, 
>> NULL, NULL },
>> +  { L"PCI Segment number",      4,    28,  L"0x%x",  NULL, NULL, 
>> NULL, NULL },
>> +  { L"Memory access size limit",1,    32,  L"0x%x",  NULL, NULL, 
>> NULL, NULL },
>> +  { L"PASID capabilities",      2,    33,  L"0x%x",  NULL, NULL, 
>> NULL, NULL },
>> +  { L"Reserved",                1,    35,  L"%x",    NULL, NULL, 
>> NULL, NULL },
>> +  { L"Flags",                   4,    36,  L"%x",    NULL, NULL, 
>> NULL, NULL },
>
> It seems flags are usually printed as L"0x%x"
[SAMI] Ack.
>
>>   };
>>     /**
>> @@ -253,6 +307,29 @@ STATIC CONST ACPI_PARSER IortNodePmcgParser[] = {
>>     { L"Page 1 Base Address",                           8, 32,  
>> L"0x%lx", NULL, NULL, NULL, NULL }
>>   };
>>   +/**
>> +  An ACPI_PARSER array describing the IORT RMR node.
>> +**/
>> +STATIC CONST ACPI_PARSER  IortNodeRmrParser[] = {
>> +  PARSE_IORT_NODE_HEADER (NULL, NULL),
>> +  { L"Flags",                   4,                      16, L"0x%x", 
>> NULL, NULL, NULL, NULL },
>> +  { L"Memory Range Desc count", 4,                      20, L"%d",   
>> NULL,
>> +    (VOID **)&RmrMemDescCount, ValidateRmrMemDescCount,NULL },
>> +  { L"Memory Range Desc Ref",   4,                      24, L"0x%x", 
>> NULL,
>> +    (VOID **)&RmrMemDescOffset, NULL, NULL }
>> +};
>> +
>> +/**
>> +  An ACPI_PARSER array describing the IORT RMR Memory Range Descriptor.
>> +**/
>> +STATIC CONST ACPI_PARSER  IortNodeRmrMemRangeDescParser[] = {
>> +  { L"Physical Range offset", 8, 0,  L"0x%lx", NULL, NULL, 
>> ValidatePhysicalRange,
>> +    NULL },
>> +  { L"Physical Range length", 8, 8,  L"0x%lx", NULL, NULL, 
>> ValidatePhysicalRange,
>> +    NULL },
>> +  { L"Reserved",              4, 16, L"0x%x",  NULL, NULL, 
>> NULL,                 NULL}
>> +};
>> +
>>   /**
>
> [snip]
>
>>   /**
>>     This function parses the ACPI IORT table.
>> -  When trace is enabled this function parses the IORT table and 
>> traces the ACPI fields.
>> +  When trace is enabled this function parses the IORT table and 
>> traces the ACPI
>> +  fields.
>>       This function also parses the following nodes:
>>       - ITS Group
>> @@ -618,6 +788,7 @@ DumpIortNodePmcg (
>>       - SMMUv1/2
>>       - SMMUv3
>>       - PMCG
>> +    - RMR
>>       This function also performs validation of the ACPI table fields.
>>   @@ -643,6 +814,13 @@ ParseAcpiIort (
>>       return;
>>     }
>>   +  if (AcpiTableRevision == 4) {
>> +    IncrementErrorCount ();
>> +    Print (
>> +      L"ERROR: IORT tabe Revision E.c is deprecated and must not be 
>> used.\n"
>> +      );
>> +  }
>> +
>
> I think a macro corresponding to rev E.c should be added in MdePkg
> so we can identify the deprecated revision easily.
> Similar comment for the Rmr revision (=2) which is checked in 
> DumpIortNodeRmr().
>
[SAMI] Ack.
>
>>     ParseAcpi (
>>       TRUE,
>>       0,
>> @@ -765,7 +943,14 @@ ParseAcpiIort (
>>             *IortIdMappingOffset
>>             );
>>           break;
>> -
>> +      case EFI_ACPI_IORT_TYPE_RMR:
>> +        DumpIortNodeRmr (
>> +          NodePtr,
>> +          *IortNodeLength,
>> +          *IortIdMappingCount,
>> +          *IortIdMappingOffset
>> +          );
>> +        break;
>>         default:
>>           IncrementErrorCount ();
>>           Print (L"ERROR: Unsupported IORT Node type = %d\n", 
>> *IortNodeType);


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91316): https://edk2.groups.io/g/devel/message/91316
Mute This Topic: https://groups.io/mt/92334076/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-