diff options
author | Robert Moore <Robert.Moore@intel.com> | 2022-03-25 09:20:39 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-25 09:20:39 -0700 |
commit | c7b6dd94b19ec1fcc4d6eba156a283ab414a39b2 (patch) | |
tree | a52abce8eb432ed3093772e3a95aede538aa49a6 | |
parent | 504d69a9f353f68b00e82f6583ffaa2e0181815a (diff) | |
parent | 002165ecc0a3dc703bb24c789aaa02fdada01675 (diff) | |
download | acpica-c7b6dd94b19ec1fcc4d6eba156a283ab414a39b2.tar.gz |
Merge pull request #758 from bwicaksononv/apmt
Add support for ARM Performance Monitoring Unit Table.
-rw-r--r-- | source/common/dmtable.c | 1 | ||||
-rw-r--r-- | source/common/dmtbdump1.c | 62 | ||||
-rw-r--r-- | source/common/dmtbinfo2.c | 34 | ||||
-rw-r--r-- | source/compiler/dtcompiler.h | 5 | ||||
-rw-r--r-- | source/compiler/dttable1.c | 96 | ||||
-rw-r--r-- | source/compiler/dttemplate.h | 23 | ||||
-rw-r--r-- | source/include/acdisasm.h | 5 | ||||
-rw-r--r-- | source/include/actbinfo.h | 2 | ||||
-rw-r--r-- | source/include/actbl2.h | 81 |
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 |