summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBesar Wicaksono <bwicaksono@nvidia.com>2022-01-25 20:49:32 -0600
committerBesar Wicaksono <bwicaksono@nvidia.com>2022-03-08 18:18:59 -0600
commit002165ecc0a3dc703bb24c789aaa02fdada01675 (patch)
treee16481b2cb574b85fda6bf8a89a616b00f756591
parent0914618b553d6f3366e568409cebf2656891ca69 (diff)
downloadacpica-002165ecc0a3dc703bb24c789aaa02fdada01675.tar.gz
Add support for ARM Performance Monitoring Unit Table.
The specification of this table is described in "ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document" ARM DEN0117. This patch adds the necessary types and support for compiling/disassembling APMT. Signed-off-by: Besar Wicaksono <bwicaksono@nvidia.com>
-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 081f50975..76ada431b 100644
--- a/source/common/dmtable.c
+++ b/source/common/dmtable.c
@@ -650,6 +650,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 aa4de68a4..15146f565 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 08565d56c..806628b91 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[];
@@ -736,6 +737,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 191eb3069..4b1e78e2a 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)
@@ -415,6 +416,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 2fa2bb4e2..30f0cb268 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