summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Moore <Robert.Moore@intel.com>2022-03-25 09:20:39 -0700
committerGitHub <noreply@github.com>2022-03-25 09:20:39 -0700
commitc7b6dd94b19ec1fcc4d6eba156a283ab414a39b2 (patch)
treea52abce8eb432ed3093772e3a95aede538aa49a6
parent504d69a9f353f68b00e82f6583ffaa2e0181815a (diff)
parent002165ecc0a3dc703bb24c789aaa02fdada01675 (diff)
downloadacpica-c7b6dd94b19ec1fcc4d6eba156a283ab414a39b2.tar.gz
Merge pull request #758 from bwicaksononv/apmt
Add support for ARM Performance Monitoring Unit Table.
-rw-r--r--source/common/dmtable.c1
-rw-r--r--source/common/dmtbdump1.c62
-rw-r--r--source/common/dmtbinfo2.c34
-rw-r--r--source/compiler/dtcompiler.h5
-rw-r--r--source/compiler/dttable1.c96
-rw-r--r--source/compiler/dttemplate.h23
-rw-r--r--source/include/acdisasm.h5
-rw-r--r--source/include/actbinfo.h2
-rw-r--r--source/include/actbl2.h81
9 files changed, 309 insertions, 0 deletions
diff --git a/source/common/dmtable.c b/source/common/dmtable.c
index 548cd649a..1497a2e96 100644
--- a/source/common/dmtable.c
+++ b/source/common/dmtable.c
@@ -651,6 +651,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] =
{
{ACPI_SIG_AEST, NULL, AcpiDmDumpAest, DtCompileAest, TemplateAest},
{ACPI_SIG_AGDI, AcpiDmTableInfoAgdi, NULL, NULL, TemplateAgdi},
+ {ACPI_SIG_APMT, NULL, AcpiDmDumpApmt, DtCompileApmt, TemplateApmt},
{ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf},
{ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat},
{ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert},
diff --git a/source/common/dmtbdump1.c b/source/common/dmtbdump1.c
index c5b5a2f07..4b659750b 100644
--- a/source/common/dmtbdump1.c
+++ b/source/common/dmtbdump1.c
@@ -376,6 +376,68 @@ AcpiDmDumpAest (
}
}
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpApmt
+ *
+ * PARAMETERS: Table - A APMT table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a APMT. This table type consists
+ * of an open-ended number of subtables.
+ *
+ *
+ * APMT - ARM Performance Monitoring Unit table. Conforms to:
+ * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
+ * ARM DEN0117 v1.0 November 25, 2021
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpApmt (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_STATUS Status;
+ ACPI_APMT_NODE *Subtable;
+ UINT32 Length = Table->Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_APMT);
+ UINT32 NodeNum = 0;
+
+ /* There is no main table (other than the standard ACPI header) */
+
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Table, Offset);
+ while (Offset < Table->Length)
+ {
+ AcpiOsPrintf ("\n");
+
+ if (Subtable->Type >= ACPI_APMT_NODE_TYPE_COUNT)
+ {
+ AcpiOsPrintf ("\n**** Unknown APMT subtable type 0x%X\n",
+ Subtable->Type);
+ return;
+ }
+
+ AcpiOsPrintf ("/* APMT Node-%u */\n", NodeNum++);
+
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ Subtable->Length, AcpiDmTableInfoApmtNode);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ /* Point to next subtable */
+
+ Offset += Subtable->Length;
+ Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Subtable,
+ Subtable->Length);
+ AcpiOsPrintf ("\n");
+ }
+}
+
/*******************************************************************************
*
diff --git a/source/common/dmtbinfo2.c b/source/common/dmtbinfo2.c
index d52359c58..cdd15c984 100644
--- a/source/common/dmtbinfo2.c
+++ b/source/common/dmtbinfo2.c
@@ -210,6 +210,40 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoAgdi[] =
/*******************************************************************************
*
+ * APMT - ARM Performance Monitoring Unit Table
+ *
+ * Conforms to:
+ * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
+ * ARM DEN0117 v1.0 November 25, 2021
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoApmtNode[] =
+{
+ {ACPI_DMT_UINT16, ACPI_APMTN_OFFSET (Length), "Length of APMT Node", 0},
+ {ACPI_DMT_UINT8, ACPI_APMTN_OFFSET (Flags), "Node Flags", 0},
+ {ACPI_DMT_FLAG0, ACPI_APMTN_FLAG_OFFSET (Flags, 0), "Dual Page Extension", 0},
+ {ACPI_DMT_FLAG1, ACPI_APMTN_FLAG_OFFSET (Flags, 0), "Processor Affinity Type", 0},
+ {ACPI_DMT_FLAG2, ACPI_APMTN_FLAG_OFFSET (Flags, 0), "64-bit Atomic Support", 0},
+ {ACPI_DMT_UINT8, ACPI_APMTN_OFFSET (Type), "Node Type", 0},
+ {ACPI_DMT_UINT32, ACPI_APMTN_OFFSET (Id), "Unique Node Identifier", 0},
+ {ACPI_DMT_UINT64, ACPI_APMTN_OFFSET (InstPrimary), "Primary Node Instance", 0},
+ {ACPI_DMT_UINT32, ACPI_APMTN_OFFSET (InstSecondary), "Secondary Node Instance", 0},
+ {ACPI_DMT_UINT64, ACPI_APMTN_OFFSET (BaseAddress0), "Page 0 Base Address", 0},
+ {ACPI_DMT_UINT64, ACPI_APMTN_OFFSET (BaseAddress1), "Page 1 Base Address", 0},
+ {ACPI_DMT_UINT32, ACPI_APMTN_OFFSET (OvflwIrq), "Overflow Interrupt ID", 0},
+ {ACPI_DMT_UINT32, ACPI_APMTN_OFFSET (Reserved), "Reserved", 0},
+ {ACPI_DMT_UINT32, ACPI_APMTN_OFFSET (OvflwIrqFlags), "Overflow Interrupt Flags", 0},
+ {ACPI_DMT_FLAG0, ACPI_APMTN_FLAG_OFFSET (OvflwIrqFlags, 0), "Interrupt Mode", 0},
+ {ACPI_DMT_FLAG1, ACPI_APMTN_FLAG_OFFSET (OvflwIrqFlags, 0), "Interrupt Type", 0},
+ {ACPI_DMT_UINT32, ACPI_APMTN_OFFSET (ProcAffinity), "Processor Affinity", 0},
+ {ACPI_DMT_UINT32, ACPI_APMTN_OFFSET (ImplId), "Implementation ID", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+
+/*******************************************************************************
+ *
* IORT - IO Remapping Table
*
******************************************************************************/
diff --git a/source/compiler/dtcompiler.h b/source/compiler/dtcompiler.h
index 7dad85e80..3b3683cc6 100644
--- a/source/compiler/dtcompiler.h
+++ b/source/compiler/dtcompiler.h
@@ -570,6 +570,10 @@ DtCompileAest (
void **PFieldList);
ACPI_STATUS
+DtCompileApmt (
+ void **PFieldList);
+
+ACPI_STATUS
DtCompileAsf (
void **PFieldList);
@@ -763,6 +767,7 @@ DtGetGenericTableInfo (
extern const unsigned char TemplateAest[];
extern const unsigned char TemplateAgdi[];
+extern const unsigned char TemplateApmt[];
extern const unsigned char TemplateAsf[];
extern const unsigned char TemplateBoot[];
extern const unsigned char TemplateBdat[];
diff --git a/source/compiler/dttable1.c b/source/compiler/dttable1.c
index 66348535e..1df24d49f 100644
--- a/source/compiler/dttable1.c
+++ b/source/compiler/dttable1.c
@@ -389,6 +389,102 @@ DtCompileAest (
/******************************************************************************
*
+ * FUNCTION: DtCompileApmt
+ *
+ * PARAMETERS: List - Current field list pointer
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Compile APMT.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompileApmt (
+ void **List)
+{
+ ACPI_STATUS Status;
+ ACPI_TABLE_HEADER *Header;
+ ACPI_APMT_NODE *ApmtNode;
+ ACPI_APMT_NODE *PeerApmtNode;
+ DT_SUBTABLE *Subtable;
+ DT_SUBTABLE *PeerSubtable;
+ DT_SUBTABLE *ParentTable;
+ DT_FIELD **PFieldList = (DT_FIELD**)List;
+ DT_FIELD *SubtableStart;
+ UINT32 CurLength;
+ char MsgBuffer[64] = "";
+
+ ParentTable = DtPeekSubtable();
+
+ Header = ACPI_CAST_PTR(ACPI_TABLE_HEADER, ParentTable->Buffer);
+
+ CurLength = sizeof(ACPI_TABLE_HEADER);
+
+ /* Walk the parse tree */
+
+ while (*PFieldList)
+ {
+ /* APMT Node Subtable */
+
+ SubtableStart = *PFieldList;
+
+ Status = DtCompileTable(PFieldList, AcpiDmTableInfoApmtNode, &Subtable);
+
+ if (ACPI_FAILURE(Status))
+ {
+ return (Status);
+ }
+
+ ApmtNode = ACPI_CAST_PTR(ACPI_APMT_NODE, Subtable->Buffer);
+
+ if (ApmtNode->Length != sizeof(ACPI_APMT_NODE))
+ {
+ DtFatal(ASL_MSG_INVALID_LENGTH, SubtableStart, "APMT");
+ return (AE_ERROR);
+ }
+
+ if (ApmtNode->Type >= ACPI_APMT_NODE_TYPE_COUNT)
+ {
+ snprintf(MsgBuffer, 64, "Node Type : 0x%X", ApmtNode->Type);
+ DtFatal(ASL_MSG_INVALID_TYPE, SubtableStart, MsgBuffer);
+ return (AE_ERROR);
+ }
+
+ PeerSubtable = DtGetNextSubtable(ParentTable, NULL);
+
+ /* Validate the node id needs to be unique. */
+ while(PeerSubtable)
+ {
+ PeerApmtNode = ACPI_CAST_PTR(ACPI_APMT_NODE, PeerSubtable->Buffer);
+ if (PeerApmtNode->Id == ApmtNode->Id)
+ {
+ snprintf(MsgBuffer, 64, "Node Id : 0x%X existed", ApmtNode->Id);
+ DtFatal(ASL_MSG_DUPLICATE_ITEM, SubtableStart, MsgBuffer);
+ return (AE_ERROR);
+ }
+
+ PeerSubtable = DtGetNextSubtable(ParentTable, PeerSubtable);
+ }
+
+ CurLength += ApmtNode->Length;
+
+ DtInsertSubtable(ParentTable, Subtable);
+ }
+
+ if (Header->Length != CurLength)
+ {
+ snprintf(MsgBuffer, 64, " - APMT Length : %u (expected: %u)",
+ Header->Length, CurLength);
+ DtFatal(ASL_MSG_INVALID_LENGTH, NULL, MsgBuffer);
+ return (AE_ERROR);
+ }
+
+ return (AE_OK);
+}
+
+/******************************************************************************
+ *
* FUNCTION: DtCompileAsf
*
* PARAMETERS: List - Current field list pointer
diff --git a/source/compiler/dttemplate.h b/source/compiler/dttemplate.h
index 08c76f6cb..9c46e33b2 100644
--- a/source/compiler/dttemplate.h
+++ b/source/compiler/dttemplate.h
@@ -259,6 +259,29 @@ const unsigned char TemplateAgdi[] =
0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00 /* 00000028 "...@...." */
};
+const unsigned char TemplateApmt[] =
+{
+ 0x41,0x50,0x4D,0x54,0x94,0x00,0x00,0x00, /* 00000000 "APMT...." */
+ 0x00,0x79,0x4E,0x56,0x49,0x44,0x49,0x41, /* 00000008 ".yNVIDIA" */
+ 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */
+ 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
+ 0x17,0x12,0x21,0x20,0x38,0x00,0x04,0x03, /* 00000020 "..! 8..." */
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, /* 00000028 "........" */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000030 "........" */
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000038 ". ......" */
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000040 ". ......" */
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000048 "........" */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000050 "........" */
+ 0x6B,0x03,0x00,0x00,0x38,0x00,0x06,0x03, /* 00000058 "k...8..." */
+ 0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, /* 00000060 "........" */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000068 "........" */
+ 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000070 ".0......" */
+ 0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000078 ".0......" */
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000080 "........" */
+ 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, /* 00000088 "........" */
+ 0x6B,0x03,0x00,0x00 /* 00000090 "k..." */
+};
+
const unsigned char TemplateAsf[] =
{
0x41,0x53,0x46,0x21,0x72,0x00,0x00,0x00, /* 00000000 "ASF!r..." */
diff --git a/source/include/acdisasm.h b/source/include/acdisasm.h
index ab234815e..e81affadb 100644
--- a/source/include/acdisasm.h
+++ b/source/include/acdisasm.h
@@ -388,6 +388,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestGicError[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestXrupt[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAgdi[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoApmtNode[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf0[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1a[];
@@ -737,6 +738,10 @@ AcpiDmDumpAest (
ACPI_TABLE_HEADER *Table);
void
+AcpiDmDumpApmt (
+ ACPI_TABLE_HEADER *Table);
+
+void
AcpiDmDumpAsf (
ACPI_TABLE_HEADER *Table);
diff --git a/source/include/actbinfo.h b/source/include/actbinfo.h
index 84ab34c3b..de0bea849 100644
--- a/source/include/actbinfo.h
+++ b/source/include/actbinfo.h
@@ -225,6 +225,7 @@
#define ACPI_AEST4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_AEST_GIC,f)
#define ACPI_AEST0D_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_AEST_NODE_INTERFACE,f)
#define ACPI_AEST0E_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_AEST_NODE_INTERRUPT,f)
+#define ACPI_APMTN_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_APMT_NODE,f)
#define ACPI_ASF0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_INFO,f)
#define ACPI_ASF1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_ALERT,f)
#define ACPI_ASF1a_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_ALERT_DATA,f)
@@ -416,6 +417,7 @@
#define ACPI_AEST0D_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_AEST_NODE_INTERFACE,f,o)
#define ACPI_AEST0E_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_AEST_NODE_INTERRUPT,f,o)
#define ACPI_AGDI_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_AGDI,f,o)
+#define ACPI_APMTN_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_APMT_NODE,f,o)
#define ACPI_BGRT_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_BGRT,f,o)
#define ACPI_DRTM_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_DRTM,f,o)
#define ACPI_DRTM1a_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_DRTM_RESOURCE,f,o)
diff --git a/source/include/actbl2.h b/source/include/actbl2.h
index bca58bec8..452822af0 100644
--- a/source/include/actbl2.h
+++ b/source/include/actbl2.h
@@ -169,6 +169,7 @@
* the wrong signature.
*/
#define ACPI_SIG_AGDI "AGDI" /* Arm Generic Diagnostic Dump and Reset Device Interface */
+#define ACPI_SIG_APMT "APMT" /* Arm Performance Monitoring Unit table */
#define ACPI_SIG_BDAT "BDAT" /* BIOS Data ACPI Table */
#define ACPI_SIG_IORT "IORT" /* IO Remapping Table */
#define ACPI_SIG_IVRS "IVRS" /* I/O Virtualization Reporting Structure */
@@ -426,6 +427,86 @@ typedef struct acpi_table_agdi
/*******************************************************************************
*
+ * APMT - ARM Performance Monitoring Unit Table
+ *
+ * Conforms to:
+ * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
+ * ARM DEN0117 v1.0 November 25, 2021
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_apmt {
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+} ACPI_TABLE_APMT;
+
+#define ACPI_APMT_NODE_ID_LENGTH 4
+
+/*
+ * APMT subtables
+ */
+typedef struct acpi_apmt_node {
+ UINT16 Length;
+ UINT8 Flags;
+ UINT8 Type;
+ UINT32 Id;
+ UINT64 InstPrimary;
+ UINT32 InstSecondary;
+ UINT64 BaseAddress0;
+ UINT64 BaseAddress1;
+ UINT32 OvflwIrq;
+ UINT32 Reserved;
+ UINT32 OvflwIrqFlags;
+ UINT32 ProcAffinity;
+ UINT32 ImplId;
+} ACPI_APMT_NODE;
+
+/* Masks for Flags field above */
+
+#define ACPI_APMT_FLAGS_DUAL_PAGE (1<<0)
+#define ACPI_APMT_FLAGS_AFFINITY (1<<1)
+#define ACPI_APMT_FLAGS_ATOMIC (1<<2)
+
+/* Values for Flags dual page field above */
+
+#define ACPI_APMT_FLAGS_DUAL_PAGE_NSUPP (0<<0)
+#define ACPI_APMT_FLAGS_DUAL_PAGE_SUPP (1<<0)
+
+/* Values for Flags processor affinity field above */
+#define ACPI_APMT_FLAGS_AFFINITY_PROC (0<<1)
+#define ACPI_APMT_FLAGS_AFFINITY_PROC_CONTAINER (1<<1)
+
+/* Values for Flags 64-bit atomic field above */
+#define ACPI_APMT_FLAGS_ATOMIC_NSUPP (0<<2)
+#define ACPI_APMT_FLAGS_ATOMIC_SUPP (1<<2)
+
+/* Values for Type field above */
+
+enum acpi_apmt_node_type {
+ ACPI_APMT_NODE_TYPE_MC = 0x00,
+ ACPI_APMT_NODE_TYPE_SMMU = 0x01,
+ ACPI_APMT_NODE_TYPE_PCIE_ROOT = 0x02,
+ ACPI_APMT_NODE_TYPE_ACPI = 0x03,
+ ACPI_APMT_NODE_TYPE_CACHE = 0x04,
+ ACPI_APMT_NODE_TYPE_COUNT
+};
+
+/* Masks for ovflw_irq_flags field above */
+
+#define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE (1<<0)
+#define ACPI_APMT_OVFLW_IRQ_FLAGS_TYPE (1<<1)
+
+/* Values for ovflw_irq_flags mode field above */
+
+#define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE_LEVEL (0<<0)
+#define ACPI_APMT_OVFLW_IRQ_FLAGS_MODE_EDGE (1<<0)
+
+/* Values for ovflw_irq_flags type field above */
+
+#define ACPI_APMT_OVFLW_IRQ_FLAGS_TYPE_WIRED (0<<1)
+
+
+/*******************************************************************************
+ *
* BDAT - BIOS Data ACPI Table
*
* Conforms to "BIOS Data ACPI Table", Interface Specification v4.0 Draft 5