Skip to content

Commit

Permalink
iASL: Add support for the AEST V2 table
Browse files Browse the repository at this point in the history
AEST V2 was published[1], add V2 support based on AEST V1.

[1]: https://developer.arm.com/documentation/den0085/latest/

Signed-off-by: Ruidong Tian <tianruidong@linux.alibaba.com>
  • Loading branch information
Ruidong Tian committed Mar 26, 2024
1 parent fee7180 commit ebb4979
Show file tree
Hide file tree
Showing 10 changed files with 543 additions and 90 deletions.
15 changes: 15 additions & 0 deletions source/common/dmtable.c
Expand Up @@ -190,6 +190,8 @@ static const char *AcpiDmAestSubnames[] =
"SMMU Error Node",
"Vendor-defined Error Node",
"GIC Error Node",
"PCIE Error Node",
"PROXY Error Node",
"Unknown Subtable Type" /* Reserved */
};

Expand All @@ -214,6 +216,7 @@ static const char *AcpiDmAestXfaceNames[] =
{
"System Register Interface",
"Memory Mapped Interface",
"Single Record Memory Mapped Interface",
"Unknown Interface Type" /* Reserved */
};

Expand Down Expand Up @@ -1196,6 +1199,16 @@ AcpiDmDumpTable (
ByteLength = 18;
break;

case ACPI_DMT_BUF32:

ByteLength = 32;
break;

case ACPI_DMT_BUF112:

ByteLength = 112;
break;

case ACPI_DMT_BUF128:

ByteLength = 128;
Expand Down Expand Up @@ -1407,6 +1420,8 @@ AcpiDmDumpTable (
case ACPI_DMT_BUF12:
case ACPI_DMT_BUF16:
case ACPI_DMT_BUF18:
case ACPI_DMT_BUF32:
case ACPI_DMT_BUF112:
case ACPI_DMT_BUF128:
/*
* Buffer: Size depends on the opcode and was set above.
Expand Down
112 changes: 101 additions & 11 deletions source/common/dmtbdump1.c
Expand Up @@ -195,6 +195,9 @@ AcpiDmDumpAest (
ACPI_DMTABLE_INFO *InfoTable;
ACPI_SIZE Length;
UINT8 Type;
UINT8 Revision = Table->Revision;
UINT32 Count;
ACPI_AEST_NODE_INTERFACE_HEADER *InterfaceHeader;


/* Very small, generic main table. AEST consists of mostly subtables */
Expand Down Expand Up @@ -234,15 +237,39 @@ AcpiDmDumpAest (
break;

case ACPI_AEST_VENDOR_ERROR_NODE:
InfoTable = AcpiDmTableInfoAestVendorError;
Length = sizeof (ACPI_AEST_VENDOR);
switch (Revision)
{
case 1:
InfoTable = AcpiDmTableInfoAestVendorError;
Length = sizeof (ACPI_AEST_VENDOR);
break;

case 2:
InfoTable = AcpiDmTableInfoAestVendorV2Error;
Length = sizeof (ACPI_AEST_VENDOR_V2);
break;

default:
AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision);
return;
}
break;

case ACPI_AEST_GIC_ERROR_NODE:
InfoTable = AcpiDmTableInfoAestGicError;
Length = sizeof (ACPI_AEST_GIC);
break;

case ACPI_AEST_PCIE_ERROR_NODE:
InfoTable = AcpiDmTableInfoAestPCIeError;
Length = sizeof (ACPI_AEST_PCIE);
break;

case ACPI_AEST_PROXY_ERROR_NODE:
InfoTable = AcpiDmTableInfoAestProxyError;
Length = sizeof (ACPI_AEST_PROXY);
break;

/* Error case below */
default:

Expand Down Expand Up @@ -335,8 +362,57 @@ AcpiDmDumpAest (
return;
}

Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
sizeof (ACPI_AEST_NODE_INTERFACE), AcpiDmTableInfoAestXface);
if (Revision == 1)
{
InfoTable = AcpiDmTableInfoAestXface;
Length = sizeof (ACPI_AEST_NODE_INTERFACE);
}
else if (Revision == 2)
{
InfoTable = AcpiDmTableInfoAestXfaceHeader;
Length = sizeof (ACPI_AEST_NODE_INTERFACE_HEADER);

Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable);
if (ACPI_FAILURE (Status))
{
return;
}

Offset += Length;

InterfaceHeader = ACPI_CAST_PTR (ACPI_AEST_NODE_INTERFACE_HEADER, Subtable);
switch (InterfaceHeader->GroupFormat)
{
case ACPI_AEST_NODE_GROUP_FORMAT_4K:
InfoTable = AcpiDmTableInfoAestXface4k;
Length = sizeof (ACPI_AEST_NODE_INTERFACE_4K);
break;

case ACPI_AEST_NODE_GROUP_FORMAT_16K:
InfoTable = AcpiDmTableInfoAestXface16k;
Length = sizeof (ACPI_AEST_NODE_INTERFACE_16K);
break;

case ACPI_AEST_NODE_GROUP_FORMAT_64K:
InfoTable = AcpiDmTableInfoAestXface64k;
Length = sizeof (ACPI_AEST_NODE_INTERFACE_64K);
break;

default:
AcpiOsPrintf ("\n**** Unknown AEST Interface Group Format 0x%X\n",
InterfaceHeader->GroupFormat);
return;
}

Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
}
else
{
AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision);
return;
}

Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable);
if (ACPI_FAILURE (Status))
{
return;
Expand All @@ -345,32 +421,46 @@ AcpiDmDumpAest (
/* Point past the interface structure */

AcpiOsPrintf ("\n");
Offset += sizeof (ACPI_AEST_NODE_INTERFACE);
Offset += Length;

/* Dump the entire interrupt structure array, if present */

if (NodeHeader->NodeInterruptOffset)
{
Length = NodeHeader->NodeInterruptCount;
Count = NodeHeader->NodeInterruptCount;
Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);

while (Length)
while (Count)
{
/* Dump the interrupt structure */

switch (Revision) {
case 1:
InfoTable = AcpiDmTableInfoAestXrupt;
Length = sizeof (ACPI_AEST_NODE_INTERRUPT);
break;

case 2:
InfoTable = AcpiDmTableInfoAestXruptV2;
Length = sizeof (ACPI_AEST_NODE_INTERRUPT_V2);
break;
default:
AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n",
Revision);
return;
}
Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
sizeof (ACPI_AEST_NODE_INTERRUPT),
AcpiDmTableInfoAestXrupt);
Length, InfoTable);
if (ACPI_FAILURE (Status))
{
return;
}

/* Point to the next interrupt structure */

Offset += sizeof (ACPI_AEST_NODE_INTERRUPT);
Offset += Length;
Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
Length--;
Count--;
AcpiOsPrintf ("\n");
}
}
Expand Down
103 changes: 103 additions & 0 deletions source/common/dmtbinfo1.c
Expand Up @@ -287,6 +287,16 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoAestVendorError[] =
ACPI_DMT_TERMINATOR
};

/* 3: Vendor Defined V2 */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestVendorV2Error[] =
{
{ACPI_DMT_UINT64, ACPI_AEST3A_OFFSET (AcpiHid), "ACPI HID", 0},
{ACPI_DMT_UINT32, ACPI_AEST3A_OFFSET (AcpiUid), "ACPI UID", 0},
{ACPI_DMT_BUF16, ACPI_AEST3A_OFFSET (VendorSpecificData), "Vendor Specific Data", 0},
ACPI_DMT_TERMINATOR
};

/* 4: Gic Error */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestGicError[] =
Expand All @@ -296,6 +306,31 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoAestGicError[] =
ACPI_DMT_TERMINATOR
};

/* 5: PCIe Error */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestPCIeError[] =
{
{ACPI_DMT_UINT32, ACPI_AEST5_OFFSET (IortNodeReference), "Iort Node Reference", 0},
ACPI_DMT_TERMINATOR
};

/* 6: Proxy Error */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestProxyError[] =
{
{ACPI_DMT_UINT64, ACPI_AEST6_OFFSET (NodeAddress), "Proxy Node Address", 0},
ACPI_DMT_TERMINATOR
};

/* Common AEST structures for subtables */

#define ACPI_DM_AEST_INTERFACE_COMMON(a) \
{ACPI_DMT_UINT32, ACPI_AEST0D##a##_OFFSET (Common.ErrorNodeDevice), "Arm Error Node Device", 0},\
{ACPI_DMT_UINT32, ACPI_AEST0D##a##_OFFSET (Common.ProcessorAffinity), "Processor Affinity", 0}, \
{ACPI_DMT_UINT64, ACPI_AEST0D##a##_OFFSET (Common.ErrorGroupRegisterBase), "Err-Group Register Addr", 0}, \
{ACPI_DMT_UINT64, ACPI_AEST0D##a##_OFFSET (Common.FaultInjectRegisterBase), "Err-Inject Register Addr", 0}, \
{ACPI_DMT_UINT64, ACPI_AEST0D##a##_OFFSET (Common.InterruptConfigRegisterBase), "IRQ-Config Register Addr", 0},

/* AestXface: Node Interface Structure */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface[] =
Expand All @@ -314,6 +349,60 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface[] =
ACPI_DMT_TERMINATOR
};

/* AestXface: Node Interface Structure V2 Header */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestXfaceHeader[] =
{
{ACPI_DMT_AEST_XFACE, ACPI_AEST0DH_OFFSET (Type), "Interface Type", 0},
{ACPI_DMT_UINT8, ACPI_AEST0DH_OFFSET (GroupFormat), "Group Format", 0},
{ACPI_DMT_UINT16, ACPI_AEST0DH_OFFSET (Reserved[0]), "Reserved", 0},
{ACPI_DMT_UINT32, ACPI_AEST0DH_OFFSET (Flags), "Flags (decoded below)", 0},
{ACPI_DMT_FLAG0, ACPI_AEST0D_FLAG_OFFSET (Flags, 0), "Shared Interface", 0},
{ACPI_DMT_FLAG1, ACPI_AEST0D_FLAG_OFFSET (Flags, 0), "Clear MISCx Registers", 0},
{ACPI_DMT_FLAG2, ACPI_AEST0D_FLAG_OFFSET (Flags, 0), "Error Node Device Valid", 0},
{ACPI_DMT_FLAG3, ACPI_AEST0D_FLAG_OFFSET (Flags, 0), "Affinity Type", 0},
{ACPI_DMT_FLAG4, ACPI_AEST0D_FLAG_OFFSET (Flags, 0), "Error group Address Valid", 0},
{ACPI_DMT_FLAG5, ACPI_AEST0D_FLAG_OFFSET (Flags, 0), "Fault Injection Address Valid", 0},
{ACPI_DMT_FLAG7, ACPI_AEST0D_FLAG_OFFSET (Flags, 0), "Interrupt Config Address valid", 0},
{ACPI_DMT_UINT64, ACPI_AEST0DH_OFFSET (Address), "Address", 0},
{ACPI_DMT_UINT32, ACPI_AEST0DH_OFFSET (ErrorRecordIndex), "Error Record Index", 0},
{ACPI_DMT_UINT32, ACPI_AEST0DH_OFFSET (ErrorRecordCount), "Error Record Count", 0},
ACPI_DMT_TERMINATOR
};

/* AestXface: Node Interface Structure V2 4K Group Format */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface4k[] =
{
{ACPI_DMT_UINT64, ACPI_AEST0D4_OFFSET (ErrorRecordImplemented),"Error Record Implemented", 0},
{ACPI_DMT_UINT64, ACPI_AEST0D4_OFFSET (ErrorStatusReporting), "Error Status Reporting", 0},
{ACPI_DMT_UINT64, ACPI_AEST0D4_OFFSET (AddressingMode), "Addressing Mode", 0},
ACPI_DM_AEST_INTERFACE_COMMON(4)
ACPI_DMT_TERMINATOR
};

/* AestXface: Node Interface Structure V2 16K Group Format */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface16k[] =
{
{ACPI_DMT_BUF32, ACPI_AEST0D16_OFFSET (ErrorRecordImplemented[0]),"Error Record Implemented", 0},
{ACPI_DMT_BUF32, ACPI_AEST0D16_OFFSET (ErrorStatusReporting[0]), "Error Status Reporting", 0},
{ACPI_DMT_BUF32, ACPI_AEST0D16_OFFSET (AddressingMode[0]), "Addressing Mode", 0},
ACPI_DM_AEST_INTERFACE_COMMON(16)
ACPI_DMT_TERMINATOR
};

/* AestXface: Node Interface Structure V2 64K Group Format */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface64k[] =
{
{ACPI_DMT_BUF112, ACPI_AEST0D64_OFFSET (ErrorRecordImplemented[0]),"Error Record Implemented", 0},
{ACPI_DMT_BUF112, ACPI_AEST0D64_OFFSET (ErrorStatusReporting[0]), "Error Status Reporting", 0},
{ACPI_DMT_BUF112, ACPI_AEST0D64_OFFSET (AddressingMode[0]), "Addressing Mode", 0},
ACPI_DM_AEST_INTERFACE_COMMON(64)
ACPI_DMT_TERMINATOR
};

/* AestXrupt: Node Interrupt Structure */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestXrupt[] =
Expand All @@ -329,6 +418,20 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoAestXrupt[] =
};


/* AestXrupt: Node Interrupt Structure V2 */

ACPI_DMTABLE_INFO AcpiDmTableInfoAestXruptV2[] =
{
{ACPI_DMT_AEST_XRUPT, ACPI_AEST0EA_OFFSET (Type), "Interrupt Type", 0},
{ACPI_DMT_UINT16, ACPI_AEST0EA_OFFSET (Reserved), "Reserved", 0},
{ACPI_DMT_UINT8, ACPI_AEST0EA_OFFSET (Flags), "Flags (decoded below)", 0},
{ACPI_DMT_FLAG0, ACPI_AEST0EA_FLAG_OFFSET (Flags, 0), "Level Triggered", 0},
{ACPI_DMT_UINT32, ACPI_AEST0EA_OFFSET (Gsiv), "Gsiv", 0},
{ACPI_DMT_UINT32, ACPI_AEST0EA_OFFSET (Reserved1[0]), "Reserved", 0},
ACPI_DMT_TERMINATOR
};


/*******************************************************************************
*
* ASF - Alert Standard Format table (Signature "ASF!")
Expand Down

0 comments on commit ebb4979

Please sign in to comment.