public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH 1/2] MdePkg: Support for MPAM ACPI Table
@ 2022-09-20 20:43 Name
  2022-09-20 20:43 ` [PATCH 2/2] DynamicTablesPkg: MPAM: MPAM Generator and supporting files Name
  2022-10-03 13:00 ` [edk2-devel] [PATCH 1/2] MdePkg: Support for MPAM ACPI Table Sami Mujawar
  0 siblings, 2 replies; 4+ messages in thread
From: Name @ 2022-09-20 20:43 UTC (permalink / raw)
  To: devel, Sami.Mujawar, Alexei.Fedorov, michael.d.kinney, gaoliming,
	zhiguang.liu, rohit.mathew
  Cc: Swatisri Kantamsetti

From: Swatisri Kantamsetti <swatisrik@nvidia.com>

Added MPAM table header, MSC and Resource Node
info structures

Signed-off-by: Swatisri Kantamsetti <swatisrik@nvidia.com>
---
 MdePkg/Include/IndustryStandard/Acpi64.h |  5 ++
 MdePkg/Include/IndustryStandard/Mpam.h   | 95 ++++++++++++++++++++++++
 2 files changed, 100 insertions(+)
 create mode 100644 MdePkg/Include/IndustryStandard/Mpam.h

diff --git a/MdePkg/Include/IndustryStandard/Acpi64.h b/MdePkg/Include/IndustryStandard/Acpi64.h
index fe5ebfac2b..e54f631186 100644
--- a/MdePkg/Include/IndustryStandard/Acpi64.h
+++ b/MdePkg/Include/IndustryStandard/Acpi64.h
@@ -2952,6 +2952,11 @@ typedef struct {
 ///
 #define EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE  SIGNATURE_32('P', 'P', 'T', 'T')
 
+///
+/// "MPAM" Memory System Resource Partitioning And Monitoring Table
+///
+#define EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_STRUCTURE_SIGNATURE  SIGNATURE_32('M', 'P', 'A', 'M')
+
 ///
 /// "PSDT" Persistent System Description Table
 ///
diff --git a/MdePkg/Include/IndustryStandard/Mpam.h b/MdePkg/Include/IndustryStandard/Mpam.h
new file mode 100644
index 0000000000..ca750a6e48
--- /dev/null
+++ b/MdePkg/Include/IndustryStandard/Mpam.h
@@ -0,0 +1,95 @@
+/** @file
+  ACPI Memory System Resource Partitioning And Monitoring (MPAM)
+  as specified in ARM spec DEN0065
+
+  Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
+  Copyright (c) 2022, ARM Limited. All rights reserved.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef _MPAM_H_
+#define _MPAM_H_
+
+///
+/// Location Types
+///
+#define EFI_ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE  0x00
+#define EFI_ACPI_MPAM_LOCATION_TYPE_MEMORY           0x01
+#define EFI_ACPI_MPAM_LOCATION_TYPE_SMMU             0x02
+#define EFI_ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE     0x03
+#define EFI_ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE      0x04
+
+///
+/// Interrupt Flags
+///
+#define EFI_ACPI_MPAM_LEVEL_TRIG_INTERRUPT_MODE     0x0
+#define EFI_ACPI_MPAM_EDGE_TRIG_INTERRUPT_MODE      0x1
+#define EFI_ACPI_MPAM_WIRED_INTERRUPT_TYPE          0x0
+#define EFI_ACPI_MPAM_PROC_INTR_AFF_TYPE            0x0
+#define EFI_ACPI_MPAM_PROC_CONTAINER_INTR_AFF_TYPE  0x8
+#define EFI_ACPI_MPAM_AFFINITY_VALID                0x10
+
+#pragma pack(1)
+
+///
+/// Memory System Resource Partitioning and Monitoring Table (MPAM)
+///
+typedef struct {
+  EFI_ACPI_DESCRIPTION_HEADER    Header;
+} EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_HEADER;
+
+///
+/// MPAM Revision (as defined in ACPI 6.4 spec.)
+///
+#define EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_REVISION  0x01
+
+///
+/// Memory System Controller Node Structure
+///
+
+typedef struct {
+  UINT16    Length;
+  UINT16    Reserved;
+  UINT32    Identifier;
+  UINT64    BaseAddress;
+  UINT32    MmioSize;
+  UINT32    OverflowInterrupt;
+  UINT32    OverflowInterruptFlags;
+  UINT32    Reserved1;
+  UINT32    OverflowInterruptAff;
+  UINT32    ErrorInterrupt;
+  UINT32    ErrorInterruptFlags;
+  UINT32    Reserved2;
+  UINT32    ErrorInterruptAff;
+  UINT32    MaxNRdyUsec;
+  UINT64    LinkedDeviceHwId;
+  UINT32    LinkedDeviceInstanceHwId;
+  UINT32    NumResourceNodes;
+} EFI_ACPI_6_4_MPAM_MSC_NODE;
+
+///
+/// Resource Node Structure
+///
+
+typedef struct {
+  UINT32    Identifier;
+  UINT8     RisIndex;
+  UINT16    Reserved1;
+  UINT8     LocatorType;
+  UINT64    Locator1;
+  UINT32    Locator2;
+  UINT32    NumFuncDep;
+} EFI_ACPI_6_4_MPAM_RESOURCE_NODE;
+
+///
+/// Functional Dependency Structure
+///
+
+typedef struct {
+  UINT32    Producer;
+  UINT32    Reserved1;
+} EFI_ACPI_6_4_MPAM_FUNC_DEP_NODE;
+
+#pragma pack()
+
+#endif
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] DynamicTablesPkg: MPAM: MPAM Generator and supporting files
  2022-09-20 20:43 [PATCH 1/2] MdePkg: Support for MPAM ACPI Table Name
@ 2022-09-20 20:43 ` Name
  2022-10-03 13:00 ` [edk2-devel] [PATCH 1/2] MdePkg: Support for MPAM ACPI Table Sami Mujawar
  1 sibling, 0 replies; 4+ messages in thread
From: Name @ 2022-09-20 20:43 UTC (permalink / raw)
  To: devel, Sami.Mujawar, Alexei.Fedorov, michael.d.kinney, gaoliming,
	zhiguang.liu, rohit.mathew
  Cc: Swatisri Kantamsetti

From: Swatisri Kantamsetti <swatisrik@nvidia.com>

ACPI header, MSC, Resource and Functional Nodes are
populated in the MPAM Table

Signed-off-by: Swatisri Kantamsetti <swatisrik@nvidia.com>
---
 DynamicTablesPkg/DynamicTables.dsc.inc        |   2 +
 DynamicTablesPkg/Include/AcpiTableGenerator.h |   1 +
 .../Include/ArmNameSpaceObjects.h             |  81 ++
 .../Arm/AcpiMpamLibArm/AcpiMpamLibArm.inf     |  30 +
 .../Acpi/Arm/AcpiMpamLibArm/MpamGenerator.c   | 741 ++++++++++++++++++
 .../Acpi/Arm/AcpiMpamLibArm/MpamGenerator.h   |  47 ++
 6 files changed, 902 insertions(+)
 create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/AcpiMpamLibArm.inf
 create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/MpamGenerator.c
 create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/MpamGenerator.h

diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc
index 3d4fa0c4c4..745d5f0633 100644
--- a/DynamicTablesPkg/DynamicTables.dsc.inc
+++ b/DynamicTablesPkg/DynamicTables.dsc.inc
@@ -29,6 +29,7 @@
   DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/AcpiIortLibArm.inf
   DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/AcpiMadtLibArm.inf
   DynamicTablesPkg/Library/Acpi/Arm/AcpiMcfgLibArm/AcpiMcfgLibArm.inf
+  DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/AcpiMpamLibArm.inf
   DynamicTablesPkg/Library/Acpi/Arm/AcpiPpttLibArm/AcpiPpttLibArm.inf
   DynamicTablesPkg/Library/Acpi/Arm/AcpiRawLibArm/AcpiRawLibArm.inf
   DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/AcpiSpcrLibArm.inf
@@ -54,6 +55,7 @@
       NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/AcpiMadtLibArm.inf
       NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiMcfgLibArm/AcpiMcfgLibArm.inf
       NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiPpttLibArm/AcpiPpttLibArm.inf
+      NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/AcpiMpamLibArm.inf
       NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiRawLibArm/AcpiRawLibArm.inf
       NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/AcpiSpcrLibArm.inf
       NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiSratLibArm/AcpiSratLibArm.inf
diff --git a/DynamicTablesPkg/Include/AcpiTableGenerator.h b/DynamicTablesPkg/Include/AcpiTableGenerator.h
index f962dbff57..56d7375b4a 100644
--- a/DynamicTablesPkg/Include/AcpiTableGenerator.h
+++ b/DynamicTablesPkg/Include/AcpiTableGenerator.h
@@ -94,6 +94,7 @@ typedef enum StdAcpiTableId {
   EStdAcpiTableIdIort,                          ///< IORT Generator
   EStdAcpiTableIdPptt,                          ///< PPTT Generator
   EStdAcpiTableIdSrat,                          ///< SRAT Generator
+  EStdAcpiTableIdMpam,                          ///< MPAM Generator
   EStdAcpiTableIdSsdtSerialPort,                ///< SSDT Serial-Port Generator
   EStdAcpiTableIdSsdtCmn600,                    ///< SSDT Cmn-600 Generator
   EStdAcpiTableIdSsdtCpuTopology,               ///< SSDT Cpu Topology
diff --git a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
index 102e0f96be..5bceacb05a 100644
--- a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
+++ b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
@@ -63,6 +63,9 @@ typedef enum ArmObjectID {
   EArmObjPciInterruptMapInfo,          ///< 39 - Pci Interrupt Map Info
   EArmObjRmr,                          ///< 40 - Reserved Memory Range Node
   EArmObjMemoryRangeDescriptor,        ///< 41 - Memory Range Descriptor
+  EArmObjMscNodeInfo,                  ///< 40 - Msc Memory System Controller Node Info
+  EArmObjResNodeInfo,                  ///< 41 - Res Resource Node Info
+  EArmObjFuncDepInfo,                  ///< 42 - Func Dep Info
   EArmObjMax
 } EARM_OBJECT_ID;
 
@@ -1070,6 +1073,84 @@ typedef struct CmArmRmrDescriptor {
   UINT64    Length;
 } CM_ARM_MEMORY_RANGE_DESCRIPTOR;
 
+/** A structure that describes Memory System Controller Node.
+
+    MPAM Memory System Component Nodes are described by
+    this object.
+
+  ID: EArmObjMscNodeInfo
+*/
+typedef struct CmArmMscNodeInfo {
+  /// An unique token used to identify this object
+  CM_OBJECT_TOKEN    Token;
+
+  /// Identifier
+  UINT32             Identifier;
+  /// MPAM Base Address
+  UINT64             BaseAddress;
+  /// MMIO Size
+  UINT32             MmioSize;
+  /// Overflow Interrupt
+  UINT32             OverflowInterrupt;
+  /// Overflow Interrupt Flags
+  UINT32             OverflowInterruptFlags;
+  /// Overflow Interrupt Affinity
+  UINT32             OverflowInterruptAff;
+  /// Error Interrupt
+  UINT32             ErrorInterrupt;
+  /// Error Interrupt Flags
+  UINT32             ErrorInterruptFlags;
+  /// Error Interrupt Affinity
+  UINT32             ErrorInterruptAff;
+  /// Not Ready Signal time
+  UINT32             MaxNRdyUsec;
+  /// Linked Device HWID
+  UINT64             LinkedDeviceHwId;
+  /// Linked Device Instance ID
+  UINT32             LinkedDeviceInstanceHwId;
+  /// Number of Resource nodes
+  UINT32             NumResourceNodes;
+} CM_ARM_MSC_NODE_INFO;
+
+/** A structure that describes Resource Node info.
+
+    MPAM Resource Nodes are described by
+    this object.
+
+  ID: EArmObjResNodeInfo
+*/
+typedef struct CmArmResNodeInfo {
+  /// An unique token used to identify this object
+  CM_OBJECT_TOKEN    Token;
+
+  /// Identifier
+  UINT32             Identifier;
+  /// RIS Index
+  UINT8              RisIndex;
+  /// Locator Type
+  UINT8              LocatorType;
+  /// Locator
+  UINT64             Locator1;
+  UINT32             Locator2;
+  /// Num functional dependencies
+  UINT32             NumFuncDep;
+} CM_ARM_RESOURCE_NODE_INFO;
+
+/** A structure that describes Functional Dependencies
+    between MPAM MSC nodes.
+
+    MPAM Functional Dependency descriptors are described by
+    this object.
+
+  ID: EArmObjFuncDepInfo
+*/
+typedef struct CmArmFuncDepInfo {
+  /// An unique token used to identify this object
+  CM_OBJECT_TOKEN    Token;
+  /// Producer
+  UINT32             Producer;
+} CM_ARM_FUNC_DEP_INFO;
+
 #pragma pack()
 
 #endif // ARM_NAMESPACE_OBJECTS_H_
diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/AcpiMpamLibArm.inf b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/AcpiMpamLibArm.inf
new file mode 100644
index 0000000000..480130dc21
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/AcpiMpamLibArm.inf
@@ -0,0 +1,30 @@
+## @file
+#  MPAM Table Generator Inf file
+#
+#  Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
+#  Copyright (c) 2022, ARM Limited. All rights reserved.
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+  INF_VERSION    = 0x0001001B
+  BASE_NAME      = AcpiMpamLibArm
+  FILE_GUID      = 02d0c79f-41cd-45c9-9835-781229c619d1
+  VERSION_STRING = 1.0
+  MODULE_TYPE    = DXE_DRIVER
+  LIBRARY_CLASS  = NULL|DXE_DRIVER
+  CONSTRUCTOR    = AcpiMpamLibConstructor
+  DESTRUCTOR     = AcpiMpamLibDestructor
+
+[Sources]
+  MpamGenerator.c
+  MpamGenerator.h
+
+[Packages]
+  EmbeddedPkg/EmbeddedPkg.dec
+  DynamicTablesPkg/DynamicTablesPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  BaseLib
diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/MpamGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/MpamGenerator.c
new file mode 100644
index 0000000000..eabb44a7c1
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/MpamGenerator.c
@@ -0,0 +1,741 @@
+/** @file
+  MPAM Table Generator
+
+  Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
+  Copyright (c) 2022, ARM Limited. All rights reserved.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - ACPI 6.4 Specification, January 2021
+
+  @par Glossary:
+  - Cm or CM   - Configuration Manager
+  - Obj or OBJ - Object
+**/
+
+#include <IndustryStandard/Mpam.h>
+#include <Library/AcpiLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Protocol/AcpiTable.h>
+
+// Module specific include files.
+#include <AcpiTableGenerator.h>
+#include <ConfigurationManagerObject.h>
+#include <ConfigurationManagerHelper.h>
+#include <Library/TableHelperLib.h>
+#include <Protocol/ConfigurationManagerProtocol.h>
+
+#include "MpamGenerator.h"
+
+/**
+  ARM standard MPAM Generator
+
+  Requirements:
+    The following Configuration Manager Object(s) are used by this Generator:
+    - EArmObjMscNodeInfo (REQUIRED)
+    - EArmObjResNodeInfo
+*/
+
+/**
+  This macro expands to a function that retrieves the MSC Node information
+  from the Configuration Manager.
+*/
+GET_OBJECT_LIST (
+  EObjNameSpaceArm,
+  EArmObjMscNodeInfo,
+  CM_ARM_MSC_NODE_INFO
+  );
+
+/**
+  This macro expands to a function that retrieves the Resource Node
+  information from the Configuration Manager.
+*/
+GET_OBJECT_LIST (
+  EObjNameSpaceArm,
+  EArmObjResNodeInfo,
+  CM_ARM_RESOURCE_NODE_INFO
+  );
+
+/**
+  This macro expands to a function that retrieves the Functional Dependency List
+  information from the Configuration Manager.
+*/
+GET_OBJECT_LIST (
+  EObjNameSpaceArm,
+  EArmObjFuncDepInfo,
+  CM_ARM_FUNC_DEP_INFO
+  );
+
+/**
+  Returns the size of the MPAM Memory System Controller (MSC) Node
+
+  @param [in]  Node     Pointer to MSC Node Info CM object
+
+  @param [in]  Node     Pointer to Resource Node Info CM object
+
+  @param [in]  Node     Pointer to Resource Node List indexer
+
+  @retval               Size of the MSC Node in bytes.
+**/
+STATIC
+UINT64
+GetMscNodeSize (
+  IN  CONST CM_ARM_MSC_NODE_INFO       *MscNode,
+  IN  CONST CM_ARM_RESOURCE_NODE_INFO  *ResourceNodeList,
+  IN        UINT32                     *ResourceNodeIndexer
+  )
+{
+  UINT64  MscNodeSize;
+  UINT8   ResourceNodeCtr;
+
+  ASSERT (MscNode != NULL);
+
+  // <size of Memory System Controller Node>
+  // Size of MSC node is size of header, plus size of all
+  // resource nodes in this MSC node
+  MscNodeSize = sizeof (EFI_ACPI_6_4_MPAM_MSC_NODE);
+
+  if (MscNode->NumResourceNodes > 0) {
+    ASSERT (ResourceNodeList != NULL);
+  }
+
+  // Loop for each Resource node
+  for (ResourceNodeCtr = 0; ResourceNodeCtr < MscNode->NumResourceNodes; ResourceNodeCtr++) {
+    // Add size of Func Dep List if any to the resource node size
+    MscNodeSize += sizeof (EFI_ACPI_6_4_MPAM_RESOURCE_NODE) +
+                   ResourceNodeList[*ResourceNodeIndexer].NumFuncDep * sizeof (EFI_ACPI_6_4_MPAM_FUNC_DEP_NODE);
+    (*ResourceNodeIndexer)++;
+  }
+
+  return MscNodeSize;
+}
+
+/** Returns the total size required for the MSC and
+    updates the Node Indexer.
+
+    This function calculates the size required for the node group
+    and also populates the Node Indexer array with offsets for the
+    individual nodes.
+
+    @param [in]       NodeStartOffset   Offset from the start of the
+                                        MPAM where this node group starts.
+    @param [in]       MscNodeList       Pointer to MSC Group node list.
+    @param [in]       MscNodeCount      Count of the MSC Group nodes.
+    @param [in]       ResourceNodeList  Pointer to MSC Group node list.
+    @param [in]       ResourceNodeCount Count of the MSC Group nodes.
+    @param [in]       FuncDepList       Pointer to Functional Dependency list.
+    @param [in, out]  NodeIndexer       Pointer to the next Node Indexer.
+
+    @retval Total size of the MSC Group Nodes.
+**/
+STATIC
+UINT64
+GetSizeofMscGroupNodes (
+  IN      CONST UINT32                         NodeStartOffset,
+  IN      CONST CM_ARM_MSC_NODE_INFO           *MscNodeList,
+  IN            UINT32                         MscNodeCount,
+  IN      CONST CM_ARM_RESOURCE_NODE_INFO      *ResourceNodeList,
+  IN            UINT32                         ResourceNodeCount,
+  IN      CONST CM_ARM_FUNC_DEP_INFO           *FuncDepList,
+  IN OUT        MPAM_NODE_INDEXER     **CONST  NodeIndexer
+  )
+{
+  UINT64  Size;
+  UINT32  ResourceNodeIndexer;
+  UINT64  MscNodeSize;
+
+  ASSERT (MscNodeList != NULL);
+
+  ResourceNodeIndexer = 0;
+  MscNodeSize         = 0;
+
+  Size = 0;
+  while (MscNodeCount-- != 0) {
+    (*NodeIndexer)->Token  = MscNodeList->Token;
+    (*NodeIndexer)->Object = (VOID *)MscNodeList;
+    (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset);
+    DEBUG ((
+      DEBUG_INFO,
+      "MPAM: MSC Node Indexer = %p, Token = %p, Object = %p, Offset = 0x%x\n",
+      *NodeIndexer,
+      (*NodeIndexer)->Token,
+      (*NodeIndexer)->Object,
+      (*NodeIndexer)->Offset
+      ));
+
+    MscNodeSize = GetMscNodeSize (MscNodeList, ResourceNodeList, &ResourceNodeIndexer);
+    Size       += MscNodeSize;
+
+    (*NodeIndexer)++;
+    MscNodeList++;
+  }
+
+  return Size;
+}
+
+/** Update the MSC Group Node Information.
+
+    @param [in]     This             Pointer to the table Generator.
+    @param [in]     CfgMgrProtocol   Pointer to the Configuration Manager
+                                     Protocol Interface.
+    @param [in]     Mpam             Pointer to MPAM table structure.
+    @param [in]     NodesStartOffset Offset for the start of the Msc Group
+                                     Nodes.
+    @param [in]     MscNodeList      Pointer to an array of Msc Group Node
+                                     Objects.
+    @param [in]     NodeCount        Number of Msc Group Node Objects.
+
+    @param [in]     ResourceNodeList Pointer to an array of Resource Nodes
+
+    @param [in]     FuncDepList      Pointer to the Functional Dep list
+
+    @retval EFI_SUCCESS           Table generated successfully.
+    @retval EFI_INVALID_PARAMETER A parameter is invalid.
+
+**/
+STATIC
+EFI_STATUS
+AddMscNodes (
+  IN      CONST ACPI_TABLE_GENERATOR                                                       *CONST  This,
+  IN      CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL                                       *CONST  CfgMgrProtocol,
+  IN      CONST EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_HEADER           *Mpam,
+  IN      CONST UINT32                                                                             NodesStartOffset,
+  IN      CONST CM_ARM_MSC_NODE_INFO                                                               *MscNodeList,
+  IN            UINT32                                                                             MscNodeCount,
+  IN      CONST CM_ARM_RESOURCE_NODE_INFO                                                          *ResourceNodeList,
+  IN      CONST CM_ARM_FUNC_DEP_INFO                                                               *FuncDepList
+  )
+{
+  EFI_STATUS                       Status;
+  EFI_ACPI_6_4_MPAM_MSC_NODE       *MscNode;
+  EFI_ACPI_6_4_MPAM_RESOURCE_NODE  *ResourceNodeArray;
+  EFI_ACPI_6_4_MPAM_FUNC_DEP_NODE  *FuncDepArray;
+
+  UINT64  NodeLength;
+  UINT32  NumResNodesInMsc;
+  UINT32  ResourceNodeIndexer;
+  UINT32  NumFuncDepInRes;
+
+  ASSERT (Mpam != NULL);
+  ResourceNodeIndexer = 0;
+
+  MscNode = (EFI_ACPI_6_4_MPAM_MSC_NODE *)((UINT8 *)Mpam + NodesStartOffset);
+
+  while (MscNodeCount-- != 0) {
+    NodeLength = GetMscNodeSize (MscNodeList, ResourceNodeList, &ResourceNodeIndexer);
+
+    if (NodeLength > MAX_UINT16) {
+      Status = EFI_INVALID_PARAMETER;
+      DEBUG ((
+        DEBUG_ERROR,
+        "ERROR: MPAM: MSC Node length 0x%lx > MAX_UINT16. Status = %r\n",
+        NodeLength,
+        Status
+        ));
+      return Status;
+    }
+
+    // Populate the node header
+    MscNode->Length                   = (UINT16)NodeLength;
+    MscNode->Reserved                 = EFI_ACPI_RESERVED_WORD;
+    MscNode->Identifier               = MscNodeList->Identifier;
+    MscNode->BaseAddress              = MscNodeList->BaseAddress;
+    MscNode->MmioSize                 = MscNodeList->MmioSize;
+    MscNode->OverflowInterrupt        = MscNodeList->OverflowInterrupt;
+    MscNode->OverflowInterruptFlags   = MscNodeList->OverflowInterruptFlags;
+    MscNode->Reserved1                = EFI_ACPI_RESERVED_DWORD;
+    MscNode->OverflowInterruptAff     = MscNodeList->OverflowInterruptAff;
+    MscNode->ErrorInterrupt           = MscNodeList->ErrorInterrupt;
+    MscNode->ErrorInterruptFlags      = MscNodeList->ErrorInterruptFlags;
+    MscNode->Reserved2                = EFI_ACPI_RESERVED_DWORD;
+    MscNode->ErrorInterruptAff        = MscNodeList->ErrorInterruptAff;
+    MscNode->MaxNRdyUsec              = MscNodeList->MaxNRdyUsec;
+    MscNode->LinkedDeviceHwId         = MscNodeList->LinkedDeviceHwId;
+    MscNode->LinkedDeviceInstanceHwId = MscNodeList->LinkedDeviceInstanceHwId;
+    MscNode->NumResourceNodes         = MscNodeList->NumResourceNodes;
+
+    // ResourceNode List for each MSC
+    if (MscNode->NumResourceNodes > 0) {
+      NumResNodesInMsc = MscNode->NumResourceNodes;
+
+      // Resource Node array for this Msc node
+      ResourceNodeArray = (EFI_ACPI_6_4_MPAM_RESOURCE_NODE *)((UINT8 *)MscNode + sizeof (EFI_ACPI_6_4_MPAM_MSC_NODE));
+
+      // Adding Resource Node content
+      while (NumResNodesInMsc-- != 0) {
+        ResourceNodeArray->Identifier  = ResourceNodeList->Identifier;
+        ResourceNodeArray->RisIndex    = ResourceNodeList->RisIndex;
+        ResourceNodeArray->Reserved1   = EFI_ACPI_RESERVED_WORD;
+        ResourceNodeArray->LocatorType = ResourceNodeList->LocatorType;
+        ResourceNodeArray->Locator1    = ResourceNodeList->Locator1;
+        ResourceNodeArray->Locator2    = ResourceNodeList->Locator2;
+        ResourceNodeArray->NumFuncDep  = ResourceNodeList->NumFuncDep;
+
+        if (ResourceNodeArray->NumFuncDep > 0) {
+          ASSERT (FuncDepList != NULL);
+        }
+
+        // Functional Dependencies for each Resource Node
+        NumFuncDepInRes = ResourceNodeArray->NumFuncDep;
+        FuncDepArray    = (EFI_ACPI_6_4_MPAM_FUNC_DEP_NODE *)((UINT8 *)ResourceNodeArray + sizeof (EFI_ACPI_6_4_MPAM_RESOURCE_NODE));
+
+        // Adding the Func Dep List content
+        while (NumFuncDepInRes-- != 0) {
+          FuncDepArray->Producer  = FuncDepList->Producer;
+          FuncDepArray->Reserved1 = EFI_ACPI_RESERVED_DWORD;
+
+          FuncDepList++;
+          FuncDepArray++;
+        }
+
+        // Next Resource Node entry
+        ResourceNodeArray = (EFI_ACPI_6_4_MPAM_RESOURCE_NODE *)((UINT8 *)ResourceNodeArray +
+                                                                sizeof (EFI_ACPI_6_4_MPAM_RESOURCE_NODE) +
+                                                                ResourceNodeArray->NumFuncDep * sizeof (EFI_ACPI_6_4_MPAM_FUNC_DEP_NODE));
+        ResourceNodeList++;
+        // Reset the ResourceNodeIndexer when ResourceNodeList is advanced
+        ResourceNodeIndexer = 0;
+      }
+    }
+
+    // Next MSC Node
+    MscNode = (EFI_ACPI_6_4_MPAM_MSC_NODE *)((UINT8 *)MscNode + MscNode->Length);
+    MscNodeList++;
+  } // Msc Node
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Construct the MPAM ACPI table.
+
+  This function invokes the Configuration Manager protocol interface
+  to get the required hardware information for generating the ACPI
+  table.
+
+  If this function allocates any resources then they must be freed
+  in the FreeXXXXTableResources function.
+
+  @param [in]  This                 Pointer to the table generator.
+  @param [in]  AcpiTableInfo        Pointer to the ACPI table generator to be used.
+  @param [in]  CfgMgrProtocol       Pointer to the Configuration Manager
+                                    Protocol Interface.
+  @param [out] Table                Pointer to the constructed ACPI Table.
+
+  @retval EFI_SUCCESS               Table generated successfully.
+  @retval EFI_INVALID_PARAMETER     A parameter is invalid.
+  @retval EFI_NOT_FOUND             The required object was not found.
+  @retval EFI_BAD_BUFFER_SIZE       The size returned by the Configuration
+                                    Manager is less than the Object size for
+                                    the requested object.
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+BuildMpamTable (
+  IN  CONST ACPI_TABLE_GENERATOR                  *CONST  This,
+  IN  CONST CM_STD_OBJ_ACPI_TABLE_INFO            *CONST  AcpiTableInfo,
+  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
+  OUT       EFI_ACPI_DESCRIPTION_HEADER          **CONST  Table
+  )
+{
+  EFI_STATUS  Status;
+  UINT64      TableSize;
+  UINT64      NodeSize;
+  UINT32      MpamNodeCount;
+
+  UINT32  MscNodeCount;
+  UINT32  MscNodeOffset;
+  UINT32  ResourceNodeCount;
+  UINT32  FuncDepCount;
+
+  EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_HEADER  *Mpam;
+  ACPI_MPAM_GENERATOR                                                       *Generator;
+  CM_ARM_MSC_NODE_INFO                                                      *MscNodeList;
+  CM_ARM_RESOURCE_NODE_INFO                                                 *ResourceNodeList;
+  CM_ARM_FUNC_DEP_INFO                                                      *FuncDepList;
+  MPAM_NODE_INDEXER                                                         *NodeIndexer;
+
+  ASSERT (
+    (This != NULL) &&
+    (AcpiTableInfo != NULL) &&
+    (CfgMgrProtocol != NULL) &&
+    (Table != NULL) &&
+    (AcpiTableInfo->TableGeneratorId == This->GeneratorID) &&
+    (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature)
+    );
+
+  DEBUG ((
+    DEBUG_INFO,
+    "DEBUG PRINT: MPAM: Requested table revision = %d\n",
+    AcpiTableInfo->AcpiTableRevision
+    ));
+
+  if ((AcpiTableInfo->AcpiTableRevision < This->MinAcpiTableRevision) ||
+      (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision))
+  {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: MPAM: Requested table revision = %d is not supported. "
+      "Supported table revisions: Minimum = %d. Maximum = %d\n",
+      AcpiTableInfo->AcpiTableRevision,
+      This->MinAcpiTableRevision,
+      This->AcpiTableRevision
+      ));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Generator = (ACPI_MPAM_GENERATOR *)This;
+  *Table    = NULL;
+
+  // Get the Memory System Controller Node info to update the MPAM table
+  Status = GetEArmObjMscNodeInfo (
+             CfgMgrProtocol,
+             CM_NULL_TOKEN,
+             &MscNodeList,
+             &MscNodeCount
+             );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: MPAM: Failed to get memory system controller node info. Status = %r\n",
+      Status
+      ));
+    goto error_handler;
+  }
+
+  MpamNodeCount           = MscNodeCount;
+  Generator->MscNodeCount = MscNodeCount;
+
+  // Get the Resource Node info to update the MPAM MSC node
+  Status = GetEArmObjResNodeInfo (
+             CfgMgrProtocol,
+             CM_NULL_TOKEN,
+             &ResourceNodeList,
+             &ResourceNodeCount
+             );
+  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: MPAM: Failed to get resource nodes info. Status = %r\n",
+      Status
+      ));
+    goto error_handler;
+  }
+
+  // Get the Functional Dependency List info to update the Resource node
+  Status = GetEArmObjFuncDepInfo (
+             CfgMgrProtocol,
+             CM_NULL_TOKEN,
+             &FuncDepList,
+             &FuncDepCount
+             );
+  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: MPAM: Failed to get functional dependecies info. Status = %r\n",
+      Status
+      ));
+    goto error_handler;
+  }
+
+  // Allocate Node Indexer array
+  NodeIndexer = (MPAM_NODE_INDEXER *)AllocateZeroPool (
+                                       sizeof (MPAM_NODE_INDEXER) *
+                                       MpamNodeCount
+                                       );
+  if (NodeIndexer == NULL) {
+    Status = EFI_OUT_OF_RESOURCES;
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: MPAM: Failed to allocate memory for Node Indexer. Status = %r\n ",
+      Status
+      ));
+    goto error_handler;
+  }
+
+  DEBUG ((DEBUG_INFO, "MPAM INFO: NodeIndexer = %p\n", NodeIndexer));
+  Generator->MpamNodeCount = MpamNodeCount;
+  Generator->NodeIndexer   = NodeIndexer;
+
+  // Calculate the size of the MPAM table
+  TableSize = sizeof (EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_HEADER);
+
+  // Include the size of MSC Nodes and index them
+  if (Generator->MscNodeCount != 0) {
+    MscNodeOffset = TableSize;
+    // Size of MSC nodes.
+    NodeSize = GetSizeofMscGroupNodes (
+                 MscNodeOffset,
+                 MscNodeList,
+                 Generator->MscNodeCount,
+                 ResourceNodeList,
+                 ResourceNodeCount,
+                 FuncDepList,
+                 &NodeIndexer
+                 );
+    if (NodeSize > MAX_UINT32) {
+      Status = EFI_INVALID_PARAMETER;
+      DEBUG ((
+        DEBUG_ERROR,
+        "ERROR: MPAM: Invalid Size of Group Nodes. Status = %r\n",
+        Status
+        ));
+      goto error_handler;
+    }
+
+    TableSize += NodeSize;
+
+    DEBUG ((
+      DEBUG_INFO,
+      " MscNodeCount = %d\n" \
+      " MscNodeOffset = 0x%x\n",
+      Generator->MscNodeCount,
+      MscNodeOffset
+      ));
+  }
+
+  DEBUG ((
+    DEBUG_INFO,
+    "INFO: MPAM:\n" \
+    " MpamNodeCount = %d\n" \
+    " TableSize = 0x%X\n",
+    MpamNodeCount,
+    TableSize
+    ));
+
+  if (TableSize > MAX_UINT32) {
+    Status = EFI_INVALID_PARAMETER;
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: MPAM: MPAM Table Size 0x%lx > MAX_UINT32," \
+      " Status = %r\n",
+      TableSize,
+      Status
+      ));
+    goto error_handler;
+  }
+
+  // Allocate the Buffer for the MPAM table
+  *Table = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize);
+  if (*Table == NULL) {
+    Status = EFI_OUT_OF_RESOURCES;
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: MPAM: Failed to allocate memory for MPAM Table. " \
+      "Size = %d. Status = %r\n",
+      TableSize,
+      Status
+      ));
+    goto error_handler;
+  }
+
+  Mpam = (EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_HEADER *)*Table;
+
+  DEBUG ((
+    DEBUG_INFO,
+    "MPAM: Mpam = 0x%p. TableSize = 0x%x\n",
+    Mpam,
+    TableSize
+    ));
+
+  // Add ACPI header
+  Status = AddAcpiHeader (
+             CfgMgrProtocol,
+             This,
+             &Mpam->Header,
+             AcpiTableInfo,
+             TableSize
+             );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: MPAM: Failed to add ACPI header. Status = %r\n",
+      Status
+      ));
+    goto error_handler;
+  }
+
+  // Add MSC Nodes to the generated table
+  if (MscNodeCount != 0) {
+    Status = AddMscNodes (
+               This,
+               CfgMgrProtocol,
+               Mpam,
+               MscNodeOffset,
+               MscNodeList,
+               MscNodeCount,
+               ResourceNodeList,
+               FuncDepList
+               );
+    if (EFI_ERROR (Status)) {
+      DEBUG ((
+        DEBUG_ERROR,
+        "ERROR: MPAM: Failed to add MSC Nodes. Status = %r\n",
+        Status
+        ));
+      goto error_handler;
+    }
+  }
+
+  return Status;
+
+error_handler:
+  if (Generator->NodeIndexer != NULL) {
+    FreePool (Generator->NodeIndexer);
+    Generator->NodeIndexer = NULL;
+  }
+
+  if (*Table != NULL) {
+    FreePool (*Table);
+    *Table = NULL;
+  }
+
+  return Status;
+}
+
+/** Free any resources allocated for constructing the MPAM Table
+
+  @param [in]      This           Pointer to the table generator.
+  @param [in]      AcpiTableInfo  Pointer to the ACPI Table Info.
+  @param [in]      CfgMgrProtocol Pointer to the Configuration Manager
+                                  Protocol Interface.
+  @param [in, out] Table          Pointer to the ACPI Table.
+
+  @retval EFI_SUCCESS           The resources were freed successfully.
+  @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid.
+**/
+STATIC
+EFI_STATUS
+FreeMpamTableResources (
+  IN      CONST ACPI_TABLE_GENERATOR                  *CONST  This,
+  IN      CONST CM_STD_OBJ_ACPI_TABLE_INFO            *CONST  AcpiTableInfo,
+  IN      CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
+  IN OUT        EFI_ACPI_DESCRIPTION_HEADER          **CONST  Table
+  )
+{
+  ACPI_MPAM_GENERATOR  *Generator;
+
+  ASSERT (This != NULL);
+  ASSERT (AcpiTableInfo != NULL);
+  ASSERT (CfgMgrProtocol != NULL);
+  ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID);
+  ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);
+
+  Generator = (ACPI_MPAM_GENERATOR *)This;
+
+  // Free any memory allocated by the generator
+  if (Generator->NodeIndexer != NULL) {
+    FreePool (Generator->NodeIndexer);
+    Generator->NodeIndexer = NULL;
+  }
+
+  if ((Table == NULL) || (*Table == NULL)) {
+    DEBUG ((DEBUG_ERROR, "ERROR: MPAM: Invalid Table Pointer\n"));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  FreePool (*Table);
+  *Table = NULL;
+
+  return EFI_SUCCESS;
+}
+
+/** The MPAM Table Generator revision.
+*/
+#define MPAM_GENERATOR_REVISION  CREATE_REVISION (1, 0)
+
+/** The interface for the MPAM Table Generator.
+*/
+STATIC
+ACPI_MPAM_GENERATOR  MpamGenerator = {
+  // ACPI table generator header
+  {
+    // Generator ID
+    CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMpam),
+    // Generator Description
+    L"ACPI.STD.MPAM.GENERATOR",
+    // ACPI Table Signature
+    EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_STRUCTURE_SIGNATURE,
+    // ACPI Table Revision supported by this Generator
+    EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_REVISION,
+    // Minimum supported ACPI Table Revision
+    EFI_ACPI_6_4_MEMORY_SYSTEM_RESOURCE_PARTITIONING_MONITORING_TABLE_REVISION,
+    // Creator ID
+    TABLE_GENERATOR_CREATOR_ID_ARM,
+    // Creator Revision
+    MPAM_GENERATOR_REVISION,
+    // Build Table function
+    BuildMpamTable,
+    // Free Resource function
+    FreeMpamTableResources,
+    // Extended build function not needed
+    NULL,
+    // Extended build function not implemented by the generator.
+    // Hence extended free resource function is not required.
+    NULL
+  },
+
+  // MPAM Generator private data
+
+  // MPAM node count
+  0,
+  // MSC node count
+  0,
+
+  // Pointer to MPAM Node Indexer
+  NULL
+};
+
+/**
+  Register the Generator with the ACPI Table Factory.
+
+  @param [in]  ImageHandle        The handle to the image.
+  @param [in]  SystemTable        Pointer to the System Table.
+
+  @retval EFI_SUCCESS             The Generator is registered.
+  @retval EFI_INVALID_PARAMETER   A parameter is invalid.
+  @retval EFI_ALREADY_STARTED     The Generator for the Table ID
+                                  is already registered.
+**/
+EFI_STATUS
+EFIAPI
+AcpiMpamLibConstructor (
+  IN  EFI_HANDLE        ImageHandle,
+  IN  EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = RegisterAcpiTableGenerator (&MpamGenerator.Header);
+  DEBUG ((DEBUG_INFO, "MPAM: Register Generator. Status = %r\n", Status));
+  ASSERT_EFI_ERROR (Status);
+  return Status;
+}
+
+/**
+  Deregister the Generator from the ACPI Table Factory.
+
+  @param [in]  ImageHandle        The handle to the image.
+  @param [in]  SystemTable        Pointer to the System Table.
+
+  @retval EFI_SUCCESS             The Generator is deregistered.
+  @retval EFI_INVALID_PARAMETER   A parameter is invalid.
+  @retval EFI_NOT_FOUND           The Generator is not registered.
+**/
+EFI_STATUS
+EFIAPI
+AcpiMpamLibDestructor (
+  IN  EFI_HANDLE        ImageHandle,
+  IN  EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = DeregisterAcpiTableGenerator (&MpamGenerator.Header);
+  DEBUG ((DEBUG_INFO, "MPAM: Deregister Generator. Status = %r\n", Status));
+  ASSERT_EFI_ERROR (Status);
+  return Status;
+}
diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/MpamGenerator.h b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/MpamGenerator.h
new file mode 100644
index 0000000000..1075bd8c6c
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMpamLibArm/MpamGenerator.h
@@ -0,0 +1,47 @@
+/** @file
+  Header file for the dynamic MPAM generator
+
+  Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
+  Copyright (c) 2022, ARM Limited. All rights reserved.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - ACPI 6.4 Specification, January 2021
+  - ARM Architecture Reference Manual ARMv8
+
+  @par Glossary:
+    - Cm or CM   - Configuration Manager
+    - Obj or OBJ - Object
+**/
+
+#ifndef MPAM_GENERATOR_H_
+#define MPAM_GENERATOR_H_
+
+#pragma pack(1)
+
+/** A structure that describes the Node indexer
+    used for indexing the MPAM MSC nodes.
+*/
+typedef struct MpamNodeIndexer {
+  /// Index token for the Node
+  CM_OBJECT_TOKEN    Token;
+  /// Pointer to the node
+  VOID               *Object;
+  /// Node offset from the start of the MPAM table
+  UINT32             Offset;
+} MPAM_NODE_INDEXER;
+
+typedef struct AcpiMpamGenerator {
+  /// ACPI Table generator header
+  ACPI_TABLE_GENERATOR    Header;
+  /// MPAM structure count
+  UINT32                  MpamNodeCount;
+  /// Count of Msc Nodes
+  UINT32                  MscNodeCount;
+  /// List of indexed CM objects for MPAM generation
+  MPAM_NODE_INDEXER       *NodeIndexer;
+} ACPI_MPAM_GENERATOR;
+
+#pragma pack()
+
+#endif // MPAM_GENERATOR_H_
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [edk2-devel] [PATCH 1/2] MdePkg: Support for MPAM ACPI Table
  2022-09-20 20:43 [PATCH 1/2] MdePkg: Support for MPAM ACPI Table Name
  2022-09-20 20:43 ` [PATCH 2/2] DynamicTablesPkg: MPAM: MPAM Generator and supporting files Name
@ 2022-10-03 13:00 ` Sami Mujawar
  2023-01-16 15:46   ` Rohit Mathew
  1 sibling, 1 reply; 4+ messages in thread
From: Sami Mujawar @ 2022-10-03 13:00 UTC (permalink / raw)
  To: Name, devel

[-- Attachment #1: Type: text/plain, Size: 258 bytes --]

Hi Swatisri,

Rohit pointed me to this patch series, which I believe is v2. I happened to have missed this as the subject line was not clear.
However, I believe my feedback (or some parts) for the v1 series would still apply.

Regards,

Sami Mujawar

[-- Attachment #2: Type: text/html, Size: 287 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [edk2-devel] [PATCH 1/2] MdePkg: Support for MPAM ACPI Table
  2022-10-03 13:00 ` [edk2-devel] [PATCH 1/2] MdePkg: Support for MPAM ACPI Table Sami Mujawar
@ 2023-01-16 15:46   ` Rohit Mathew
  0 siblings, 0 replies; 4+ messages in thread
From: Rohit Mathew @ 2023-01-16 15:46 UTC (permalink / raw)
  To: devel@edk2.groups.io, Swatisri Kantamsetti
  Cc: nd, Thomas Abraham, Sami Mujawar

[-- Attachment #1: Type: text/plain, Size: 720 bytes --]

Hi Swatisri,

Just wanted to check if you would still be interested in posting MPAM ACPI 2.0 header? If you are caught up with something else, I could try to post a patch for the same.

Regards,
Rohit

From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Sami Mujawar via groups.io
Sent: 03 October 2022 14:01
To: Name <username@nvidia.com>; devel@edk2.groups.io
Subject: Re: [edk2-devel] [PATCH 1/2] MdePkg: Support for MPAM ACPI Table

Hi Swatisri,

Rohit pointed me to this patch series, which I believe is v2. I happened to have missed this as the subject line was not clear.
However, I believe my feedback (or some parts) for the v1 series would still apply.

Regards,

Sami Mujawar


[-- Attachment #2: Type: text/html, Size: 3157 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-01-16 15:46 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-09-20 20:43 [PATCH 1/2] MdePkg: Support for MPAM ACPI Table Name
2022-09-20 20:43 ` [PATCH 2/2] DynamicTablesPkg: MPAM: MPAM Generator and supporting files Name
2022-10-03 13:00 ` [edk2-devel] [PATCH 1/2] MdePkg: Support for MPAM ACPI Table Sami Mujawar
2023-01-16 15:46   ` Rohit Mathew

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox