Message ID | 20220130163419.493806-2-colin.i.king@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | ACPICA: Update to version 20211217 | expand |
On 2022-01-30 09:34, Colin Ian King wrote: > Changes in this release of ACPICA are detailed at the following > link on the ACPICA developer mailing list: > > https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/XA2YNYE3AZ67XXHUXVRPITIWCVQD5XHV/ > > Signed-off-by: Colin Ian King <colin.i.king@gmail.com> > --- > src/acpica/source/common/acfileio.c | 11 +- > src/acpica/source/common/ahtable.c | 3 + > src/acpica/source/common/dmtable.c | 158 ++++++- > src/acpica/source/common/dmtbdump.c | 70 +++- > src/acpica/source/common/dmtbdump1.c | 2 - > src/acpica/source/common/dmtbdump2.c | 247 +++++++---- > src/acpica/source/common/dmtbinfo.c | 6 +- > src/acpica/source/common/dmtbinfo2.c | 79 +++- > src/acpica/source/common/dmtbinfo3.c | 14 + > src/acpica/source/compiler/aslcache.c | 5 + > src/acpica/source/compiler/aslfiles.c | 4 +- > src/acpica/source/compiler/aslmessages.c | 2 + > src/acpica/source/compiler/aslmessages.h | 2 + > src/acpica/source/compiler/aslstartup.c | 23 +- > src/acpica/source/compiler/asluuid.c | 1 - > src/acpica/source/compiler/dtcompiler.h | 3 + > src/acpica/source/compiler/dttable.c | 59 ++- > src/acpica/source/compiler/dttable2.c | 385 +++++++++++++++++- > src/acpica/source/compiler/dttemplate.h | 93 +++++ > src/acpica/source/compiler/dtutils.c | 11 + > .../source/components/dispatcher/dsopcode.c | 1 + > .../source/components/events/evhandler.c | 2 +- > .../source/components/events/evregion.c | 9 + > .../source/components/events/evrgnini.c | 58 +++ > .../source/components/executer/exconfig.c | 2 +- > .../source/components/executer/excreate.c | 1 + > .../source/components/executer/exfield.c | 4 +- > .../source/components/executer/exoparg1.c | 2 +- > .../source/components/executer/exregion.c | 14 +- > .../source/components/hardware/hwesleep.c | 5 +- > .../source/components/hardware/hwsleep.c | 7 +- > .../source/components/hardware/hwxfsleep.c | 2 - > src/acpica/source/components/tables/tbdata.c | 85 ++-- > src/acpica/source/components/tables/tbfadt.c | 6 +- > .../source/components/tables/tbinstal.c | 12 +- > src/acpica/source/components/tables/tbprint.c | 3 +- > src/acpica/source/components/tables/tbutils.c | 3 +- > .../source/components/tables/tbxfload.c | 57 ++- > .../source/components/utilities/utdelete.c | 1 + > src/acpica/source/include/acdisasm.h | 16 + > src/acpica/source/include/acevents.h | 7 + > src/acpica/source/include/acobject.h | 1 + > src/acpica/source/include/acpixf.h | 10 +- > src/acpica/source/include/actables.h | 5 +- > src/acpica/source/include/actbinfo.h | 7 + > src/acpica/source/include/actbl2.h | 148 +++++-- > src/acpica/source/include/actypes.h | 26 +- > 47 files changed, 1442 insertions(+), 230 deletions(-) > > diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c > index 99f89729..3e26ac3f 100644 > --- a/src/acpica/source/common/acfileio.c > +++ b/src/acpica/source/common/acfileio.c > @@ -552,10 +552,15 @@ AcValidateTableHeader ( > /* Read a potential table header */ > > OriginalOffset = ftell (File); > - fseek (File, TableOffset, SEEK_SET); > - > + if (fseek (File, TableOffset, SEEK_SET)) > + { > + fprintf (stderr, "SEEK error\n"); > + } > Actual = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File); > - fseek (File, OriginalOffset, SEEK_SET); > + if (fseek (File, OriginalOffset, SEEK_SET)) > + { > + fprintf (stderr, "SEEK error\n"); > + } > > if (Actual < sizeof (ACPI_TABLE_HEADER)) > { > diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c > index d7ce88a9..def42520 100644 > --- a/src/acpica/source/common/ahtable.c > +++ b/src/acpica/source/common/ahtable.c > @@ -200,6 +200,7 @@ AcpiAhGetTableInfo ( > const AH_TABLE AcpiGbl_SupportedTables[] = > { > {ACPI_SIG_AEST, "Arm Error Source Table"}, > + {ACPI_SIG_AGDI, "Arm Generic Diagnostic Dump and Reset Device Interface Table"}, > {ACPI_SIG_ASF, "Alert Standard Format Table"}, > {ACPI_SIG_BDAT, "BIOS Data ACPI Table"}, > {ACPI_SIG_BERT, "Boot Error Record Table"}, > @@ -233,6 +234,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] = > {ACPI_SIG_MSCT, "Maximum System Characteristics Table"}, > {ACPI_SIG_MSDM, "Microsoft Data Management Table"}, > {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"}, > + {ACPI_SIG_NHLT, "Non HD Audio Link Table"}, > {ACPI_SIG_PCCT, "Platform Communications Channel Table"}, > {ACPI_SIG_PDTT, "Platform Debug Trigger Table"}, > {ACPI_SIG_PHAT, "Platform Health Assessment Table"}, > @@ -256,6 +258,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] = > {ACPI_SIG_STAO, "Status Override Table"}, > {ACPI_SIG_SVKL, "Storage Volume Key Location Table"}, > {ACPI_SIG_TCPA, "Trusted Computing Platform Alliance Table"}, > + {ACPI_SIG_TDEL, "TD-Event Log Table"}, > {ACPI_SIG_TPM2, "Trusted Platform Module hardware interface Table"}, > {ACPI_SIG_UEFI, "UEFI Boot Optimization Table"}, > {ACPI_SIG_VIOT, "Virtual I/O Translation Table"}, > diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c > index dff1c613..3137132a 100644 > --- a/src/acpica/source/common/dmtable.c > +++ b/src/acpica/source/common/dmtable.c > @@ -167,10 +167,11 @@ AcpiAhGetTableInfo ( > > /* Common format strings for commented values */ > > -#define UINT8_FORMAT "%2.2X [%s]\n" > -#define UINT16_FORMAT "%4.4X [%s]\n" > -#define UINT32_FORMAT "%8.8X [%s]\n" > -#define STRING_FORMAT "[%s]\n" > +#define UINT8_FORMAT "%2.2X [%s]\n" > +#define UINT8_FORMAT_NO_NEWLINE "%2.2X [%s]" > +#define UINT16_FORMAT "%4.4X [%s]\n" > +#define UINT32_FORMAT "%8.8X [%s]\n" > +#define STRING_FORMAT "[%s]\n" > > /* These tables map a subtable type to a description string */ > > @@ -437,6 +438,50 @@ static const char *AcpiDmNhltDirectionNames[] = > "Unknown Direction" /* Reserved */ > }; > > +static const char *AcpiDmNhltMicTypeNames[] = > +{ > + "Omnidirectional", /* ACPI_NHLT_MIC_OMNIDIRECTIONAL */ > + "Subcardioid", /* ACPI_NHLT_MIC_SUBCARDIOID */ > + "Cardioid", /* ACPI_NHLT_MIC_CARDIOID */ > + "SuperCardioid", /* ACPI_NHLT_MIC_SUPER_CARDIOID */ > + "HyperCardioid", /* ACPI_NHLT_MIC_HYPER_CARDIOID */ > + "8 Shaped", /* ACPI_NHLT_MIC_8_SHAPED */ > + "Reserved Mic Type", /* Reserved */ > + "Vendor Defined", /* ACPI_NHLT_MIC_VENDOR_DEFINED */ > + "Unknown Mic Type" /* ACPI_NHLT_MIC_RESERVED */ > +}; > + > +static const char *AcpiDmNhltMicPositionNames[] = > +{ > + "Top", /* ACPI_NHLT_MIC_POSITION_TOP */ > + "Bottom", /* ACPI_NHLT_MIC_POSITION_BOTTOM */ > + "Left", /* ACPI_NHLT_MIC_POSITION_LEFT */ > + "Right", /* ACPI_NHLT_MIC_POSITION_RIGHT */ > + "Front", /* ACPI_NHLT_MIC_POSITION_FRONT */ > + "Back", /* ACPI_NHLT_MIC_POSITION_BACK */ > + "Unknown Mic Position" /* 6 and above are reserved */ > +}; > + > +static const char *AcpiDmNhltMicArrayTypeNames[] = > +{ > + "Unknown Array Type", /* ACPI_NHLT_ARRAY_TYPE_RESERVED */ > + "Small Linear 2-element", /* ACPI_NHLT_SMALL_LINEAR_2ELEMENT */ > + "Big Linear 2-element", /* ACPI_NHLT_BIG_LINEAR_2ELEMENT */ > + "Linear 4-element 1st Geometry", /* ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT */ > + "Planar L-shaped 4-element", /* ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT */ > + "Linear 4-element 2nd Geometry", /* ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT */ > + "Vendor Defined" /* ACPI_NHLT_VENDOR_DEFINED */ > +}; > + > +static const char *AcpiDmNhltConfigTypeNames[] = > +{ > + "Generic Type", /* ACPI_NHLT_CONFIG_TYPE_GENERIC */ > + "Microphone Array", /* ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY */ > + "Reserved", /* ACPI_NHLT_CONFIG_TYPE_RESERVED */ > + "Render Feedback", /* ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK */ > + "Unknown Config Type" /* ACPI_NHLT_CONFIG_TYPE_RESERVED */ > +}; > + > static const char *AcpiDmPcctSubnames[] = > { > "Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */ > @@ -604,6 +649,7 @@ static const char *AcpiDmGasAccessWidth[] = > const ACPI_DMTABLE_DATA AcpiDmTableData[] = > { > {ACPI_SIG_AEST, NULL, AcpiDmDumpAest, DtCompileAest, TemplateAest}, > + {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi, NULL, NULL, TemplateAgdi}, > {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf}, > {ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat}, > {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert}, > @@ -635,7 +681,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = > {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct}, > {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm}, > {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit}, > - {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, NULL, NULL}, > + {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, DtCompileNhlt, TemplateNhlt}, > {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct}, > {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt}, > {ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat}, > @@ -657,6 +703,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = > {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao}, > {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl}, > {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa}, > + {ACPI_SIG_TDEL, AcpiDmTableInfoTdel, NULL, NULL, TemplateTdel}, > {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2}, > {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi}, > {ACPI_SIG_VIOT, AcpiDmTableInfoViot, AcpiDmDumpViot, DtCompileViot, TemplateViot}, > @@ -795,7 +842,8 @@ AcpiDmDumpDataTable ( > return; > } > } > - else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature)) > + else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, > + Table)->Signature)) > { > Length = AcpiDmDumpRsdp (Table); > } > @@ -1040,7 +1088,7 @@ AcpiDmDumpTable ( > > /* Check for beyond subtable end or (worse) beyond EOT */ > > - if (SubtableLength && (Info->Offset >= SubtableLength)) > + if (SubtableLength && (Info->Offset > SubtableLength)) > { > AcpiOsPrintf ( > "/**** ACPI subtable terminates early (Len %u) - " > @@ -1074,6 +1122,10 @@ AcpiDmDumpTable ( > case ACPI_DMT_MADT: > case ACPI_DMT_NHLT1: > case ACPI_DMT_NHLT1a: > + case ACPI_DMT_NHLT1b: > + case ACPI_DMT_NHLT1c: > + case ACPI_DMT_NHLT1d: > + case ACPI_DMT_NHLT1f: > case ACPI_DMT_PCCT: > case ACPI_DMT_PMTT: > case ACPI_DMT_PPTT: > @@ -1102,6 +1154,7 @@ AcpiDmDumpTable ( > case ACPI_DMT_HEST: > case ACPI_DMT_HMAT: > case ACPI_DMT_NFIT: > + case ACPI_DMT_NHLT1e: > case ACPI_DMT_PHAT: > > ByteLength = 2; > @@ -1848,6 +1901,95 @@ AcpiDmDumpTable ( > AcpiDmNhltDirectionNames[Temp8]); > break; > > + case ACPI_DMT_NHLT1b: > + > + /* NHLT microphone type */ > + > + Temp8 = *Target; > + if (Temp8 > ACPI_NHLT_MIC_RESERVED) > + { > + Temp8 = ACPI_NHLT_MIC_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT, *Target, > + AcpiDmNhltMicTypeNames[Temp8]); > + break; > + > + case ACPI_DMT_NHLT1c: > + > + /* NHLT microphone position */ > + > + Temp8 = *Target; > + if (Temp8 > ACPI_NHLT_MIC_POSITION_RESERVED) > + { > + Temp8 = ACPI_NHLT_MIC_POSITION_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT, *Target, > + AcpiDmNhltMicPositionNames[Temp8]); > + break; > + > + case ACPI_DMT_NHLT1d: > + > + /* NHLT microphone array type */ > + > + Temp8 = *Target & ACPI_NHLT_ARRAY_TYPE_MASK; > + if (Temp8 < ACPI_NHLT_ARRAY_TYPE_RESERVED) > + { > + Temp8 = ACPI_NHLT_ARRAY_TYPE_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT_NO_NEWLINE, *Target, > + AcpiDmNhltMicArrayTypeNames[Temp8 - ACPI_NHLT_ARRAY_TYPE_RESERVED]); > + > + Temp8 = *Target; > + if (Temp8 & ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT) > + { > + AcpiOsPrintf (" [%s]", "SNR and Sensitivity"); > + } > + > + AcpiOsPrintf ("\n"); > + break; > + > + case ACPI_DMT_NHLT1e: > + > + /* NHLT Endpoint Device ID */ > + > + Temp16 = ACPI_GET16 (Target); > + if (Temp16 == 0xAE20) > + { > + Name = "PDM DMIC"; > + } > + else if (Temp16 == 0xAE30) > + { > + Name = "BT Sideband"; > + } > + else if (Temp16 == 0xAE34) > + { > + Name = "I2S/TDM Codecs"; > + } > + else > + { > + Name = "Unknown Device ID"; > + } > + > + AcpiOsPrintf (UINT16_FORMAT, Temp16, Name); > + break; > + > + case ACPI_DMT_NHLT1f: > + > + /* NHLT ConfigType field */ > + > + Temp8 = *Target; > + if (Temp8 > ACPI_NHLT_CONFIG_TYPE_RESERVED) > + { > + Temp8 = ACPI_NHLT_CONFIG_TYPE_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT, *Target, > + AcpiDmNhltConfigTypeNames[Temp8]); > + break; > + > case ACPI_DMT_PCCT: > > /* PCCT subtable types */ > @@ -1929,7 +2071,7 @@ AcpiDmDumpTable ( > break; > } > > - AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL); > + AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL); > break; > > case ACPI_DMT_RGRT: > diff --git a/src/acpica/source/common/dmtbdump.c b/src/acpica/source/common/dmtbdump.c > index abeb06fa..86c90d67 100644 > --- a/src/acpica/source/common/dmtbdump.c > +++ b/src/acpica/source/common/dmtbdump.c > @@ -195,7 +195,9 @@ AcpiDmDumpBuffer ( > char *Header) > { > UINT8 *Buffer; > + UINT8 BufChar; > UINT32 i; > + UINT32 j; > > > if (!Length) > @@ -208,20 +210,72 @@ AcpiDmDumpBuffer ( > > while (i < Length) > { > - if (!(i % 16)) > + if ((Length > 16) && (i != 0)) > { > - /* Insert a backslash - line continuation character */ > + if ((Length - i) < 16) > + AcpiOsPrintf ("\n/* %3.3Xh %4.4u %3u */ ", AbsoluteOffset, AbsoluteOffset, Length - i); > + else > + AcpiOsPrintf ("\n/* %3.3Xh %4.4u 16 */ ", AbsoluteOffset, AbsoluteOffset); > + } > + AbsoluteOffset += 16; > + > + /* Emit the raw data bytes*/ > > - if (Length > 16) > + for (j = 0; j < 16; j++) > + { > + if (i + j >= Length) > { > - AcpiOsPrintf ("\\\n "); > + /* Dump fill spaces */ > + > + AcpiOsPrintf ("%*s", (48 - (3 * (Length -i))), " "); > + break; > } > + AcpiOsPrintf ("%.02X ", Buffer[(ACPI_SIZE) i + j]); > + } > + > + /* Emit the ASCII equivalent to the raw data bytes */ > + > + for (j = 0; j < 16; j++) > + { > + if (i + j >= Length) > + { > + AcpiOsPrintf (" */\\\n"); > + return; > + } > + > + /* > + * Add comment characters so rest of line is ignored when > + * compiled > + */ > + if (j == 0) > + { > + AcpiOsPrintf ("/* "); > + } > + > + BufChar = Buffer[(ACPI_SIZE) i + j]; > + if (isprint (BufChar)) > + { > + AcpiOsPrintf ("%c", BufChar); > + } > + else > + { > + AcpiOsPrintf ("."); > + } > + } > + > + /* Done with that line. */ > + /* Close the comment and insert a backslash - line continuation character */ > + > + if (Length > 16) > + { > + AcpiOsPrintf (" */\\"); > + } > + else > + { > + AcpiOsPrintf (" */\\"); > } > > - AcpiOsPrintf ("%.02X ", *Buffer); > - i++; > - Buffer++; > - AbsoluteOffset++; > + i += 16; /* Point to next line */ > } > > AcpiOsPrintf ("\n"); > diff --git a/src/acpica/source/common/dmtbdump1.c b/src/acpica/source/common/dmtbdump1.c > index 3a97af46..fd5e2fd9 100644 > --- a/src/acpica/source/common/dmtbdump1.c > +++ b/src/acpica/source/common/dmtbdump1.c > @@ -296,8 +296,6 @@ AcpiDmDumpAest ( > case ACPI_AEST_GENERIC_RESOURCE: > InfoTable = AcpiDmTableInfoAestGenRsrc; > Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC); > - AcpiOsPrintf ("Generic Resource Type (%X) is not supported at this time\n", > - ProcessorSubtable->ResourceType); > break; > > /* Error case below */ > diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c > index 118b96ee..04f7139f 100644 > --- a/src/acpica/source/common/dmtbdump2.c > +++ b/src/acpica/source/common/dmtbdump2.c > @@ -1494,19 +1494,21 @@ AcpiDmDumpNhlt ( > UINT32 CapabilitiesSize; > UINT32 i; > UINT32 j; > - UINT32 k; > UINT32 EndpointEndOffset; > UINT8 ConfigType = 0; > UINT8 ArrayType; > + UINT8 MicrophoneCount; > + ACPI_NHLT_VENDOR_MIC_COUNT *MicCount; > ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific; > ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; > ACPI_NHLT_LINUX_SPECIFIC_COUNT *Count; > ACPI_NHLT_LINUX_SPECIFIC_DATA *LinuxData; > + ACPI_NHLT_LINUX_SPECIFIC_DATA_B *LinuxDataB; > > > /* Main table */ > > - AcpiOsPrintf ("/* Main table */\n"); > + AcpiOsPrintf (" /* Main table */\n"); > > Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt); > if (ACPI_FAILURE (Status)) > @@ -1532,52 +1534,59 @@ AcpiDmDumpNhlt ( > /* Do the Endpoint Descriptor table */ > > Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > + > + /* Check for endpoint descriptor length beyond end-of-table */ > + > if (Subtable->DescriptorLength > TableLength) > { > Offset += 1; > - AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than" > + AcpiOsPrintf ("\n /* Endpoint Descriptor Length larger than" > " table size: %X, table %X, adjusting table offset (+1) */\n", > Subtable->DescriptorLength, TableLength); > > Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > } > > - AcpiOsPrintf ("\n/* Endpoint Descriptor #%u */\n", i+1); > + AcpiOsPrintf ("\n /* Endpoint Descriptor #%u */\n", i+1); > Status = AcpiDmDumpTable (TableLength, Offset, Subtable, > Subtable->DescriptorLength, AcpiDmTableInfoNhlt0); > if (ACPI_FAILURE (Status)) > { > return; > } > + > EndpointEndOffset = Subtable->DescriptorLength + Offset; > > /* Check for endpoint descriptor beyond end-of-table */ > > if (Subtable->DescriptorLength > TableLength) > { > - AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than table size: %X, table %X */\n", > + AcpiOsPrintf ("\n /* Endpoint Descriptor Length larger than table size: %X, table %X */\n", > Subtable->DescriptorLength, TableLength); > } > + > Offset += sizeof (ACPI_NHLT_ENDPOINT); > Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > > /* Do the Device Specific table */ > > - AcpiOsPrintf ("\n/* Endpoint Device_Specific_Config table */\n"); > + AcpiOsPrintf ("\n /* Endpoint Device_Specific_Config table */\n"); > DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); > CapabilitiesSize = DevSpecific->CapabilitiesSize; > + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + ArrayType = 0; > > /* Different subtables based upon capabilities_size */ > > switch (CapabilitiesSize) > { > case 0: > - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > - sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); > - if (ACPI_FAILURE (Status)) > - { > - return; > - } > Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); > break; > > @@ -1602,6 +1611,9 @@ AcpiDmDumpNhlt ( > break; > > case 3: > + default: > + /* Extract the ConfigType and ArrayType */ > + > ConfigType = DevSpecific->ConfigType; > ArrayType = DevSpecific->ArrayType; > > @@ -1614,56 +1626,113 @@ AcpiDmDumpNhlt ( > > /* Capabilities Size == 3 */ > Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A); > + break; > > - /* Check for a vendor-defined mic array */ > + case 7: > + ConfigType = DevSpecific->ConfigType; > + Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); > > - if ((ConfigType == ACPI_NHLT_TYPE_MIC_ARRAY) && ((ArrayType & ARRAY_TYPE_MASK) == VENDOR_DEFINED)) > + AcpiOsPrintf ("\n /* Render Feedback Device-Specific table */\n"); > + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5); > + if (ACPI_FAILURE (Status)) > { > - /* Vendor-defined microphone array */ > + return; > + } > > - AcpiOsPrintf ("\n/* Vendor-defined microphone array */\n"); > + /* Capabilities Size = 7 */ > + Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG); > + > + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK) > + { > + Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); > > Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > - sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6); > + sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt6b); > if (ACPI_FAILURE (Status)) > { > return; > } > - Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG); > + Offset += sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG); > } > break; > + } > > - default: > - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > - sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); > - if (ACPI_FAILURE (Status)) > - { > - return; > - } > + /* Check for a vendor-defined mic array */ > > - Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); > - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > - CapabilitiesSize, AcpiDmTableInfoNhlt3a); > - if (ACPI_FAILURE (Status)) > + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY) > + { > + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED) > { > - return; > + /* Vendor-defined microphone array; get the microphone count first */ > + > + AcpiOsPrintf ("\n /* Vendor-defined microphone count */\n"); > + MicCount = ACPI_ADD_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Table, Offset); > + MicrophoneCount = MicCount->MicrophoneCount; > + > + Status = AcpiDmDumpTable (TableLength, Offset, MicCount, > + sizeof (ACPI_NHLT_VENDOR_MIC_COUNT), AcpiDmTableInfoNhlt6a); > + Offset += sizeof (ACPI_NHLT_VENDOR_MIC_COUNT); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + /* Get the vendor microphone config structure(s) */ > + > + for (j = 0; j < MicrophoneCount; j++) > + { > + AcpiOsPrintf ("\n /* Vendor-defined microphone array #%u*/\n", j+1); > + DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset); > + > + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > + sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG); > + } > + > + /* Check for Microphone SNR and sensitivity extension */ > + > + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) == ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT) > + { > + AcpiOsPrintf ("\n /* Microphone SNR and sensitivity array */\n"); > + DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset); > + > + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > + sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION), AcpiDmTableInfoNhlt9); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION); > + } > } > - Offset += CapabilitiesSize; > - break; > } > > - /* Do the Formats_Config table */ > + /* Do the Formats_Config table - starts with the FormatsCount field */ > > FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset); > FormatsCount = FormatsConfig->FormatsCount; > > - AcpiOsPrintf ("\n/* Formats_Config table */\n"); > + AcpiOsPrintf ("\n /* Formats_Config table */\n"); > > - Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig, > - sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4); > - if (ACPI_FAILURE (Status)) > + /* Dump the FormatsCount value */ > + > + if (FormatsCount > 0) > { > - return; > + Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig, > + sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > } > Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG); > > @@ -1676,36 +1745,43 @@ AcpiDmDumpNhlt ( > > /* Do the Wave_extensible struct */ > > - AcpiOsPrintf ("\n/* Wave_Format_Extensible table #%u */\n", j+1); > + AcpiOsPrintf ("\n /* Wave_Format_Extensible table #%u */\n", j+1); > Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, > sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3); > if (ACPI_FAILURE (Status)) > { > return; > } > - Offset += sizeof (ACPI_NHLT_WAVE_EXTENSIBLE); > > - /* Do the Capabilities array */ > + Offset += sizeof (ACPI_NHLT_FORMAT_CONFIG); > > - Offset += sizeof (UINT32); > - AcpiOsPrintf ("\n/* Specific_Config table #%u */\n", j+1); > - FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); > - Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, > - CapabilitiesSize, AcpiDmTableInfoNhlt3a); > - if (ACPI_FAILURE (Status)) > + if (CapabilitiesSize > 0) > { > - return; > + FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); > + /* Do the Capabilities array (of bytes) */ > + > + AcpiOsPrintf ("\n /* Specific_Config table #%u */\n", j+1); > + FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); > + Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, > + CapabilitiesSize, AcpiDmTableInfoNhlt3a); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += CapabilitiesSize; // + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); > } > - Offset += CapabilitiesSize; > - } > + > + } /* for (j = 0; j < FormatsCount; j++) */ > > /* > - * If we are not done with the Endpoint(s) yet, then there must be > - * some Linux-specific structure(s) yet to be processed. > + * If we are not done with the current Endpoint yet, then there must be > + * some Linux-specific structure(s) yet to be processed. First, get > + * the count of such structure(s). > */ > if (Offset < EndpointEndOffset) > { > - AcpiOsPrintf ("\n"); > + AcpiOsPrintf ("\n /* Linux-specific structures (not part of NHLT spec) */\n"); > Count = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Table, Offset); > Status = AcpiDmDumpTable (TableLength, Offset, Count, > sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT), AcpiDmTableInfoNhlt7); > @@ -1715,14 +1791,32 @@ AcpiDmDumpNhlt ( > } > Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT); > > + if (Count->StructureCount > 1) > + { > + /* > + * We currently cannot disassemble more than one > + * Linux-Specific section, because we have no way of > + * knowing whether the "Specific Data" part is present. > + */ > + Count->StructureCount = 1; > + fprintf (stderr, "%s %s\n", "Feature not supported:", > + "Cannot disassemble more than one Linux-Specific structure"); > + return; > + } > + > /* Variable number of linux-specific structures */ > > - for (k = 0; k < Count->StructureCount; k++) > + for (j = 0; j < Count->StructureCount; j++) > { > LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset); > + AcpiOsPrintf ("\n /* Linux-specific structure #%u (not part of NHLT spec) */\n", j+1); > > - AcpiOsPrintf ("\n/* Linux-specific structure #%u */\n", k+1); > - > + /* > + * Dump the following Linux-specific fields: > + * 1) Device ID > + * 2) Device Instance ID > + * 3) Device Port ID > + */ > Status = AcpiDmDumpTable (TableLength, Offset, LinuxData, > sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA), AcpiDmTableInfoNhlt7a); > if (ACPI_FAILURE (Status)) > @@ -1731,28 +1825,43 @@ AcpiDmDumpNhlt ( > } > > Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA); > - } > > - /* Should be at the end of the Endpoint structure. Skip any extra bytes */ > + /* > + * Check that the current offset is not beyond the end of > + * this endpoint descriptor. If it is not, we assume that > + * the "Specific Data" field is present and valid. Note: > + * This does not seem to be documented anywhere. > + */ > + if (Offset < EndpointEndOffset) > + { > + /* Dump the linux-specific "Specific Data" field */ > > - if (Offset < EndpointEndOffset) > - { > - AcpiOsPrintf ("\n/* Endpoint descriptor ended before endpoint size was reached. " > - "skipped %X input bytes, current offset: %X, Endpoint End Offset: %X */\n", > - EndpointEndOffset - Offset, Offset, EndpointEndOffset); > - AcpiUtDumpBuffer (((UINT8 *)Table)+Offset, > - EndpointEndOffset - Offset, DB_BYTE_DISPLAY, Offset); > - Offset = EndpointEndOffset; > + LinuxDataB = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA_B, Table, Offset); > + Status = AcpiDmDumpTable (TableLength, Offset, LinuxDataB, > + sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B), AcpiDmTableInfoNhlt7b); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B); > + } > } > + > + /* Should be at the end of the Endpoint structure. */ > } > - } > > - /* Emit the table terminator (if present) */ > + } /* for (i = 0; i < EndpointCount; i++) */ > + > > + /* > + * Done with all of the Endpoint Descriptors, Emit the table terminator > + * (if such a legacy structure is present -- not in NHLT specification) > + */ > if (Offset == TableLength - sizeof (ACPI_NHLT_TABLE_TERMINATOR)) > { > LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset); > - AcpiOsPrintf ("\n/* Table terminator structure */\n"); > + AcpiOsPrintf ("\n /* Table terminator structure (not part of NHLT spec) */\n"); > > Status = AcpiDmDumpTable (TableLength, Offset, LinuxData, > sizeof (ACPI_NHLT_TABLE_TERMINATOR), AcpiDmTableInfoNhlt8); > diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c > index 347f9d36..7d812315 100644 > --- a/src/acpica/source/common/dmtbinfo.c > +++ b/src/acpica/source/common/dmtbinfo.c > @@ -292,7 +292,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFacs[] = > ACPI_DMTABLE_INFO AcpiDmTableInfoFadt1[] = > { > {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Facs), "FACS Address", 0}, > - {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Dsdt), "DSDT Address", DT_NON_ZERO}, > + {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Dsdt), "DSDT Address", 0}, > {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Model), "Model", 0}, > {ACPI_DMT_FADTPM, ACPI_FADT_OFFSET (PreferredProfile), "PM Profile", 0}, > {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (SciInterrupt), "SCI Interrupt", 0}, > @@ -408,7 +408,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFadt3[] = > ACPI_DMT_TERMINATOR > }; > > -/* ACPI 5.0 Extensions (FADT version 5) */ > +/* Extensions for FADT version 5 */ > > ACPI_DMTABLE_INFO AcpiDmTableInfoFadt5[] = > { > @@ -417,7 +417,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFadt5[] = > ACPI_DMT_TERMINATOR > }; > > -/* ACPI 6.0 Extensions (FADT version 6) */ > +/* Extensions for FADT version 6 */ > > ACPI_DMTABLE_INFO AcpiDmTableInfoFadt6[] = > { > diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c > index 4cbe112e..ab1b2634 100644 > --- a/src/acpica/source/common/dmtbinfo2.c > +++ b/src/acpica/source/common/dmtbinfo2.c > @@ -188,6 +188,25 @@ > * Remaining tables are not consumed directly by the ACPICA subsystem > */ > > +/******************************************************************************* > + * > + * AGDI - Arm Generic Diagnostic Dump and Reset Device Interface > + * > + * Conforms to "ACPI for Arm Components 1.1, Platform Design Document" > + * ARM DEN0093 v1.1 > + * > + ******************************************************************************/ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoAgdi[] = > +{ > + {ACPI_DMT_UINT8, ACPI_AGDI_OFFSET (Flags), "Flags (decoded below)", 0}, > + {ACPI_DMT_FLAG0, ACPI_AGDI_FLAG_OFFSET (Flags, 0), "Signalling mode", 0}, > + {ACPI_DMT_UINT24, ACPI_AGDI_OFFSET (Reserved[0]), "Reserved", 0}, > + {ACPI_DMT_UINT32, ACPI_AGDI_OFFSET (SdeiEvent), "SdeiEvent", 0}, > + {ACPI_DMT_UINT32, ACPI_AGDI_OFFSET (Gsiv), "Gsiv", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > > /******************************************************************************* > * > @@ -1217,7 +1236,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt0[] = > {ACPI_DMT_NHLT1, ACPI_NHLT0_OFFSET (LinkType), "Link Type", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (InstanceId), "Instance Id", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (VendorId), "Vendor Id", 0}, > - {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (DeviceId), "Device Id", 0}, > + {ACPI_DMT_NHLT1e, ACPI_NHLT0_OFFSET (DeviceId), "Device Id", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (RevisionId), "Revision Id", 0}, > {ACPI_DMT_UINT32, ACPI_NHLT0_OFFSET (SubsystemId), "Subsystem Id", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (DeviceType), "Device Type", 0}, > @@ -1230,9 +1249,9 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt0[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt1[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT1_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > + {ACPI_DMT_UINT32, ACPI_NHLT1_OFFSET (CapabilitiesSize), "Capabilities Size", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT1_OFFSET (VirtualSlot), "Virtual Slot", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT1_OFFSET (ConfigType), "Config Type", 0}, > + {ACPI_DMT_NHLT1f, ACPI_NHLT1_OFFSET (ConfigType), "Config Type", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1253,7 +1272,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt2[] = > ACPI_DMT_TERMINATOR > }; > > -/* Format Config */ > +/* Format Config (wave_format_extensible structure) */ > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3[] = > { > @@ -1267,7 +1286,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3[] = > {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.ValidBitsPerSample), "Valid Bits Per Sample", 0}, > {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (Format.ChannelMask), "Channel Mask", 0}, > {ACPI_DMT_UUID, ACPI_NHLT3_OFFSET (Format.SubFormatGuid), "SubFormat GUID", 0}, > - {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (CapabilitySize), "Capabilities Length", DT_LENGTH}, > + {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (CapabilitySize), "Capabilities Length", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1281,7 +1300,6 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3a[] = > ACPI_DMT_TERMINATOR > }; > > - > /* Formats Config */ > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt4[] = > @@ -1294,9 +1312,8 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt4[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT5_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > {ACPI_DMT_UINT8, ACPI_NHLT5_OFFSET (VirtualSlot), "Virtual Slot", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT5_OFFSET (ConfigType), "Config Type", 0}, > + {ACPI_DMT_NHLT1f, ACPI_NHLT5_OFFSET (ConfigType), "Config Type", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1304,10 +1321,9 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT5A_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (VirtualSlot), "Virtual Slot", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (ConfigType), "Config Type", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (ArrayType), "Array Type", 0}, > + {ACPI_DMT_NHLT1f, ACPI_NHLT5A_OFFSET (ConfigType), "Config Type", 0}, > + {ACPI_DMT_NHLT1d, ACPI_NHLT5A_OFFSET (ArrayType), "Array Type", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1315,7 +1331,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT5B_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > + {ACPI_DMT_UINT32, ACPI_NHLT5B_OFFSET (CapabilitiesSize), "Capabilities Size", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1323,17 +1339,32 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5c[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT5C_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > {ACPI_DMT_UINT8, ACPI_NHLT5C_OFFSET (VirtualSlot), "Virtual Slot", 0}, > ACPI_DMT_TERMINATOR > }; > > /* Microphone array Config */ > > +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6a[] = > +{ > + {ACPI_DMT_UINT8, ACPI_NHLT6A_OFFSET (MicrophoneCount), "Microphone Count", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Render Feedback Device Config, CapabilitiesSize == 7 */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6b[] = > +{ > + {ACPI_DMT_UINT8, ACPI_NHLT6B_OFFSET (FeedbackVirtualSlot), "Feedback Virtual Slot", 0}, > + {ACPI_DMT_UINT16, ACPI_NHLT6B_OFFSET (FeedbackChannels), "Feedback Channels", 0}, > + {ACPI_DMT_UINT16, ACPI_NHLT6B_OFFSET (FeedbackValidBitsPerSample),"Valid Bits Per Sample", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[] = > { > - {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (Type), "Type", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (Panel), "Panel", 0}, > + {ACPI_DMT_NHLT1b, ACPI_NHLT6_OFFSET (Type), "Type", 0}, > + {ACPI_DMT_NHLT1c, ACPI_NHLT6_OFFSET (Panel), "Panel", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (SpeakerPositionDistance), "Speaker Position Distance", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (HorizontalOffset), "Horizontal Offset", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (VerticalOffset), "Vertical Offset", 0}, > @@ -1352,7 +1383,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7[] = > { > - {ACPI_DMT_UINT8, ACPI_NHLT7_OFFSET (StructureCount), "Linux-specific struct count", 0}, > + {ACPI_DMT_UINT8, ACPI_NHLT7_OFFSET (StructureCount), "Linux-specific Count", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1363,7 +1394,12 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7a[] = > {ACPI_DMT_BUF16, ACPI_NHLT7A_OFFSET (DeviceId), "Device ID", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT7A_OFFSET (DeviceInstanceId), "Device Instance ID", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT7A_OFFSET (DevicePortId), "Device Port ID", 0}, > - {ACPI_DMT_BUF18, ACPI_NHLT7A_OFFSET (Filler), "Specific Data", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7b[] = > +{ > + {ACPI_DMT_BUF18, ACPI_NHLT7B_OFFSET (SpecificData), "Specific Data", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1376,6 +1412,15 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt8[] = > ACPI_DMT_TERMINATOR > }; > > +/* Sensitivity Extension */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt9[] = > +{ > + {ACPI_DMT_UINT32, ACPI_NHLT9_OFFSET (SNR), "Signal-to-noise ratio", 0}, > + {ACPI_DMT_UINT32, ACPI_NHLT9_OFFSET (Sensitivity), "Mic Sensitivity", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > > /******************************************************************************* > * > diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c > index 12e1be4c..6bdaf676 100644 > --- a/src/acpica/source/common/dmtbinfo3.c > +++ b/src/acpica/source/common/dmtbinfo3.c > @@ -491,6 +491,20 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[] = > }; > > > +/******************************************************************************* > + * > + * TDEL - TD-Event Log Table > + * > + ******************************************************************************/ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoTdel[] = > +{ > + {ACPI_DMT_UINT32, ACPI_TDEL_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_TDEL_OFFSET (LogAreaMinimumLength), "Log Area Minimum Length", 0}, > + {ACPI_DMT_UINT64, ACPI_TDEL_OFFSET (LogAreaStartAddress), "Log Area Start Address", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > /******************************************************************************* > * > * TPM2 - Trusted Platform Module (TPM) 2.0 Hardware Interface Table > diff --git a/src/acpica/source/compiler/aslcache.c b/src/acpica/source/compiler/aslcache.c > index 51e6f4c4..05ae19b7 100644 > --- a/src/acpica/source/compiler/aslcache.c > +++ b/src/acpica/source/compiler/aslcache.c > @@ -183,6 +183,11 @@ UtLocalCacheCalloc ( > UINT32 CacheSize = ASL_STRING_CACHE_SIZE; > > > +#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED > + /* Used for objects other than strings, so keep allocations aligned */ > + Length = ACPI_ROUND_UP_TO_NATIVE_WORD (Length); > +#endif > + > if (Length > CacheSize) > { > CacheSize = Length; > diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c > index a93417c6..14403d3d 100644 > --- a/src/acpica/source/compiler/aslfiles.c > +++ b/src/acpica/source/compiler/aslfiles.c > @@ -835,8 +835,8 @@ ErrorExit: > * RETURN: Status > * > * DESCRIPTION: Open the specified input file, and save the directory path to > - * the file so that include files can be opened in > - * the same directory. > + * the file so that include files can be opened in the same > + * directory. NOTE: File is opened in text mode. > * > ******************************************************************************/ > > diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c > index 4dd6422b..ca50d281 100644 > --- a/src/acpica/source/compiler/aslmessages.c > +++ b/src/acpica/source/compiler/aslmessages.c > @@ -410,6 +410,8 @@ const char *AslTableCompilerMsgs [] = > /* ASL_MSG_ENTRY_LIST */ "Invalid entry initializer list", > /* ASL_MSG_UNKNOWN_FORMAT */ "Unknown format value", > /* ASL_MSG_RESERVED_VALUE */ "Value for field is reserved or unknown", > +/* ASL_MSG_TWO_ZERO_VALUES */ "32-bit DSDT Address and 64-bit X_DSDT Address cannot both be zero", > +/* ASL_MSG_BAD_PARSE_TREE */ "Parse tree appears to be ill-defined" > }; > > /* Preprocessor */ > diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h > index 69c2561b..0e9fefd4 100644 > --- a/src/acpica/source/compiler/aslmessages.h > +++ b/src/acpica/source/compiler/aslmessages.h > @@ -412,6 +412,8 @@ typedef enum > ASL_MSG_ENTRY_LIST, > ASL_MSG_UNKNOWN_FORMAT, > ASL_MSG_RESERVED_VALUE, > + ASL_MSG_TWO_ZERO_VALUES, > + ASL_MSG_BAD_PARSE_TREE, > > /* These messages are used by the Preprocessor only */ > > diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c > index 97881e14..3954388c 100644 > --- a/src/acpica/source/compiler/aslstartup.c > +++ b/src/acpica/source/compiler/aslstartup.c > @@ -293,9 +293,17 @@ AslDetectSourceFileType ( > goto Cleanup; > } > > - /* We have some sort of binary table, check for valid ACPI table */ > - > - fseek (Info->Handle, 0, SEEK_SET); > + /* > + * We have some sort of binary table; reopen in binary mode, then > + * check for valid ACPI table > + */ > + fclose (Info->Handle); > + Info->Handle = fopen (Info->Filename, "rb"); > + if (!Info->Handle) > + { > + fprintf (stderr, "Could not open input file %s\n", > + Info->Filename); > + } > > Status = AcValidateTableHeader (Info->Handle, 0); > if (ACPI_SUCCESS (Status)) > @@ -446,8 +454,9 @@ AslDoOneFile ( > UtConvertBackslashes (AslGbl_Files[ASL_FILE_INPUT].Filename); > > /* > - * Open the input file. Here, this should be an ASCII source file, > - * either an ASL file or a Data Table file > + * Open the input file. Here, this could be an ASCII source file, > + * either an ASL file or a Data Table file, or a binary AML file > + * or binary data table file (For disassembly). > */ > Status = FlOpenInputFile (AslGbl_Files[ASL_FILE_INPUT].Filename); > if (ACPI_FAILURE (Status)) > @@ -458,8 +467,6 @@ AslDoOneFile ( > > FileNode = FlGetCurrentFileNode(); > > - FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); > - > /* Determine input file type */ > > AslGbl_FileType = AslDetectSourceFileType (&AslGbl_Files[ASL_FILE_INPUT]); > @@ -469,6 +476,8 @@ AslDoOneFile ( > return (AE_ERROR); > } > > + FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); > + > /* > * If -p not specified, we will use the input filename as the > * output filename prefix > diff --git a/src/acpica/source/compiler/asluuid.c b/src/acpica/source/compiler/asluuid.c > index 30540acd..def35c92 100644 > --- a/src/acpica/source/compiler/asluuid.c > +++ b/src/acpica/source/compiler/asluuid.c > @@ -211,4 +211,3 @@ AuValidateUuid ( > > return (AE_OK); > } > - > diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h > index 614a686f..d9c92ce2 100644 > --- a/src/acpica/source/compiler/dtcompiler.h > +++ b/src/acpica/source/compiler/dtcompiler.h > @@ -762,6 +762,7 @@ DtGetGenericTableInfo ( > /* ACPI Table templates */ > > extern const unsigned char TemplateAest[]; > +extern const unsigned char TemplateAgdi[]; > extern const unsigned char TemplateAsf[]; > extern const unsigned char TemplateBoot[]; > extern const unsigned char TemplateBdat[]; > @@ -793,6 +794,7 @@ extern const unsigned char TemplateMpst[]; > extern const unsigned char TemplateMsct[]; > extern const unsigned char TemplateMsdm[]; > extern const unsigned char TemplateNfit[]; > +extern const unsigned char TemplateNhlt[]; > extern const unsigned char TemplatePcct[]; > extern const unsigned char TemplatePdtt[]; > extern const unsigned char TemplatePhat[]; > @@ -814,6 +816,7 @@ extern const unsigned char TemplateSrat[]; > extern const unsigned char TemplateStao[]; > extern const unsigned char TemplateSvkl[]; > extern const unsigned char TemplateTcpa[]; > +extern const unsigned char TemplateTdel[]; > extern const unsigned char TemplateTpm2[]; > extern const unsigned char TemplateUefi[]; > extern const unsigned char TemplateViot[]; > diff --git a/src/acpica/source/compiler/dttable.c b/src/acpica/source/compiler/dttable.c > index 702c83ee..fb3f26f1 100644 > --- a/src/acpica/source/compiler/dttable.c > +++ b/src/acpica/source/compiler/dttable.c > @@ -223,10 +223,12 @@ DtCompileRsdp ( > * > * RETURN: Status > * > - * DESCRIPTION: Compile FADT. > + * DESCRIPTION: Compile FADT (signature FACP). > * > *****************************************************************************/ > > +#define ACPI_XDSDT_LOCATION_IN_LIST 11 > + > ACPI_STATUS > DtCompileFadt ( > void **List) > @@ -235,10 +237,17 @@ DtCompileFadt ( > DT_SUBTABLE *Subtable; > DT_SUBTABLE *ParentTable; > DT_FIELD **PFieldList = (DT_FIELD **) List; > - ACPI_TABLE_HEADER *Table; > + DT_FIELD *DsdtFieldList; > + ACPI_TABLE_FADT *Table; > UINT8 Revision; > + UINT32 DsdtAddress; > + UINT64 X_DsdtAddress; > + UINT32 i; > + > > + /* Get the table revision and 32-bit DSDT Address definition */ > > + DsdtFieldList = (*PFieldList)->Next; > Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1, > &Subtable); > if (ACPI_FAILURE (Status)) > @@ -249,8 +258,16 @@ DtCompileFadt ( > ParentTable = DtPeekSubtable (); > DtInsertSubtable (ParentTable, Subtable); > > - Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); > - Revision = Table->Revision; > + Table = ACPI_CAST_PTR (ACPI_TABLE_FADT, ParentTable->Buffer); > + Revision = Table->Header.Revision; > + DsdtAddress = Table->Dsdt; > + > + /* FADT version 1 has only 32-bit addresses - error if DSDT address is NULL */ > + > + if ((Revision == 1) && (!DsdtAddress)) > + { > + DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, DsdtFieldList, NULL); > + } > > if (Revision == 2) > { > @@ -263,8 +280,24 @@ DtCompileFadt ( > > DtInsertSubtable (ParentTable, Subtable); > } > - else if (Revision >= 2) > + > + else if (Revision > 2) > { > + /* > + * Rev 3 and greater have 64-bit addresses (as well as 32-bit). > + * Get the 64-bit DSDT (X_DSDT) Address definition. Note: This > + * appears at field list offset 11 within AcpiDmTableInfoFadt3. > + */ > + DsdtFieldList = *PFieldList; > + for (i = 0; i < ACPI_XDSDT_LOCATION_IN_LIST; i++) > + { > + DsdtFieldList = DsdtFieldList->Next; > + if (!DsdtFieldList) > + { > + return (ASL_MSG_BAD_PARSE_TREE); > + } > + } > + > Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3, > &Subtable); > if (ACPI_FAILURE (Status)) > @@ -274,6 +307,20 @@ DtCompileFadt ( > > DtInsertSubtable (ParentTable, Subtable); > > + Table = ACPI_CAST_PTR (ACPI_TABLE_FADT, ParentTable->Buffer); > + X_DsdtAddress = Table->XDsdt; > + > + /* > + * Error if both the 32-bit DSDT address and the > + * 64-bit X_DSDT address are zero. > + */ > + if ((!X_DsdtAddress) && (!DsdtAddress)) > + { > + DtError (ASL_ERROR, ASL_MSG_TWO_ZERO_VALUES, DsdtFieldList, NULL); > + } > + > + /* Fields specific to FADT Revision 5 (appended to previous) */ > + > if (Revision >= 5) > { > Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5, > @@ -286,6 +333,8 @@ DtCompileFadt ( > DtInsertSubtable (ParentTable, Subtable); > } > > + /* Fields specific to FADT Revision 6 (appended to previous) */ > + > if (Revision >= 6) > { > Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6, > diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c > index b9445122..85406361 100644 > --- a/src/acpica/source/compiler/dttable2.c > +++ b/src/acpica/source/compiler/dttable2.c > @@ -781,6 +781,390 @@ DtCompileNfit ( > } > > > +/****************************************************************************** > + * > + * FUNCTION: DtCompileNhlt > + * > + * PARAMETERS: List - Current field list pointer > + * > + * RETURN: Status > + * > + * DESCRIPTION: Compile NHLT. > + * > + *****************************************************************************/ > + > +ACPI_STATUS > +DtCompileNhlt ( > + void **List) > +{ > + ACPI_STATUS Status; > + UINT32 EndpointCount; > + UINT32 MicrophoneCount; > + UINT32 FormatsCount; > + DT_SUBTABLE *Subtable; > + DT_SUBTABLE *ParentTable; > + DT_FIELD **PFieldList = (DT_FIELD **) List; > + UINT32 CapabilitiesSize; > + UINT8 ArrayType; > + UINT8 ConfigType; > + UINT8 LinuxSpecificCount; > + UINT32 i; > + UINT32 j; > + ACPI_TABLE_NHLT_ENDPOINT_COUNT *MainTable; > + ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific; > + ACPI_NHLT_VENDOR_MIC_COUNT *MicCount; > + ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; > + ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D *ConfigSpecific; > + ACPI_NHLT_LINUX_SPECIFIC_COUNT *LinuxSpecific; > + > + > + /* Main table */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + /* Get the Endpoint Descriptor count */ > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + MainTable = ACPI_CAST_PTR (ACPI_TABLE_NHLT_ENDPOINT_COUNT, Subtable->Buffer); > + EndpointCount = MainTable->EndpointCount; > + > + /* Subtables */ > + > + while (*PFieldList) > + { > + /* Variable number of Endpoint descriptors */ > + > + for (i = 0; i < EndpointCount; i++) > + { > + /* Do the Endpoint Descriptor */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt0, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + /* Do the Device Specific table */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable->Buffer); > + CapabilitiesSize = DevSpecific->CapabilitiesSize; > + > + ArrayType = 0; > + ConfigType = 0; > + > + switch (CapabilitiesSize) > + { > + case 0: > + break; > + > + case 1: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5c, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + break; > + > + case 2: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + break; > + > + case 3: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); > + ArrayType = ConfigSpecific->ArrayType; > + ConfigType = ConfigSpecific->ConfigType; > + break; > + > + case 7: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6b, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); > + ArrayType = ConfigSpecific->ArrayType; > + ConfigType = ConfigSpecific->ConfigType; > + break; > + > + default: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); > + ArrayType = ConfigSpecific->ArrayType; > + ConfigType = ConfigSpecific->ConfigType; > + break; > + > + } /* switch (CapabilitiesSize) */ > + > + if (CapabilitiesSize >= 3) > + { > + /* Check for a vendor-defined mic array */ > + > + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY) > + { > + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED) > + { > + /* Get the microphone count */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + MicCount = ACPI_CAST_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Subtable->Buffer); > + MicrophoneCount = MicCount->MicrophoneCount; > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + /* Variable number of microphones */ > + > + for (j = 0; j < MicrophoneCount; j++) > + { > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + > + /* Do the MIC_SNR_SENSITIVITY_EXTENSION, if present */ > + > + if (ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) > + { > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt9, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + } > + } > + } > + > + /* Get the formats count */ > + > + DtPopSubtable (); > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt4, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + FormatsConfig = ACPI_CAST_PTR (ACPI_NHLT_FORMATS_CONFIG, Subtable->Buffer); > + FormatsCount = FormatsConfig->FormatsCount; > + > + /* Variable number of wave_format_extensible structs */ > + > + for (j = 0; j < FormatsCount; j++) > + { > + /* Do the main wave_format_extensible structure */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + /* Do the capabilities list */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + DtPopSubtable (); > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + } /* for (j = 0; j < FormatsCount; j++) */ > + > + /* > + * If we are not done with the current Endpoint yet, then there must be > + * some Linux-specific structure(s) yet to be processed. First, get > + * the count of such structure(s). > + */ > + if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) > + { > + /* Get the count of Linux-specific structures */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + LinuxSpecific = ACPI_CAST_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Subtable->Buffer); > + LinuxSpecificCount = LinuxSpecific->StructureCount; > + > + for (j = 0; j < LinuxSpecificCount; j++) > + { > + /* > + * Compile the following Linux-specific fields: > + * 1) Device ID > + * 2) Device Instance ID > + * 3) Device Port ID > + */ > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + /* > + * To have a valid Linux-specific "Specific Data" at this > + * point, we need: > + * 1) The next field must be named "Specific Data" > + */ > + if (!strcmp ((const char *) (*PFieldList)->Name, "Specific Data")) > + { > + /* Compile the "Specific Data" field */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + > + } /* for (j = 0; j < LinuxSpecificCount; j++) */ > + } > + > + DtPopSubtable (); > + > + } /* for (i = 0; i < EndpointCount; i++) */ > + > + /* > + * All Endpoint Descriptors are completed. > + * Do the table terminator structure (not in NHLT spec, optional) > + */ > + if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) > + { > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt8, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + > + return (AE_OK); > + } > + > + return (AE_OK); > +} > + > + > /****************************************************************************** > * > * FUNCTION: DtCompilePcct > @@ -2141,7 +2525,6 @@ DtCompileStao ( > } > > > - > /****************************************************************************** > * > * FUNCTION: DtCompileSvkl > diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h > index 24c8c6f9..e9272f3a 100644 > --- a/src/acpica/source/compiler/dttemplate.h > +++ b/src/acpica/source/compiler/dttemplate.h > @@ -249,6 +249,16 @@ const unsigned char TemplateAest[] = > 0x56,0x00,0x00,0x00 /* 000002C8 "V..." */ > }; > > +const unsigned char TemplateAgdi[] = > +{ > + 0x41,0x47,0x44,0x49,0x30,0x00,0x00,0x00, /* 00000000 "AGDI0..." */ > + 0x01,0xE4,0x41,0x4D,0x50,0x45,0x52,0x45, /* 00000008 "..AMPERE" */ > + 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */ > + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ > + 0x05,0x01,0x21,0x20,0x00,0x00,0x00,0x00, /* 00000020 "..! ...." */ > + 0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00 /* 00000028 "...@...." */ > +}; > + > const unsigned char TemplateAsf[] = > { > 0x41,0x53,0x46,0x21,0x72,0x00,0x00,0x00, /* 00000000 "ASF!r..." */ > @@ -1185,6 +1195,78 @@ const unsigned char TemplateNfit[] = > 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /* 00000180 "........" */ > }; > > +const unsigned char TemplateNhlt[] = > +{ > + 0x4E,0x48,0x4C,0x54,0x1E,0x02,0x00,0x00, /* 00000000 "NHLT...." */ > + 0x01,0xF7,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ > + 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */ > + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ > + 0x30,0x09,0x21,0x20,0x04,0xAD,0x00,0x00, /* 00000020 "0.! ...." */ > + 0x00,0x02,0x06,0x07,0x00,0x30,0xAE,0x09, /* 00000028 ".....0.." */ > + 0x00,0x0A,0x00,0x00,0x00,0x02,0x03,0x0D, /* 00000030 "........" */ > + 0x38,0x00,0x00,0x00,0xCC,0x01,0x1F,0x02, /* 00000038 "8......." */ > + 0x04,0x00,0x13,0x00,0x09,0x00,0x11,0x00, /* 00000040 "........" */ > + 0x04,0x20,0x07,0x00,0x09,0x00,0x18,0x00, /* 00000048 ". ......" */ > + 0x22,0x00,0x11,0x00,0x15,0x00,0x05,0x03, /* 00000050 ""......." */ > + 0x13,0x00,0x09,0x00,0x11,0x00,0x04,0x20, /* 00000058 "....... " */ > + 0x07,0x00,0x09,0x00,0x18,0x00,0x22,0x00, /* 00000060 "......"." */ > + 0x11,0x00,0x15,0x00,0xAA,0xAA,0x99,0x99, /* 00000068 "........" */ > + 0x78,0x56,0x34,0x12,0x02,0xFE,0xFF,0x78, /* 00000070 "xV4....x" */ > + 0x56,0x44,0x33,0x00,0x00,0x66,0x55,0x00, /* 00000078 "VD3..fU." */ > + 0x00,0x00,0x80,0x16,0x00,0x32,0x00,0x04, /* 00000080 ".....2.." */ > + 0x00,0x99,0x99,0x88,0x88,0x6E,0x88,0x9F, /* 00000088 ".....n.." */ > + 0xA6,0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B, /* 00000090 "..l.E..{" */ > + 0x5D,0xCE,0x24,0xC5,0x53,0x02,0x00,0x00, /* 00000098 "].$.S..." */ > + 0x00,0x30,0x40,0xFE,0xFF,0x78,0x56,0x44, /* 000000A0 ".0@..xVD" */ > + 0x33,0x00,0x00,0x66,0x55,0x00,0x00,0x00, /* 000000A8 "3..fU..." */ > + 0x80,0x16,0x00,0x32,0x00,0x04,0x00,0x99, /* 000000B0 "...2...." */ > + 0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6,0xEB, /* 000000B8 "...n...." */ > + 0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D,0xCE, /* 000000C0 "l.E..{]." */ > + 0x24,0xC5,0x53,0x03,0x00,0x00,0x00,0x50, /* 000000C8 "$.S....P" */ > + 0x60,0x70,0x48,0x00,0x00,0x00,0x05,0x06, /* 000000D0 "`pH....." */ > + 0x07,0x00,0x34,0xAE,0x09,0x00,0x0A,0x00, /* 000000D8 "..4....." */ > + 0x00,0x00,0x02,0x00,0x0D,0x02,0x00,0x00, /* 000000E0 "........" */ > + 0x00,0xCC,0x00,0x01,0xFE,0xFF,0x78,0x56, /* 000000E8 "......xV" */ > + 0x44,0x33,0x00,0x00,0x66,0x55,0x00,0x00, /* 000000F0 "D3..fU.." */ > + 0x00,0x80,0x16,0x00,0x32,0x00,0x04,0x00, /* 000000F8 "....2..." */ > + 0x99,0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6, /* 00000100 "....n..." */ > + 0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D, /* 00000108 ".l.E..{]" */ > + 0xCE,0x24,0xC5,0x53,0x02,0x00,0x00,0x00, /* 00000110 ".$.S...." */ > + 0x70,0x80,0x80,0x00,0x00,0x00,0x02,0x06, /* 00000118 "p......." */ > + 0x07,0x00,0x30,0xAE,0x09,0x00,0x0A,0x00, /* 00000120 "..0....." */ > + 0x00,0x00,0x02,0x03,0x0D,0x07,0x00,0x00, /* 00000128 "........" */ > + 0x00,0xCC,0x03,0x09,0x34,0x12,0x28,0x01, /* 00000130 "....4.(." */ > + 0x02,0xFE,0xFF,0x78,0x56,0x44,0x33,0x00, /* 00000138 "...xVD3." */ > + 0x00,0x66,0x55,0x00,0x00,0x00,0x80,0x16, /* 00000140 ".fU....." */ > + 0x00,0x32,0x00,0x04,0x00,0x99,0x99,0x88, /* 00000148 ".2......" */ > + 0x88,0x6E,0x88,0x9F,0xA6,0xEB,0x6C,0x94, /* 00000150 ".n....l." */ > + 0x45,0xA4,0x1F,0x7B,0x5D,0xCE,0x24,0xC5, /* 00000158 "E..{].$." */ > + 0x53,0x04,0x00,0x00,0x00,0x70,0x80,0x90, /* 00000160 "S....p.." */ > + 0xA0,0xFE,0xFF,0x78,0x56,0x44,0x33,0x00, /* 00000168 "...xVD3." */ > + 0x00,0x66,0x55,0x00,0x00,0x00,0x80,0x16, /* 00000170 ".fU....." */ > + 0x00,0x32,0x00,0x04,0x00,0x99,0x99,0x88, /* 00000178 ".2......" */ > + 0x88,0x6E,0x88,0x9F,0xA6,0xEB,0x6C,0x94, /* 00000180 ".n....l." */ > + 0x45,0xA4,0x1F,0x7B,0x5D,0xCE,0x24,0xC5, /* 00000188 "E..{].$." */ > + 0x53,0x05,0x00,0x00,0x00,0x70,0x80,0x90, /* 00000190 "S....p.." */ > + 0xA0,0xB0,0x7C,0x00,0x00,0x00,0x05,0x06, /* 00000198 "..|....." */ > + 0x07,0x00,0x34,0xAE,0x09,0x00,0x0A,0x00, /* 000001A0 "..4....." */ > + 0x00,0x00,0x02,0x00,0x0D,0x02,0x00,0x00, /* 000001A8 "........" */ > + 0x00,0xCC,0x00,0x01,0xFE,0xFF,0x78,0x56, /* 000001B0 "......xV" */ > + 0x44,0x33,0x00,0x00,0x66,0x55,0x00,0x00, /* 000001B8 "D3..fU.." */ > + 0x00,0x80,0x16,0x00,0x32,0x00,0x04,0x00, /* 000001C0 "....2..." */ > + 0x99,0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6, /* 000001C8 "....n..." */ > + 0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D, /* 000001D0 ".l.E..{]" */ > + 0xCE,0x24,0xC5,0x53,0x11,0x00,0x00,0x00, /* 000001D8 ".$.S...." */ > + 0x00,0x01,0x32,0x03,0x04,0x05,0x06,0x37, /* 000001E0 "..2....7" */ > + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x3F, /* 000001E8 ".......?" */ > + 0x0A,0x01,0x00,0x01,0x32,0x03,0x04,0x05, /* 000001F0 "....2..." */ > + 0x06,0x37,0x08,0x09,0x0A,0x0B,0x0C,0x0D, /* 000001F8 ".7......" */ > + 0x0E,0x3F,0x44,0x9A,0x00,0x01,0x32,0x03, /* 00000200 ".?D...2." */ > + 0x04,0x05,0x06,0x37,0x08,0x09,0x0A,0x0B, /* 00000208 "...7...." */ > + 0x0C,0x0D,0x0E,0x3F,0x0A,0x0B,0x04,0x00, /* 00000210 "...?...." */ > + 0x00,0x00,0xEF,0xBE,0xAD,0xDE /* 00000218 "......" */ > +}; > + > const unsigned char TemplatePcct[] = > { > 0x50,0x43,0x43,0x54,0xAE,0x02,0x00,0x00, /* 00000000 "PCCT...." */ > @@ -1756,6 +1838,17 @@ const unsigned char TemplateTcpa[] = > 0x01,0x01,0x01,0x01 /* 00000060 "...." */ > }; > > +const unsigned char TemplateTdel[] = > +{ > + 0x54,0x44,0x45,0x4C,0x38,0x00,0x00,0x00, /* 00000000 "TDEL8..." */ > + 0x04,0x1C,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ > + 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */ > + 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ > + 0x30,0x09,0x21,0x20,0x00,0x00,0x00,0x00, /* 00000020 "0.! ...." */ > + 0xEF,0xCD,0xAB,0x78,0x56,0x34,0x12,0x00, /* 00000028 "...xV4.." */ > + 0x78,0x56,0x34,0x12,0xEF,0xCD,0xAB,0x00 /* 00000030 "xV4....." */ > +}; > + > const unsigned char TemplateTpm2[] = > { > 0x54,0x50,0x4D,0x32,0x4C,0x00,0x00,0x00, /* 00000000 "TPM2L..." */ > diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c > index 52180fb3..2342ace3 100644 > --- a/src/acpica/source/compiler/dtutils.c > +++ b/src/acpica/source/compiler/dtutils.c > @@ -437,6 +437,7 @@ DtGetFieldType ( > case ACPI_DMT_BUF10: > case ACPI_DMT_BUF12: > case ACPI_DMT_BUF16: > + case ACPI_DMT_BUF18: > case ACPI_DMT_BUF128: > case ACPI_DMT_PCI_PATH: > case ACPI_DMT_PMTT_VENDOR: > @@ -583,6 +584,10 @@ DtGetFieldLength ( > case ACPI_DMT_MADT: > case ACPI_DMT_NHLT1: > case ACPI_DMT_NHLT1a: > + case ACPI_DMT_NHLT1b: > + case ACPI_DMT_NHLT1c: > + case ACPI_DMT_NHLT1d: > + case ACPI_DMT_NHLT1f: > case ACPI_DMT_PCCT: > case ACPI_DMT_PMTT: > case ACPI_DMT_PPTT: > @@ -611,6 +616,7 @@ DtGetFieldLength ( > case ACPI_DMT_HEST: > case ACPI_DMT_HMAT: > case ACPI_DMT_NFIT: > + case ACPI_DMT_NHLT1e: > case ACPI_DMT_PCI_PATH: > case ACPI_DMT_PHAT: > > @@ -737,6 +743,11 @@ DtGetFieldLength ( > ByteLength = 16; > break; > > + case ACPI_DMT_BUF18: > + > + ByteLength = 18; > + break; > + > case ACPI_DMT_BUF128: > > ByteLength = 128; > diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c > index 153cd89a..579421fa 100644 > --- a/src/acpica/source/components/dispatcher/dsopcode.c > +++ b/src/acpica/source/components/dispatcher/dsopcode.c > @@ -707,6 +707,7 @@ AcpiDsEvalTableRegionOperands ( > > ObjDesc->Region.Address = ACPI_PTR_TO_PHYSADDR (Table); > ObjDesc->Region.Length = Table->Length; > + ObjDesc->Region.Pointer = Table; > > ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n", > ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), > diff --git a/src/acpica/source/components/events/evhandler.c b/src/acpica/source/components/events/evhandler.c > index 39171014..763b294e 100644 > --- a/src/acpica/source/components/events/evhandler.c > +++ b/src/acpica/source/components/events/evhandler.c > @@ -563,7 +563,7 @@ AcpiEvInstallSpaceHandler ( > case ACPI_ADR_SPACE_DATA_TABLE: > > Handler = AcpiExDataTableSpaceHandler; > - Setup = NULL; > + Setup = AcpiEvDataTableRegionSetup; > break; > > default: > diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c > index 2624cd65..6c73bc80 100644 > --- a/src/acpica/source/components/events/evregion.c > +++ b/src/acpica/source/components/events/evregion.c > @@ -320,6 +320,15 @@ AcpiEvAddressSpaceDispatch ( > return_ACPI_STATUS (AE_NOT_EXIST); > } > > + if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_COMM) > + { > + ACPI_PCC_INFO *Ctx = HandlerDesc->AddressSpace.Context; > + > + Ctx->InternalBuffer = FieldObj->Field.InternalPccBuffer; > + Ctx->Length = (UINT16) RegionObj->Region.Length; > + Ctx->SubspaceId = (UINT8) RegionObj->Region.Address; > + } > + > /* > * We must exit the interpreter because the region setup will > * potentially execute control methods (for example, the _REG method > diff --git a/src/acpica/source/components/events/evrgnini.c b/src/acpica/source/components/events/evrgnini.c > index 9327d8f7..6959ff98 100644 > --- a/src/acpica/source/components/events/evrgnini.c > +++ b/src/acpica/source/components/events/evrgnini.c > @@ -599,6 +599,64 @@ AcpiEvCmosRegionSetup ( > } > > > +/******************************************************************************* > + * > + * FUNCTION: AcpiEvDataTableRegionSetup > + * > + * PARAMETERS: Handle - Region we are interested in > + * Function - Start or stop > + * HandlerContext - Address space handler context > + * RegionContext - Region specific context > + * > + * RETURN: Status > + * > + * DESCRIPTION: Setup a DataTableRegion > + * > + * MUTEX: Assumes namespace is not locked > + * > + ******************************************************************************/ > + > +ACPI_STATUS > +AcpiEvDataTableRegionSetup ( > + ACPI_HANDLE Handle, > + UINT32 Function, > + void *HandlerContext, > + void **RegionContext) > +{ > + ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle; > + ACPI_DATA_TABLE_MAPPING *LocalRegionContext; > + > + > + ACPI_FUNCTION_TRACE (EvDataTableRegionSetup); > + > + > + if (Function == ACPI_REGION_DEACTIVATE) > + { > + if (*RegionContext) > + { > + ACPI_FREE (*RegionContext); > + *RegionContext = NULL; > + } > + return_ACPI_STATUS (AE_OK); > + } > + > + /* Create a new context */ > + > + LocalRegionContext = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DATA_TABLE_MAPPING)); > + if (!(LocalRegionContext)) > + { > + return_ACPI_STATUS (AE_NO_MEMORY); > + } > + > + /* Save the data table pointer for use in the handler */ > + > + LocalRegionContext->Pointer = RegionDesc->Region.Pointer; > + > + *RegionContext = LocalRegionContext; > + return_ACPI_STATUS (AE_OK); > +} > + > + > /******************************************************************************* > * > * FUNCTION: AcpiEvDefaultRegionSetup > diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c > index 301e8830..ff26ade7 100644 > --- a/src/acpica/source/components/executer/exconfig.c > +++ b/src/acpica/source/components/executer/exconfig.c > @@ -596,7 +596,7 @@ AcpiExLoadOp ( > ACPI_INFO (("Dynamic OEM Table Load:")); > AcpiExExitInterpreter (); > Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table), > - ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, TRUE, &TableIndex); > + ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, Table, TRUE, &TableIndex); > AcpiExEnterInterpreter (); > if (ACPI_FAILURE (Status)) > { > diff --git a/src/acpica/source/components/executer/excreate.c b/src/acpica/source/components/executer/excreate.c > index 8afae43c..18a3af2f 100644 > --- a/src/acpica/source/components/executer/excreate.c > +++ b/src/acpica/source/components/executer/excreate.c > @@ -451,6 +451,7 @@ AcpiExCreateRegion ( > ObjDesc->Region.SpaceId = SpaceId; > ObjDesc->Region.Address = 0; > ObjDesc->Region.Length = 0; > + ObjDesc->Region.Pointer = NULL; > ObjDesc->Region.Node = Node; > ObjDesc->Region.Handler = NULL; > ObjDesc->Common.Flags &= > diff --git a/src/acpica/source/components/executer/exfield.c b/src/acpica/source/components/executer/exfield.c > index 7871e350..b33ab5b3 100644 > --- a/src/acpica/source/components/executer/exfield.c > +++ b/src/acpica/source/components/executer/exfield.c > @@ -492,9 +492,7 @@ AcpiExWriteDataToField ( > ObjDesc->Field.BaseByteOffset, > SourceDesc->Buffer.Pointer, DataLength); > > - if ((ObjDesc->Field.RegionObj->Region.Address == PCC_MASTER_SUBSPACE && > - MASTER_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) || > - GENERIC_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) > + if (MASTER_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) > { > /* Perform the write */ > > diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c > index bf40b697..424e1e99 100644 > --- a/src/acpica/source/components/executer/exoparg1.c > +++ b/src/acpica/source/components/executer/exoparg1.c > @@ -1193,7 +1193,7 @@ AcpiExOpcode_1A_0T_1R ( > WalkState, ReturnDesc, &TempDesc); > if (ACPI_FAILURE (Status)) > { > - goto Cleanup; > + return_ACPI_STATUS (Status); > } > > ReturnDesc = TempDesc; > diff --git a/src/acpica/source/components/executer/exregion.c b/src/acpica/source/components/executer/exregion.c > index 2f49eb0a..cd1fa2eb 100644 > --- a/src/acpica/source/components/executer/exregion.c > +++ b/src/acpica/source/components/executer/exregion.c > @@ -692,9 +692,17 @@ AcpiExDataTableSpaceHandler ( > void *HandlerContext, > void *RegionContext) > { > + ACPI_DATA_TABLE_MAPPING *Mapping; > + char *Pointer; > + > + > ACPI_FUNCTION_TRACE (ExDataTableSpaceHandler); > > > + Mapping = (ACPI_DATA_TABLE_MAPPING *) RegionContext; > + Pointer = ACPI_CAST_PTR (char, Mapping->Pointer) + > + (Address - ACPI_PTR_TO_PHYSADDR (Mapping->Pointer)); > + > /* > * Perform the memory read or write. The BitWidth was already > * validated. > @@ -703,14 +711,12 @@ AcpiExDataTableSpaceHandler ( > { > case ACPI_READ: > > - memcpy (ACPI_CAST_PTR (char, Value), ACPI_PHYSADDR_TO_PTR (Address), > - ACPI_DIV_8 (BitWidth)); > + memcpy (ACPI_CAST_PTR (char, Value), Pointer, ACPI_DIV_8 (BitWidth)); > break; > > case ACPI_WRITE: > > - memcpy (ACPI_PHYSADDR_TO_PTR (Address), ACPI_CAST_PTR (char, Value), > - ACPI_DIV_8 (BitWidth)); > + memcpy (Pointer, ACPI_CAST_PTR (char, Value), ACPI_DIV_8 (BitWidth)); > break; > > default: > diff --git a/src/acpica/source/components/hardware/hwesleep.c b/src/acpica/source/components/hardware/hwesleep.c > index e8db4d26..19463e5a 100644 > --- a/src/acpica/source/components/hardware/hwesleep.c > +++ b/src/acpica/source/components/hardware/hwesleep.c > @@ -261,7 +261,10 @@ AcpiHwExtendedSleep ( > > /* Flush caches, as per ACPI specification */ > > - ACPI_FLUSH_CPU_CACHE (); > + if (SleepState < ACPI_STATE_S4) > + { > + ACPI_FLUSH_CPU_CACHE (); > + } > > Status = AcpiOsEnterSleep (SleepState, SleepControl, 0); > if (Status == AE_CTRL_TERMINATE) > diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c > index 2b857d97..4d581da3 100644 > --- a/src/acpica/source/components/hardware/hwsleep.c > +++ b/src/acpica/source/components/hardware/hwsleep.c > @@ -262,7 +262,10 @@ AcpiHwLegacySleep ( > > /* Flush caches, as per ACPI specification */ > > - ACPI_FLUSH_CPU_CACHE (); > + if (SleepState < ACPI_STATE_S4) > + { > + ACPI_FLUSH_CPU_CACHE (); > + } > > Status = AcpiOsEnterSleep (SleepState, Pm1aControl, Pm1bControl); > if (Status == AE_CTRL_TERMINATE) > @@ -376,7 +379,7 @@ AcpiHwLegacyWakePrep ( > > Pm1aControl |= (AcpiGbl_SleepTypeAS0 << > SleepTypeRegInfo->BitPosition); > - Pm1aControl |= (AcpiGbl_SleepTypeBS0 << > + Pm1bControl |= (AcpiGbl_SleepTypeBS0 << > SleepTypeRegInfo->BitPosition); > > /* Write the control registers and ignore any errors */ > diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c > index f1a1344c..106dea0d 100644 > --- a/src/acpica/source/components/hardware/hwxfsleep.c > +++ b/src/acpica/source/components/hardware/hwxfsleep.c > @@ -353,8 +353,6 @@ AcpiEnterSleepStateS4bios ( > return_ACPI_STATUS (Status); > } > > - ACPI_FLUSH_CPU_CACHE (); > - > Status = AcpiHwWritePort (AcpiGbl_FADT.SmiCommand, > (UINT32) AcpiGbl_FADT.S4BiosRequest, 8); > if (ACPI_FAILURE (Status)) > diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c > index 522234d9..6f3f7113 100644 > --- a/src/acpica/source/components/tables/tbdata.c > +++ b/src/acpica/source/components/tables/tbdata.c > @@ -243,14 +243,28 @@ AcpiTbInitTableDescriptor ( > { > > /* > - * Initialize the table descriptor. Set the pointer to NULL, since the > - * table is not fully mapped at this time. > + * Initialize the table descriptor. Set the pointer to NULL for external > + * tables, since the table is not fully mapped at this time. > */ > memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC)); > TableDesc->Address = Address; > TableDesc->Length = Table->Length; > TableDesc->Flags = Flags; > ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature); > + > + switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) > + { > + case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: > + case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: > + > + TableDesc->Pointer = Table; > + break; > + > + case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: > + default: > + > + break; > + } > } > > > @@ -290,8 +304,7 @@ AcpiTbAcquireTable ( > case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: > case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: > > - Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, > - ACPI_PHYSADDR_TO_PTR (TableDesc->Address)); > + Table = TableDesc->Pointer; > break; > > default: > @@ -359,6 +372,8 @@ AcpiTbReleaseTable ( > * PARAMETERS: TableDesc - Table descriptor to be acquired > * Address - Address of the table > * Flags - Allocation flags of the table > + * Table - Pointer to the table (required for virtual > + * origins, optional for physical) > * > * RETURN: Status > * > @@ -373,9 +388,10 @@ ACPI_STATUS > AcpiTbAcquireTempTable ( > ACPI_TABLE_DESC *TableDesc, > ACPI_PHYSICAL_ADDRESS Address, > - UINT8 Flags) > + UINT8 Flags, > + ACPI_TABLE_HEADER *Table) > { > - ACPI_TABLE_HEADER *TableHeader; > + BOOLEAN MappedTable = FALSE; > > > switch (Flags & ACPI_TABLE_ORIGIN_MASK) > @@ -384,37 +400,43 @@ AcpiTbAcquireTempTable ( > > /* Get the length of the full table from the header */ > > - TableHeader = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER)); > - if (!TableHeader) > + if (!Table) > { > - return (AE_NO_MEMORY); > + Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER)); > + if (!Table) > + { > + return (AE_NO_MEMORY); > + } > + > + MappedTable = TRUE; > } > > - AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader); > - AcpiOsUnmapMemory (TableHeader, sizeof (ACPI_TABLE_HEADER)); > - return (AE_OK); > + break; > > case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: > case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: > > - TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, > - ACPI_PHYSADDR_TO_PTR (Address)); > - if (!TableHeader) > + if (!Table) > { > - return (AE_NO_MEMORY); > + return (AE_BAD_PARAMETER); > } > > - AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader); > - return (AE_OK); > + break; > > default: > > - break; > + /* Table is not valid yet */ > + > + return (AE_NO_MEMORY); > } > > - /* Table is not valid yet */ > + AcpiTbInitTableDescriptor (TableDesc, Address, Flags, Table); > + if (MappedTable) > + { > + AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER)); > + } > > - return (AE_NO_MEMORY); > + return (AE_OK); > } > > > @@ -513,7 +535,20 @@ AcpiTbInvalidateTable ( > > AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length, > TableDesc->Flags); > - TableDesc->Pointer = NULL; > + > + switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) > + { > + case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: > + > + TableDesc->Pointer = NULL; > + break; > + > + case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: > + case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: > + default: > + > + break; > + } > > return_VOID; > } > @@ -1219,6 +1254,9 @@ AcpiTbLoadTable ( > * > * PARAMETERS: Address - Physical address of the table > * Flags - Allocation flags of the table > + * Table - Pointer to the table (required for > + * virtual origins, optional for > + * physical) > * Override - Whether override should be performed > * TableIndex - Where table index is returned > * > @@ -1232,6 +1270,7 @@ ACPI_STATUS > AcpiTbInstallAndLoadTable ( > ACPI_PHYSICAL_ADDRESS Address, > UINT8 Flags, > + ACPI_TABLE_HEADER *Table, > BOOLEAN Override, > UINT32 *TableIndex) > { > @@ -1244,7 +1283,7 @@ AcpiTbInstallAndLoadTable ( > > /* Install the table and load it into the namespace */ > > - Status = AcpiTbInstallStandardTable (Address, Flags, TRUE, > + Status = AcpiTbInstallStandardTable (Address, Flags, Table, TRUE, > Override, &i); > if (ACPI_FAILURE (Status)) > { > diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c > index 8196e7af..ff00c2f2 100644 > --- a/src/acpica/source/components/tables/tbfadt.c > +++ b/src/acpica/source/components/tables/tbfadt.c > @@ -486,7 +486,7 @@ AcpiTbParseFadt ( > > AcpiTbInstallStandardTable ( > (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XDsdt, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, > &AcpiGbl_DsdtIndex); > > /* If Hardware Reduced flag is set, there is no FACS */ > @@ -497,14 +497,14 @@ AcpiTbParseFadt ( > { > AcpiTbInstallStandardTable ( > (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.Facs, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, > &AcpiGbl_FacsIndex); > } > if (AcpiGbl_FADT.XFacs) > { > AcpiTbInstallStandardTable ( > (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XFacs, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, > &AcpiGbl_XFacsIndex); > } > } > diff --git a/src/acpica/source/components/tables/tbinstal.c b/src/acpica/source/components/tables/tbinstal.c > index dcbb2a74..f628b460 100644 > --- a/src/acpica/source/components/tables/tbinstal.c > +++ b/src/acpica/source/components/tables/tbinstal.c > @@ -227,6 +227,8 @@ AcpiTbInstallTableWithOverride ( > * PARAMETERS: Address - Address of the table (might be a virtual > * address depending on the TableFlags) > * Flags - Flags for the table > + * Table - Pointer to the table (required for virtual > + * origins, optional for physical) > * Reload - Whether reload should be performed > * Override - Whether override should be performed > * TableIndex - Where the table index is returned > @@ -245,6 +247,7 @@ ACPI_STATUS > AcpiTbInstallStandardTable ( > ACPI_PHYSICAL_ADDRESS Address, > UINT8 Flags, > + ACPI_TABLE_HEADER *Table, > BOOLEAN Reload, > BOOLEAN Override, > UINT32 *TableIndex) > @@ -259,7 +262,7 @@ AcpiTbInstallStandardTable ( > > /* Acquire a temporary table descriptor for validation */ > > - Status = AcpiTbAcquireTempTable (&NewTableDesc, Address, Flags); > + Status = AcpiTbAcquireTempTable (&NewTableDesc, Address, Flags, Table); > if (ACPI_FAILURE (Status)) > { > ACPI_ERROR ((AE_INFO, > @@ -369,7 +372,7 @@ AcpiTbOverrideTable ( > if (ACPI_SUCCESS (Status) && Table) > { > AcpiTbAcquireTempTable (&NewTableDesc, ACPI_PTR_TO_PHYSADDR (Table), > - ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL); > + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table); > ACPI_ERROR_ONLY (OverrideType = "Logical"); > goto FinishOverride; > } > @@ -381,7 +384,7 @@ AcpiTbOverrideTable ( > if (ACPI_SUCCESS (Status) && Address && Length) > { > AcpiTbAcquireTempTable (&NewTableDesc, Address, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL); > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL); > ACPI_ERROR_ONLY (OverrideType = "Physical"); > goto FinishOverride; > } > @@ -457,7 +460,8 @@ AcpiTbUninstallTable ( > if ((TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) == > ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL) > { > - ACPI_FREE (ACPI_PHYSADDR_TO_PTR (TableDesc->Address)); > + ACPI_FREE (TableDesc->Pointer); > + TableDesc->Pointer = NULL; > } > > TableDesc->Address = ACPI_PTR_TO_PHYSADDR (NULL); > diff --git a/src/acpica/source/components/tables/tbprint.c b/src/acpica/source/components/tables/tbprint.c > index 392ff95a..5985abdb 100644 > --- a/src/acpica/source/components/tables/tbprint.c > +++ b/src/acpica/source/components/tables/tbprint.c > @@ -261,7 +261,8 @@ AcpiTbPrintTableHeader ( > Header->Signature, ACPI_FORMAT_UINT64 (Address), > Header->Length)); > } > - else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) > + else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, > + Header)->Signature)) > { > /* RSDP has no common fields */ > > diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c > index 6316f258..76d8ef3b 100644 > --- a/src/acpica/source/components/tables/tbutils.c > +++ b/src/acpica/source/components/tables/tbutils.c > @@ -500,7 +500,8 @@ AcpiTbParseRootTable ( > } > > Status = AcpiTbInstallStandardTable (Address, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, &TableIndex); > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, > + &TableIndex); > > if (ACPI_SUCCESS (Status) && > ACPI_COMPARE_NAMESEG ( > diff --git a/src/acpica/source/components/tables/tbxfload.c b/src/acpica/source/components/tables/tbxfload.c > index 046487ba..9e90c91b 100644 > --- a/src/acpica/source/components/tables/tbxfload.c > +++ b/src/acpica/source/components/tables/tbxfload.c > @@ -396,9 +396,7 @@ UnlockAndExit: > * > * FUNCTION: AcpiInstallTable > * > - * PARAMETERS: Address - Address of the ACPI table to be installed. > - * Physical - Whether the address is a physical table > - * address or not > + * PARAMETERS: Table - Pointer to the ACPI table to be installed. > * > * RETURN: Status > * > @@ -410,28 +408,17 @@ UnlockAndExit: > > ACPI_STATUS ACPI_INIT_FUNCTION > AcpiInstallTable ( > - ACPI_PHYSICAL_ADDRESS Address, > - BOOLEAN Physical) > + ACPI_TABLE_HEADER *Table) > { > ACPI_STATUS Status; > - UINT8 Flags; > UINT32 TableIndex; > > > ACPI_FUNCTION_TRACE (AcpiInstallTable); > > > - if (Physical) > - { > - Flags = ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL; > - } > - else > - { > - Flags = ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL; > - } > - > - Status = AcpiTbInstallStandardTable (Address, Flags, > - FALSE, FALSE, &TableIndex); > + Status = AcpiTbInstallStandardTable (ACPI_PTR_TO_PHYSADDR (Table), > + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table, FALSE, FALSE, &TableIndex); > > return_ACPI_STATUS (Status); > } > @@ -439,6 +426,40 @@ AcpiInstallTable ( > ACPI_EXPORT_SYMBOL_INIT (AcpiInstallTable) > > > +/******************************************************************************* > + * > + * FUNCTION: AcpiInstallPhysicalTable > + * > + * PARAMETERS: Address - Address of the ACPI table to be installed. > + * > + * RETURN: Status > + * > + * DESCRIPTION: Dynamically install an ACPI table. > + * Note: This function should only be invoked after > + * AcpiInitializeTables() and before AcpiLoadTables(). > + * > + ******************************************************************************/ > + > +ACPI_STATUS ACPI_INIT_FUNCTION > +AcpiInstallPhysicalTable ( > + ACPI_PHYSICAL_ADDRESS Address) > +{ > + ACPI_STATUS Status; > + UINT32 TableIndex; > + > + > + ACPI_FUNCTION_TRACE (AcpiInstallPhysicalTable); > + > + > + Status = AcpiTbInstallStandardTable (Address, > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, FALSE, &TableIndex); > + > + return_ACPI_STATUS (Status); > +} > + > +ACPI_EXPORT_SYMBOL_INIT (AcpiInstallPhysicalTable) > + > + > /******************************************************************************* > * > * FUNCTION: AcpiLoadTable > @@ -481,7 +502,7 @@ AcpiLoadTable ( > > ACPI_INFO (("Host-directed Dynamic ACPI Table Load:")); > Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table), > - ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex); > + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table, FALSE, &TableIndex); > if (TableIdx) > { > *TableIdx = TableIndex; > diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c > index 624aa687..de114cb6 100644 > --- a/src/acpica/source/components/utilities/utdelete.c > +++ b/src/acpica/source/components/utilities/utdelete.c > @@ -594,6 +594,7 @@ AcpiUtUpdateRefCount ( > ACPI_WARNING ((AE_INFO, > "Obj %p, Reference Count is already zero, cannot decrement\n", > Object)); > + return; > } > > ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, > diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h > index 6e162d6a..17d70d4e 100644 > --- a/src/acpica/source/include/acdisasm.h > +++ b/src/acpica/source/include/acdisasm.h > @@ -257,6 +257,7 @@ typedef enum > ACPI_DMT_AEST_RES, > ACPI_DMT_AEST_XFACE, > ACPI_DMT_AEST_XRUPT, > + ACPI_DMT_AGDI, > ACPI_DMT_ASF, > ACPI_DMT_CEDT, > ACPI_DMT_DMAR, > @@ -280,6 +281,11 @@ typedef enum > ACPI_DMT_NFIT, > ACPI_DMT_NHLT1, > ACPI_DMT_NHLT1a, > + ACPI_DMT_NHLT1b, > + ACPI_DMT_NHLT1c, > + ACPI_DMT_NHLT1d, > + ACPI_DMT_NHLT1e, > + ACPI_DMT_NHLT1f, > ACPI_DMT_PCCT, > ACPI_DMT_PHAT, > ACPI_DMT_PMTT, > @@ -381,6 +387,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestVendorError[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestGicError[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestXrupt[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoAgdi[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf0[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1a[]; > @@ -559,9 +566,13 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5c[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6a[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6b[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7a[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7b[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt8[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt9[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhatHdr[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0a[]; > @@ -635,6 +646,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoSvkl0[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaHdr[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaClient[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTdel[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2a[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm211[]; > @@ -882,6 +894,10 @@ void > AcpiDmDumpTcpa ( > ACPI_TABLE_HEADER *Table); > > +void > +AcpiDmDumpTdel ( > + ACPI_TABLE_HEADER *Table); > + > void > AcpiDmDumpTpm2 ( > ACPI_TABLE_HEADER *Table); > diff --git a/src/acpica/source/include/acevents.h b/src/acpica/source/include/acevents.h > index 77475ac9..dda14495 100644 > --- a/src/acpica/source/include/acevents.h > +++ b/src/acpica/source/include/acevents.h > @@ -457,6 +457,13 @@ AcpiEvPciBarRegionSetup ( > void *HandlerContext, > void **RegionContext); > > +ACPI_STATUS > +AcpiEvDataTableRegionSetup ( > + ACPI_HANDLE Handle, > + UINT32 Function, > + void *HandlerContext, > + void **RegionContext); > + > ACPI_STATUS > AcpiEvDefaultRegionSetup ( > ACPI_HANDLE Handle, > diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h > index e7d9f1c9..51a397f2 100644 > --- a/src/acpica/source/include/acobject.h > +++ b/src/acpica/source/include/acobject.h > @@ -313,6 +313,7 @@ typedef struct acpi_object_region > union acpi_operand_object *Next; > ACPI_PHYSICAL_ADDRESS Address; > UINT32 Length; > + void *Pointer; /* Only for data table regions */ > > } ACPI_OBJECT_REGION; > > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index 7f4b31ee..c07d0de2 100644 > --- a/src/acpica/source/include/acpixf.h > +++ b/src/acpica/source/include/acpixf.h > @@ -154,7 +154,7 @@ > > /* Current ACPICA subsystem version in YYYYMMDD format */ > > -#define ACPI_CA_VERSION 0x20210930 > +#define ACPI_CA_VERSION 0x20211217 > > #include "acconfig.h" > #include "actypes.h" > @@ -658,8 +658,12 @@ AcpiDecodePldBuffer ( > ACPI_EXTERNAL_RETURN_STATUS ( > ACPI_STATUS ACPI_INIT_FUNCTION > AcpiInstallTable ( > - ACPI_PHYSICAL_ADDRESS Address, > - BOOLEAN Physical)) > + ACPI_TABLE_HEADER *Table)) > + > +ACPI_EXTERNAL_RETURN_STATUS ( > +ACPI_STATUS ACPI_INIT_FUNCTION > +AcpiInstallPhysicalTable ( > + ACPI_PHYSICAL_ADDRESS Address)) > > ACPI_EXTERNAL_RETURN_STATUS ( > ACPI_STATUS > diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h > index 038085c8..d0845643 100644 > --- a/src/acpica/source/include/actables.h > +++ b/src/acpica/source/include/actables.h > @@ -193,7 +193,8 @@ ACPI_STATUS > AcpiTbAcquireTempTable ( > ACPI_TABLE_DESC *TableDesc, > ACPI_PHYSICAL_ADDRESS Address, > - UINT8 Flags); > + UINT8 Flags, > + ACPI_TABLE_HEADER *Table); > > void > AcpiTbReleaseTempTable ( > @@ -279,6 +280,7 @@ ACPI_STATUS > AcpiTbInstallStandardTable ( > ACPI_PHYSICAL_ADDRESS Address, > UINT8 Flags, > + ACPI_TABLE_HEADER *Table, > BOOLEAN Reload, > BOOLEAN Override, > UINT32 *TableIndex); > @@ -296,6 +298,7 @@ ACPI_STATUS > AcpiTbInstallAndLoadTable ( > ACPI_PHYSICAL_ADDRESS Address, > UINT8 Flags, > + ACPI_TABLE_HEADER *Table, > BOOLEAN Override, > UINT32 *TableIndex); > > diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h > index 8a9ff736..7402d97b 100644 > --- a/src/acpica/source/include/actbinfo.h > +++ b/src/acpica/source/include/actbinfo.h > @@ -152,6 +152,7 @@ > /* > * Macros used to generate offsets to specific table fields > */ > +#define ACPI_AGDI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_AGDI,f) > #define ACPI_FACS_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_FACS,f) > #define ACPI_GAS_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_GENERIC_ADDRESS,f) > #define ACPI_HDR_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_HEADER,f) > @@ -197,6 +198,7 @@ > #define ACPI_STAO_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_STAO,f) > #define ACPI_SVKL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SVKL,f) > #define ACPI_TCPA_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_HDR,f) > +#define ACPI_TDEL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TDEL,f) > #define ACPI_TPM2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM2,f) > #define ACPI_TPM23_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM23,f) > #define ACPI_UEFI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_UEFI,f) > @@ -339,9 +341,13 @@ > #define ACPI_NHLT5B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B,f) > #define ACPI_NHLT5C_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C,f) > #define ACPI_NHLT6_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_VENDOR_MIC_CONFIG,f) > +#define ACPI_NHLT6A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_VENDOR_MIC_COUNT,f) > +#define ACPI_NHLT6B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG,f) > #define ACPI_NHLT7_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_COUNT,f) > #define ACPI_NHLT7A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_DATA,f) > +#define ACPI_NHLT7B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_DATA_B,f) > #define ACPI_NHLT8_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_TABLE_TERMINATOR,f) > +#define ACPI_NHLT9_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION,f) > #define ACPI_PCCT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_SUBSPACE,f) > #define ACPI_PCCT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED,f) > #define ACPI_PCCT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f) > @@ -408,6 +414,7 @@ > #define ACPI_AEST0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_AEST_PROCESSOR,f,o) > #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_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/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h > index 0c80aae2..eaa2e243 100644 > --- a/src/acpica/source/include/actbl2.h > +++ b/src/acpica/source/include/actbl2.h > @@ -168,6 +168,7 @@ > * file. Useful because they make it more difficult to inadvertently type in > * the wrong signature. > */ > +#define ACPI_SIG_AGDI "AGDI" /* Arm Generic Diagnostic Dump and Reset Device Interface */ > #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 */ > @@ -192,6 +193,7 @@ > #define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */ > #define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */ > #define ACPI_SIG_SVKL "SVKL" /* Storage Volume Key Location Table */ > +#define ACPI_SIG_TDEL "TDEL" /* TD Event Log Table */ > > > /* > @@ -309,7 +311,7 @@ typedef struct acpi_aest_processor_tlb > > typedef struct acpi_aest_processor_generic > { > - UINT8 *Resource; > + UINT32 Resource; > > } ACPI_AEST_PROCESSOR_GENERIC; > > @@ -400,6 +402,28 @@ typedef struct acpi_aest_node_interrupt > #define ACPI_AEST_XRUPT_RESERVED 2 /* 2 and above are reserved */ > > > +/******************************************************************************* > + * AGDI - Arm Generic Diagnostic Dump and Reset Device Interface > + * > + * Conforms to "ACPI for Arm Components 1.1, Platform Design Document" > + * ARM DEN0093 v1.1 > + * > + ******************************************************************************/ > +typedef struct acpi_table_agdi > +{ > + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ > + UINT8 Flags; > + UINT8 Reserved[3]; > + UINT32 SdeiEvent; > + UINT32 Gsiv; > + > +} ACPI_TABLE_AGDI; > + > +/* Mask for Flags field above */ > + > +#define ACPI_AGDI_SIGNALING_MODE (1) > + > + > /******************************************************************************* > * > * BDAT - BIOS Data ACPI Table > @@ -1796,6 +1820,12 @@ typedef struct acpi_table_nhlt > > } ACPI_TABLE_NHLT; > > +typedef struct acpi_table_nhlt_endpoint_count > +{ > + UINT8 EndpointCount; > + > +} ACPI_TABLE_NHLT_ENDPOINT_COUNT; > + > typedef struct acpi_nhlt_endpoint > { > UINT32 DescriptorLength; > @@ -1852,6 +1882,8 @@ typedef struct acpi_nhlt_endpoint > #define ACPI_NHLT_DIR_RENDER_FEEDBACK 3 > #define ACPI_NHLT_DIR_RESERVED 4 /* 4 and above are reserved */ > > +/* Capabilities = 2 */ > + > typedef struct acpi_nhlt_device_specific_config > { > UINT32 CapabilitiesSize; > @@ -1860,6 +1892,8 @@ typedef struct acpi_nhlt_device_specific_config > > } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG; > > +/* Capabilities = 3 */ > + > typedef struct acpi_nhlt_device_specific_config_a > { > UINT32 CapabilitiesSize; > @@ -1869,14 +1903,24 @@ typedef struct acpi_nhlt_device_specific_config_a > > } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A; > > -/* Values for Config Type above */ > +/* Capabilities = 3 */ > + > +typedef struct acpi_nhlt_device_specific_config_d > +{ > + UINT8 VirtualSlot; > + UINT8 ConfigType; > + UINT8 ArrayType; > > -#define ACPI_NHLT_TYPE_MIC_ARRAY 0x01 > -#define ACPI_NHLT_TYPE_GENERIC 0x00 > +} ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D; > > -/* Mask for Extension field of ArrayType */ > +/* Values for Config Type above */ > + > +#define ACPI_NHLT_CONFIG_TYPE_GENERIC 0x00 > +#define ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY 0x01 > +#define ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK 0x03 > +#define ACPI_NHLT_CONFIG_TYPE_RESERVED 0x04 /* 4 and above are reserved */ > > -#define ACPI_NHLT_ARRAY_TYPE_MASK 0x10 > +/* Capabilities = 0 */ > > typedef struct acpi_nhlt_device_specific_config_b > { > @@ -1884,6 +1928,8 @@ typedef struct acpi_nhlt_device_specific_config_b > > } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B; > > +/* Capabilities = 1 */ > + > typedef struct acpi_nhlt_device_specific_config_c > { > UINT32 CapabilitiesSize; > @@ -1891,6 +1937,13 @@ typedef struct acpi_nhlt_device_specific_config_c > > } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C; > > +typedef struct acpi_nhlt_render_device_specific_config > +{ > + UINT32 CapabilitiesSize; > + UINT8 VirtualSlot; > + > +} ACPI_NHLT_RENDER_DEVICE_SPECIFIC_CONFIG; > + > typedef struct acpi_nhlt_wave_extensible > { > UINT16 FormatTag; > @@ -1963,18 +2016,24 @@ typedef struct acpi_nhlt_mic_device_specific_config > > /* Values for ArrayTypeExt above */ > > -#define SMALL_LINEAR_2ELEMENT 0x0A > -#define BIG_LINEAR_2ELEMENT 0x0B > -#define FIRST_GEOMETRY_LINEAR_4ELEMENT 0x0C > -#define PLANAR_LSHAPED_4ELEMENT 0x0D > -#define SECOND_GEOMETRY_LINEAR_4ELEMENT 0x0E > -#define VENDOR_DEFINED 0x0F > -#define ARRAY_TYPE_MASK 0x0F > -#define ARRAY_TYPE_EXT_MASK 0x10 > +#define ACPI_NHLT_ARRAY_TYPE_RESERVED 0x09 // 9 and below are reserved > +#define ACPI_NHLT_SMALL_LINEAR_2ELEMENT 0x0A > +#define ACPI_NHLT_BIG_LINEAR_2ELEMENT 0x0B > +#define ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT 0x0C > +#define ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT 0x0D > +#define ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT 0x0E > +#define ACPI_NHLT_VENDOR_DEFINED 0x0F > +#define ACPI_NHLT_ARRAY_TYPE_MASK 0x0F > +#define ACPI_NHLT_ARRAY_TYPE_EXT_MASK 0x10 > + > +#define ACPI_NHLT_NO_EXTENSION 0x0 > +#define ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT (1<<4) > > -#define NO_EXTENSION 0x0 > -#define MIC_SNR_SENSITIVITY_EXT 0x1 > +typedef struct acpi_nhlt_vendor_mic_count > +{ > + UINT8 MicrophoneCount; > > +} ACPI_NHLT_VENDOR_MIC_COUNT; > > typedef struct acpi_nhlt_vendor_mic_config > { > @@ -1996,22 +2055,25 @@ typedef struct acpi_nhlt_vendor_mic_config > > /* Values for Type field above */ > > -#define MIC_OMNIDIRECTIONAL 0 > -#define MIC_SUBCARDIOID 1 > -#define MIC_CARDIOID 2 > -#define MIC_SUPER_CARDIOID 3 > -#define MIC_HYPER_CARDIOID 4 > -#define MIC_8_SHAPED 5 > -#define MIC_VENDOR_DEFINED 7 > +#define ACPI_NHLT_MIC_OMNIDIRECTIONAL 0 > +#define ACPI_NHLT_MIC_SUBCARDIOID 1 > +#define ACPI_NHLT_MIC_CARDIOID 2 > +#define ACPI_NHLT_MIC_SUPER_CARDIOID 3 > +#define ACPI_NHLT_MIC_HYPER_CARDIOID 4 > +#define ACPI_NHLT_MIC_8_SHAPED 5 > +#define ACPI_NHLT_MIC_RESERVED6 6 // 6 is reserved > +#define ACPI_NHLT_MIC_VENDOR_DEFINED 7 > +#define ACPI_NHLT_MIC_RESERVED 8 // 8 and above are reserved > > /* Values for Panel field above */ > > -#define MIC_TOP 0 > -#define MIC_BOTTOM 1 > -#define MIC_LEFT 2 > -#define MIC_RIGHT 3 > -#define MIC_FRONT 4 > -#define MIC_REAR 5 > +#define ACPI_NHLT_MIC_POSITION_TOP 0 > +#define ACPI_NHLT_MIC_POSITION_BOTTOM 1 > +#define ACPI_NHLT_MIC_POSITION_LEFT 2 > +#define ACPI_NHLT_MIC_POSITION_RIGHT 3 > +#define ACPI_NHLT_MIC_POSITION_FRONT 4 > +#define ACPI_NHLT_MIC_POSITION_BACK 5 > +#define ACPI_NHLT_MIC_POSITION_RESERVED 6 // 6 and above are reserved > > typedef struct acpi_nhlt_vendor_mic_device_specific_config > { > @@ -2030,9 +2092,10 @@ typedef struct acpi_nhlt_mic_snr_sensitivity_extension > > } ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION; > > +/* Render device with feedback */ > + > typedef struct acpi_nhlt_render_feedback_device_specific_config > { > - ACPI_NHLT_DEVICE_SPECIFIC_CONFIG DeviceConfig; > UINT8 FeedbackVirtualSlot; // Render slot in case of capture > UINT16 FeedbackChannels; // Informative only > UINT16 FeedbackValidBitsPerSample; > @@ -2052,10 +2115,15 @@ typedef struct acpi_nhlt_linux_specific_data > UINT8 DeviceId[16]; > UINT8 DeviceInstanceId; > UINT8 DevicePortId; > - UINT8 Filler[18]; > > } ACPI_NHLT_LINUX_SPECIFIC_DATA; > > +typedef struct acpi_nhlt_linux_specific_data_b > +{ > + UINT8 SpecificData[18]; > + > +} ACPI_NHLT_LINUX_SPECIFIC_DATA_B; > + > typedef struct acpi_nhlt_table_terminator > { > UINT32 TerminatorValue; > @@ -3008,6 +3076,24 @@ enum acpi_svkl_format > }; > > > +/******************************************************************************* > + * > + * TDEL - TD-Event Log > + * From: "Guest-Host-Communication Interface (GHCI) for Intel > + * Trust Domain Extensions (Intel TDX)". > + * September 2020 > + * > + ******************************************************************************/ > + > +typedef struct acpi_table_tdel > +{ > + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ > + UINT32 Reserved; > + UINT64 LogAreaMinimumLength; > + UINT64 LogAreaStartAddress; > + > +} ACPI_TABLE_TDEL; > + > /* Reset to default packing */ > > #pragma pack() > diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h > index 5138342c..6805b48f 100644 > --- a/src/acpica/source/include/actypes.h > +++ b/src/acpica/source/include/actypes.h > @@ -660,7 +660,6 @@ typedef UINT64 ACPI_INTEGER; > #define ACPI_TO_POINTER(i) ACPI_CAST_PTR (void, (ACPI_SIZE) (i)) > #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) 0) > #define ACPI_OFFSET(d, f) ACPI_PTR_DIFF (&(((d *) 0)->f), (void *) 0) > -#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i) > #define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i) > > /* Optimizations for 4-character (32-bit) ACPI_NAME manipulation */ > @@ -687,9 +686,14 @@ typedef UINT64 ACPI_INTEGER; > * Can be used with AccessSize field of ACPI_GENERIC_ADDRESS and > * ACPI_RESOURCE_GENERIC_REGISTER. > */ > -#define ACPI_ACCESS_BIT_WIDTH(AccessSize) (1 << ((AccessSize) + 2)) > -#define ACPI_ACCESS_BYTE_WIDTH(AccessSize) (1 << ((AccessSize) - 1)) > - > +#define ACPI_ACCESS_BIT_SHIFT 2 > +#define ACPI_ACCESS_BYTE_SHIFT -1 > +#define ACPI_ACCESS_BIT_MAX (31 - ACPI_ACCESS_BIT_SHIFT) > +#define ACPI_ACCESS_BYTE_MAX (31 - ACPI_ACCESS_BYTE_SHIFT) > +#define ACPI_ACCESS_BIT_DEFAULT (8 - ACPI_ACCESS_BIT_SHIFT) > +#define ACPI_ACCESS_BYTE_DEFAULT (8 - ACPI_ACCESS_BYTE_SHIFT) > +#define ACPI_ACCESS_BIT_WIDTH(size) (1 << ((size) + ACPI_ACCESS_BIT_SHIFT)) > +#define ACPI_ACCESS_BYTE_WIDTH(size) (1 << ((size) + ACPI_ACCESS_BYTE_SHIFT)) > > /******************************************************************************* > * > @@ -1319,6 +1323,14 @@ typedef struct acpi_connection_info > > } ACPI_CONNECTION_INFO; > > +/* Special Context data for PCC Opregion (ACPI 6.3) */ > + > +typedef struct acpi_pcc_info { > + UINT8 SubspaceId; > + UINT16 Length; > + UINT8 *InternalBuffer; > +} ACPI_PCC_INFO; > + > > typedef > ACPI_STATUS (*ACPI_ADR_SPACE_SETUP) ( > @@ -1458,6 +1470,12 @@ typedef struct acpi_mem_space_context > > } ACPI_MEM_SPACE_CONTEXT; > > +typedef struct acpi_data_table_space_context > +{ > + void *Pointer; > + > +} ACPI_DATA_TABLE_MAPPING; > + > > /* > * ACPI_MEMORY_LIST is used only if the ACPICA local cache is enabled Acked-by: Alex Hung <alex.hung@canonical.com>
On 1/31/22 00:34, Colin Ian King wrote: > Changes in this release of ACPICA are detailed at the following > link on the ACPICA developer mailing list: > > https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/XA2YNYE3AZ67XXHUXVRPITIWCVQD5XHV/ > > Signed-off-by: Colin Ian King <colin.i.king@gmail.com> > --- > src/acpica/source/common/acfileio.c | 11 +- > src/acpica/source/common/ahtable.c | 3 + > src/acpica/source/common/dmtable.c | 158 ++++++- > src/acpica/source/common/dmtbdump.c | 70 +++- > src/acpica/source/common/dmtbdump1.c | 2 - > src/acpica/source/common/dmtbdump2.c | 247 +++++++---- > src/acpica/source/common/dmtbinfo.c | 6 +- > src/acpica/source/common/dmtbinfo2.c | 79 +++- > src/acpica/source/common/dmtbinfo3.c | 14 + > src/acpica/source/compiler/aslcache.c | 5 + > src/acpica/source/compiler/aslfiles.c | 4 +- > src/acpica/source/compiler/aslmessages.c | 2 + > src/acpica/source/compiler/aslmessages.h | 2 + > src/acpica/source/compiler/aslstartup.c | 23 +- > src/acpica/source/compiler/asluuid.c | 1 - > src/acpica/source/compiler/dtcompiler.h | 3 + > src/acpica/source/compiler/dttable.c | 59 ++- > src/acpica/source/compiler/dttable2.c | 385 +++++++++++++++++- > src/acpica/source/compiler/dttemplate.h | 93 +++++ > src/acpica/source/compiler/dtutils.c | 11 + > .../source/components/dispatcher/dsopcode.c | 1 + > .../source/components/events/evhandler.c | 2 +- > .../source/components/events/evregion.c | 9 + > .../source/components/events/evrgnini.c | 58 +++ > .../source/components/executer/exconfig.c | 2 +- > .../source/components/executer/excreate.c | 1 + > .../source/components/executer/exfield.c | 4 +- > .../source/components/executer/exoparg1.c | 2 +- > .../source/components/executer/exregion.c | 14 +- > .../source/components/hardware/hwesleep.c | 5 +- > .../source/components/hardware/hwsleep.c | 7 +- > .../source/components/hardware/hwxfsleep.c | 2 - > src/acpica/source/components/tables/tbdata.c | 85 ++-- > src/acpica/source/components/tables/tbfadt.c | 6 +- > .../source/components/tables/tbinstal.c | 12 +- > src/acpica/source/components/tables/tbprint.c | 3 +- > src/acpica/source/components/tables/tbutils.c | 3 +- > .../source/components/tables/tbxfload.c | 57 ++- > .../source/components/utilities/utdelete.c | 1 + > src/acpica/source/include/acdisasm.h | 16 + > src/acpica/source/include/acevents.h | 7 + > src/acpica/source/include/acobject.h | 1 + > src/acpica/source/include/acpixf.h | 10 +- > src/acpica/source/include/actables.h | 5 +- > src/acpica/source/include/actbinfo.h | 7 + > src/acpica/source/include/actbl2.h | 148 +++++-- > src/acpica/source/include/actypes.h | 26 +- > 47 files changed, 1442 insertions(+), 230 deletions(-) > > diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c > index 99f89729..3e26ac3f 100644 > --- a/src/acpica/source/common/acfileio.c > +++ b/src/acpica/source/common/acfileio.c > @@ -552,10 +552,15 @@ AcValidateTableHeader ( > /* Read a potential table header */ > > OriginalOffset = ftell (File); > - fseek (File, TableOffset, SEEK_SET); > - > + if (fseek (File, TableOffset, SEEK_SET)) > + { > + fprintf (stderr, "SEEK error\n"); > + } > Actual = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File); > - fseek (File, OriginalOffset, SEEK_SET); > + if (fseek (File, OriginalOffset, SEEK_SET)) > + { > + fprintf (stderr, "SEEK error\n"); > + } > > if (Actual < sizeof (ACPI_TABLE_HEADER)) > { > diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c > index d7ce88a9..def42520 100644 > --- a/src/acpica/source/common/ahtable.c > +++ b/src/acpica/source/common/ahtable.c > @@ -200,6 +200,7 @@ AcpiAhGetTableInfo ( > const AH_TABLE AcpiGbl_SupportedTables[] = > { > {ACPI_SIG_AEST, "Arm Error Source Table"}, > + {ACPI_SIG_AGDI, "Arm Generic Diagnostic Dump and Reset Device Interface Table"}, > {ACPI_SIG_ASF, "Alert Standard Format Table"}, > {ACPI_SIG_BDAT, "BIOS Data ACPI Table"}, > {ACPI_SIG_BERT, "Boot Error Record Table"}, > @@ -233,6 +234,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] = > {ACPI_SIG_MSCT, "Maximum System Characteristics Table"}, > {ACPI_SIG_MSDM, "Microsoft Data Management Table"}, > {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"}, > + {ACPI_SIG_NHLT, "Non HD Audio Link Table"}, > {ACPI_SIG_PCCT, "Platform Communications Channel Table"}, > {ACPI_SIG_PDTT, "Platform Debug Trigger Table"}, > {ACPI_SIG_PHAT, "Platform Health Assessment Table"}, > @@ -256,6 +258,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] = > {ACPI_SIG_STAO, "Status Override Table"}, > {ACPI_SIG_SVKL, "Storage Volume Key Location Table"}, > {ACPI_SIG_TCPA, "Trusted Computing Platform Alliance Table"}, > + {ACPI_SIG_TDEL, "TD-Event Log Table"}, > {ACPI_SIG_TPM2, "Trusted Platform Module hardware interface Table"}, > {ACPI_SIG_UEFI, "UEFI Boot Optimization Table"}, > {ACPI_SIG_VIOT, "Virtual I/O Translation Table"}, > diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c > index dff1c613..3137132a 100644 > --- a/src/acpica/source/common/dmtable.c > +++ b/src/acpica/source/common/dmtable.c > @@ -167,10 +167,11 @@ AcpiAhGetTableInfo ( > > /* Common format strings for commented values */ > > -#define UINT8_FORMAT "%2.2X [%s]\n" > -#define UINT16_FORMAT "%4.4X [%s]\n" > -#define UINT32_FORMAT "%8.8X [%s]\n" > -#define STRING_FORMAT "[%s]\n" > +#define UINT8_FORMAT "%2.2X [%s]\n" > +#define UINT8_FORMAT_NO_NEWLINE "%2.2X [%s]" > +#define UINT16_FORMAT "%4.4X [%s]\n" > +#define UINT32_FORMAT "%8.8X [%s]\n" > +#define STRING_FORMAT "[%s]\n" > > /* These tables map a subtable type to a description string */ > > @@ -437,6 +438,50 @@ static const char *AcpiDmNhltDirectionNames[] = > "Unknown Direction" /* Reserved */ > }; > > +static const char *AcpiDmNhltMicTypeNames[] = > +{ > + "Omnidirectional", /* ACPI_NHLT_MIC_OMNIDIRECTIONAL */ > + "Subcardioid", /* ACPI_NHLT_MIC_SUBCARDIOID */ > + "Cardioid", /* ACPI_NHLT_MIC_CARDIOID */ > + "SuperCardioid", /* ACPI_NHLT_MIC_SUPER_CARDIOID */ > + "HyperCardioid", /* ACPI_NHLT_MIC_HYPER_CARDIOID */ > + "8 Shaped", /* ACPI_NHLT_MIC_8_SHAPED */ > + "Reserved Mic Type", /* Reserved */ > + "Vendor Defined", /* ACPI_NHLT_MIC_VENDOR_DEFINED */ > + "Unknown Mic Type" /* ACPI_NHLT_MIC_RESERVED */ > +}; > + > +static const char *AcpiDmNhltMicPositionNames[] = > +{ > + "Top", /* ACPI_NHLT_MIC_POSITION_TOP */ > + "Bottom", /* ACPI_NHLT_MIC_POSITION_BOTTOM */ > + "Left", /* ACPI_NHLT_MIC_POSITION_LEFT */ > + "Right", /* ACPI_NHLT_MIC_POSITION_RIGHT */ > + "Front", /* ACPI_NHLT_MIC_POSITION_FRONT */ > + "Back", /* ACPI_NHLT_MIC_POSITION_BACK */ > + "Unknown Mic Position" /* 6 and above are reserved */ > +}; > + > +static const char *AcpiDmNhltMicArrayTypeNames[] = > +{ > + "Unknown Array Type", /* ACPI_NHLT_ARRAY_TYPE_RESERVED */ > + "Small Linear 2-element", /* ACPI_NHLT_SMALL_LINEAR_2ELEMENT */ > + "Big Linear 2-element", /* ACPI_NHLT_BIG_LINEAR_2ELEMENT */ > + "Linear 4-element 1st Geometry", /* ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT */ > + "Planar L-shaped 4-element", /* ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT */ > + "Linear 4-element 2nd Geometry", /* ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT */ > + "Vendor Defined" /* ACPI_NHLT_VENDOR_DEFINED */ > +}; > + > +static const char *AcpiDmNhltConfigTypeNames[] = > +{ > + "Generic Type", /* ACPI_NHLT_CONFIG_TYPE_GENERIC */ > + "Microphone Array", /* ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY */ > + "Reserved", /* ACPI_NHLT_CONFIG_TYPE_RESERVED */ > + "Render Feedback", /* ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK */ > + "Unknown Config Type" /* ACPI_NHLT_CONFIG_TYPE_RESERVED */ > +}; > + > static const char *AcpiDmPcctSubnames[] = > { > "Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */ > @@ -604,6 +649,7 @@ static const char *AcpiDmGasAccessWidth[] = > const ACPI_DMTABLE_DATA AcpiDmTableData[] = > { > {ACPI_SIG_AEST, NULL, AcpiDmDumpAest, DtCompileAest, TemplateAest}, > + {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi, NULL, NULL, TemplateAgdi}, > {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf}, > {ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat}, > {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert}, > @@ -635,7 +681,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = > {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct}, > {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm}, > {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit}, > - {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, NULL, NULL}, > + {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, DtCompileNhlt, TemplateNhlt}, > {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct}, > {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt}, > {ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat}, > @@ -657,6 +703,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = > {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao}, > {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl}, > {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa}, > + {ACPI_SIG_TDEL, AcpiDmTableInfoTdel, NULL, NULL, TemplateTdel}, > {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2}, > {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi}, > {ACPI_SIG_VIOT, AcpiDmTableInfoViot, AcpiDmDumpViot, DtCompileViot, TemplateViot}, > @@ -795,7 +842,8 @@ AcpiDmDumpDataTable ( > return; > } > } > - else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature)) > + else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, > + Table)->Signature)) > { > Length = AcpiDmDumpRsdp (Table); > } > @@ -1040,7 +1088,7 @@ AcpiDmDumpTable ( > > /* Check for beyond subtable end or (worse) beyond EOT */ > > - if (SubtableLength && (Info->Offset >= SubtableLength)) > + if (SubtableLength && (Info->Offset > SubtableLength)) > { > AcpiOsPrintf ( > "/**** ACPI subtable terminates early (Len %u) - " > @@ -1074,6 +1122,10 @@ AcpiDmDumpTable ( > case ACPI_DMT_MADT: > case ACPI_DMT_NHLT1: > case ACPI_DMT_NHLT1a: > + case ACPI_DMT_NHLT1b: > + case ACPI_DMT_NHLT1c: > + case ACPI_DMT_NHLT1d: > + case ACPI_DMT_NHLT1f: > case ACPI_DMT_PCCT: > case ACPI_DMT_PMTT: > case ACPI_DMT_PPTT: > @@ -1102,6 +1154,7 @@ AcpiDmDumpTable ( > case ACPI_DMT_HEST: > case ACPI_DMT_HMAT: > case ACPI_DMT_NFIT: > + case ACPI_DMT_NHLT1e: > case ACPI_DMT_PHAT: > > ByteLength = 2; > @@ -1848,6 +1901,95 @@ AcpiDmDumpTable ( > AcpiDmNhltDirectionNames[Temp8]); > break; > > + case ACPI_DMT_NHLT1b: > + > + /* NHLT microphone type */ > + > + Temp8 = *Target; > + if (Temp8 > ACPI_NHLT_MIC_RESERVED) > + { > + Temp8 = ACPI_NHLT_MIC_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT, *Target, > + AcpiDmNhltMicTypeNames[Temp8]); > + break; > + > + case ACPI_DMT_NHLT1c: > + > + /* NHLT microphone position */ > + > + Temp8 = *Target; > + if (Temp8 > ACPI_NHLT_MIC_POSITION_RESERVED) > + { > + Temp8 = ACPI_NHLT_MIC_POSITION_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT, *Target, > + AcpiDmNhltMicPositionNames[Temp8]); > + break; > + > + case ACPI_DMT_NHLT1d: > + > + /* NHLT microphone array type */ > + > + Temp8 = *Target & ACPI_NHLT_ARRAY_TYPE_MASK; > + if (Temp8 < ACPI_NHLT_ARRAY_TYPE_RESERVED) > + { > + Temp8 = ACPI_NHLT_ARRAY_TYPE_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT_NO_NEWLINE, *Target, > + AcpiDmNhltMicArrayTypeNames[Temp8 - ACPI_NHLT_ARRAY_TYPE_RESERVED]); > + > + Temp8 = *Target; > + if (Temp8 & ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT) > + { > + AcpiOsPrintf (" [%s]", "SNR and Sensitivity"); > + } > + > + AcpiOsPrintf ("\n"); > + break; > + > + case ACPI_DMT_NHLT1e: > + > + /* NHLT Endpoint Device ID */ > + > + Temp16 = ACPI_GET16 (Target); > + if (Temp16 == 0xAE20) > + { > + Name = "PDM DMIC"; > + } > + else if (Temp16 == 0xAE30) > + { > + Name = "BT Sideband"; > + } > + else if (Temp16 == 0xAE34) > + { > + Name = "I2S/TDM Codecs"; > + } > + else > + { > + Name = "Unknown Device ID"; > + } > + > + AcpiOsPrintf (UINT16_FORMAT, Temp16, Name); > + break; > + > + case ACPI_DMT_NHLT1f: > + > + /* NHLT ConfigType field */ > + > + Temp8 = *Target; > + if (Temp8 > ACPI_NHLT_CONFIG_TYPE_RESERVED) > + { > + Temp8 = ACPI_NHLT_CONFIG_TYPE_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT, *Target, > + AcpiDmNhltConfigTypeNames[Temp8]); > + break; > + > case ACPI_DMT_PCCT: > > /* PCCT subtable types */ > @@ -1929,7 +2071,7 @@ AcpiDmDumpTable ( > break; > } > > - AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL); > + AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL); > break; > > case ACPI_DMT_RGRT: > diff --git a/src/acpica/source/common/dmtbdump.c b/src/acpica/source/common/dmtbdump.c > index abeb06fa..86c90d67 100644 > --- a/src/acpica/source/common/dmtbdump.c > +++ b/src/acpica/source/common/dmtbdump.c > @@ -195,7 +195,9 @@ AcpiDmDumpBuffer ( > char *Header) > { > UINT8 *Buffer; > + UINT8 BufChar; > UINT32 i; > + UINT32 j; > > > if (!Length) > @@ -208,20 +210,72 @@ AcpiDmDumpBuffer ( > > while (i < Length) > { > - if (!(i % 16)) > + if ((Length > 16) && (i != 0)) > { > - /* Insert a backslash - line continuation character */ > + if ((Length - i) < 16) > + AcpiOsPrintf ("\n/* %3.3Xh %4.4u %3u */ ", AbsoluteOffset, AbsoluteOffset, Length - i); > + else > + AcpiOsPrintf ("\n/* %3.3Xh %4.4u 16 */ ", AbsoluteOffset, AbsoluteOffset); > + } > + AbsoluteOffset += 16; > + > + /* Emit the raw data bytes*/ > > - if (Length > 16) > + for (j = 0; j < 16; j++) > + { > + if (i + j >= Length) > { > - AcpiOsPrintf ("\\\n "); > + /* Dump fill spaces */ > + > + AcpiOsPrintf ("%*s", (48 - (3 * (Length -i))), " "); > + break; > } > + AcpiOsPrintf ("%.02X ", Buffer[(ACPI_SIZE) i + j]); > + } > + > + /* Emit the ASCII equivalent to the raw data bytes */ > + > + for (j = 0; j < 16; j++) > + { > + if (i + j >= Length) > + { > + AcpiOsPrintf (" */\\\n"); > + return; > + } > + > + /* > + * Add comment characters so rest of line is ignored when > + * compiled > + */ > + if (j == 0) > + { > + AcpiOsPrintf ("/* "); > + } > + > + BufChar = Buffer[(ACPI_SIZE) i + j]; > + if (isprint (BufChar)) > + { > + AcpiOsPrintf ("%c", BufChar); > + } > + else > + { > + AcpiOsPrintf ("."); > + } > + } > + > + /* Done with that line. */ > + /* Close the comment and insert a backslash - line continuation character */ > + > + if (Length > 16) > + { > + AcpiOsPrintf (" */\\"); > + } > + else > + { > + AcpiOsPrintf (" */\\"); > } > > - AcpiOsPrintf ("%.02X ", *Buffer); > - i++; > - Buffer++; > - AbsoluteOffset++; > + i += 16; /* Point to next line */ > } > > AcpiOsPrintf ("\n"); > diff --git a/src/acpica/source/common/dmtbdump1.c b/src/acpica/source/common/dmtbdump1.c > index 3a97af46..fd5e2fd9 100644 > --- a/src/acpica/source/common/dmtbdump1.c > +++ b/src/acpica/source/common/dmtbdump1.c > @@ -296,8 +296,6 @@ AcpiDmDumpAest ( > case ACPI_AEST_GENERIC_RESOURCE: > InfoTable = AcpiDmTableInfoAestGenRsrc; > Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC); > - AcpiOsPrintf ("Generic Resource Type (%X) is not supported at this time\n", > - ProcessorSubtable->ResourceType); > break; > > /* Error case below */ > diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c > index 118b96ee..04f7139f 100644 > --- a/src/acpica/source/common/dmtbdump2.c > +++ b/src/acpica/source/common/dmtbdump2.c > @@ -1494,19 +1494,21 @@ AcpiDmDumpNhlt ( > UINT32 CapabilitiesSize; > UINT32 i; > UINT32 j; > - UINT32 k; > UINT32 EndpointEndOffset; > UINT8 ConfigType = 0; > UINT8 ArrayType; > + UINT8 MicrophoneCount; > + ACPI_NHLT_VENDOR_MIC_COUNT *MicCount; > ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific; > ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; > ACPI_NHLT_LINUX_SPECIFIC_COUNT *Count; > ACPI_NHLT_LINUX_SPECIFIC_DATA *LinuxData; > + ACPI_NHLT_LINUX_SPECIFIC_DATA_B *LinuxDataB; > > > /* Main table */ > > - AcpiOsPrintf ("/* Main table */\n"); > + AcpiOsPrintf (" /* Main table */\n"); > > Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt); > if (ACPI_FAILURE (Status)) > @@ -1532,52 +1534,59 @@ AcpiDmDumpNhlt ( > /* Do the Endpoint Descriptor table */ > > Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > + > + /* Check for endpoint descriptor length beyond end-of-table */ > + > if (Subtable->DescriptorLength > TableLength) > { > Offset += 1; > - AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than" > + AcpiOsPrintf ("\n /* Endpoint Descriptor Length larger than" > " table size: %X, table %X, adjusting table offset (+1) */\n", > Subtable->DescriptorLength, TableLength); > > Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > } > > - AcpiOsPrintf ("\n/* Endpoint Descriptor #%u */\n", i+1); > + AcpiOsPrintf ("\n /* Endpoint Descriptor #%u */\n", i+1); > Status = AcpiDmDumpTable (TableLength, Offset, Subtable, > Subtable->DescriptorLength, AcpiDmTableInfoNhlt0); > if (ACPI_FAILURE (Status)) > { > return; > } > + > EndpointEndOffset = Subtable->DescriptorLength + Offset; > > /* Check for endpoint descriptor beyond end-of-table */ > > if (Subtable->DescriptorLength > TableLength) > { > - AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than table size: %X, table %X */\n", > + AcpiOsPrintf ("\n /* Endpoint Descriptor Length larger than table size: %X, table %X */\n", > Subtable->DescriptorLength, TableLength); > } > + > Offset += sizeof (ACPI_NHLT_ENDPOINT); > Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > > /* Do the Device Specific table */ > > - AcpiOsPrintf ("\n/* Endpoint Device_Specific_Config table */\n"); > + AcpiOsPrintf ("\n /* Endpoint Device_Specific_Config table */\n"); > DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); > CapabilitiesSize = DevSpecific->CapabilitiesSize; > + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + ArrayType = 0; > > /* Different subtables based upon capabilities_size */ > > switch (CapabilitiesSize) > { > case 0: > - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > - sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); > - if (ACPI_FAILURE (Status)) > - { > - return; > - } > Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); > break; > > @@ -1602,6 +1611,9 @@ AcpiDmDumpNhlt ( > break; > > case 3: > + default: > + /* Extract the ConfigType and ArrayType */ > + > ConfigType = DevSpecific->ConfigType; > ArrayType = DevSpecific->ArrayType; > > @@ -1614,56 +1626,113 @@ AcpiDmDumpNhlt ( > > /* Capabilities Size == 3 */ > Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A); > + break; > > - /* Check for a vendor-defined mic array */ > + case 7: > + ConfigType = DevSpecific->ConfigType; > + Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); > > - if ((ConfigType == ACPI_NHLT_TYPE_MIC_ARRAY) && ((ArrayType & ARRAY_TYPE_MASK) == VENDOR_DEFINED)) > + AcpiOsPrintf ("\n /* Render Feedback Device-Specific table */\n"); > + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5); > + if (ACPI_FAILURE (Status)) > { > - /* Vendor-defined microphone array */ > + return; > + } > > - AcpiOsPrintf ("\n/* Vendor-defined microphone array */\n"); > + /* Capabilities Size = 7 */ > + Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG); > + > + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK) > + { > + Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); > + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); > > Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > - sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6); > + sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt6b); > if (ACPI_FAILURE (Status)) > { > return; > } > - Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG); > + Offset += sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG); > } > break; > + } > > - default: > - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > - sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); > - if (ACPI_FAILURE (Status)) > - { > - return; > - } > + /* Check for a vendor-defined mic array */ > > - Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); > - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > - CapabilitiesSize, AcpiDmTableInfoNhlt3a); > - if (ACPI_FAILURE (Status)) > + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY) > + { > + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED) > { > - return; > + /* Vendor-defined microphone array; get the microphone count first */ > + > + AcpiOsPrintf ("\n /* Vendor-defined microphone count */\n"); > + MicCount = ACPI_ADD_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Table, Offset); > + MicrophoneCount = MicCount->MicrophoneCount; > + > + Status = AcpiDmDumpTable (TableLength, Offset, MicCount, > + sizeof (ACPI_NHLT_VENDOR_MIC_COUNT), AcpiDmTableInfoNhlt6a); > + Offset += sizeof (ACPI_NHLT_VENDOR_MIC_COUNT); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + /* Get the vendor microphone config structure(s) */ > + > + for (j = 0; j < MicrophoneCount; j++) > + { > + AcpiOsPrintf ("\n /* Vendor-defined microphone array #%u*/\n", j+1); > + DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset); > + > + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > + sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG); > + } > + > + /* Check for Microphone SNR and sensitivity extension */ > + > + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) == ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT) > + { > + AcpiOsPrintf ("\n /* Microphone SNR and sensitivity array */\n"); > + DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset); > + > + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, > + sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION), AcpiDmTableInfoNhlt9); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION); > + } > } > - Offset += CapabilitiesSize; > - break; > } > > - /* Do the Formats_Config table */ > + /* Do the Formats_Config table - starts with the FormatsCount field */ > > FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset); > FormatsCount = FormatsConfig->FormatsCount; > > - AcpiOsPrintf ("\n/* Formats_Config table */\n"); > + AcpiOsPrintf ("\n /* Formats_Config table */\n"); > > - Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig, > - sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4); > - if (ACPI_FAILURE (Status)) > + /* Dump the FormatsCount value */ > + > + if (FormatsCount > 0) > { > - return; > + Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig, > + sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > } > Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG); > > @@ -1676,36 +1745,43 @@ AcpiDmDumpNhlt ( > > /* Do the Wave_extensible struct */ > > - AcpiOsPrintf ("\n/* Wave_Format_Extensible table #%u */\n", j+1); > + AcpiOsPrintf ("\n /* Wave_Format_Extensible table #%u */\n", j+1); > Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, > sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3); > if (ACPI_FAILURE (Status)) > { > return; > } > - Offset += sizeof (ACPI_NHLT_WAVE_EXTENSIBLE); > > - /* Do the Capabilities array */ > + Offset += sizeof (ACPI_NHLT_FORMAT_CONFIG); > > - Offset += sizeof (UINT32); > - AcpiOsPrintf ("\n/* Specific_Config table #%u */\n", j+1); > - FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); > - Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, > - CapabilitiesSize, AcpiDmTableInfoNhlt3a); > - if (ACPI_FAILURE (Status)) > + if (CapabilitiesSize > 0) > { > - return; > + FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); > + /* Do the Capabilities array (of bytes) */ > + > + AcpiOsPrintf ("\n /* Specific_Config table #%u */\n", j+1); > + FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); > + Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, > + CapabilitiesSize, AcpiDmTableInfoNhlt3a); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += CapabilitiesSize; // + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); > } > - Offset += CapabilitiesSize; > - } > + > + } /* for (j = 0; j < FormatsCount; j++) */ > > /* > - * If we are not done with the Endpoint(s) yet, then there must be > - * some Linux-specific structure(s) yet to be processed. > + * If we are not done with the current Endpoint yet, then there must be > + * some Linux-specific structure(s) yet to be processed. First, get > + * the count of such structure(s). > */ > if (Offset < EndpointEndOffset) > { > - AcpiOsPrintf ("\n"); > + AcpiOsPrintf ("\n /* Linux-specific structures (not part of NHLT spec) */\n"); > Count = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Table, Offset); > Status = AcpiDmDumpTable (TableLength, Offset, Count, > sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT), AcpiDmTableInfoNhlt7); > @@ -1715,14 +1791,32 @@ AcpiDmDumpNhlt ( > } > Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT); > > + if (Count->StructureCount > 1) > + { > + /* > + * We currently cannot disassemble more than one > + * Linux-Specific section, because we have no way of > + * knowing whether the "Specific Data" part is present. > + */ > + Count->StructureCount = 1; > + fprintf (stderr, "%s %s\n", "Feature not supported:", > + "Cannot disassemble more than one Linux-Specific structure"); > + return; > + } > + > /* Variable number of linux-specific structures */ > > - for (k = 0; k < Count->StructureCount; k++) > + for (j = 0; j < Count->StructureCount; j++) > { > LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset); > + AcpiOsPrintf ("\n /* Linux-specific structure #%u (not part of NHLT spec) */\n", j+1); > > - AcpiOsPrintf ("\n/* Linux-specific structure #%u */\n", k+1); > - > + /* > + * Dump the following Linux-specific fields: > + * 1) Device ID > + * 2) Device Instance ID > + * 3) Device Port ID > + */ > Status = AcpiDmDumpTable (TableLength, Offset, LinuxData, > sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA), AcpiDmTableInfoNhlt7a); > if (ACPI_FAILURE (Status)) > @@ -1731,28 +1825,43 @@ AcpiDmDumpNhlt ( > } > > Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA); > - } > > - /* Should be at the end of the Endpoint structure. Skip any extra bytes */ > + /* > + * Check that the current offset is not beyond the end of > + * this endpoint descriptor. If it is not, we assume that > + * the "Specific Data" field is present and valid. Note: > + * This does not seem to be documented anywhere. > + */ > + if (Offset < EndpointEndOffset) > + { > + /* Dump the linux-specific "Specific Data" field */ > > - if (Offset < EndpointEndOffset) > - { > - AcpiOsPrintf ("\n/* Endpoint descriptor ended before endpoint size was reached. " > - "skipped %X input bytes, current offset: %X, Endpoint End Offset: %X */\n", > - EndpointEndOffset - Offset, Offset, EndpointEndOffset); > - AcpiUtDumpBuffer (((UINT8 *)Table)+Offset, > - EndpointEndOffset - Offset, DB_BYTE_DISPLAY, Offset); > - Offset = EndpointEndOffset; > + LinuxDataB = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA_B, Table, Offset); > + Status = AcpiDmDumpTable (TableLength, Offset, LinuxDataB, > + sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B), AcpiDmTableInfoNhlt7b); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B); > + } > } > + > + /* Should be at the end of the Endpoint structure. */ > } > - } > > - /* Emit the table terminator (if present) */ > + } /* for (i = 0; i < EndpointCount; i++) */ > + > > + /* > + * Done with all of the Endpoint Descriptors, Emit the table terminator > + * (if such a legacy structure is present -- not in NHLT specification) > + */ > if (Offset == TableLength - sizeof (ACPI_NHLT_TABLE_TERMINATOR)) > { > LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset); > - AcpiOsPrintf ("\n/* Table terminator structure */\n"); > + AcpiOsPrintf ("\n /* Table terminator structure (not part of NHLT spec) */\n"); > > Status = AcpiDmDumpTable (TableLength, Offset, LinuxData, > sizeof (ACPI_NHLT_TABLE_TERMINATOR), AcpiDmTableInfoNhlt8); > diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c > index 347f9d36..7d812315 100644 > --- a/src/acpica/source/common/dmtbinfo.c > +++ b/src/acpica/source/common/dmtbinfo.c > @@ -292,7 +292,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFacs[] = > ACPI_DMTABLE_INFO AcpiDmTableInfoFadt1[] = > { > {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Facs), "FACS Address", 0}, > - {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Dsdt), "DSDT Address", DT_NON_ZERO}, > + {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Dsdt), "DSDT Address", 0}, > {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Model), "Model", 0}, > {ACPI_DMT_FADTPM, ACPI_FADT_OFFSET (PreferredProfile), "PM Profile", 0}, > {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (SciInterrupt), "SCI Interrupt", 0}, > @@ -408,7 +408,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFadt3[] = > ACPI_DMT_TERMINATOR > }; > > -/* ACPI 5.0 Extensions (FADT version 5) */ > +/* Extensions for FADT version 5 */ > > ACPI_DMTABLE_INFO AcpiDmTableInfoFadt5[] = > { > @@ -417,7 +417,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFadt5[] = > ACPI_DMT_TERMINATOR > }; > > -/* ACPI 6.0 Extensions (FADT version 6) */ > +/* Extensions for FADT version 6 */ > > ACPI_DMTABLE_INFO AcpiDmTableInfoFadt6[] = > { > diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c > index 4cbe112e..ab1b2634 100644 > --- a/src/acpica/source/common/dmtbinfo2.c > +++ b/src/acpica/source/common/dmtbinfo2.c > @@ -188,6 +188,25 @@ > * Remaining tables are not consumed directly by the ACPICA subsystem > */ > > +/******************************************************************************* > + * > + * AGDI - Arm Generic Diagnostic Dump and Reset Device Interface > + * > + * Conforms to "ACPI for Arm Components 1.1, Platform Design Document" > + * ARM DEN0093 v1.1 > + * > + ******************************************************************************/ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoAgdi[] = > +{ > + {ACPI_DMT_UINT8, ACPI_AGDI_OFFSET (Flags), "Flags (decoded below)", 0}, > + {ACPI_DMT_FLAG0, ACPI_AGDI_FLAG_OFFSET (Flags, 0), "Signalling mode", 0}, > + {ACPI_DMT_UINT24, ACPI_AGDI_OFFSET (Reserved[0]), "Reserved", 0}, > + {ACPI_DMT_UINT32, ACPI_AGDI_OFFSET (SdeiEvent), "SdeiEvent", 0}, > + {ACPI_DMT_UINT32, ACPI_AGDI_OFFSET (Gsiv), "Gsiv", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > > /******************************************************************************* > * > @@ -1217,7 +1236,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt0[] = > {ACPI_DMT_NHLT1, ACPI_NHLT0_OFFSET (LinkType), "Link Type", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (InstanceId), "Instance Id", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (VendorId), "Vendor Id", 0}, > - {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (DeviceId), "Device Id", 0}, > + {ACPI_DMT_NHLT1e, ACPI_NHLT0_OFFSET (DeviceId), "Device Id", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (RevisionId), "Revision Id", 0}, > {ACPI_DMT_UINT32, ACPI_NHLT0_OFFSET (SubsystemId), "Subsystem Id", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (DeviceType), "Device Type", 0}, > @@ -1230,9 +1249,9 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt0[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt1[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT1_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > + {ACPI_DMT_UINT32, ACPI_NHLT1_OFFSET (CapabilitiesSize), "Capabilities Size", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT1_OFFSET (VirtualSlot), "Virtual Slot", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT1_OFFSET (ConfigType), "Config Type", 0}, > + {ACPI_DMT_NHLT1f, ACPI_NHLT1_OFFSET (ConfigType), "Config Type", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1253,7 +1272,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt2[] = > ACPI_DMT_TERMINATOR > }; > > -/* Format Config */ > +/* Format Config (wave_format_extensible structure) */ > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3[] = > { > @@ -1267,7 +1286,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3[] = > {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.ValidBitsPerSample), "Valid Bits Per Sample", 0}, > {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (Format.ChannelMask), "Channel Mask", 0}, > {ACPI_DMT_UUID, ACPI_NHLT3_OFFSET (Format.SubFormatGuid), "SubFormat GUID", 0}, > - {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (CapabilitySize), "Capabilities Length", DT_LENGTH}, > + {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (CapabilitySize), "Capabilities Length", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1281,7 +1300,6 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3a[] = > ACPI_DMT_TERMINATOR > }; > > - > /* Formats Config */ > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt4[] = > @@ -1294,9 +1312,8 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt4[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT5_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > {ACPI_DMT_UINT8, ACPI_NHLT5_OFFSET (VirtualSlot), "Virtual Slot", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT5_OFFSET (ConfigType), "Config Type", 0}, > + {ACPI_DMT_NHLT1f, ACPI_NHLT5_OFFSET (ConfigType), "Config Type", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1304,10 +1321,9 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT5A_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (VirtualSlot), "Virtual Slot", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (ConfigType), "Config Type", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (ArrayType), "Array Type", 0}, > + {ACPI_DMT_NHLT1f, ACPI_NHLT5A_OFFSET (ConfigType), "Config Type", 0}, > + {ACPI_DMT_NHLT1d, ACPI_NHLT5A_OFFSET (ArrayType), "Array Type", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1315,7 +1331,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT5B_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > + {ACPI_DMT_UINT32, ACPI_NHLT5B_OFFSET (CapabilitiesSize), "Capabilities Size", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1323,17 +1339,32 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5c[] = > { > - {ACPI_DMT_UINT32, ACPI_NHLT5C_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, > {ACPI_DMT_UINT8, ACPI_NHLT5C_OFFSET (VirtualSlot), "Virtual Slot", 0}, > ACPI_DMT_TERMINATOR > }; > > /* Microphone array Config */ > > +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6a[] = > +{ > + {ACPI_DMT_UINT8, ACPI_NHLT6A_OFFSET (MicrophoneCount), "Microphone Count", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Render Feedback Device Config, CapabilitiesSize == 7 */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6b[] = > +{ > + {ACPI_DMT_UINT8, ACPI_NHLT6B_OFFSET (FeedbackVirtualSlot), "Feedback Virtual Slot", 0}, > + {ACPI_DMT_UINT16, ACPI_NHLT6B_OFFSET (FeedbackChannels), "Feedback Channels", 0}, > + {ACPI_DMT_UINT16, ACPI_NHLT6B_OFFSET (FeedbackValidBitsPerSample),"Valid Bits Per Sample", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[] = > { > - {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (Type), "Type", 0}, > - {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (Panel), "Panel", 0}, > + {ACPI_DMT_NHLT1b, ACPI_NHLT6_OFFSET (Type), "Type", 0}, > + {ACPI_DMT_NHLT1c, ACPI_NHLT6_OFFSET (Panel), "Panel", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (SpeakerPositionDistance), "Speaker Position Distance", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (HorizontalOffset), "Horizontal Offset", 0}, > {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (VerticalOffset), "Vertical Offset", 0}, > @@ -1352,7 +1383,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7[] = > { > - {ACPI_DMT_UINT8, ACPI_NHLT7_OFFSET (StructureCount), "Linux-specific struct count", 0}, > + {ACPI_DMT_UINT8, ACPI_NHLT7_OFFSET (StructureCount), "Linux-specific Count", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1363,7 +1394,12 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7a[] = > {ACPI_DMT_BUF16, ACPI_NHLT7A_OFFSET (DeviceId), "Device ID", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT7A_OFFSET (DeviceInstanceId), "Device Instance ID", 0}, > {ACPI_DMT_UINT8, ACPI_NHLT7A_OFFSET (DevicePortId), "Device Port ID", 0}, > - {ACPI_DMT_BUF18, ACPI_NHLT7A_OFFSET (Filler), "Specific Data", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7b[] = > +{ > + {ACPI_DMT_BUF18, ACPI_NHLT7B_OFFSET (SpecificData), "Specific Data", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1376,6 +1412,15 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt8[] = > ACPI_DMT_TERMINATOR > }; > > +/* Sensitivity Extension */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt9[] = > +{ > + {ACPI_DMT_UINT32, ACPI_NHLT9_OFFSET (SNR), "Signal-to-noise ratio", 0}, > + {ACPI_DMT_UINT32, ACPI_NHLT9_OFFSET (Sensitivity), "Mic Sensitivity", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > > /******************************************************************************* > * > diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c > index 12e1be4c..6bdaf676 100644 > --- a/src/acpica/source/common/dmtbinfo3.c > +++ b/src/acpica/source/common/dmtbinfo3.c > @@ -491,6 +491,20 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[] = > }; > > > +/******************************************************************************* > + * > + * TDEL - TD-Event Log Table > + * > + ******************************************************************************/ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoTdel[] = > +{ > + {ACPI_DMT_UINT32, ACPI_TDEL_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_TDEL_OFFSET (LogAreaMinimumLength), "Log Area Minimum Length", 0}, > + {ACPI_DMT_UINT64, ACPI_TDEL_OFFSET (LogAreaStartAddress), "Log Area Start Address", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > /******************************************************************************* > * > * TPM2 - Trusted Platform Module (TPM) 2.0 Hardware Interface Table > diff --git a/src/acpica/source/compiler/aslcache.c b/src/acpica/source/compiler/aslcache.c > index 51e6f4c4..05ae19b7 100644 > --- a/src/acpica/source/compiler/aslcache.c > +++ b/src/acpica/source/compiler/aslcache.c > @@ -183,6 +183,11 @@ UtLocalCacheCalloc ( > UINT32 CacheSize = ASL_STRING_CACHE_SIZE; > > > +#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED > + /* Used for objects other than strings, so keep allocations aligned */ > + Length = ACPI_ROUND_UP_TO_NATIVE_WORD (Length); > +#endif > + > if (Length > CacheSize) > { > CacheSize = Length; > diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c > index a93417c6..14403d3d 100644 > --- a/src/acpica/source/compiler/aslfiles.c > +++ b/src/acpica/source/compiler/aslfiles.c > @@ -835,8 +835,8 @@ ErrorExit: > * RETURN: Status > * > * DESCRIPTION: Open the specified input file, and save the directory path to > - * the file so that include files can be opened in > - * the same directory. > + * the file so that include files can be opened in the same > + * directory. NOTE: File is opened in text mode. > * > ******************************************************************************/ > > diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c > index 4dd6422b..ca50d281 100644 > --- a/src/acpica/source/compiler/aslmessages.c > +++ b/src/acpica/source/compiler/aslmessages.c > @@ -410,6 +410,8 @@ const char *AslTableCompilerMsgs [] = > /* ASL_MSG_ENTRY_LIST */ "Invalid entry initializer list", > /* ASL_MSG_UNKNOWN_FORMAT */ "Unknown format value", > /* ASL_MSG_RESERVED_VALUE */ "Value for field is reserved or unknown", > +/* ASL_MSG_TWO_ZERO_VALUES */ "32-bit DSDT Address and 64-bit X_DSDT Address cannot both be zero", > +/* ASL_MSG_BAD_PARSE_TREE */ "Parse tree appears to be ill-defined" > }; > > /* Preprocessor */ > diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h > index 69c2561b..0e9fefd4 100644 > --- a/src/acpica/source/compiler/aslmessages.h > +++ b/src/acpica/source/compiler/aslmessages.h > @@ -412,6 +412,8 @@ typedef enum > ASL_MSG_ENTRY_LIST, > ASL_MSG_UNKNOWN_FORMAT, > ASL_MSG_RESERVED_VALUE, > + ASL_MSG_TWO_ZERO_VALUES, > + ASL_MSG_BAD_PARSE_TREE, > > /* These messages are used by the Preprocessor only */ > > diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c > index 97881e14..3954388c 100644 > --- a/src/acpica/source/compiler/aslstartup.c > +++ b/src/acpica/source/compiler/aslstartup.c > @@ -293,9 +293,17 @@ AslDetectSourceFileType ( > goto Cleanup; > } > > - /* We have some sort of binary table, check for valid ACPI table */ > - > - fseek (Info->Handle, 0, SEEK_SET); > + /* > + * We have some sort of binary table; reopen in binary mode, then > + * check for valid ACPI table > + */ > + fclose (Info->Handle); > + Info->Handle = fopen (Info->Filename, "rb"); > + if (!Info->Handle) > + { > + fprintf (stderr, "Could not open input file %s\n", > + Info->Filename); > + } > > Status = AcValidateTableHeader (Info->Handle, 0); > if (ACPI_SUCCESS (Status)) > @@ -446,8 +454,9 @@ AslDoOneFile ( > UtConvertBackslashes (AslGbl_Files[ASL_FILE_INPUT].Filename); > > /* > - * Open the input file. Here, this should be an ASCII source file, > - * either an ASL file or a Data Table file > + * Open the input file. Here, this could be an ASCII source file, > + * either an ASL file or a Data Table file, or a binary AML file > + * or binary data table file (For disassembly). > */ > Status = FlOpenInputFile (AslGbl_Files[ASL_FILE_INPUT].Filename); > if (ACPI_FAILURE (Status)) > @@ -458,8 +467,6 @@ AslDoOneFile ( > > FileNode = FlGetCurrentFileNode(); > > - FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); > - > /* Determine input file type */ > > AslGbl_FileType = AslDetectSourceFileType (&AslGbl_Files[ASL_FILE_INPUT]); > @@ -469,6 +476,8 @@ AslDoOneFile ( > return (AE_ERROR); > } > > + FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); > + > /* > * If -p not specified, we will use the input filename as the > * output filename prefix > diff --git a/src/acpica/source/compiler/asluuid.c b/src/acpica/source/compiler/asluuid.c > index 30540acd..def35c92 100644 > --- a/src/acpica/source/compiler/asluuid.c > +++ b/src/acpica/source/compiler/asluuid.c > @@ -211,4 +211,3 @@ AuValidateUuid ( > > return (AE_OK); > } > - > diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h > index 614a686f..d9c92ce2 100644 > --- a/src/acpica/source/compiler/dtcompiler.h > +++ b/src/acpica/source/compiler/dtcompiler.h > @@ -762,6 +762,7 @@ DtGetGenericTableInfo ( > /* ACPI Table templates */ > > extern const unsigned char TemplateAest[]; > +extern const unsigned char TemplateAgdi[]; > extern const unsigned char TemplateAsf[]; > extern const unsigned char TemplateBoot[]; > extern const unsigned char TemplateBdat[]; > @@ -793,6 +794,7 @@ extern const unsigned char TemplateMpst[]; > extern const unsigned char TemplateMsct[]; > extern const unsigned char TemplateMsdm[]; > extern const unsigned char TemplateNfit[]; > +extern const unsigned char TemplateNhlt[]; > extern const unsigned char TemplatePcct[]; > extern const unsigned char TemplatePdtt[]; > extern const unsigned char TemplatePhat[]; > @@ -814,6 +816,7 @@ extern const unsigned char TemplateSrat[]; > extern const unsigned char TemplateStao[]; > extern const unsigned char TemplateSvkl[]; > extern const unsigned char TemplateTcpa[]; > +extern const unsigned char TemplateTdel[]; > extern const unsigned char TemplateTpm2[]; > extern const unsigned char TemplateUefi[]; > extern const unsigned char TemplateViot[]; > diff --git a/src/acpica/source/compiler/dttable.c b/src/acpica/source/compiler/dttable.c > index 702c83ee..fb3f26f1 100644 > --- a/src/acpica/source/compiler/dttable.c > +++ b/src/acpica/source/compiler/dttable.c > @@ -223,10 +223,12 @@ DtCompileRsdp ( > * > * RETURN: Status > * > - * DESCRIPTION: Compile FADT. > + * DESCRIPTION: Compile FADT (signature FACP). > * > *****************************************************************************/ > > +#define ACPI_XDSDT_LOCATION_IN_LIST 11 > + > ACPI_STATUS > DtCompileFadt ( > void **List) > @@ -235,10 +237,17 @@ DtCompileFadt ( > DT_SUBTABLE *Subtable; > DT_SUBTABLE *ParentTable; > DT_FIELD **PFieldList = (DT_FIELD **) List; > - ACPI_TABLE_HEADER *Table; > + DT_FIELD *DsdtFieldList; > + ACPI_TABLE_FADT *Table; > UINT8 Revision; > + UINT32 DsdtAddress; > + UINT64 X_DsdtAddress; > + UINT32 i; > + > > + /* Get the table revision and 32-bit DSDT Address definition */ > > + DsdtFieldList = (*PFieldList)->Next; > Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1, > &Subtable); > if (ACPI_FAILURE (Status)) > @@ -249,8 +258,16 @@ DtCompileFadt ( > ParentTable = DtPeekSubtable (); > DtInsertSubtable (ParentTable, Subtable); > > - Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); > - Revision = Table->Revision; > + Table = ACPI_CAST_PTR (ACPI_TABLE_FADT, ParentTable->Buffer); > + Revision = Table->Header.Revision; > + DsdtAddress = Table->Dsdt; > + > + /* FADT version 1 has only 32-bit addresses - error if DSDT address is NULL */ > + > + if ((Revision == 1) && (!DsdtAddress)) > + { > + DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, DsdtFieldList, NULL); > + } > > if (Revision == 2) > { > @@ -263,8 +280,24 @@ DtCompileFadt ( > > DtInsertSubtable (ParentTable, Subtable); > } > - else if (Revision >= 2) > + > + else if (Revision > 2) > { > + /* > + * Rev 3 and greater have 64-bit addresses (as well as 32-bit). > + * Get the 64-bit DSDT (X_DSDT) Address definition. Note: This > + * appears at field list offset 11 within AcpiDmTableInfoFadt3. > + */ > + DsdtFieldList = *PFieldList; > + for (i = 0; i < ACPI_XDSDT_LOCATION_IN_LIST; i++) > + { > + DsdtFieldList = DsdtFieldList->Next; > + if (!DsdtFieldList) > + { > + return (ASL_MSG_BAD_PARSE_TREE); > + } > + } > + > Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3, > &Subtable); > if (ACPI_FAILURE (Status)) > @@ -274,6 +307,20 @@ DtCompileFadt ( > > DtInsertSubtable (ParentTable, Subtable); > > + Table = ACPI_CAST_PTR (ACPI_TABLE_FADT, ParentTable->Buffer); > + X_DsdtAddress = Table->XDsdt; > + > + /* > + * Error if both the 32-bit DSDT address and the > + * 64-bit X_DSDT address are zero. > + */ > + if ((!X_DsdtAddress) && (!DsdtAddress)) > + { > + DtError (ASL_ERROR, ASL_MSG_TWO_ZERO_VALUES, DsdtFieldList, NULL); > + } > + > + /* Fields specific to FADT Revision 5 (appended to previous) */ > + > if (Revision >= 5) > { > Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5, > @@ -286,6 +333,8 @@ DtCompileFadt ( > DtInsertSubtable (ParentTable, Subtable); > } > > + /* Fields specific to FADT Revision 6 (appended to previous) */ > + > if (Revision >= 6) > { > Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6, > diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c > index b9445122..85406361 100644 > --- a/src/acpica/source/compiler/dttable2.c > +++ b/src/acpica/source/compiler/dttable2.c > @@ -781,6 +781,390 @@ DtCompileNfit ( > } > > > +/****************************************************************************** > + * > + * FUNCTION: DtCompileNhlt > + * > + * PARAMETERS: List - Current field list pointer > + * > + * RETURN: Status > + * > + * DESCRIPTION: Compile NHLT. > + * > + *****************************************************************************/ > + > +ACPI_STATUS > +DtCompileNhlt ( > + void **List) > +{ > + ACPI_STATUS Status; > + UINT32 EndpointCount; > + UINT32 MicrophoneCount; > + UINT32 FormatsCount; > + DT_SUBTABLE *Subtable; > + DT_SUBTABLE *ParentTable; > + DT_FIELD **PFieldList = (DT_FIELD **) List; > + UINT32 CapabilitiesSize; > + UINT8 ArrayType; > + UINT8 ConfigType; > + UINT8 LinuxSpecificCount; > + UINT32 i; > + UINT32 j; > + ACPI_TABLE_NHLT_ENDPOINT_COUNT *MainTable; > + ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific; > + ACPI_NHLT_VENDOR_MIC_COUNT *MicCount; > + ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; > + ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D *ConfigSpecific; > + ACPI_NHLT_LINUX_SPECIFIC_COUNT *LinuxSpecific; > + > + > + /* Main table */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + /* Get the Endpoint Descriptor count */ > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + MainTable = ACPI_CAST_PTR (ACPI_TABLE_NHLT_ENDPOINT_COUNT, Subtable->Buffer); > + EndpointCount = MainTable->EndpointCount; > + > + /* Subtables */ > + > + while (*PFieldList) > + { > + /* Variable number of Endpoint descriptors */ > + > + for (i = 0; i < EndpointCount; i++) > + { > + /* Do the Endpoint Descriptor */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt0, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + /* Do the Device Specific table */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable->Buffer); > + CapabilitiesSize = DevSpecific->CapabilitiesSize; > + > + ArrayType = 0; > + ConfigType = 0; > + > + switch (CapabilitiesSize) > + { > + case 0: > + break; > + > + case 1: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5c, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + break; > + > + case 2: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + break; > + > + case 3: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); > + ArrayType = ConfigSpecific->ArrayType; > + ConfigType = ConfigSpecific->ConfigType; > + break; > + > + case 7: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6b, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); > + ArrayType = ConfigSpecific->ArrayType; > + ConfigType = ConfigSpecific->ConfigType; > + break; > + > + default: > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); > + ArrayType = ConfigSpecific->ArrayType; > + ConfigType = ConfigSpecific->ConfigType; > + break; > + > + } /* switch (CapabilitiesSize) */ > + > + if (CapabilitiesSize >= 3) > + { > + /* Check for a vendor-defined mic array */ > + > + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY) > + { > + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED) > + { > + /* Get the microphone count */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + MicCount = ACPI_CAST_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Subtable->Buffer); > + MicrophoneCount = MicCount->MicrophoneCount; > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + /* Variable number of microphones */ > + > + for (j = 0; j < MicrophoneCount; j++) > + { > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + > + /* Do the MIC_SNR_SENSITIVITY_EXTENSION, if present */ > + > + if (ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) > + { > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt9, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + } > + } > + } > + > + /* Get the formats count */ > + > + DtPopSubtable (); > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt4, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + FormatsConfig = ACPI_CAST_PTR (ACPI_NHLT_FORMATS_CONFIG, Subtable->Buffer); > + FormatsCount = FormatsConfig->FormatsCount; > + > + /* Variable number of wave_format_extensible structs */ > + > + for (j = 0; j < FormatsCount; j++) > + { > + /* Do the main wave_format_extensible structure */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + /* Do the capabilities list */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + DtPopSubtable (); > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + } /* for (j = 0; j < FormatsCount; j++) */ > + > + /* > + * If we are not done with the current Endpoint yet, then there must be > + * some Linux-specific structure(s) yet to be processed. First, get > + * the count of such structure(s). > + */ > + if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) > + { > + /* Get the count of Linux-specific structures */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + LinuxSpecific = ACPI_CAST_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Subtable->Buffer); > + LinuxSpecificCount = LinuxSpecific->StructureCount; > + > + for (j = 0; j < LinuxSpecificCount; j++) > + { > + /* > + * Compile the following Linux-specific fields: > + * 1) Device ID > + * 2) Device Instance ID > + * 3) Device Port ID > + */ > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + /* > + * To have a valid Linux-specific "Specific Data" at this > + * point, we need: > + * 1) The next field must be named "Specific Data" > + */ > + if (!strcmp ((const char *) (*PFieldList)->Name, "Specific Data")) > + { > + /* Compile the "Specific Data" field */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + > + } /* for (j = 0; j < LinuxSpecificCount; j++) */ > + } > + > + DtPopSubtable (); > + > + } /* for (i = 0; i < EndpointCount; i++) */ > + > + /* > + * All Endpoint Descriptors are completed. > + * Do the table terminator structure (not in NHLT spec, optional) > + */ > + if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) > + { > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt8, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + > + return (AE_OK); > + } > + > + return (AE_OK); > +} > + > + > /****************************************************************************** > * > * FUNCTION: DtCompilePcct > @@ -2141,7 +2525,6 @@ DtCompileStao ( > } > > > - > /****************************************************************************** > * > * FUNCTION: DtCompileSvkl > diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h > index 24c8c6f9..e9272f3a 100644 > --- a/src/acpica/source/compiler/dttemplate.h > +++ b/src/acpica/source/compiler/dttemplate.h > @@ -249,6 +249,16 @@ const unsigned char TemplateAest[] = > 0x56,0x00,0x00,0x00 /* 000002C8 "V..." */ > }; > > +const unsigned char TemplateAgdi[] = > +{ > + 0x41,0x47,0x44,0x49,0x30,0x00,0x00,0x00, /* 00000000 "AGDI0..." */ > + 0x01,0xE4,0x41,0x4D,0x50,0x45,0x52,0x45, /* 00000008 "..AMPERE" */ > + 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */ > + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ > + 0x05,0x01,0x21,0x20,0x00,0x00,0x00,0x00, /* 00000020 "..! ...." */ > + 0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00 /* 00000028 "...@...." */ > +}; > + > const unsigned char TemplateAsf[] = > { > 0x41,0x53,0x46,0x21,0x72,0x00,0x00,0x00, /* 00000000 "ASF!r..." */ > @@ -1185,6 +1195,78 @@ const unsigned char TemplateNfit[] = > 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /* 00000180 "........" */ > }; > > +const unsigned char TemplateNhlt[] = > +{ > + 0x4E,0x48,0x4C,0x54,0x1E,0x02,0x00,0x00, /* 00000000 "NHLT...." */ > + 0x01,0xF7,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ > + 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */ > + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ > + 0x30,0x09,0x21,0x20,0x04,0xAD,0x00,0x00, /* 00000020 "0.! ...." */ > + 0x00,0x02,0x06,0x07,0x00,0x30,0xAE,0x09, /* 00000028 ".....0.." */ > + 0x00,0x0A,0x00,0x00,0x00,0x02,0x03,0x0D, /* 00000030 "........" */ > + 0x38,0x00,0x00,0x00,0xCC,0x01,0x1F,0x02, /* 00000038 "8......." */ > + 0x04,0x00,0x13,0x00,0x09,0x00,0x11,0x00, /* 00000040 "........" */ > + 0x04,0x20,0x07,0x00,0x09,0x00,0x18,0x00, /* 00000048 ". ......" */ > + 0x22,0x00,0x11,0x00,0x15,0x00,0x05,0x03, /* 00000050 ""......." */ > + 0x13,0x00,0x09,0x00,0x11,0x00,0x04,0x20, /* 00000058 "....... " */ > + 0x07,0x00,0x09,0x00,0x18,0x00,0x22,0x00, /* 00000060 "......"." */ > + 0x11,0x00,0x15,0x00,0xAA,0xAA,0x99,0x99, /* 00000068 "........" */ > + 0x78,0x56,0x34,0x12,0x02,0xFE,0xFF,0x78, /* 00000070 "xV4....x" */ > + 0x56,0x44,0x33,0x00,0x00,0x66,0x55,0x00, /* 00000078 "VD3..fU." */ > + 0x00,0x00,0x80,0x16,0x00,0x32,0x00,0x04, /* 00000080 ".....2.." */ > + 0x00,0x99,0x99,0x88,0x88,0x6E,0x88,0x9F, /* 00000088 ".....n.." */ > + 0xA6,0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B, /* 00000090 "..l.E..{" */ > + 0x5D,0xCE,0x24,0xC5,0x53,0x02,0x00,0x00, /* 00000098 "].$.S..." */ > + 0x00,0x30,0x40,0xFE,0xFF,0x78,0x56,0x44, /* 000000A0 ".0@..xVD" */ > + 0x33,0x00,0x00,0x66,0x55,0x00,0x00,0x00, /* 000000A8 "3..fU..." */ > + 0x80,0x16,0x00,0x32,0x00,0x04,0x00,0x99, /* 000000B0 "...2...." */ > + 0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6,0xEB, /* 000000B8 "...n...." */ > + 0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D,0xCE, /* 000000C0 "l.E..{]." */ > + 0x24,0xC5,0x53,0x03,0x00,0x00,0x00,0x50, /* 000000C8 "$.S....P" */ > + 0x60,0x70,0x48,0x00,0x00,0x00,0x05,0x06, /* 000000D0 "`pH....." */ > + 0x07,0x00,0x34,0xAE,0x09,0x00,0x0A,0x00, /* 000000D8 "..4....." */ > + 0x00,0x00,0x02,0x00,0x0D,0x02,0x00,0x00, /* 000000E0 "........" */ > + 0x00,0xCC,0x00,0x01,0xFE,0xFF,0x78,0x56, /* 000000E8 "......xV" */ > + 0x44,0x33,0x00,0x00,0x66,0x55,0x00,0x00, /* 000000F0 "D3..fU.." */ > + 0x00,0x80,0x16,0x00,0x32,0x00,0x04,0x00, /* 000000F8 "....2..." */ > + 0x99,0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6, /* 00000100 "....n..." */ > + 0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D, /* 00000108 ".l.E..{]" */ > + 0xCE,0x24,0xC5,0x53,0x02,0x00,0x00,0x00, /* 00000110 ".$.S...." */ > + 0x70,0x80,0x80,0x00,0x00,0x00,0x02,0x06, /* 00000118 "p......." */ > + 0x07,0x00,0x30,0xAE,0x09,0x00,0x0A,0x00, /* 00000120 "..0....." */ > + 0x00,0x00,0x02,0x03,0x0D,0x07,0x00,0x00, /* 00000128 "........" */ > + 0x00,0xCC,0x03,0x09,0x34,0x12,0x28,0x01, /* 00000130 "....4.(." */ > + 0x02,0xFE,0xFF,0x78,0x56,0x44,0x33,0x00, /* 00000138 "...xVD3." */ > + 0x00,0x66,0x55,0x00,0x00,0x00,0x80,0x16, /* 00000140 ".fU....." */ > + 0x00,0x32,0x00,0x04,0x00,0x99,0x99,0x88, /* 00000148 ".2......" */ > + 0x88,0x6E,0x88,0x9F,0xA6,0xEB,0x6C,0x94, /* 00000150 ".n....l." */ > + 0x45,0xA4,0x1F,0x7B,0x5D,0xCE,0x24,0xC5, /* 00000158 "E..{].$." */ > + 0x53,0x04,0x00,0x00,0x00,0x70,0x80,0x90, /* 00000160 "S....p.." */ > + 0xA0,0xFE,0xFF,0x78,0x56,0x44,0x33,0x00, /* 00000168 "...xVD3." */ > + 0x00,0x66,0x55,0x00,0x00,0x00,0x80,0x16, /* 00000170 ".fU....." */ > + 0x00,0x32,0x00,0x04,0x00,0x99,0x99,0x88, /* 00000178 ".2......" */ > + 0x88,0x6E,0x88,0x9F,0xA6,0xEB,0x6C,0x94, /* 00000180 ".n....l." */ > + 0x45,0xA4,0x1F,0x7B,0x5D,0xCE,0x24,0xC5, /* 00000188 "E..{].$." */ > + 0x53,0x05,0x00,0x00,0x00,0x70,0x80,0x90, /* 00000190 "S....p.." */ > + 0xA0,0xB0,0x7C,0x00,0x00,0x00,0x05,0x06, /* 00000198 "..|....." */ > + 0x07,0x00,0x34,0xAE,0x09,0x00,0x0A,0x00, /* 000001A0 "..4....." */ > + 0x00,0x00,0x02,0x00,0x0D,0x02,0x00,0x00, /* 000001A8 "........" */ > + 0x00,0xCC,0x00,0x01,0xFE,0xFF,0x78,0x56, /* 000001B0 "......xV" */ > + 0x44,0x33,0x00,0x00,0x66,0x55,0x00,0x00, /* 000001B8 "D3..fU.." */ > + 0x00,0x80,0x16,0x00,0x32,0x00,0x04,0x00, /* 000001C0 "....2..." */ > + 0x99,0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6, /* 000001C8 "....n..." */ > + 0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D, /* 000001D0 ".l.E..{]" */ > + 0xCE,0x24,0xC5,0x53,0x11,0x00,0x00,0x00, /* 000001D8 ".$.S...." */ > + 0x00,0x01,0x32,0x03,0x04,0x05,0x06,0x37, /* 000001E0 "..2....7" */ > + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x3F, /* 000001E8 ".......?" */ > + 0x0A,0x01,0x00,0x01,0x32,0x03,0x04,0x05, /* 000001F0 "....2..." */ > + 0x06,0x37,0x08,0x09,0x0A,0x0B,0x0C,0x0D, /* 000001F8 ".7......" */ > + 0x0E,0x3F,0x44,0x9A,0x00,0x01,0x32,0x03, /* 00000200 ".?D...2." */ > + 0x04,0x05,0x06,0x37,0x08,0x09,0x0A,0x0B, /* 00000208 "...7...." */ > + 0x0C,0x0D,0x0E,0x3F,0x0A,0x0B,0x04,0x00, /* 00000210 "...?...." */ > + 0x00,0x00,0xEF,0xBE,0xAD,0xDE /* 00000218 "......" */ > +}; > + > const unsigned char TemplatePcct[] = > { > 0x50,0x43,0x43,0x54,0xAE,0x02,0x00,0x00, /* 00000000 "PCCT...." */ > @@ -1756,6 +1838,17 @@ const unsigned char TemplateTcpa[] = > 0x01,0x01,0x01,0x01 /* 00000060 "...." */ > }; > > +const unsigned char TemplateTdel[] = > +{ > + 0x54,0x44,0x45,0x4C,0x38,0x00,0x00,0x00, /* 00000000 "TDEL8..." */ > + 0x04,0x1C,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ > + 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */ > + 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ > + 0x30,0x09,0x21,0x20,0x00,0x00,0x00,0x00, /* 00000020 "0.! ...." */ > + 0xEF,0xCD,0xAB,0x78,0x56,0x34,0x12,0x00, /* 00000028 "...xV4.." */ > + 0x78,0x56,0x34,0x12,0xEF,0xCD,0xAB,0x00 /* 00000030 "xV4....." */ > +}; > + > const unsigned char TemplateTpm2[] = > { > 0x54,0x50,0x4D,0x32,0x4C,0x00,0x00,0x00, /* 00000000 "TPM2L..." */ > diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c > index 52180fb3..2342ace3 100644 > --- a/src/acpica/source/compiler/dtutils.c > +++ b/src/acpica/source/compiler/dtutils.c > @@ -437,6 +437,7 @@ DtGetFieldType ( > case ACPI_DMT_BUF10: > case ACPI_DMT_BUF12: > case ACPI_DMT_BUF16: > + case ACPI_DMT_BUF18: > case ACPI_DMT_BUF128: > case ACPI_DMT_PCI_PATH: > case ACPI_DMT_PMTT_VENDOR: > @@ -583,6 +584,10 @@ DtGetFieldLength ( > case ACPI_DMT_MADT: > case ACPI_DMT_NHLT1: > case ACPI_DMT_NHLT1a: > + case ACPI_DMT_NHLT1b: > + case ACPI_DMT_NHLT1c: > + case ACPI_DMT_NHLT1d: > + case ACPI_DMT_NHLT1f: > case ACPI_DMT_PCCT: > case ACPI_DMT_PMTT: > case ACPI_DMT_PPTT: > @@ -611,6 +616,7 @@ DtGetFieldLength ( > case ACPI_DMT_HEST: > case ACPI_DMT_HMAT: > case ACPI_DMT_NFIT: > + case ACPI_DMT_NHLT1e: > case ACPI_DMT_PCI_PATH: > case ACPI_DMT_PHAT: > > @@ -737,6 +743,11 @@ DtGetFieldLength ( > ByteLength = 16; > break; > > + case ACPI_DMT_BUF18: > + > + ByteLength = 18; > + break; > + > case ACPI_DMT_BUF128: > > ByteLength = 128; > diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c > index 153cd89a..579421fa 100644 > --- a/src/acpica/source/components/dispatcher/dsopcode.c > +++ b/src/acpica/source/components/dispatcher/dsopcode.c > @@ -707,6 +707,7 @@ AcpiDsEvalTableRegionOperands ( > > ObjDesc->Region.Address = ACPI_PTR_TO_PHYSADDR (Table); > ObjDesc->Region.Length = Table->Length; > + ObjDesc->Region.Pointer = Table; > > ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n", > ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), > diff --git a/src/acpica/source/components/events/evhandler.c b/src/acpica/source/components/events/evhandler.c > index 39171014..763b294e 100644 > --- a/src/acpica/source/components/events/evhandler.c > +++ b/src/acpica/source/components/events/evhandler.c > @@ -563,7 +563,7 @@ AcpiEvInstallSpaceHandler ( > case ACPI_ADR_SPACE_DATA_TABLE: > > Handler = AcpiExDataTableSpaceHandler; > - Setup = NULL; > + Setup = AcpiEvDataTableRegionSetup; > break; > > default: > diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c > index 2624cd65..6c73bc80 100644 > --- a/src/acpica/source/components/events/evregion.c > +++ b/src/acpica/source/components/events/evregion.c > @@ -320,6 +320,15 @@ AcpiEvAddressSpaceDispatch ( > return_ACPI_STATUS (AE_NOT_EXIST); > } > > + if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_COMM) > + { > + ACPI_PCC_INFO *Ctx = HandlerDesc->AddressSpace.Context; > + > + Ctx->InternalBuffer = FieldObj->Field.InternalPccBuffer; > + Ctx->Length = (UINT16) RegionObj->Region.Length; > + Ctx->SubspaceId = (UINT8) RegionObj->Region.Address; > + } > + > /* > * We must exit the interpreter because the region setup will > * potentially execute control methods (for example, the _REG method > diff --git a/src/acpica/source/components/events/evrgnini.c b/src/acpica/source/components/events/evrgnini.c > index 9327d8f7..6959ff98 100644 > --- a/src/acpica/source/components/events/evrgnini.c > +++ b/src/acpica/source/components/events/evrgnini.c > @@ -599,6 +599,64 @@ AcpiEvCmosRegionSetup ( > } > > > +/******************************************************************************* > + * > + * FUNCTION: AcpiEvDataTableRegionSetup > + * > + * PARAMETERS: Handle - Region we are interested in > + * Function - Start or stop > + * HandlerContext - Address space handler context > + * RegionContext - Region specific context > + * > + * RETURN: Status > + * > + * DESCRIPTION: Setup a DataTableRegion > + * > + * MUTEX: Assumes namespace is not locked > + * > + ******************************************************************************/ > + > +ACPI_STATUS > +AcpiEvDataTableRegionSetup ( > + ACPI_HANDLE Handle, > + UINT32 Function, > + void *HandlerContext, > + void **RegionContext) > +{ > + ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle; > + ACPI_DATA_TABLE_MAPPING *LocalRegionContext; > + > + > + ACPI_FUNCTION_TRACE (EvDataTableRegionSetup); > + > + > + if (Function == ACPI_REGION_DEACTIVATE) > + { > + if (*RegionContext) > + { > + ACPI_FREE (*RegionContext); > + *RegionContext = NULL; > + } > + return_ACPI_STATUS (AE_OK); > + } > + > + /* Create a new context */ > + > + LocalRegionContext = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DATA_TABLE_MAPPING)); > + if (!(LocalRegionContext)) > + { > + return_ACPI_STATUS (AE_NO_MEMORY); > + } > + > + /* Save the data table pointer for use in the handler */ > + > + LocalRegionContext->Pointer = RegionDesc->Region.Pointer; > + > + *RegionContext = LocalRegionContext; > + return_ACPI_STATUS (AE_OK); > +} > + > + > /******************************************************************************* > * > * FUNCTION: AcpiEvDefaultRegionSetup > diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c > index 301e8830..ff26ade7 100644 > --- a/src/acpica/source/components/executer/exconfig.c > +++ b/src/acpica/source/components/executer/exconfig.c > @@ -596,7 +596,7 @@ AcpiExLoadOp ( > ACPI_INFO (("Dynamic OEM Table Load:")); > AcpiExExitInterpreter (); > Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table), > - ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, TRUE, &TableIndex); > + ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, Table, TRUE, &TableIndex); > AcpiExEnterInterpreter (); > if (ACPI_FAILURE (Status)) > { > diff --git a/src/acpica/source/components/executer/excreate.c b/src/acpica/source/components/executer/excreate.c > index 8afae43c..18a3af2f 100644 > --- a/src/acpica/source/components/executer/excreate.c > +++ b/src/acpica/source/components/executer/excreate.c > @@ -451,6 +451,7 @@ AcpiExCreateRegion ( > ObjDesc->Region.SpaceId = SpaceId; > ObjDesc->Region.Address = 0; > ObjDesc->Region.Length = 0; > + ObjDesc->Region.Pointer = NULL; > ObjDesc->Region.Node = Node; > ObjDesc->Region.Handler = NULL; > ObjDesc->Common.Flags &= > diff --git a/src/acpica/source/components/executer/exfield.c b/src/acpica/source/components/executer/exfield.c > index 7871e350..b33ab5b3 100644 > --- a/src/acpica/source/components/executer/exfield.c > +++ b/src/acpica/source/components/executer/exfield.c > @@ -492,9 +492,7 @@ AcpiExWriteDataToField ( > ObjDesc->Field.BaseByteOffset, > SourceDesc->Buffer.Pointer, DataLength); > > - if ((ObjDesc->Field.RegionObj->Region.Address == PCC_MASTER_SUBSPACE && > - MASTER_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) || > - GENERIC_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) > + if (MASTER_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) > { > /* Perform the write */ > > diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c > index bf40b697..424e1e99 100644 > --- a/src/acpica/source/components/executer/exoparg1.c > +++ b/src/acpica/source/components/executer/exoparg1.c > @@ -1193,7 +1193,7 @@ AcpiExOpcode_1A_0T_1R ( > WalkState, ReturnDesc, &TempDesc); > if (ACPI_FAILURE (Status)) > { > - goto Cleanup; > + return_ACPI_STATUS (Status); > } > > ReturnDesc = TempDesc; > diff --git a/src/acpica/source/components/executer/exregion.c b/src/acpica/source/components/executer/exregion.c > index 2f49eb0a..cd1fa2eb 100644 > --- a/src/acpica/source/components/executer/exregion.c > +++ b/src/acpica/source/components/executer/exregion.c > @@ -692,9 +692,17 @@ AcpiExDataTableSpaceHandler ( > void *HandlerContext, > void *RegionContext) > { > + ACPI_DATA_TABLE_MAPPING *Mapping; > + char *Pointer; > + > + > ACPI_FUNCTION_TRACE (ExDataTableSpaceHandler); > > > + Mapping = (ACPI_DATA_TABLE_MAPPING *) RegionContext; > + Pointer = ACPI_CAST_PTR (char, Mapping->Pointer) + > + (Address - ACPI_PTR_TO_PHYSADDR (Mapping->Pointer)); > + > /* > * Perform the memory read or write. The BitWidth was already > * validated. > @@ -703,14 +711,12 @@ AcpiExDataTableSpaceHandler ( > { > case ACPI_READ: > > - memcpy (ACPI_CAST_PTR (char, Value), ACPI_PHYSADDR_TO_PTR (Address), > - ACPI_DIV_8 (BitWidth)); > + memcpy (ACPI_CAST_PTR (char, Value), Pointer, ACPI_DIV_8 (BitWidth)); > break; > > case ACPI_WRITE: > > - memcpy (ACPI_PHYSADDR_TO_PTR (Address), ACPI_CAST_PTR (char, Value), > - ACPI_DIV_8 (BitWidth)); > + memcpy (Pointer, ACPI_CAST_PTR (char, Value), ACPI_DIV_8 (BitWidth)); > break; > > default: > diff --git a/src/acpica/source/components/hardware/hwesleep.c b/src/acpica/source/components/hardware/hwesleep.c > index e8db4d26..19463e5a 100644 > --- a/src/acpica/source/components/hardware/hwesleep.c > +++ b/src/acpica/source/components/hardware/hwesleep.c > @@ -261,7 +261,10 @@ AcpiHwExtendedSleep ( > > /* Flush caches, as per ACPI specification */ > > - ACPI_FLUSH_CPU_CACHE (); > + if (SleepState < ACPI_STATE_S4) > + { > + ACPI_FLUSH_CPU_CACHE (); > + } > > Status = AcpiOsEnterSleep (SleepState, SleepControl, 0); > if (Status == AE_CTRL_TERMINATE) > diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c > index 2b857d97..4d581da3 100644 > --- a/src/acpica/source/components/hardware/hwsleep.c > +++ b/src/acpica/source/components/hardware/hwsleep.c > @@ -262,7 +262,10 @@ AcpiHwLegacySleep ( > > /* Flush caches, as per ACPI specification */ > > - ACPI_FLUSH_CPU_CACHE (); > + if (SleepState < ACPI_STATE_S4) > + { > + ACPI_FLUSH_CPU_CACHE (); > + } > > Status = AcpiOsEnterSleep (SleepState, Pm1aControl, Pm1bControl); > if (Status == AE_CTRL_TERMINATE) > @@ -376,7 +379,7 @@ AcpiHwLegacyWakePrep ( > > Pm1aControl |= (AcpiGbl_SleepTypeAS0 << > SleepTypeRegInfo->BitPosition); > - Pm1aControl |= (AcpiGbl_SleepTypeBS0 << > + Pm1bControl |= (AcpiGbl_SleepTypeBS0 << > SleepTypeRegInfo->BitPosition); > > /* Write the control registers and ignore any errors */ > diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c > index f1a1344c..106dea0d 100644 > --- a/src/acpica/source/components/hardware/hwxfsleep.c > +++ b/src/acpica/source/components/hardware/hwxfsleep.c > @@ -353,8 +353,6 @@ AcpiEnterSleepStateS4bios ( > return_ACPI_STATUS (Status); > } > > - ACPI_FLUSH_CPU_CACHE (); > - > Status = AcpiHwWritePort (AcpiGbl_FADT.SmiCommand, > (UINT32) AcpiGbl_FADT.S4BiosRequest, 8); > if (ACPI_FAILURE (Status)) > diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c > index 522234d9..6f3f7113 100644 > --- a/src/acpica/source/components/tables/tbdata.c > +++ b/src/acpica/source/components/tables/tbdata.c > @@ -243,14 +243,28 @@ AcpiTbInitTableDescriptor ( > { > > /* > - * Initialize the table descriptor. Set the pointer to NULL, since the > - * table is not fully mapped at this time. > + * Initialize the table descriptor. Set the pointer to NULL for external > + * tables, since the table is not fully mapped at this time. > */ > memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC)); > TableDesc->Address = Address; > TableDesc->Length = Table->Length; > TableDesc->Flags = Flags; > ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature); > + > + switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) > + { > + case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: > + case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: > + > + TableDesc->Pointer = Table; > + break; > + > + case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: > + default: > + > + break; > + } > } > > > @@ -290,8 +304,7 @@ AcpiTbAcquireTable ( > case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: > case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: > > - Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, > - ACPI_PHYSADDR_TO_PTR (TableDesc->Address)); > + Table = TableDesc->Pointer; > break; > > default: > @@ -359,6 +372,8 @@ AcpiTbReleaseTable ( > * PARAMETERS: TableDesc - Table descriptor to be acquired > * Address - Address of the table > * Flags - Allocation flags of the table > + * Table - Pointer to the table (required for virtual > + * origins, optional for physical) > * > * RETURN: Status > * > @@ -373,9 +388,10 @@ ACPI_STATUS > AcpiTbAcquireTempTable ( > ACPI_TABLE_DESC *TableDesc, > ACPI_PHYSICAL_ADDRESS Address, > - UINT8 Flags) > + UINT8 Flags, > + ACPI_TABLE_HEADER *Table) > { > - ACPI_TABLE_HEADER *TableHeader; > + BOOLEAN MappedTable = FALSE; > > > switch (Flags & ACPI_TABLE_ORIGIN_MASK) > @@ -384,37 +400,43 @@ AcpiTbAcquireTempTable ( > > /* Get the length of the full table from the header */ > > - TableHeader = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER)); > - if (!TableHeader) > + if (!Table) > { > - return (AE_NO_MEMORY); > + Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER)); > + if (!Table) > + { > + return (AE_NO_MEMORY); > + } > + > + MappedTable = TRUE; > } > > - AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader); > - AcpiOsUnmapMemory (TableHeader, sizeof (ACPI_TABLE_HEADER)); > - return (AE_OK); > + break; > > case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: > case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: > > - TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, > - ACPI_PHYSADDR_TO_PTR (Address)); > - if (!TableHeader) > + if (!Table) > { > - return (AE_NO_MEMORY); > + return (AE_BAD_PARAMETER); > } > > - AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader); > - return (AE_OK); > + break; > > default: > > - break; > + /* Table is not valid yet */ > + > + return (AE_NO_MEMORY); > } > > - /* Table is not valid yet */ > + AcpiTbInitTableDescriptor (TableDesc, Address, Flags, Table); > + if (MappedTable) > + { > + AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER)); > + } > > - return (AE_NO_MEMORY); > + return (AE_OK); > } > > > @@ -513,7 +535,20 @@ AcpiTbInvalidateTable ( > > AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length, > TableDesc->Flags); > - TableDesc->Pointer = NULL; > + > + switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) > + { > + case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: > + > + TableDesc->Pointer = NULL; > + break; > + > + case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: > + case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: > + default: > + > + break; > + } > > return_VOID; > } > @@ -1219,6 +1254,9 @@ AcpiTbLoadTable ( > * > * PARAMETERS: Address - Physical address of the table > * Flags - Allocation flags of the table > + * Table - Pointer to the table (required for > + * virtual origins, optional for > + * physical) > * Override - Whether override should be performed > * TableIndex - Where table index is returned > * > @@ -1232,6 +1270,7 @@ ACPI_STATUS > AcpiTbInstallAndLoadTable ( > ACPI_PHYSICAL_ADDRESS Address, > UINT8 Flags, > + ACPI_TABLE_HEADER *Table, > BOOLEAN Override, > UINT32 *TableIndex) > { > @@ -1244,7 +1283,7 @@ AcpiTbInstallAndLoadTable ( > > /* Install the table and load it into the namespace */ > > - Status = AcpiTbInstallStandardTable (Address, Flags, TRUE, > + Status = AcpiTbInstallStandardTable (Address, Flags, Table, TRUE, > Override, &i); > if (ACPI_FAILURE (Status)) > { > diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c > index 8196e7af..ff00c2f2 100644 > --- a/src/acpica/source/components/tables/tbfadt.c > +++ b/src/acpica/source/components/tables/tbfadt.c > @@ -486,7 +486,7 @@ AcpiTbParseFadt ( > > AcpiTbInstallStandardTable ( > (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XDsdt, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, > &AcpiGbl_DsdtIndex); > > /* If Hardware Reduced flag is set, there is no FACS */ > @@ -497,14 +497,14 @@ AcpiTbParseFadt ( > { > AcpiTbInstallStandardTable ( > (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.Facs, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, > &AcpiGbl_FacsIndex); > } > if (AcpiGbl_FADT.XFacs) > { > AcpiTbInstallStandardTable ( > (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XFacs, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, > &AcpiGbl_XFacsIndex); > } > } > diff --git a/src/acpica/source/components/tables/tbinstal.c b/src/acpica/source/components/tables/tbinstal.c > index dcbb2a74..f628b460 100644 > --- a/src/acpica/source/components/tables/tbinstal.c > +++ b/src/acpica/source/components/tables/tbinstal.c > @@ -227,6 +227,8 @@ AcpiTbInstallTableWithOverride ( > * PARAMETERS: Address - Address of the table (might be a virtual > * address depending on the TableFlags) > * Flags - Flags for the table > + * Table - Pointer to the table (required for virtual > + * origins, optional for physical) > * Reload - Whether reload should be performed > * Override - Whether override should be performed > * TableIndex - Where the table index is returned > @@ -245,6 +247,7 @@ ACPI_STATUS > AcpiTbInstallStandardTable ( > ACPI_PHYSICAL_ADDRESS Address, > UINT8 Flags, > + ACPI_TABLE_HEADER *Table, > BOOLEAN Reload, > BOOLEAN Override, > UINT32 *TableIndex) > @@ -259,7 +262,7 @@ AcpiTbInstallStandardTable ( > > /* Acquire a temporary table descriptor for validation */ > > - Status = AcpiTbAcquireTempTable (&NewTableDesc, Address, Flags); > + Status = AcpiTbAcquireTempTable (&NewTableDesc, Address, Flags, Table); > if (ACPI_FAILURE (Status)) > { > ACPI_ERROR ((AE_INFO, > @@ -369,7 +372,7 @@ AcpiTbOverrideTable ( > if (ACPI_SUCCESS (Status) && Table) > { > AcpiTbAcquireTempTable (&NewTableDesc, ACPI_PTR_TO_PHYSADDR (Table), > - ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL); > + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table); > ACPI_ERROR_ONLY (OverrideType = "Logical"); > goto FinishOverride; > } > @@ -381,7 +384,7 @@ AcpiTbOverrideTable ( > if (ACPI_SUCCESS (Status) && Address && Length) > { > AcpiTbAcquireTempTable (&NewTableDesc, Address, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL); > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL); > ACPI_ERROR_ONLY (OverrideType = "Physical"); > goto FinishOverride; > } > @@ -457,7 +460,8 @@ AcpiTbUninstallTable ( > if ((TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) == > ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL) > { > - ACPI_FREE (ACPI_PHYSADDR_TO_PTR (TableDesc->Address)); > + ACPI_FREE (TableDesc->Pointer); > + TableDesc->Pointer = NULL; > } > > TableDesc->Address = ACPI_PTR_TO_PHYSADDR (NULL); > diff --git a/src/acpica/source/components/tables/tbprint.c b/src/acpica/source/components/tables/tbprint.c > index 392ff95a..5985abdb 100644 > --- a/src/acpica/source/components/tables/tbprint.c > +++ b/src/acpica/source/components/tables/tbprint.c > @@ -261,7 +261,8 @@ AcpiTbPrintTableHeader ( > Header->Signature, ACPI_FORMAT_UINT64 (Address), > Header->Length)); > } > - else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) > + else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, > + Header)->Signature)) > { > /* RSDP has no common fields */ > > diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c > index 6316f258..76d8ef3b 100644 > --- a/src/acpica/source/components/tables/tbutils.c > +++ b/src/acpica/source/components/tables/tbutils.c > @@ -500,7 +500,8 @@ AcpiTbParseRootTable ( > } > > Status = AcpiTbInstallStandardTable (Address, > - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, &TableIndex); > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, > + &TableIndex); > > if (ACPI_SUCCESS (Status) && > ACPI_COMPARE_NAMESEG ( > diff --git a/src/acpica/source/components/tables/tbxfload.c b/src/acpica/source/components/tables/tbxfload.c > index 046487ba..9e90c91b 100644 > --- a/src/acpica/source/components/tables/tbxfload.c > +++ b/src/acpica/source/components/tables/tbxfload.c > @@ -396,9 +396,7 @@ UnlockAndExit: > * > * FUNCTION: AcpiInstallTable > * > - * PARAMETERS: Address - Address of the ACPI table to be installed. > - * Physical - Whether the address is a physical table > - * address or not > + * PARAMETERS: Table - Pointer to the ACPI table to be installed. > * > * RETURN: Status > * > @@ -410,28 +408,17 @@ UnlockAndExit: > > ACPI_STATUS ACPI_INIT_FUNCTION > AcpiInstallTable ( > - ACPI_PHYSICAL_ADDRESS Address, > - BOOLEAN Physical) > + ACPI_TABLE_HEADER *Table) > { > ACPI_STATUS Status; > - UINT8 Flags; > UINT32 TableIndex; > > > ACPI_FUNCTION_TRACE (AcpiInstallTable); > > > - if (Physical) > - { > - Flags = ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL; > - } > - else > - { > - Flags = ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL; > - } > - > - Status = AcpiTbInstallStandardTable (Address, Flags, > - FALSE, FALSE, &TableIndex); > + Status = AcpiTbInstallStandardTable (ACPI_PTR_TO_PHYSADDR (Table), > + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table, FALSE, FALSE, &TableIndex); > > return_ACPI_STATUS (Status); > } > @@ -439,6 +426,40 @@ AcpiInstallTable ( > ACPI_EXPORT_SYMBOL_INIT (AcpiInstallTable) > > > +/******************************************************************************* > + * > + * FUNCTION: AcpiInstallPhysicalTable > + * > + * PARAMETERS: Address - Address of the ACPI table to be installed. > + * > + * RETURN: Status > + * > + * DESCRIPTION: Dynamically install an ACPI table. > + * Note: This function should only be invoked after > + * AcpiInitializeTables() and before AcpiLoadTables(). > + * > + ******************************************************************************/ > + > +ACPI_STATUS ACPI_INIT_FUNCTION > +AcpiInstallPhysicalTable ( > + ACPI_PHYSICAL_ADDRESS Address) > +{ > + ACPI_STATUS Status; > + UINT32 TableIndex; > + > + > + ACPI_FUNCTION_TRACE (AcpiInstallPhysicalTable); > + > + > + Status = AcpiTbInstallStandardTable (Address, > + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, FALSE, &TableIndex); > + > + return_ACPI_STATUS (Status); > +} > + > +ACPI_EXPORT_SYMBOL_INIT (AcpiInstallPhysicalTable) > + > + > /******************************************************************************* > * > * FUNCTION: AcpiLoadTable > @@ -481,7 +502,7 @@ AcpiLoadTable ( > > ACPI_INFO (("Host-directed Dynamic ACPI Table Load:")); > Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table), > - ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex); > + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table, FALSE, &TableIndex); > if (TableIdx) > { > *TableIdx = TableIndex; > diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c > index 624aa687..de114cb6 100644 > --- a/src/acpica/source/components/utilities/utdelete.c > +++ b/src/acpica/source/components/utilities/utdelete.c > @@ -594,6 +594,7 @@ AcpiUtUpdateRefCount ( > ACPI_WARNING ((AE_INFO, > "Obj %p, Reference Count is already zero, cannot decrement\n", > Object)); > + return; > } > > ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, > diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h > index 6e162d6a..17d70d4e 100644 > --- a/src/acpica/source/include/acdisasm.h > +++ b/src/acpica/source/include/acdisasm.h > @@ -257,6 +257,7 @@ typedef enum > ACPI_DMT_AEST_RES, > ACPI_DMT_AEST_XFACE, > ACPI_DMT_AEST_XRUPT, > + ACPI_DMT_AGDI, > ACPI_DMT_ASF, > ACPI_DMT_CEDT, > ACPI_DMT_DMAR, > @@ -280,6 +281,11 @@ typedef enum > ACPI_DMT_NFIT, > ACPI_DMT_NHLT1, > ACPI_DMT_NHLT1a, > + ACPI_DMT_NHLT1b, > + ACPI_DMT_NHLT1c, > + ACPI_DMT_NHLT1d, > + ACPI_DMT_NHLT1e, > + ACPI_DMT_NHLT1f, > ACPI_DMT_PCCT, > ACPI_DMT_PHAT, > ACPI_DMT_PMTT, > @@ -381,6 +387,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestVendorError[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestGicError[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestXrupt[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoAgdi[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf0[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1a[]; > @@ -559,9 +566,13 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5c[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6a[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6b[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7a[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7b[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt8[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt9[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhatHdr[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0a[]; > @@ -635,6 +646,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoSvkl0[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaHdr[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaClient[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTdel[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2a[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm211[]; > @@ -882,6 +894,10 @@ void > AcpiDmDumpTcpa ( > ACPI_TABLE_HEADER *Table); > > +void > +AcpiDmDumpTdel ( > + ACPI_TABLE_HEADER *Table); > + > void > AcpiDmDumpTpm2 ( > ACPI_TABLE_HEADER *Table); > diff --git a/src/acpica/source/include/acevents.h b/src/acpica/source/include/acevents.h > index 77475ac9..dda14495 100644 > --- a/src/acpica/source/include/acevents.h > +++ b/src/acpica/source/include/acevents.h > @@ -457,6 +457,13 @@ AcpiEvPciBarRegionSetup ( > void *HandlerContext, > void **RegionContext); > > +ACPI_STATUS > +AcpiEvDataTableRegionSetup ( > + ACPI_HANDLE Handle, > + UINT32 Function, > + void *HandlerContext, > + void **RegionContext); > + > ACPI_STATUS > AcpiEvDefaultRegionSetup ( > ACPI_HANDLE Handle, > diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h > index e7d9f1c9..51a397f2 100644 > --- a/src/acpica/source/include/acobject.h > +++ b/src/acpica/source/include/acobject.h > @@ -313,6 +313,7 @@ typedef struct acpi_object_region > union acpi_operand_object *Next; > ACPI_PHYSICAL_ADDRESS Address; > UINT32 Length; > + void *Pointer; /* Only for data table regions */ > > } ACPI_OBJECT_REGION; > > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index 7f4b31ee..c07d0de2 100644 > --- a/src/acpica/source/include/acpixf.h > +++ b/src/acpica/source/include/acpixf.h > @@ -154,7 +154,7 @@ > > /* Current ACPICA subsystem version in YYYYMMDD format */ > > -#define ACPI_CA_VERSION 0x20210930 > +#define ACPI_CA_VERSION 0x20211217 > > #include "acconfig.h" > #include "actypes.h" > @@ -658,8 +658,12 @@ AcpiDecodePldBuffer ( > ACPI_EXTERNAL_RETURN_STATUS ( > ACPI_STATUS ACPI_INIT_FUNCTION > AcpiInstallTable ( > - ACPI_PHYSICAL_ADDRESS Address, > - BOOLEAN Physical)) > + ACPI_TABLE_HEADER *Table)) > + > +ACPI_EXTERNAL_RETURN_STATUS ( > +ACPI_STATUS ACPI_INIT_FUNCTION > +AcpiInstallPhysicalTable ( > + ACPI_PHYSICAL_ADDRESS Address)) > > ACPI_EXTERNAL_RETURN_STATUS ( > ACPI_STATUS > diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h > index 038085c8..d0845643 100644 > --- a/src/acpica/source/include/actables.h > +++ b/src/acpica/source/include/actables.h > @@ -193,7 +193,8 @@ ACPI_STATUS > AcpiTbAcquireTempTable ( > ACPI_TABLE_DESC *TableDesc, > ACPI_PHYSICAL_ADDRESS Address, > - UINT8 Flags); > + UINT8 Flags, > + ACPI_TABLE_HEADER *Table); > > void > AcpiTbReleaseTempTable ( > @@ -279,6 +280,7 @@ ACPI_STATUS > AcpiTbInstallStandardTable ( > ACPI_PHYSICAL_ADDRESS Address, > UINT8 Flags, > + ACPI_TABLE_HEADER *Table, > BOOLEAN Reload, > BOOLEAN Override, > UINT32 *TableIndex); > @@ -296,6 +298,7 @@ ACPI_STATUS > AcpiTbInstallAndLoadTable ( > ACPI_PHYSICAL_ADDRESS Address, > UINT8 Flags, > + ACPI_TABLE_HEADER *Table, > BOOLEAN Override, > UINT32 *TableIndex); > > diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h > index 8a9ff736..7402d97b 100644 > --- a/src/acpica/source/include/actbinfo.h > +++ b/src/acpica/source/include/actbinfo.h > @@ -152,6 +152,7 @@ > /* > * Macros used to generate offsets to specific table fields > */ > +#define ACPI_AGDI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_AGDI,f) > #define ACPI_FACS_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_FACS,f) > #define ACPI_GAS_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_GENERIC_ADDRESS,f) > #define ACPI_HDR_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_HEADER,f) > @@ -197,6 +198,7 @@ > #define ACPI_STAO_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_STAO,f) > #define ACPI_SVKL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SVKL,f) > #define ACPI_TCPA_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_HDR,f) > +#define ACPI_TDEL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TDEL,f) > #define ACPI_TPM2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM2,f) > #define ACPI_TPM23_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM23,f) > #define ACPI_UEFI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_UEFI,f) > @@ -339,9 +341,13 @@ > #define ACPI_NHLT5B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B,f) > #define ACPI_NHLT5C_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C,f) > #define ACPI_NHLT6_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_VENDOR_MIC_CONFIG,f) > +#define ACPI_NHLT6A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_VENDOR_MIC_COUNT,f) > +#define ACPI_NHLT6B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG,f) > #define ACPI_NHLT7_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_COUNT,f) > #define ACPI_NHLT7A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_DATA,f) > +#define ACPI_NHLT7B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_DATA_B,f) > #define ACPI_NHLT8_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_TABLE_TERMINATOR,f) > +#define ACPI_NHLT9_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION,f) > #define ACPI_PCCT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_SUBSPACE,f) > #define ACPI_PCCT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED,f) > #define ACPI_PCCT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f) > @@ -408,6 +414,7 @@ > #define ACPI_AEST0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_AEST_PROCESSOR,f,o) > #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_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/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h > index 0c80aae2..eaa2e243 100644 > --- a/src/acpica/source/include/actbl2.h > +++ b/src/acpica/source/include/actbl2.h > @@ -168,6 +168,7 @@ > * file. Useful because they make it more difficult to inadvertently type in > * the wrong signature. > */ > +#define ACPI_SIG_AGDI "AGDI" /* Arm Generic Diagnostic Dump and Reset Device Interface */ > #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 */ > @@ -192,6 +193,7 @@ > #define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */ > #define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */ > #define ACPI_SIG_SVKL "SVKL" /* Storage Volume Key Location Table */ > +#define ACPI_SIG_TDEL "TDEL" /* TD Event Log Table */ > > > /* > @@ -309,7 +311,7 @@ typedef struct acpi_aest_processor_tlb > > typedef struct acpi_aest_processor_generic > { > - UINT8 *Resource; > + UINT32 Resource; > > } ACPI_AEST_PROCESSOR_GENERIC; > > @@ -400,6 +402,28 @@ typedef struct acpi_aest_node_interrupt > #define ACPI_AEST_XRUPT_RESERVED 2 /* 2 and above are reserved */ > > > +/******************************************************************************* > + * AGDI - Arm Generic Diagnostic Dump and Reset Device Interface > + * > + * Conforms to "ACPI for Arm Components 1.1, Platform Design Document" > + * ARM DEN0093 v1.1 > + * > + ******************************************************************************/ > +typedef struct acpi_table_agdi > +{ > + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ > + UINT8 Flags; > + UINT8 Reserved[3]; > + UINT32 SdeiEvent; > + UINT32 Gsiv; > + > +} ACPI_TABLE_AGDI; > + > +/* Mask for Flags field above */ > + > +#define ACPI_AGDI_SIGNALING_MODE (1) > + > + > /******************************************************************************* > * > * BDAT - BIOS Data ACPI Table > @@ -1796,6 +1820,12 @@ typedef struct acpi_table_nhlt > > } ACPI_TABLE_NHLT; > > +typedef struct acpi_table_nhlt_endpoint_count > +{ > + UINT8 EndpointCount; > + > +} ACPI_TABLE_NHLT_ENDPOINT_COUNT; > + > typedef struct acpi_nhlt_endpoint > { > UINT32 DescriptorLength; > @@ -1852,6 +1882,8 @@ typedef struct acpi_nhlt_endpoint > #define ACPI_NHLT_DIR_RENDER_FEEDBACK 3 > #define ACPI_NHLT_DIR_RESERVED 4 /* 4 and above are reserved */ > > +/* Capabilities = 2 */ > + > typedef struct acpi_nhlt_device_specific_config > { > UINT32 CapabilitiesSize; > @@ -1860,6 +1892,8 @@ typedef struct acpi_nhlt_device_specific_config > > } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG; > > +/* Capabilities = 3 */ > + > typedef struct acpi_nhlt_device_specific_config_a > { > UINT32 CapabilitiesSize; > @@ -1869,14 +1903,24 @@ typedef struct acpi_nhlt_device_specific_config_a > > } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A; > > -/* Values for Config Type above */ > +/* Capabilities = 3 */ > + > +typedef struct acpi_nhlt_device_specific_config_d > +{ > + UINT8 VirtualSlot; > + UINT8 ConfigType; > + UINT8 ArrayType; > > -#define ACPI_NHLT_TYPE_MIC_ARRAY 0x01 > -#define ACPI_NHLT_TYPE_GENERIC 0x00 > +} ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D; > > -/* Mask for Extension field of ArrayType */ > +/* Values for Config Type above */ > + > +#define ACPI_NHLT_CONFIG_TYPE_GENERIC 0x00 > +#define ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY 0x01 > +#define ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK 0x03 > +#define ACPI_NHLT_CONFIG_TYPE_RESERVED 0x04 /* 4 and above are reserved */ > > -#define ACPI_NHLT_ARRAY_TYPE_MASK 0x10 > +/* Capabilities = 0 */ > > typedef struct acpi_nhlt_device_specific_config_b > { > @@ -1884,6 +1928,8 @@ typedef struct acpi_nhlt_device_specific_config_b > > } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B; > > +/* Capabilities = 1 */ > + > typedef struct acpi_nhlt_device_specific_config_c > { > UINT32 CapabilitiesSize; > @@ -1891,6 +1937,13 @@ typedef struct acpi_nhlt_device_specific_config_c > > } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C; > > +typedef struct acpi_nhlt_render_device_specific_config > +{ > + UINT32 CapabilitiesSize; > + UINT8 VirtualSlot; > + > +} ACPI_NHLT_RENDER_DEVICE_SPECIFIC_CONFIG; > + > typedef struct acpi_nhlt_wave_extensible > { > UINT16 FormatTag; > @@ -1963,18 +2016,24 @@ typedef struct acpi_nhlt_mic_device_specific_config > > /* Values for ArrayTypeExt above */ > > -#define SMALL_LINEAR_2ELEMENT 0x0A > -#define BIG_LINEAR_2ELEMENT 0x0B > -#define FIRST_GEOMETRY_LINEAR_4ELEMENT 0x0C > -#define PLANAR_LSHAPED_4ELEMENT 0x0D > -#define SECOND_GEOMETRY_LINEAR_4ELEMENT 0x0E > -#define VENDOR_DEFINED 0x0F > -#define ARRAY_TYPE_MASK 0x0F > -#define ARRAY_TYPE_EXT_MASK 0x10 > +#define ACPI_NHLT_ARRAY_TYPE_RESERVED 0x09 // 9 and below are reserved > +#define ACPI_NHLT_SMALL_LINEAR_2ELEMENT 0x0A > +#define ACPI_NHLT_BIG_LINEAR_2ELEMENT 0x0B > +#define ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT 0x0C > +#define ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT 0x0D > +#define ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT 0x0E > +#define ACPI_NHLT_VENDOR_DEFINED 0x0F > +#define ACPI_NHLT_ARRAY_TYPE_MASK 0x0F > +#define ACPI_NHLT_ARRAY_TYPE_EXT_MASK 0x10 > + > +#define ACPI_NHLT_NO_EXTENSION 0x0 > +#define ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT (1<<4) > > -#define NO_EXTENSION 0x0 > -#define MIC_SNR_SENSITIVITY_EXT 0x1 > +typedef struct acpi_nhlt_vendor_mic_count > +{ > + UINT8 MicrophoneCount; > > +} ACPI_NHLT_VENDOR_MIC_COUNT; > > typedef struct acpi_nhlt_vendor_mic_config > { > @@ -1996,22 +2055,25 @@ typedef struct acpi_nhlt_vendor_mic_config > > /* Values for Type field above */ > > -#define MIC_OMNIDIRECTIONAL 0 > -#define MIC_SUBCARDIOID 1 > -#define MIC_CARDIOID 2 > -#define MIC_SUPER_CARDIOID 3 > -#define MIC_HYPER_CARDIOID 4 > -#define MIC_8_SHAPED 5 > -#define MIC_VENDOR_DEFINED 7 > +#define ACPI_NHLT_MIC_OMNIDIRECTIONAL 0 > +#define ACPI_NHLT_MIC_SUBCARDIOID 1 > +#define ACPI_NHLT_MIC_CARDIOID 2 > +#define ACPI_NHLT_MIC_SUPER_CARDIOID 3 > +#define ACPI_NHLT_MIC_HYPER_CARDIOID 4 > +#define ACPI_NHLT_MIC_8_SHAPED 5 > +#define ACPI_NHLT_MIC_RESERVED6 6 // 6 is reserved > +#define ACPI_NHLT_MIC_VENDOR_DEFINED 7 > +#define ACPI_NHLT_MIC_RESERVED 8 // 8 and above are reserved > > /* Values for Panel field above */ > > -#define MIC_TOP 0 > -#define MIC_BOTTOM 1 > -#define MIC_LEFT 2 > -#define MIC_RIGHT 3 > -#define MIC_FRONT 4 > -#define MIC_REAR 5 > +#define ACPI_NHLT_MIC_POSITION_TOP 0 > +#define ACPI_NHLT_MIC_POSITION_BOTTOM 1 > +#define ACPI_NHLT_MIC_POSITION_LEFT 2 > +#define ACPI_NHLT_MIC_POSITION_RIGHT 3 > +#define ACPI_NHLT_MIC_POSITION_FRONT 4 > +#define ACPI_NHLT_MIC_POSITION_BACK 5 > +#define ACPI_NHLT_MIC_POSITION_RESERVED 6 // 6 and above are reserved > > typedef struct acpi_nhlt_vendor_mic_device_specific_config > { > @@ -2030,9 +2092,10 @@ typedef struct acpi_nhlt_mic_snr_sensitivity_extension > > } ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION; > > +/* Render device with feedback */ > + > typedef struct acpi_nhlt_render_feedback_device_specific_config > { > - ACPI_NHLT_DEVICE_SPECIFIC_CONFIG DeviceConfig; > UINT8 FeedbackVirtualSlot; // Render slot in case of capture > UINT16 FeedbackChannels; // Informative only > UINT16 FeedbackValidBitsPerSample; > @@ -2052,10 +2115,15 @@ typedef struct acpi_nhlt_linux_specific_data > UINT8 DeviceId[16]; > UINT8 DeviceInstanceId; > UINT8 DevicePortId; > - UINT8 Filler[18]; > > } ACPI_NHLT_LINUX_SPECIFIC_DATA; > > +typedef struct acpi_nhlt_linux_specific_data_b > +{ > + UINT8 SpecificData[18]; > + > +} ACPI_NHLT_LINUX_SPECIFIC_DATA_B; > + > typedef struct acpi_nhlt_table_terminator > { > UINT32 TerminatorValue; > @@ -3008,6 +3076,24 @@ enum acpi_svkl_format > }; > > > +/******************************************************************************* > + * > + * TDEL - TD-Event Log > + * From: "Guest-Host-Communication Interface (GHCI) for Intel > + * Trust Domain Extensions (Intel TDX)". > + * September 2020 > + * > + ******************************************************************************/ > + > +typedef struct acpi_table_tdel > +{ > + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ > + UINT32 Reserved; > + UINT64 LogAreaMinimumLength; > + UINT64 LogAreaStartAddress; > + > +} ACPI_TABLE_TDEL; > + > /* Reset to default packing */ > > #pragma pack() > diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h > index 5138342c..6805b48f 100644 > --- a/src/acpica/source/include/actypes.h > +++ b/src/acpica/source/include/actypes.h > @@ -660,7 +660,6 @@ typedef UINT64 ACPI_INTEGER; > #define ACPI_TO_POINTER(i) ACPI_CAST_PTR (void, (ACPI_SIZE) (i)) > #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) 0) > #define ACPI_OFFSET(d, f) ACPI_PTR_DIFF (&(((d *) 0)->f), (void *) 0) > -#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i) > #define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i) > > /* Optimizations for 4-character (32-bit) ACPI_NAME manipulation */ > @@ -687,9 +686,14 @@ typedef UINT64 ACPI_INTEGER; > * Can be used with AccessSize field of ACPI_GENERIC_ADDRESS and > * ACPI_RESOURCE_GENERIC_REGISTER. > */ > -#define ACPI_ACCESS_BIT_WIDTH(AccessSize) (1 << ((AccessSize) + 2)) > -#define ACPI_ACCESS_BYTE_WIDTH(AccessSize) (1 << ((AccessSize) - 1)) > - > +#define ACPI_ACCESS_BIT_SHIFT 2 > +#define ACPI_ACCESS_BYTE_SHIFT -1 > +#define ACPI_ACCESS_BIT_MAX (31 - ACPI_ACCESS_BIT_SHIFT) > +#define ACPI_ACCESS_BYTE_MAX (31 - ACPI_ACCESS_BYTE_SHIFT) > +#define ACPI_ACCESS_BIT_DEFAULT (8 - ACPI_ACCESS_BIT_SHIFT) > +#define ACPI_ACCESS_BYTE_DEFAULT (8 - ACPI_ACCESS_BYTE_SHIFT) > +#define ACPI_ACCESS_BIT_WIDTH(size) (1 << ((size) + ACPI_ACCESS_BIT_SHIFT)) > +#define ACPI_ACCESS_BYTE_WIDTH(size) (1 << ((size) + ACPI_ACCESS_BYTE_SHIFT)) > > /******************************************************************************* > * > @@ -1319,6 +1323,14 @@ typedef struct acpi_connection_info > > } ACPI_CONNECTION_INFO; > > +/* Special Context data for PCC Opregion (ACPI 6.3) */ > + > +typedef struct acpi_pcc_info { > + UINT8 SubspaceId; > + UINT16 Length; > + UINT8 *InternalBuffer; > +} ACPI_PCC_INFO; > + > > typedef > ACPI_STATUS (*ACPI_ADR_SPACE_SETUP) ( > @@ -1458,6 +1470,12 @@ typedef struct acpi_mem_space_context > > } ACPI_MEM_SPACE_CONTEXT; > > +typedef struct acpi_data_table_space_context > +{ > + void *Pointer; > + > +} ACPI_DATA_TABLE_MAPPING; > + > > /* > * ACPI_MEMORY_LIST is used only if the ACPICA local cache is enabled Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c index 99f89729..3e26ac3f 100644 --- a/src/acpica/source/common/acfileio.c +++ b/src/acpica/source/common/acfileio.c @@ -552,10 +552,15 @@ AcValidateTableHeader ( /* Read a potential table header */ OriginalOffset = ftell (File); - fseek (File, TableOffset, SEEK_SET); - + if (fseek (File, TableOffset, SEEK_SET)) + { + fprintf (stderr, "SEEK error\n"); + } Actual = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File); - fseek (File, OriginalOffset, SEEK_SET); + if (fseek (File, OriginalOffset, SEEK_SET)) + { + fprintf (stderr, "SEEK error\n"); + } if (Actual < sizeof (ACPI_TABLE_HEADER)) { diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c index d7ce88a9..def42520 100644 --- a/src/acpica/source/common/ahtable.c +++ b/src/acpica/source/common/ahtable.c @@ -200,6 +200,7 @@ AcpiAhGetTableInfo ( const AH_TABLE AcpiGbl_SupportedTables[] = { {ACPI_SIG_AEST, "Arm Error Source Table"}, + {ACPI_SIG_AGDI, "Arm Generic Diagnostic Dump and Reset Device Interface Table"}, {ACPI_SIG_ASF, "Alert Standard Format Table"}, {ACPI_SIG_BDAT, "BIOS Data ACPI Table"}, {ACPI_SIG_BERT, "Boot Error Record Table"}, @@ -233,6 +234,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] = {ACPI_SIG_MSCT, "Maximum System Characteristics Table"}, {ACPI_SIG_MSDM, "Microsoft Data Management Table"}, {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"}, + {ACPI_SIG_NHLT, "Non HD Audio Link Table"}, {ACPI_SIG_PCCT, "Platform Communications Channel Table"}, {ACPI_SIG_PDTT, "Platform Debug Trigger Table"}, {ACPI_SIG_PHAT, "Platform Health Assessment Table"}, @@ -256,6 +258,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] = {ACPI_SIG_STAO, "Status Override Table"}, {ACPI_SIG_SVKL, "Storage Volume Key Location Table"}, {ACPI_SIG_TCPA, "Trusted Computing Platform Alliance Table"}, + {ACPI_SIG_TDEL, "TD-Event Log Table"}, {ACPI_SIG_TPM2, "Trusted Platform Module hardware interface Table"}, {ACPI_SIG_UEFI, "UEFI Boot Optimization Table"}, {ACPI_SIG_VIOT, "Virtual I/O Translation Table"}, diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c index dff1c613..3137132a 100644 --- a/src/acpica/source/common/dmtable.c +++ b/src/acpica/source/common/dmtable.c @@ -167,10 +167,11 @@ AcpiAhGetTableInfo ( /* Common format strings for commented values */ -#define UINT8_FORMAT "%2.2X [%s]\n" -#define UINT16_FORMAT "%4.4X [%s]\n" -#define UINT32_FORMAT "%8.8X [%s]\n" -#define STRING_FORMAT "[%s]\n" +#define UINT8_FORMAT "%2.2X [%s]\n" +#define UINT8_FORMAT_NO_NEWLINE "%2.2X [%s]" +#define UINT16_FORMAT "%4.4X [%s]\n" +#define UINT32_FORMAT "%8.8X [%s]\n" +#define STRING_FORMAT "[%s]\n" /* These tables map a subtable type to a description string */ @@ -437,6 +438,50 @@ static const char *AcpiDmNhltDirectionNames[] = "Unknown Direction" /* Reserved */ }; +static const char *AcpiDmNhltMicTypeNames[] = +{ + "Omnidirectional", /* ACPI_NHLT_MIC_OMNIDIRECTIONAL */ + "Subcardioid", /* ACPI_NHLT_MIC_SUBCARDIOID */ + "Cardioid", /* ACPI_NHLT_MIC_CARDIOID */ + "SuperCardioid", /* ACPI_NHLT_MIC_SUPER_CARDIOID */ + "HyperCardioid", /* ACPI_NHLT_MIC_HYPER_CARDIOID */ + "8 Shaped", /* ACPI_NHLT_MIC_8_SHAPED */ + "Reserved Mic Type", /* Reserved */ + "Vendor Defined", /* ACPI_NHLT_MIC_VENDOR_DEFINED */ + "Unknown Mic Type" /* ACPI_NHLT_MIC_RESERVED */ +}; + +static const char *AcpiDmNhltMicPositionNames[] = +{ + "Top", /* ACPI_NHLT_MIC_POSITION_TOP */ + "Bottom", /* ACPI_NHLT_MIC_POSITION_BOTTOM */ + "Left", /* ACPI_NHLT_MIC_POSITION_LEFT */ + "Right", /* ACPI_NHLT_MIC_POSITION_RIGHT */ + "Front", /* ACPI_NHLT_MIC_POSITION_FRONT */ + "Back", /* ACPI_NHLT_MIC_POSITION_BACK */ + "Unknown Mic Position" /* 6 and above are reserved */ +}; + +static const char *AcpiDmNhltMicArrayTypeNames[] = +{ + "Unknown Array Type", /* ACPI_NHLT_ARRAY_TYPE_RESERVED */ + "Small Linear 2-element", /* ACPI_NHLT_SMALL_LINEAR_2ELEMENT */ + "Big Linear 2-element", /* ACPI_NHLT_BIG_LINEAR_2ELEMENT */ + "Linear 4-element 1st Geometry", /* ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT */ + "Planar L-shaped 4-element", /* ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT */ + "Linear 4-element 2nd Geometry", /* ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT */ + "Vendor Defined" /* ACPI_NHLT_VENDOR_DEFINED */ +}; + +static const char *AcpiDmNhltConfigTypeNames[] = +{ + "Generic Type", /* ACPI_NHLT_CONFIG_TYPE_GENERIC */ + "Microphone Array", /* ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY */ + "Reserved", /* ACPI_NHLT_CONFIG_TYPE_RESERVED */ + "Render Feedback", /* ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK */ + "Unknown Config Type" /* ACPI_NHLT_CONFIG_TYPE_RESERVED */ +}; + static const char *AcpiDmPcctSubnames[] = { "Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */ @@ -604,6 +649,7 @@ static const char *AcpiDmGasAccessWidth[] = const ACPI_DMTABLE_DATA AcpiDmTableData[] = { {ACPI_SIG_AEST, NULL, AcpiDmDumpAest, DtCompileAest, TemplateAest}, + {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi, NULL, NULL, TemplateAgdi}, {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf}, {ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat}, {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert}, @@ -635,7 +681,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct}, {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm}, {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit}, - {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, NULL, NULL}, + {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, DtCompileNhlt, TemplateNhlt}, {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct}, {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt}, {ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat}, @@ -657,6 +703,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao}, {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl}, {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa}, + {ACPI_SIG_TDEL, AcpiDmTableInfoTdel, NULL, NULL, TemplateTdel}, {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2}, {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi}, {ACPI_SIG_VIOT, AcpiDmTableInfoViot, AcpiDmDumpViot, DtCompileViot, TemplateViot}, @@ -795,7 +842,8 @@ AcpiDmDumpDataTable ( return; } } - else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature)) + else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, + Table)->Signature)) { Length = AcpiDmDumpRsdp (Table); } @@ -1040,7 +1088,7 @@ AcpiDmDumpTable ( /* Check for beyond subtable end or (worse) beyond EOT */ - if (SubtableLength && (Info->Offset >= SubtableLength)) + if (SubtableLength && (Info->Offset > SubtableLength)) { AcpiOsPrintf ( "/**** ACPI subtable terminates early (Len %u) - " @@ -1074,6 +1122,10 @@ AcpiDmDumpTable ( case ACPI_DMT_MADT: case ACPI_DMT_NHLT1: case ACPI_DMT_NHLT1a: + case ACPI_DMT_NHLT1b: + case ACPI_DMT_NHLT1c: + case ACPI_DMT_NHLT1d: + case ACPI_DMT_NHLT1f: case ACPI_DMT_PCCT: case ACPI_DMT_PMTT: case ACPI_DMT_PPTT: @@ -1102,6 +1154,7 @@ AcpiDmDumpTable ( case ACPI_DMT_HEST: case ACPI_DMT_HMAT: case ACPI_DMT_NFIT: + case ACPI_DMT_NHLT1e: case ACPI_DMT_PHAT: ByteLength = 2; @@ -1848,6 +1901,95 @@ AcpiDmDumpTable ( AcpiDmNhltDirectionNames[Temp8]); break; + case ACPI_DMT_NHLT1b: + + /* NHLT microphone type */ + + Temp8 = *Target; + if (Temp8 > ACPI_NHLT_MIC_RESERVED) + { + Temp8 = ACPI_NHLT_MIC_RESERVED; + } + + AcpiOsPrintf (UINT8_FORMAT, *Target, + AcpiDmNhltMicTypeNames[Temp8]); + break; + + case ACPI_DMT_NHLT1c: + + /* NHLT microphone position */ + + Temp8 = *Target; + if (Temp8 > ACPI_NHLT_MIC_POSITION_RESERVED) + { + Temp8 = ACPI_NHLT_MIC_POSITION_RESERVED; + } + + AcpiOsPrintf (UINT8_FORMAT, *Target, + AcpiDmNhltMicPositionNames[Temp8]); + break; + + case ACPI_DMT_NHLT1d: + + /* NHLT microphone array type */ + + Temp8 = *Target & ACPI_NHLT_ARRAY_TYPE_MASK; + if (Temp8 < ACPI_NHLT_ARRAY_TYPE_RESERVED) + { + Temp8 = ACPI_NHLT_ARRAY_TYPE_RESERVED; + } + + AcpiOsPrintf (UINT8_FORMAT_NO_NEWLINE, *Target, + AcpiDmNhltMicArrayTypeNames[Temp8 - ACPI_NHLT_ARRAY_TYPE_RESERVED]); + + Temp8 = *Target; + if (Temp8 & ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT) + { + AcpiOsPrintf (" [%s]", "SNR and Sensitivity"); + } + + AcpiOsPrintf ("\n"); + break; + + case ACPI_DMT_NHLT1e: + + /* NHLT Endpoint Device ID */ + + Temp16 = ACPI_GET16 (Target); + if (Temp16 == 0xAE20) + { + Name = "PDM DMIC"; + } + else if (Temp16 == 0xAE30) + { + Name = "BT Sideband"; + } + else if (Temp16 == 0xAE34) + { + Name = "I2S/TDM Codecs"; + } + else + { + Name = "Unknown Device ID"; + } + + AcpiOsPrintf (UINT16_FORMAT, Temp16, Name); + break; + + case ACPI_DMT_NHLT1f: + + /* NHLT ConfigType field */ + + Temp8 = *Target; + if (Temp8 > ACPI_NHLT_CONFIG_TYPE_RESERVED) + { + Temp8 = ACPI_NHLT_CONFIG_TYPE_RESERVED; + } + + AcpiOsPrintf (UINT8_FORMAT, *Target, + AcpiDmNhltConfigTypeNames[Temp8]); + break; + case ACPI_DMT_PCCT: /* PCCT subtable types */ @@ -1929,7 +2071,7 @@ AcpiDmDumpTable ( break; } - AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL); + AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL); break; case ACPI_DMT_RGRT: diff --git a/src/acpica/source/common/dmtbdump.c b/src/acpica/source/common/dmtbdump.c index abeb06fa..86c90d67 100644 --- a/src/acpica/source/common/dmtbdump.c +++ b/src/acpica/source/common/dmtbdump.c @@ -195,7 +195,9 @@ AcpiDmDumpBuffer ( char *Header) { UINT8 *Buffer; + UINT8 BufChar; UINT32 i; + UINT32 j; if (!Length) @@ -208,20 +210,72 @@ AcpiDmDumpBuffer ( while (i < Length) { - if (!(i % 16)) + if ((Length > 16) && (i != 0)) { - /* Insert a backslash - line continuation character */ + if ((Length - i) < 16) + AcpiOsPrintf ("\n/* %3.3Xh %4.4u %3u */ ", AbsoluteOffset, AbsoluteOffset, Length - i); + else + AcpiOsPrintf ("\n/* %3.3Xh %4.4u 16 */ ", AbsoluteOffset, AbsoluteOffset); + } + AbsoluteOffset += 16; + + /* Emit the raw data bytes*/ - if (Length > 16) + for (j = 0; j < 16; j++) + { + if (i + j >= Length) { - AcpiOsPrintf ("\\\n "); + /* Dump fill spaces */ + + AcpiOsPrintf ("%*s", (48 - (3 * (Length -i))), " "); + break; } + AcpiOsPrintf ("%.02X ", Buffer[(ACPI_SIZE) i + j]); + } + + /* Emit the ASCII equivalent to the raw data bytes */ + + for (j = 0; j < 16; j++) + { + if (i + j >= Length) + { + AcpiOsPrintf (" */\\\n"); + return; + } + + /* + * Add comment characters so rest of line is ignored when + * compiled + */ + if (j == 0) + { + AcpiOsPrintf ("/* "); + } + + BufChar = Buffer[(ACPI_SIZE) i + j]; + if (isprint (BufChar)) + { + AcpiOsPrintf ("%c", BufChar); + } + else + { + AcpiOsPrintf ("."); + } + } + + /* Done with that line. */ + /* Close the comment and insert a backslash - line continuation character */ + + if (Length > 16) + { + AcpiOsPrintf (" */\\"); + } + else + { + AcpiOsPrintf (" */\\"); } - AcpiOsPrintf ("%.02X ", *Buffer); - i++; - Buffer++; - AbsoluteOffset++; + i += 16; /* Point to next line */ } AcpiOsPrintf ("\n"); diff --git a/src/acpica/source/common/dmtbdump1.c b/src/acpica/source/common/dmtbdump1.c index 3a97af46..fd5e2fd9 100644 --- a/src/acpica/source/common/dmtbdump1.c +++ b/src/acpica/source/common/dmtbdump1.c @@ -296,8 +296,6 @@ AcpiDmDumpAest ( case ACPI_AEST_GENERIC_RESOURCE: InfoTable = AcpiDmTableInfoAestGenRsrc; Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC); - AcpiOsPrintf ("Generic Resource Type (%X) is not supported at this time\n", - ProcessorSubtable->ResourceType); break; /* Error case below */ diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c index 118b96ee..04f7139f 100644 --- a/src/acpica/source/common/dmtbdump2.c +++ b/src/acpica/source/common/dmtbdump2.c @@ -1494,19 +1494,21 @@ AcpiDmDumpNhlt ( UINT32 CapabilitiesSize; UINT32 i; UINT32 j; - UINT32 k; UINT32 EndpointEndOffset; UINT8 ConfigType = 0; UINT8 ArrayType; + UINT8 MicrophoneCount; + ACPI_NHLT_VENDOR_MIC_COUNT *MicCount; ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific; ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; ACPI_NHLT_LINUX_SPECIFIC_COUNT *Count; ACPI_NHLT_LINUX_SPECIFIC_DATA *LinuxData; + ACPI_NHLT_LINUX_SPECIFIC_DATA_B *LinuxDataB; /* Main table */ - AcpiOsPrintf ("/* Main table */\n"); + AcpiOsPrintf (" /* Main table */\n"); Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt); if (ACPI_FAILURE (Status)) @@ -1532,52 +1534,59 @@ AcpiDmDumpNhlt ( /* Do the Endpoint Descriptor table */ Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); + + /* Check for endpoint descriptor length beyond end-of-table */ + if (Subtable->DescriptorLength > TableLength) { Offset += 1; - AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than" + AcpiOsPrintf ("\n /* Endpoint Descriptor Length larger than" " table size: %X, table %X, adjusting table offset (+1) */\n", Subtable->DescriptorLength, TableLength); Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); } - AcpiOsPrintf ("\n/* Endpoint Descriptor #%u */\n", i+1); + AcpiOsPrintf ("\n /* Endpoint Descriptor #%u */\n", i+1); Status = AcpiDmDumpTable (TableLength, Offset, Subtable, Subtable->DescriptorLength, AcpiDmTableInfoNhlt0); if (ACPI_FAILURE (Status)) { return; } + EndpointEndOffset = Subtable->DescriptorLength + Offset; /* Check for endpoint descriptor beyond end-of-table */ if (Subtable->DescriptorLength > TableLength) { - AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than table size: %X, table %X */\n", + AcpiOsPrintf ("\n /* Endpoint Descriptor Length larger than table size: %X, table %X */\n", Subtable->DescriptorLength, TableLength); } + Offset += sizeof (ACPI_NHLT_ENDPOINT); Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); /* Do the Device Specific table */ - AcpiOsPrintf ("\n/* Endpoint Device_Specific_Config table */\n"); + AcpiOsPrintf ("\n /* Endpoint Device_Specific_Config table */\n"); DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); CapabilitiesSize = DevSpecific->CapabilitiesSize; + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); + if (ACPI_FAILURE (Status)) + { + return; + } + + ArrayType = 0; /* Different subtables based upon capabilities_size */ switch (CapabilitiesSize) { case 0: - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, - sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); - if (ACPI_FAILURE (Status)) - { - return; - } Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); break; @@ -1602,6 +1611,9 @@ AcpiDmDumpNhlt ( break; case 3: + default: + /* Extract the ConfigType and ArrayType */ + ConfigType = DevSpecific->ConfigType; ArrayType = DevSpecific->ArrayType; @@ -1614,56 +1626,113 @@ AcpiDmDumpNhlt ( /* Capabilities Size == 3 */ Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A); + break; - /* Check for a vendor-defined mic array */ + case 7: + ConfigType = DevSpecific->ConfigType; + Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); - if ((ConfigType == ACPI_NHLT_TYPE_MIC_ARRAY) && ((ArrayType & ARRAY_TYPE_MASK) == VENDOR_DEFINED)) + AcpiOsPrintf ("\n /* Render Feedback Device-Specific table */\n"); + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5); + if (ACPI_FAILURE (Status)) { - /* Vendor-defined microphone array */ + return; + } - AcpiOsPrintf ("\n/* Vendor-defined microphone array */\n"); + /* Capabilities Size = 7 */ + Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG); + + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK) + { + Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset); + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable); Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, - sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6); + sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt6b); if (ACPI_FAILURE (Status)) { return; } - Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG); + Offset += sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG); } break; + } - default: - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, - sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b); - if (ACPI_FAILURE (Status)) - { - return; - } + /* Check for a vendor-defined mic array */ - Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); - Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, - CapabilitiesSize, AcpiDmTableInfoNhlt3a); - if (ACPI_FAILURE (Status)) + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY) + { + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED) { - return; + /* Vendor-defined microphone array; get the microphone count first */ + + AcpiOsPrintf ("\n /* Vendor-defined microphone count */\n"); + MicCount = ACPI_ADD_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Table, Offset); + MicrophoneCount = MicCount->MicrophoneCount; + + Status = AcpiDmDumpTable (TableLength, Offset, MicCount, + sizeof (ACPI_NHLT_VENDOR_MIC_COUNT), AcpiDmTableInfoNhlt6a); + Offset += sizeof (ACPI_NHLT_VENDOR_MIC_COUNT); + if (ACPI_FAILURE (Status)) + { + return; + } + + /* Get the vendor microphone config structure(s) */ + + for (j = 0; j < MicrophoneCount; j++) + { + AcpiOsPrintf ("\n /* Vendor-defined microphone array #%u*/\n", j+1); + DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset); + + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, + sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6); + if (ACPI_FAILURE (Status)) + { + return; + } + + Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG); + } + + /* Check for Microphone SNR and sensitivity extension */ + + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) == ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT) + { + AcpiOsPrintf ("\n /* Microphone SNR and sensitivity array */\n"); + DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset); + + Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific, + sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION), AcpiDmTableInfoNhlt9); + if (ACPI_FAILURE (Status)) + { + return; + } + + Offset += sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION); + } } - Offset += CapabilitiesSize; - break; } - /* Do the Formats_Config table */ + /* Do the Formats_Config table - starts with the FormatsCount field */ FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset); FormatsCount = FormatsConfig->FormatsCount; - AcpiOsPrintf ("\n/* Formats_Config table */\n"); + AcpiOsPrintf ("\n /* Formats_Config table */\n"); - Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig, - sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4); - if (ACPI_FAILURE (Status)) + /* Dump the FormatsCount value */ + + if (FormatsCount > 0) { - return; + Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig, + sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4); + if (ACPI_FAILURE (Status)) + { + return; + } } Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG); @@ -1676,36 +1745,43 @@ AcpiDmDumpNhlt ( /* Do the Wave_extensible struct */ - AcpiOsPrintf ("\n/* Wave_Format_Extensible table #%u */\n", j+1); + AcpiOsPrintf ("\n /* Wave_Format_Extensible table #%u */\n", j+1); Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3); if (ACPI_FAILURE (Status)) { return; } - Offset += sizeof (ACPI_NHLT_WAVE_EXTENSIBLE); - /* Do the Capabilities array */ + Offset += sizeof (ACPI_NHLT_FORMAT_CONFIG); - Offset += sizeof (UINT32); - AcpiOsPrintf ("\n/* Specific_Config table #%u */\n", j+1); - FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); - Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, - CapabilitiesSize, AcpiDmTableInfoNhlt3a); - if (ACPI_FAILURE (Status)) + if (CapabilitiesSize > 0) { - return; + FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); + /* Do the Capabilities array (of bytes) */ + + AcpiOsPrintf ("\n /* Specific_Config table #%u */\n", j+1); + FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset); + Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable, + CapabilitiesSize, AcpiDmTableInfoNhlt3a); + if (ACPI_FAILURE (Status)) + { + return; + } + + Offset += CapabilitiesSize; // + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); } - Offset += CapabilitiesSize; - } + + } /* for (j = 0; j < FormatsCount; j++) */ /* - * If we are not done with the Endpoint(s) yet, then there must be - * some Linux-specific structure(s) yet to be processed. + * If we are not done with the current Endpoint yet, then there must be + * some Linux-specific structure(s) yet to be processed. First, get + * the count of such structure(s). */ if (Offset < EndpointEndOffset) { - AcpiOsPrintf ("\n"); + AcpiOsPrintf ("\n /* Linux-specific structures (not part of NHLT spec) */\n"); Count = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Table, Offset); Status = AcpiDmDumpTable (TableLength, Offset, Count, sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT), AcpiDmTableInfoNhlt7); @@ -1715,14 +1791,32 @@ AcpiDmDumpNhlt ( } Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT); + if (Count->StructureCount > 1) + { + /* + * We currently cannot disassemble more than one + * Linux-Specific section, because we have no way of + * knowing whether the "Specific Data" part is present. + */ + Count->StructureCount = 1; + fprintf (stderr, "%s %s\n", "Feature not supported:", + "Cannot disassemble more than one Linux-Specific structure"); + return; + } + /* Variable number of linux-specific structures */ - for (k = 0; k < Count->StructureCount; k++) + for (j = 0; j < Count->StructureCount; j++) { LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset); + AcpiOsPrintf ("\n /* Linux-specific structure #%u (not part of NHLT spec) */\n", j+1); - AcpiOsPrintf ("\n/* Linux-specific structure #%u */\n", k+1); - + /* + * Dump the following Linux-specific fields: + * 1) Device ID + * 2) Device Instance ID + * 3) Device Port ID + */ Status = AcpiDmDumpTable (TableLength, Offset, LinuxData, sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA), AcpiDmTableInfoNhlt7a); if (ACPI_FAILURE (Status)) @@ -1731,28 +1825,43 @@ AcpiDmDumpNhlt ( } Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA); - } - /* Should be at the end of the Endpoint structure. Skip any extra bytes */ + /* + * Check that the current offset is not beyond the end of + * this endpoint descriptor. If it is not, we assume that + * the "Specific Data" field is present and valid. Note: + * This does not seem to be documented anywhere. + */ + if (Offset < EndpointEndOffset) + { + /* Dump the linux-specific "Specific Data" field */ - if (Offset < EndpointEndOffset) - { - AcpiOsPrintf ("\n/* Endpoint descriptor ended before endpoint size was reached. " - "skipped %X input bytes, current offset: %X, Endpoint End Offset: %X */\n", - EndpointEndOffset - Offset, Offset, EndpointEndOffset); - AcpiUtDumpBuffer (((UINT8 *)Table)+Offset, - EndpointEndOffset - Offset, DB_BYTE_DISPLAY, Offset); - Offset = EndpointEndOffset; + LinuxDataB = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA_B, Table, Offset); + Status = AcpiDmDumpTable (TableLength, Offset, LinuxDataB, + sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B), AcpiDmTableInfoNhlt7b); + if (ACPI_FAILURE (Status)) + { + return; + } + + Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA_B); + } } + + /* Should be at the end of the Endpoint structure. */ } - } - /* Emit the table terminator (if present) */ + } /* for (i = 0; i < EndpointCount; i++) */ + + /* + * Done with all of the Endpoint Descriptors, Emit the table terminator + * (if such a legacy structure is present -- not in NHLT specification) + */ if (Offset == TableLength - sizeof (ACPI_NHLT_TABLE_TERMINATOR)) { LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset); - AcpiOsPrintf ("\n/* Table terminator structure */\n"); + AcpiOsPrintf ("\n /* Table terminator structure (not part of NHLT spec) */\n"); Status = AcpiDmDumpTable (TableLength, Offset, LinuxData, sizeof (ACPI_NHLT_TABLE_TERMINATOR), AcpiDmTableInfoNhlt8); diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c index 347f9d36..7d812315 100644 --- a/src/acpica/source/common/dmtbinfo.c +++ b/src/acpica/source/common/dmtbinfo.c @@ -292,7 +292,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFacs[] = ACPI_DMTABLE_INFO AcpiDmTableInfoFadt1[] = { {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Facs), "FACS Address", 0}, - {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Dsdt), "DSDT Address", DT_NON_ZERO}, + {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Dsdt), "DSDT Address", 0}, {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Model), "Model", 0}, {ACPI_DMT_FADTPM, ACPI_FADT_OFFSET (PreferredProfile), "PM Profile", 0}, {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (SciInterrupt), "SCI Interrupt", 0}, @@ -408,7 +408,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFadt3[] = ACPI_DMT_TERMINATOR }; -/* ACPI 5.0 Extensions (FADT version 5) */ +/* Extensions for FADT version 5 */ ACPI_DMTABLE_INFO AcpiDmTableInfoFadt5[] = { @@ -417,7 +417,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFadt5[] = ACPI_DMT_TERMINATOR }; -/* ACPI 6.0 Extensions (FADT version 6) */ +/* Extensions for FADT version 6 */ ACPI_DMTABLE_INFO AcpiDmTableInfoFadt6[] = { diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c index 4cbe112e..ab1b2634 100644 --- a/src/acpica/source/common/dmtbinfo2.c +++ b/src/acpica/source/common/dmtbinfo2.c @@ -188,6 +188,25 @@ * Remaining tables are not consumed directly by the ACPICA subsystem */ +/******************************************************************************* + * + * AGDI - Arm Generic Diagnostic Dump and Reset Device Interface + * + * Conforms to "ACPI for Arm Components 1.1, Platform Design Document" + * ARM DEN0093 v1.1 + * + ******************************************************************************/ + +ACPI_DMTABLE_INFO AcpiDmTableInfoAgdi[] = +{ + {ACPI_DMT_UINT8, ACPI_AGDI_OFFSET (Flags), "Flags (decoded below)", 0}, + {ACPI_DMT_FLAG0, ACPI_AGDI_FLAG_OFFSET (Flags, 0), "Signalling mode", 0}, + {ACPI_DMT_UINT24, ACPI_AGDI_OFFSET (Reserved[0]), "Reserved", 0}, + {ACPI_DMT_UINT32, ACPI_AGDI_OFFSET (SdeiEvent), "SdeiEvent", 0}, + {ACPI_DMT_UINT32, ACPI_AGDI_OFFSET (Gsiv), "Gsiv", 0}, + ACPI_DMT_TERMINATOR +}; + /******************************************************************************* * @@ -1217,7 +1236,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt0[] = {ACPI_DMT_NHLT1, ACPI_NHLT0_OFFSET (LinkType), "Link Type", 0}, {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (InstanceId), "Instance Id", 0}, {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (VendorId), "Vendor Id", 0}, - {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (DeviceId), "Device Id", 0}, + {ACPI_DMT_NHLT1e, ACPI_NHLT0_OFFSET (DeviceId), "Device Id", 0}, {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (RevisionId), "Revision Id", 0}, {ACPI_DMT_UINT32, ACPI_NHLT0_OFFSET (SubsystemId), "Subsystem Id", 0}, {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (DeviceType), "Device Type", 0}, @@ -1230,9 +1249,9 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt0[] = ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt1[] = { - {ACPI_DMT_UINT32, ACPI_NHLT1_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, + {ACPI_DMT_UINT32, ACPI_NHLT1_OFFSET (CapabilitiesSize), "Capabilities Size", 0}, {ACPI_DMT_UINT8, ACPI_NHLT1_OFFSET (VirtualSlot), "Virtual Slot", 0}, - {ACPI_DMT_UINT8, ACPI_NHLT1_OFFSET (ConfigType), "Config Type", 0}, + {ACPI_DMT_NHLT1f, ACPI_NHLT1_OFFSET (ConfigType), "Config Type", 0}, ACPI_DMT_TERMINATOR }; @@ -1253,7 +1272,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt2[] = ACPI_DMT_TERMINATOR }; -/* Format Config */ +/* Format Config (wave_format_extensible structure) */ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3[] = { @@ -1267,7 +1286,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3[] = {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.ValidBitsPerSample), "Valid Bits Per Sample", 0}, {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (Format.ChannelMask), "Channel Mask", 0}, {ACPI_DMT_UUID, ACPI_NHLT3_OFFSET (Format.SubFormatGuid), "SubFormat GUID", 0}, - {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (CapabilitySize), "Capabilities Length", DT_LENGTH}, + {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (CapabilitySize), "Capabilities Length", 0}, ACPI_DMT_TERMINATOR }; @@ -1281,7 +1300,6 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3a[] = ACPI_DMT_TERMINATOR }; - /* Formats Config */ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt4[] = @@ -1294,9 +1312,8 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt4[] = ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5[] = { - {ACPI_DMT_UINT32, ACPI_NHLT5_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, {ACPI_DMT_UINT8, ACPI_NHLT5_OFFSET (VirtualSlot), "Virtual Slot", 0}, - {ACPI_DMT_UINT8, ACPI_NHLT5_OFFSET (ConfigType), "Config Type", 0}, + {ACPI_DMT_NHLT1f, ACPI_NHLT5_OFFSET (ConfigType), "Config Type", 0}, ACPI_DMT_TERMINATOR }; @@ -1304,10 +1321,9 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5[] = ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[] = { - {ACPI_DMT_UINT32, ACPI_NHLT5A_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (VirtualSlot), "Virtual Slot", 0}, - {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (ConfigType), "Config Type", 0}, - {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (ArrayType), "Array Type", 0}, + {ACPI_DMT_NHLT1f, ACPI_NHLT5A_OFFSET (ConfigType), "Config Type", 0}, + {ACPI_DMT_NHLT1d, ACPI_NHLT5A_OFFSET (ArrayType), "Array Type", 0}, ACPI_DMT_TERMINATOR }; @@ -1315,7 +1331,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[] = ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[] = { - {ACPI_DMT_UINT32, ACPI_NHLT5B_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, + {ACPI_DMT_UINT32, ACPI_NHLT5B_OFFSET (CapabilitiesSize), "Capabilities Size", 0}, ACPI_DMT_TERMINATOR }; @@ -1323,17 +1339,32 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[] = ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5c[] = { - {ACPI_DMT_UINT32, ACPI_NHLT5C_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH}, {ACPI_DMT_UINT8, ACPI_NHLT5C_OFFSET (VirtualSlot), "Virtual Slot", 0}, ACPI_DMT_TERMINATOR }; /* Microphone array Config */ +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6a[] = +{ + {ACPI_DMT_UINT8, ACPI_NHLT6A_OFFSET (MicrophoneCount), "Microphone Count", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Render Feedback Device Config, CapabilitiesSize == 7 */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6b[] = +{ + {ACPI_DMT_UINT8, ACPI_NHLT6B_OFFSET (FeedbackVirtualSlot), "Feedback Virtual Slot", 0}, + {ACPI_DMT_UINT16, ACPI_NHLT6B_OFFSET (FeedbackChannels), "Feedback Channels", 0}, + {ACPI_DMT_UINT16, ACPI_NHLT6B_OFFSET (FeedbackValidBitsPerSample),"Valid Bits Per Sample", 0}, + ACPI_DMT_TERMINATOR +}; + ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[] = { - {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (Type), "Type", 0}, - {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (Panel), "Panel", 0}, + {ACPI_DMT_NHLT1b, ACPI_NHLT6_OFFSET (Type), "Type", 0}, + {ACPI_DMT_NHLT1c, ACPI_NHLT6_OFFSET (Panel), "Panel", 0}, {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (SpeakerPositionDistance), "Speaker Position Distance", 0}, {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (HorizontalOffset), "Horizontal Offset", 0}, {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (VerticalOffset), "Vertical Offset", 0}, @@ -1352,7 +1383,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[] = ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7[] = { - {ACPI_DMT_UINT8, ACPI_NHLT7_OFFSET (StructureCount), "Linux-specific struct count", 0}, + {ACPI_DMT_UINT8, ACPI_NHLT7_OFFSET (StructureCount), "Linux-specific Count", 0}, ACPI_DMT_TERMINATOR }; @@ -1363,7 +1394,12 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7a[] = {ACPI_DMT_BUF16, ACPI_NHLT7A_OFFSET (DeviceId), "Device ID", 0}, {ACPI_DMT_UINT8, ACPI_NHLT7A_OFFSET (DeviceInstanceId), "Device Instance ID", 0}, {ACPI_DMT_UINT8, ACPI_NHLT7A_OFFSET (DevicePortId), "Device Port ID", 0}, - {ACPI_DMT_BUF18, ACPI_NHLT7A_OFFSET (Filler), "Specific Data", 0}, + ACPI_DMT_TERMINATOR +}; + +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7b[] = +{ + {ACPI_DMT_BUF18, ACPI_NHLT7B_OFFSET (SpecificData), "Specific Data", 0}, ACPI_DMT_TERMINATOR }; @@ -1376,6 +1412,15 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt8[] = ACPI_DMT_TERMINATOR }; +/* Sensitivity Extension */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt9[] = +{ + {ACPI_DMT_UINT32, ACPI_NHLT9_OFFSET (SNR), "Signal-to-noise ratio", 0}, + {ACPI_DMT_UINT32, ACPI_NHLT9_OFFSET (Sensitivity), "Mic Sensitivity", 0}, + ACPI_DMT_TERMINATOR +}; + /******************************************************************************* * diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c index 12e1be4c..6bdaf676 100644 --- a/src/acpica/source/common/dmtbinfo3.c +++ b/src/acpica/source/common/dmtbinfo3.c @@ -491,6 +491,20 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[] = }; +/******************************************************************************* + * + * TDEL - TD-Event Log Table + * + ******************************************************************************/ + +ACPI_DMTABLE_INFO AcpiDmTableInfoTdel[] = +{ + {ACPI_DMT_UINT32, ACPI_TDEL_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT64, ACPI_TDEL_OFFSET (LogAreaMinimumLength), "Log Area Minimum Length", 0}, + {ACPI_DMT_UINT64, ACPI_TDEL_OFFSET (LogAreaStartAddress), "Log Area Start Address", 0}, + ACPI_DMT_TERMINATOR +}; + /******************************************************************************* * * TPM2 - Trusted Platform Module (TPM) 2.0 Hardware Interface Table diff --git a/src/acpica/source/compiler/aslcache.c b/src/acpica/source/compiler/aslcache.c index 51e6f4c4..05ae19b7 100644 --- a/src/acpica/source/compiler/aslcache.c +++ b/src/acpica/source/compiler/aslcache.c @@ -183,6 +183,11 @@ UtLocalCacheCalloc ( UINT32 CacheSize = ASL_STRING_CACHE_SIZE; +#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED + /* Used for objects other than strings, so keep allocations aligned */ + Length = ACPI_ROUND_UP_TO_NATIVE_WORD (Length); +#endif + if (Length > CacheSize) { CacheSize = Length; diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c index a93417c6..14403d3d 100644 --- a/src/acpica/source/compiler/aslfiles.c +++ b/src/acpica/source/compiler/aslfiles.c @@ -835,8 +835,8 @@ ErrorExit: * RETURN: Status * * DESCRIPTION: Open the specified input file, and save the directory path to - * the file so that include files can be opened in - * the same directory. + * the file so that include files can be opened in the same + * directory. NOTE: File is opened in text mode. * ******************************************************************************/ diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c index 4dd6422b..ca50d281 100644 --- a/src/acpica/source/compiler/aslmessages.c +++ b/src/acpica/source/compiler/aslmessages.c @@ -410,6 +410,8 @@ const char *AslTableCompilerMsgs [] = /* ASL_MSG_ENTRY_LIST */ "Invalid entry initializer list", /* ASL_MSG_UNKNOWN_FORMAT */ "Unknown format value", /* ASL_MSG_RESERVED_VALUE */ "Value for field is reserved or unknown", +/* ASL_MSG_TWO_ZERO_VALUES */ "32-bit DSDT Address and 64-bit X_DSDT Address cannot both be zero", +/* ASL_MSG_BAD_PARSE_TREE */ "Parse tree appears to be ill-defined" }; /* Preprocessor */ diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h index 69c2561b..0e9fefd4 100644 --- a/src/acpica/source/compiler/aslmessages.h +++ b/src/acpica/source/compiler/aslmessages.h @@ -412,6 +412,8 @@ typedef enum ASL_MSG_ENTRY_LIST, ASL_MSG_UNKNOWN_FORMAT, ASL_MSG_RESERVED_VALUE, + ASL_MSG_TWO_ZERO_VALUES, + ASL_MSG_BAD_PARSE_TREE, /* These messages are used by the Preprocessor only */ diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c index 97881e14..3954388c 100644 --- a/src/acpica/source/compiler/aslstartup.c +++ b/src/acpica/source/compiler/aslstartup.c @@ -293,9 +293,17 @@ AslDetectSourceFileType ( goto Cleanup; } - /* We have some sort of binary table, check for valid ACPI table */ - - fseek (Info->Handle, 0, SEEK_SET); + /* + * We have some sort of binary table; reopen in binary mode, then + * check for valid ACPI table + */ + fclose (Info->Handle); + Info->Handle = fopen (Info->Filename, "rb"); + if (!Info->Handle) + { + fprintf (stderr, "Could not open input file %s\n", + Info->Filename); + } Status = AcValidateTableHeader (Info->Handle, 0); if (ACPI_SUCCESS (Status)) @@ -446,8 +454,9 @@ AslDoOneFile ( UtConvertBackslashes (AslGbl_Files[ASL_FILE_INPUT].Filename); /* - * Open the input file. Here, this should be an ASCII source file, - * either an ASL file or a Data Table file + * Open the input file. Here, this could be an ASCII source file, + * either an ASL file or a Data Table file, or a binary AML file + * or binary data table file (For disassembly). */ Status = FlOpenInputFile (AslGbl_Files[ASL_FILE_INPUT].Filename); if (ACPI_FAILURE (Status)) @@ -458,8 +467,6 @@ AslDoOneFile ( FileNode = FlGetCurrentFileNode(); - FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); - /* Determine input file type */ AslGbl_FileType = AslDetectSourceFileType (&AslGbl_Files[ASL_FILE_INPUT]); @@ -469,6 +476,8 @@ AslDoOneFile ( return (AE_ERROR); } + FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); + /* * If -p not specified, we will use the input filename as the * output filename prefix diff --git a/src/acpica/source/compiler/asluuid.c b/src/acpica/source/compiler/asluuid.c index 30540acd..def35c92 100644 --- a/src/acpica/source/compiler/asluuid.c +++ b/src/acpica/source/compiler/asluuid.c @@ -211,4 +211,3 @@ AuValidateUuid ( return (AE_OK); } - diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h index 614a686f..d9c92ce2 100644 --- a/src/acpica/source/compiler/dtcompiler.h +++ b/src/acpica/source/compiler/dtcompiler.h @@ -762,6 +762,7 @@ DtGetGenericTableInfo ( /* ACPI Table templates */ extern const unsigned char TemplateAest[]; +extern const unsigned char TemplateAgdi[]; extern const unsigned char TemplateAsf[]; extern const unsigned char TemplateBoot[]; extern const unsigned char TemplateBdat[]; @@ -793,6 +794,7 @@ extern const unsigned char TemplateMpst[]; extern const unsigned char TemplateMsct[]; extern const unsigned char TemplateMsdm[]; extern const unsigned char TemplateNfit[]; +extern const unsigned char TemplateNhlt[]; extern const unsigned char TemplatePcct[]; extern const unsigned char TemplatePdtt[]; extern const unsigned char TemplatePhat[]; @@ -814,6 +816,7 @@ extern const unsigned char TemplateSrat[]; extern const unsigned char TemplateStao[]; extern const unsigned char TemplateSvkl[]; extern const unsigned char TemplateTcpa[]; +extern const unsigned char TemplateTdel[]; extern const unsigned char TemplateTpm2[]; extern const unsigned char TemplateUefi[]; extern const unsigned char TemplateViot[]; diff --git a/src/acpica/source/compiler/dttable.c b/src/acpica/source/compiler/dttable.c index 702c83ee..fb3f26f1 100644 --- a/src/acpica/source/compiler/dttable.c +++ b/src/acpica/source/compiler/dttable.c @@ -223,10 +223,12 @@ DtCompileRsdp ( * * RETURN: Status * - * DESCRIPTION: Compile FADT. + * DESCRIPTION: Compile FADT (signature FACP). * *****************************************************************************/ +#define ACPI_XDSDT_LOCATION_IN_LIST 11 + ACPI_STATUS DtCompileFadt ( void **List) @@ -235,10 +237,17 @@ DtCompileFadt ( DT_SUBTABLE *Subtable; DT_SUBTABLE *ParentTable; DT_FIELD **PFieldList = (DT_FIELD **) List; - ACPI_TABLE_HEADER *Table; + DT_FIELD *DsdtFieldList; + ACPI_TABLE_FADT *Table; UINT8 Revision; + UINT32 DsdtAddress; + UINT64 X_DsdtAddress; + UINT32 i; + + /* Get the table revision and 32-bit DSDT Address definition */ + DsdtFieldList = (*PFieldList)->Next; Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1, &Subtable); if (ACPI_FAILURE (Status)) @@ -249,8 +258,16 @@ DtCompileFadt ( ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); - Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); - Revision = Table->Revision; + Table = ACPI_CAST_PTR (ACPI_TABLE_FADT, ParentTable->Buffer); + Revision = Table->Header.Revision; + DsdtAddress = Table->Dsdt; + + /* FADT version 1 has only 32-bit addresses - error if DSDT address is NULL */ + + if ((Revision == 1) && (!DsdtAddress)) + { + DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, DsdtFieldList, NULL); + } if (Revision == 2) { @@ -263,8 +280,24 @@ DtCompileFadt ( DtInsertSubtable (ParentTable, Subtable); } - else if (Revision >= 2) + + else if (Revision > 2) { + /* + * Rev 3 and greater have 64-bit addresses (as well as 32-bit). + * Get the 64-bit DSDT (X_DSDT) Address definition. Note: This + * appears at field list offset 11 within AcpiDmTableInfoFadt3. + */ + DsdtFieldList = *PFieldList; + for (i = 0; i < ACPI_XDSDT_LOCATION_IN_LIST; i++) + { + DsdtFieldList = DsdtFieldList->Next; + if (!DsdtFieldList) + { + return (ASL_MSG_BAD_PARSE_TREE); + } + } + Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3, &Subtable); if (ACPI_FAILURE (Status)) @@ -274,6 +307,20 @@ DtCompileFadt ( DtInsertSubtable (ParentTable, Subtable); + Table = ACPI_CAST_PTR (ACPI_TABLE_FADT, ParentTable->Buffer); + X_DsdtAddress = Table->XDsdt; + + /* + * Error if both the 32-bit DSDT address and the + * 64-bit X_DSDT address are zero. + */ + if ((!X_DsdtAddress) && (!DsdtAddress)) + { + DtError (ASL_ERROR, ASL_MSG_TWO_ZERO_VALUES, DsdtFieldList, NULL); + } + + /* Fields specific to FADT Revision 5 (appended to previous) */ + if (Revision >= 5) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5, @@ -286,6 +333,8 @@ DtCompileFadt ( DtInsertSubtable (ParentTable, Subtable); } + /* Fields specific to FADT Revision 6 (appended to previous) */ + if (Revision >= 6) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6, diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c index b9445122..85406361 100644 --- a/src/acpica/source/compiler/dttable2.c +++ b/src/acpica/source/compiler/dttable2.c @@ -781,6 +781,390 @@ DtCompileNfit ( } +/****************************************************************************** + * + * FUNCTION: DtCompileNhlt + * + * PARAMETERS: List - Current field list pointer + * + * RETURN: Status + * + * DESCRIPTION: Compile NHLT. + * + *****************************************************************************/ + +ACPI_STATUS +DtCompileNhlt ( + void **List) +{ + ACPI_STATUS Status; + UINT32 EndpointCount; + UINT32 MicrophoneCount; + UINT32 FormatsCount; + DT_SUBTABLE *Subtable; + DT_SUBTABLE *ParentTable; + DT_FIELD **PFieldList = (DT_FIELD **) List; + UINT32 CapabilitiesSize; + UINT8 ArrayType; + UINT8 ConfigType; + UINT8 LinuxSpecificCount; + UINT32 i; + UINT32 j; + ACPI_TABLE_NHLT_ENDPOINT_COUNT *MainTable; + ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific; + ACPI_NHLT_VENDOR_MIC_COUNT *MicCount; + ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; + ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D *ConfigSpecific; + ACPI_NHLT_LINUX_SPECIFIC_COUNT *LinuxSpecific; + + + /* Main table */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + /* Get the Endpoint Descriptor count */ + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + DtPushSubtable (Subtable); + + MainTable = ACPI_CAST_PTR (ACPI_TABLE_NHLT_ENDPOINT_COUNT, Subtable->Buffer); + EndpointCount = MainTable->EndpointCount; + + /* Subtables */ + + while (*PFieldList) + { + /* Variable number of Endpoint descriptors */ + + for (i = 0; i < EndpointCount; i++) + { + /* Do the Endpoint Descriptor */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt0, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + DtPushSubtable (Subtable); + + /* Do the Device Specific table */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + DtPushSubtable (Subtable); + + DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable->Buffer); + CapabilitiesSize = DevSpecific->CapabilitiesSize; + + ArrayType = 0; + ConfigType = 0; + + switch (CapabilitiesSize) + { + case 0: + break; + + case 1: + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5c, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + break; + + case 2: + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + break; + + case 3: + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); + ArrayType = ConfigSpecific->ArrayType; + ConfigType = ConfigSpecific->ConfigType; + break; + + case 7: + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6b, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); + ArrayType = ConfigSpecific->ArrayType; + ConfigType = ConfigSpecific->ConfigType; + break; + + default: + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5a, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + ConfigSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D, Subtable->Buffer); + ArrayType = ConfigSpecific->ArrayType; + ConfigType = ConfigSpecific->ConfigType; + break; + + } /* switch (CapabilitiesSize) */ + + if (CapabilitiesSize >= 3) + { + /* Check for a vendor-defined mic array */ + + if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY) + { + if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED) + { + /* Get the microphone count */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6a, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + MicCount = ACPI_CAST_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Subtable->Buffer); + MicrophoneCount = MicCount->MicrophoneCount; + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + /* Variable number of microphones */ + + for (j = 0; j < MicrophoneCount; j++) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt6, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + } + + /* Do the MIC_SNR_SENSITIVITY_EXTENSION, if present */ + + if (ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt9, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + } + } + } + } + + /* Get the formats count */ + + DtPopSubtable (); + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt4, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + FormatsConfig = ACPI_CAST_PTR (ACPI_NHLT_FORMATS_CONFIG, Subtable->Buffer); + FormatsCount = FormatsConfig->FormatsCount; + + /* Variable number of wave_format_extensible structs */ + + for (j = 0; j < FormatsCount; j++) + { + /* Do the main wave_format_extensible structure */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + DtPushSubtable (Subtable); + + /* Do the capabilities list */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + DtPopSubtable (); + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + } /* for (j = 0; j < FormatsCount; j++) */ + + /* + * If we are not done with the current Endpoint yet, then there must be + * some Linux-specific structure(s) yet to be processed. First, get + * the count of such structure(s). + */ + if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) + { + /* Get the count of Linux-specific structures */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + LinuxSpecific = ACPI_CAST_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Subtable->Buffer); + LinuxSpecificCount = LinuxSpecific->StructureCount; + + for (j = 0; j < LinuxSpecificCount; j++) + { + /* + * Compile the following Linux-specific fields: + * 1) Device ID + * 2) Device Instance ID + * 3) Device Port ID + */ + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7a, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + /* + * To have a valid Linux-specific "Specific Data" at this + * point, we need: + * 1) The next field must be named "Specific Data" + */ + if (!strcmp ((const char *) (*PFieldList)->Name, "Specific Data")) + { + /* Compile the "Specific Data" field */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + } + + } /* for (j = 0; j < LinuxSpecificCount; j++) */ + } + + DtPopSubtable (); + + } /* for (i = 0; i < EndpointCount; i++) */ + + /* + * All Endpoint Descriptors are completed. + * Do the table terminator structure (not in NHLT spec, optional) + */ + if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt8, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + } + + return (AE_OK); + } + + return (AE_OK); +} + + /****************************************************************************** * * FUNCTION: DtCompilePcct @@ -2141,7 +2525,6 @@ DtCompileStao ( } - /****************************************************************************** * * FUNCTION: DtCompileSvkl diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h index 24c8c6f9..e9272f3a 100644 --- a/src/acpica/source/compiler/dttemplate.h +++ b/src/acpica/source/compiler/dttemplate.h @@ -249,6 +249,16 @@ const unsigned char TemplateAest[] = 0x56,0x00,0x00,0x00 /* 000002C8 "V..." */ }; +const unsigned char TemplateAgdi[] = +{ + 0x41,0x47,0x44,0x49,0x30,0x00,0x00,0x00, /* 00000000 "AGDI0..." */ + 0x01,0xE4,0x41,0x4D,0x50,0x45,0x52,0x45, /* 00000008 "..AMPERE" */ + 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */ + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x05,0x01,0x21,0x20,0x00,0x00,0x00,0x00, /* 00000020 "..! ...." */ + 0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00 /* 00000028 "...@...." */ +}; + const unsigned char TemplateAsf[] = { 0x41,0x53,0x46,0x21,0x72,0x00,0x00,0x00, /* 00000000 "ASF!r..." */ @@ -1185,6 +1195,78 @@ const unsigned char TemplateNfit[] = 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /* 00000180 "........" */ }; +const unsigned char TemplateNhlt[] = +{ + 0x4E,0x48,0x4C,0x54,0x1E,0x02,0x00,0x00, /* 00000000 "NHLT...." */ + 0x01,0xF7,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ + 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */ + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x30,0x09,0x21,0x20,0x04,0xAD,0x00,0x00, /* 00000020 "0.! ...." */ + 0x00,0x02,0x06,0x07,0x00,0x30,0xAE,0x09, /* 00000028 ".....0.." */ + 0x00,0x0A,0x00,0x00,0x00,0x02,0x03,0x0D, /* 00000030 "........" */ + 0x38,0x00,0x00,0x00,0xCC,0x01,0x1F,0x02, /* 00000038 "8......." */ + 0x04,0x00,0x13,0x00,0x09,0x00,0x11,0x00, /* 00000040 "........" */ + 0x04,0x20,0x07,0x00,0x09,0x00,0x18,0x00, /* 00000048 ". ......" */ + 0x22,0x00,0x11,0x00,0x15,0x00,0x05,0x03, /* 00000050 ""......." */ + 0x13,0x00,0x09,0x00,0x11,0x00,0x04,0x20, /* 00000058 "....... " */ + 0x07,0x00,0x09,0x00,0x18,0x00,0x22,0x00, /* 00000060 "......"." */ + 0x11,0x00,0x15,0x00,0xAA,0xAA,0x99,0x99, /* 00000068 "........" */ + 0x78,0x56,0x34,0x12,0x02,0xFE,0xFF,0x78, /* 00000070 "xV4....x" */ + 0x56,0x44,0x33,0x00,0x00,0x66,0x55,0x00, /* 00000078 "VD3..fU." */ + 0x00,0x00,0x80,0x16,0x00,0x32,0x00,0x04, /* 00000080 ".....2.." */ + 0x00,0x99,0x99,0x88,0x88,0x6E,0x88,0x9F, /* 00000088 ".....n.." */ + 0xA6,0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B, /* 00000090 "..l.E..{" */ + 0x5D,0xCE,0x24,0xC5,0x53,0x02,0x00,0x00, /* 00000098 "].$.S..." */ + 0x00,0x30,0x40,0xFE,0xFF,0x78,0x56,0x44, /* 000000A0 ".0@..xVD" */ + 0x33,0x00,0x00,0x66,0x55,0x00,0x00,0x00, /* 000000A8 "3..fU..." */ + 0x80,0x16,0x00,0x32,0x00,0x04,0x00,0x99, /* 000000B0 "...2...." */ + 0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6,0xEB, /* 000000B8 "...n...." */ + 0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D,0xCE, /* 000000C0 "l.E..{]." */ + 0x24,0xC5,0x53,0x03,0x00,0x00,0x00,0x50, /* 000000C8 "$.S....P" */ + 0x60,0x70,0x48,0x00,0x00,0x00,0x05,0x06, /* 000000D0 "`pH....." */ + 0x07,0x00,0x34,0xAE,0x09,0x00,0x0A,0x00, /* 000000D8 "..4....." */ + 0x00,0x00,0x02,0x00,0x0D,0x02,0x00,0x00, /* 000000E0 "........" */ + 0x00,0xCC,0x00,0x01,0xFE,0xFF,0x78,0x56, /* 000000E8 "......xV" */ + 0x44,0x33,0x00,0x00,0x66,0x55,0x00,0x00, /* 000000F0 "D3..fU.." */ + 0x00,0x80,0x16,0x00,0x32,0x00,0x04,0x00, /* 000000F8 "....2..." */ + 0x99,0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6, /* 00000100 "....n..." */ + 0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D, /* 00000108 ".l.E..{]" */ + 0xCE,0x24,0xC5,0x53,0x02,0x00,0x00,0x00, /* 00000110 ".$.S...." */ + 0x70,0x80,0x80,0x00,0x00,0x00,0x02,0x06, /* 00000118 "p......." */ + 0x07,0x00,0x30,0xAE,0x09,0x00,0x0A,0x00, /* 00000120 "..0....." */ + 0x00,0x00,0x02,0x03,0x0D,0x07,0x00,0x00, /* 00000128 "........" */ + 0x00,0xCC,0x03,0x09,0x34,0x12,0x28,0x01, /* 00000130 "....4.(." */ + 0x02,0xFE,0xFF,0x78,0x56,0x44,0x33,0x00, /* 00000138 "...xVD3." */ + 0x00,0x66,0x55,0x00,0x00,0x00,0x80,0x16, /* 00000140 ".fU....." */ + 0x00,0x32,0x00,0x04,0x00,0x99,0x99,0x88, /* 00000148 ".2......" */ + 0x88,0x6E,0x88,0x9F,0xA6,0xEB,0x6C,0x94, /* 00000150 ".n....l." */ + 0x45,0xA4,0x1F,0x7B,0x5D,0xCE,0x24,0xC5, /* 00000158 "E..{].$." */ + 0x53,0x04,0x00,0x00,0x00,0x70,0x80,0x90, /* 00000160 "S....p.." */ + 0xA0,0xFE,0xFF,0x78,0x56,0x44,0x33,0x00, /* 00000168 "...xVD3." */ + 0x00,0x66,0x55,0x00,0x00,0x00,0x80,0x16, /* 00000170 ".fU....." */ + 0x00,0x32,0x00,0x04,0x00,0x99,0x99,0x88, /* 00000178 ".2......" */ + 0x88,0x6E,0x88,0x9F,0xA6,0xEB,0x6C,0x94, /* 00000180 ".n....l." */ + 0x45,0xA4,0x1F,0x7B,0x5D,0xCE,0x24,0xC5, /* 00000188 "E..{].$." */ + 0x53,0x05,0x00,0x00,0x00,0x70,0x80,0x90, /* 00000190 "S....p.." */ + 0xA0,0xB0,0x7C,0x00,0x00,0x00,0x05,0x06, /* 00000198 "..|....." */ + 0x07,0x00,0x34,0xAE,0x09,0x00,0x0A,0x00, /* 000001A0 "..4....." */ + 0x00,0x00,0x02,0x00,0x0D,0x02,0x00,0x00, /* 000001A8 "........" */ + 0x00,0xCC,0x00,0x01,0xFE,0xFF,0x78,0x56, /* 000001B0 "......xV" */ + 0x44,0x33,0x00,0x00,0x66,0x55,0x00,0x00, /* 000001B8 "D3..fU.." */ + 0x00,0x80,0x16,0x00,0x32,0x00,0x04,0x00, /* 000001C0 "....2..." */ + 0x99,0x99,0x88,0x88,0x6E,0x88,0x9F,0xA6, /* 000001C8 "....n..." */ + 0xEB,0x6C,0x94,0x45,0xA4,0x1F,0x7B,0x5D, /* 000001D0 ".l.E..{]" */ + 0xCE,0x24,0xC5,0x53,0x11,0x00,0x00,0x00, /* 000001D8 ".$.S...." */ + 0x00,0x01,0x32,0x03,0x04,0x05,0x06,0x37, /* 000001E0 "..2....7" */ + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x3F, /* 000001E8 ".......?" */ + 0x0A,0x01,0x00,0x01,0x32,0x03,0x04,0x05, /* 000001F0 "....2..." */ + 0x06,0x37,0x08,0x09,0x0A,0x0B,0x0C,0x0D, /* 000001F8 ".7......" */ + 0x0E,0x3F,0x44,0x9A,0x00,0x01,0x32,0x03, /* 00000200 ".?D...2." */ + 0x04,0x05,0x06,0x37,0x08,0x09,0x0A,0x0B, /* 00000208 "...7...." */ + 0x0C,0x0D,0x0E,0x3F,0x0A,0x0B,0x04,0x00, /* 00000210 "...?...." */ + 0x00,0x00,0xEF,0xBE,0xAD,0xDE /* 00000218 "......" */ +}; + const unsigned char TemplatePcct[] = { 0x50,0x43,0x43,0x54,0xAE,0x02,0x00,0x00, /* 00000000 "PCCT...." */ @@ -1756,6 +1838,17 @@ const unsigned char TemplateTcpa[] = 0x01,0x01,0x01,0x01 /* 00000060 "...." */ }; +const unsigned char TemplateTdel[] = +{ + 0x54,0x44,0x45,0x4C,0x38,0x00,0x00,0x00, /* 00000000 "TDEL8..." */ + 0x04,0x1C,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ + 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */ + 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x30,0x09,0x21,0x20,0x00,0x00,0x00,0x00, /* 00000020 "0.! ...." */ + 0xEF,0xCD,0xAB,0x78,0x56,0x34,0x12,0x00, /* 00000028 "...xV4.." */ + 0x78,0x56,0x34,0x12,0xEF,0xCD,0xAB,0x00 /* 00000030 "xV4....." */ +}; + const unsigned char TemplateTpm2[] = { 0x54,0x50,0x4D,0x32,0x4C,0x00,0x00,0x00, /* 00000000 "TPM2L..." */ diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c index 52180fb3..2342ace3 100644 --- a/src/acpica/source/compiler/dtutils.c +++ b/src/acpica/source/compiler/dtutils.c @@ -437,6 +437,7 @@ DtGetFieldType ( case ACPI_DMT_BUF10: case ACPI_DMT_BUF12: case ACPI_DMT_BUF16: + case ACPI_DMT_BUF18: case ACPI_DMT_BUF128: case ACPI_DMT_PCI_PATH: case ACPI_DMT_PMTT_VENDOR: @@ -583,6 +584,10 @@ DtGetFieldLength ( case ACPI_DMT_MADT: case ACPI_DMT_NHLT1: case ACPI_DMT_NHLT1a: + case ACPI_DMT_NHLT1b: + case ACPI_DMT_NHLT1c: + case ACPI_DMT_NHLT1d: + case ACPI_DMT_NHLT1f: case ACPI_DMT_PCCT: case ACPI_DMT_PMTT: case ACPI_DMT_PPTT: @@ -611,6 +616,7 @@ DtGetFieldLength ( case ACPI_DMT_HEST: case ACPI_DMT_HMAT: case ACPI_DMT_NFIT: + case ACPI_DMT_NHLT1e: case ACPI_DMT_PCI_PATH: case ACPI_DMT_PHAT: @@ -737,6 +743,11 @@ DtGetFieldLength ( ByteLength = 16; break; + case ACPI_DMT_BUF18: + + ByteLength = 18; + break; + case ACPI_DMT_BUF128: ByteLength = 128; diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c index 153cd89a..579421fa 100644 --- a/src/acpica/source/components/dispatcher/dsopcode.c +++ b/src/acpica/source/components/dispatcher/dsopcode.c @@ -707,6 +707,7 @@ AcpiDsEvalTableRegionOperands ( ObjDesc->Region.Address = ACPI_PTR_TO_PHYSADDR (Table); ObjDesc->Region.Length = Table->Length; + ObjDesc->Region.Pointer = Table; ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n", ObjDesc, ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), diff --git a/src/acpica/source/components/events/evhandler.c b/src/acpica/source/components/events/evhandler.c index 39171014..763b294e 100644 --- a/src/acpica/source/components/events/evhandler.c +++ b/src/acpica/source/components/events/evhandler.c @@ -563,7 +563,7 @@ AcpiEvInstallSpaceHandler ( case ACPI_ADR_SPACE_DATA_TABLE: Handler = AcpiExDataTableSpaceHandler; - Setup = NULL; + Setup = AcpiEvDataTableRegionSetup; break; default: diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c index 2624cd65..6c73bc80 100644 --- a/src/acpica/source/components/events/evregion.c +++ b/src/acpica/source/components/events/evregion.c @@ -320,6 +320,15 @@ AcpiEvAddressSpaceDispatch ( return_ACPI_STATUS (AE_NOT_EXIST); } + if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_COMM) + { + ACPI_PCC_INFO *Ctx = HandlerDesc->AddressSpace.Context; + + Ctx->InternalBuffer = FieldObj->Field.InternalPccBuffer; + Ctx->Length = (UINT16) RegionObj->Region.Length; + Ctx->SubspaceId = (UINT8) RegionObj->Region.Address; + } + /* * We must exit the interpreter because the region setup will * potentially execute control methods (for example, the _REG method diff --git a/src/acpica/source/components/events/evrgnini.c b/src/acpica/source/components/events/evrgnini.c index 9327d8f7..6959ff98 100644 --- a/src/acpica/source/components/events/evrgnini.c +++ b/src/acpica/source/components/events/evrgnini.c @@ -599,6 +599,64 @@ AcpiEvCmosRegionSetup ( } +/******************************************************************************* + * + * FUNCTION: AcpiEvDataTableRegionSetup + * + * PARAMETERS: Handle - Region we are interested in + * Function - Start or stop + * HandlerContext - Address space handler context + * RegionContext - Region specific context + * + * RETURN: Status + * + * DESCRIPTION: Setup a DataTableRegion + * + * MUTEX: Assumes namespace is not locked + * + ******************************************************************************/ + +ACPI_STATUS +AcpiEvDataTableRegionSetup ( + ACPI_HANDLE Handle, + UINT32 Function, + void *HandlerContext, + void **RegionContext) +{ + ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle; + ACPI_DATA_TABLE_MAPPING *LocalRegionContext; + + + ACPI_FUNCTION_TRACE (EvDataTableRegionSetup); + + + if (Function == ACPI_REGION_DEACTIVATE) + { + if (*RegionContext) + { + ACPI_FREE (*RegionContext); + *RegionContext = NULL; + } + return_ACPI_STATUS (AE_OK); + } + + /* Create a new context */ + + LocalRegionContext = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DATA_TABLE_MAPPING)); + if (!(LocalRegionContext)) + { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + /* Save the data table pointer for use in the handler */ + + LocalRegionContext->Pointer = RegionDesc->Region.Pointer; + + *RegionContext = LocalRegionContext; + return_ACPI_STATUS (AE_OK); +} + + /******************************************************************************* * * FUNCTION: AcpiEvDefaultRegionSetup diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c index 301e8830..ff26ade7 100644 --- a/src/acpica/source/components/executer/exconfig.c +++ b/src/acpica/source/components/executer/exconfig.c @@ -596,7 +596,7 @@ AcpiExLoadOp ( ACPI_INFO (("Dynamic OEM Table Load:")); AcpiExExitInterpreter (); Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table), - ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, TRUE, &TableIndex); + ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, Table, TRUE, &TableIndex); AcpiExEnterInterpreter (); if (ACPI_FAILURE (Status)) { diff --git a/src/acpica/source/components/executer/excreate.c b/src/acpica/source/components/executer/excreate.c index 8afae43c..18a3af2f 100644 --- a/src/acpica/source/components/executer/excreate.c +++ b/src/acpica/source/components/executer/excreate.c @@ -451,6 +451,7 @@ AcpiExCreateRegion ( ObjDesc->Region.SpaceId = SpaceId; ObjDesc->Region.Address = 0; ObjDesc->Region.Length = 0; + ObjDesc->Region.Pointer = NULL; ObjDesc->Region.Node = Node; ObjDesc->Region.Handler = NULL; ObjDesc->Common.Flags &= diff --git a/src/acpica/source/components/executer/exfield.c b/src/acpica/source/components/executer/exfield.c index 7871e350..b33ab5b3 100644 --- a/src/acpica/source/components/executer/exfield.c +++ b/src/acpica/source/components/executer/exfield.c @@ -492,9 +492,7 @@ AcpiExWriteDataToField ( ObjDesc->Field.BaseByteOffset, SourceDesc->Buffer.Pointer, DataLength); - if ((ObjDesc->Field.RegionObj->Region.Address == PCC_MASTER_SUBSPACE && - MASTER_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) || - GENERIC_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) + if (MASTER_SUBSPACE_COMMAND (ObjDesc->Field.BaseByteOffset)) { /* Perform the write */ diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c index bf40b697..424e1e99 100644 --- a/src/acpica/source/components/executer/exoparg1.c +++ b/src/acpica/source/components/executer/exoparg1.c @@ -1193,7 +1193,7 @@ AcpiExOpcode_1A_0T_1R ( WalkState, ReturnDesc, &TempDesc); if (ACPI_FAILURE (Status)) { - goto Cleanup; + return_ACPI_STATUS (Status); } ReturnDesc = TempDesc; diff --git a/src/acpica/source/components/executer/exregion.c b/src/acpica/source/components/executer/exregion.c index 2f49eb0a..cd1fa2eb 100644 --- a/src/acpica/source/components/executer/exregion.c +++ b/src/acpica/source/components/executer/exregion.c @@ -692,9 +692,17 @@ AcpiExDataTableSpaceHandler ( void *HandlerContext, void *RegionContext) { + ACPI_DATA_TABLE_MAPPING *Mapping; + char *Pointer; + + ACPI_FUNCTION_TRACE (ExDataTableSpaceHandler); + Mapping = (ACPI_DATA_TABLE_MAPPING *) RegionContext; + Pointer = ACPI_CAST_PTR (char, Mapping->Pointer) + + (Address - ACPI_PTR_TO_PHYSADDR (Mapping->Pointer)); + /* * Perform the memory read or write. The BitWidth was already * validated. @@ -703,14 +711,12 @@ AcpiExDataTableSpaceHandler ( { case ACPI_READ: - memcpy (ACPI_CAST_PTR (char, Value), ACPI_PHYSADDR_TO_PTR (Address), - ACPI_DIV_8 (BitWidth)); + memcpy (ACPI_CAST_PTR (char, Value), Pointer, ACPI_DIV_8 (BitWidth)); break; case ACPI_WRITE: - memcpy (ACPI_PHYSADDR_TO_PTR (Address), ACPI_CAST_PTR (char, Value), - ACPI_DIV_8 (BitWidth)); + memcpy (Pointer, ACPI_CAST_PTR (char, Value), ACPI_DIV_8 (BitWidth)); break; default: diff --git a/src/acpica/source/components/hardware/hwesleep.c b/src/acpica/source/components/hardware/hwesleep.c index e8db4d26..19463e5a 100644 --- a/src/acpica/source/components/hardware/hwesleep.c +++ b/src/acpica/source/components/hardware/hwesleep.c @@ -261,7 +261,10 @@ AcpiHwExtendedSleep ( /* Flush caches, as per ACPI specification */ - ACPI_FLUSH_CPU_CACHE (); + if (SleepState < ACPI_STATE_S4) + { + ACPI_FLUSH_CPU_CACHE (); + } Status = AcpiOsEnterSleep (SleepState, SleepControl, 0); if (Status == AE_CTRL_TERMINATE) diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c index 2b857d97..4d581da3 100644 --- a/src/acpica/source/components/hardware/hwsleep.c +++ b/src/acpica/source/components/hardware/hwsleep.c @@ -262,7 +262,10 @@ AcpiHwLegacySleep ( /* Flush caches, as per ACPI specification */ - ACPI_FLUSH_CPU_CACHE (); + if (SleepState < ACPI_STATE_S4) + { + ACPI_FLUSH_CPU_CACHE (); + } Status = AcpiOsEnterSleep (SleepState, Pm1aControl, Pm1bControl); if (Status == AE_CTRL_TERMINATE) @@ -376,7 +379,7 @@ AcpiHwLegacyWakePrep ( Pm1aControl |= (AcpiGbl_SleepTypeAS0 << SleepTypeRegInfo->BitPosition); - Pm1aControl |= (AcpiGbl_SleepTypeBS0 << + Pm1bControl |= (AcpiGbl_SleepTypeBS0 << SleepTypeRegInfo->BitPosition); /* Write the control registers and ignore any errors */ diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c index f1a1344c..106dea0d 100644 --- a/src/acpica/source/components/hardware/hwxfsleep.c +++ b/src/acpica/source/components/hardware/hwxfsleep.c @@ -353,8 +353,6 @@ AcpiEnterSleepStateS4bios ( return_ACPI_STATUS (Status); } - ACPI_FLUSH_CPU_CACHE (); - Status = AcpiHwWritePort (AcpiGbl_FADT.SmiCommand, (UINT32) AcpiGbl_FADT.S4BiosRequest, 8); if (ACPI_FAILURE (Status)) diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c index 522234d9..6f3f7113 100644 --- a/src/acpica/source/components/tables/tbdata.c +++ b/src/acpica/source/components/tables/tbdata.c @@ -243,14 +243,28 @@ AcpiTbInitTableDescriptor ( { /* - * Initialize the table descriptor. Set the pointer to NULL, since the - * table is not fully mapped at this time. + * Initialize the table descriptor. Set the pointer to NULL for external + * tables, since the table is not fully mapped at this time. */ memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC)); TableDesc->Address = Address; TableDesc->Length = Table->Length; TableDesc->Flags = Flags; ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature); + + switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) + { + case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: + case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: + + TableDesc->Pointer = Table; + break; + + case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: + default: + + break; + } } @@ -290,8 +304,7 @@ AcpiTbAcquireTable ( case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: - Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, - ACPI_PHYSADDR_TO_PTR (TableDesc->Address)); + Table = TableDesc->Pointer; break; default: @@ -359,6 +372,8 @@ AcpiTbReleaseTable ( * PARAMETERS: TableDesc - Table descriptor to be acquired * Address - Address of the table * Flags - Allocation flags of the table + * Table - Pointer to the table (required for virtual + * origins, optional for physical) * * RETURN: Status * @@ -373,9 +388,10 @@ ACPI_STATUS AcpiTbAcquireTempTable ( ACPI_TABLE_DESC *TableDesc, ACPI_PHYSICAL_ADDRESS Address, - UINT8 Flags) + UINT8 Flags, + ACPI_TABLE_HEADER *Table) { - ACPI_TABLE_HEADER *TableHeader; + BOOLEAN MappedTable = FALSE; switch (Flags & ACPI_TABLE_ORIGIN_MASK) @@ -384,37 +400,43 @@ AcpiTbAcquireTempTable ( /* Get the length of the full table from the header */ - TableHeader = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER)); - if (!TableHeader) + if (!Table) { - return (AE_NO_MEMORY); + Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER)); + if (!Table) + { + return (AE_NO_MEMORY); + } + + MappedTable = TRUE; } - AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader); - AcpiOsUnmapMemory (TableHeader, sizeof (ACPI_TABLE_HEADER)); - return (AE_OK); + break; case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: - TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, - ACPI_PHYSADDR_TO_PTR (Address)); - if (!TableHeader) + if (!Table) { - return (AE_NO_MEMORY); + return (AE_BAD_PARAMETER); } - AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader); - return (AE_OK); + break; default: - break; + /* Table is not valid yet */ + + return (AE_NO_MEMORY); } - /* Table is not valid yet */ + AcpiTbInitTableDescriptor (TableDesc, Address, Flags, Table); + if (MappedTable) + { + AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER)); + } - return (AE_NO_MEMORY); + return (AE_OK); } @@ -513,7 +535,20 @@ AcpiTbInvalidateTable ( AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length, TableDesc->Flags); - TableDesc->Pointer = NULL; + + switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) + { + case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: + + TableDesc->Pointer = NULL; + break; + + case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: + case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: + default: + + break; + } return_VOID; } @@ -1219,6 +1254,9 @@ AcpiTbLoadTable ( * * PARAMETERS: Address - Physical address of the table * Flags - Allocation flags of the table + * Table - Pointer to the table (required for + * virtual origins, optional for + * physical) * Override - Whether override should be performed * TableIndex - Where table index is returned * @@ -1232,6 +1270,7 @@ ACPI_STATUS AcpiTbInstallAndLoadTable ( ACPI_PHYSICAL_ADDRESS Address, UINT8 Flags, + ACPI_TABLE_HEADER *Table, BOOLEAN Override, UINT32 *TableIndex) { @@ -1244,7 +1283,7 @@ AcpiTbInstallAndLoadTable ( /* Install the table and load it into the namespace */ - Status = AcpiTbInstallStandardTable (Address, Flags, TRUE, + Status = AcpiTbInstallStandardTable (Address, Flags, Table, TRUE, Override, &i); if (ACPI_FAILURE (Status)) { diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c index 8196e7af..ff00c2f2 100644 --- a/src/acpica/source/components/tables/tbfadt.c +++ b/src/acpica/source/components/tables/tbfadt.c @@ -486,7 +486,7 @@ AcpiTbParseFadt ( AcpiTbInstallStandardTable ( (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XDsdt, - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, &AcpiGbl_DsdtIndex); /* If Hardware Reduced flag is set, there is no FACS */ @@ -497,14 +497,14 @@ AcpiTbParseFadt ( { AcpiTbInstallStandardTable ( (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.Facs, - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, &AcpiGbl_FacsIndex); } if (AcpiGbl_FADT.XFacs) { AcpiTbInstallStandardTable ( (ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XFacs, - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, &AcpiGbl_XFacsIndex); } } diff --git a/src/acpica/source/components/tables/tbinstal.c b/src/acpica/source/components/tables/tbinstal.c index dcbb2a74..f628b460 100644 --- a/src/acpica/source/components/tables/tbinstal.c +++ b/src/acpica/source/components/tables/tbinstal.c @@ -227,6 +227,8 @@ AcpiTbInstallTableWithOverride ( * PARAMETERS: Address - Address of the table (might be a virtual * address depending on the TableFlags) * Flags - Flags for the table + * Table - Pointer to the table (required for virtual + * origins, optional for physical) * Reload - Whether reload should be performed * Override - Whether override should be performed * TableIndex - Where the table index is returned @@ -245,6 +247,7 @@ ACPI_STATUS AcpiTbInstallStandardTable ( ACPI_PHYSICAL_ADDRESS Address, UINT8 Flags, + ACPI_TABLE_HEADER *Table, BOOLEAN Reload, BOOLEAN Override, UINT32 *TableIndex) @@ -259,7 +262,7 @@ AcpiTbInstallStandardTable ( /* Acquire a temporary table descriptor for validation */ - Status = AcpiTbAcquireTempTable (&NewTableDesc, Address, Flags); + Status = AcpiTbAcquireTempTable (&NewTableDesc, Address, Flags, Table); if (ACPI_FAILURE (Status)) { ACPI_ERROR ((AE_INFO, @@ -369,7 +372,7 @@ AcpiTbOverrideTable ( if (ACPI_SUCCESS (Status) && Table) { AcpiTbAcquireTempTable (&NewTableDesc, ACPI_PTR_TO_PHYSADDR (Table), - ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL); + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table); ACPI_ERROR_ONLY (OverrideType = "Logical"); goto FinishOverride; } @@ -381,7 +384,7 @@ AcpiTbOverrideTable ( if (ACPI_SUCCESS (Status) && Address && Length) { AcpiTbAcquireTempTable (&NewTableDesc, Address, - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL); + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL); ACPI_ERROR_ONLY (OverrideType = "Physical"); goto FinishOverride; } @@ -457,7 +460,8 @@ AcpiTbUninstallTable ( if ((TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) == ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL) { - ACPI_FREE (ACPI_PHYSADDR_TO_PTR (TableDesc->Address)); + ACPI_FREE (TableDesc->Pointer); + TableDesc->Pointer = NULL; } TableDesc->Address = ACPI_PTR_TO_PHYSADDR (NULL); diff --git a/src/acpica/source/components/tables/tbprint.c b/src/acpica/source/components/tables/tbprint.c index 392ff95a..5985abdb 100644 --- a/src/acpica/source/components/tables/tbprint.c +++ b/src/acpica/source/components/tables/tbprint.c @@ -261,7 +261,8 @@ AcpiTbPrintTableHeader ( Header->Signature, ACPI_FORMAT_UINT64 (Address), Header->Length)); } - else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) + else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, + Header)->Signature)) { /* RSDP has no common fields */ diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c index 6316f258..76d8ef3b 100644 --- a/src/acpica/source/components/tables/tbutils.c +++ b/src/acpica/source/components/tables/tbutils.c @@ -500,7 +500,8 @@ AcpiTbParseRootTable ( } Status = AcpiTbInstallStandardTable (Address, - ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, &TableIndex); + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, TRUE, + &TableIndex); if (ACPI_SUCCESS (Status) && ACPI_COMPARE_NAMESEG ( diff --git a/src/acpica/source/components/tables/tbxfload.c b/src/acpica/source/components/tables/tbxfload.c index 046487ba..9e90c91b 100644 --- a/src/acpica/source/components/tables/tbxfload.c +++ b/src/acpica/source/components/tables/tbxfload.c @@ -396,9 +396,7 @@ UnlockAndExit: * * FUNCTION: AcpiInstallTable * - * PARAMETERS: Address - Address of the ACPI table to be installed. - * Physical - Whether the address is a physical table - * address or not + * PARAMETERS: Table - Pointer to the ACPI table to be installed. * * RETURN: Status * @@ -410,28 +408,17 @@ UnlockAndExit: ACPI_STATUS ACPI_INIT_FUNCTION AcpiInstallTable ( - ACPI_PHYSICAL_ADDRESS Address, - BOOLEAN Physical) + ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - UINT8 Flags; UINT32 TableIndex; ACPI_FUNCTION_TRACE (AcpiInstallTable); - if (Physical) - { - Flags = ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL; - } - else - { - Flags = ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL; - } - - Status = AcpiTbInstallStandardTable (Address, Flags, - FALSE, FALSE, &TableIndex); + Status = AcpiTbInstallStandardTable (ACPI_PTR_TO_PHYSADDR (Table), + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table, FALSE, FALSE, &TableIndex); return_ACPI_STATUS (Status); } @@ -439,6 +426,40 @@ AcpiInstallTable ( ACPI_EXPORT_SYMBOL_INIT (AcpiInstallTable) +/******************************************************************************* + * + * FUNCTION: AcpiInstallPhysicalTable + * + * PARAMETERS: Address - Address of the ACPI table to be installed. + * + * RETURN: Status + * + * DESCRIPTION: Dynamically install an ACPI table. + * Note: This function should only be invoked after + * AcpiInitializeTables() and before AcpiLoadTables(). + * + ******************************************************************************/ + +ACPI_STATUS ACPI_INIT_FUNCTION +AcpiInstallPhysicalTable ( + ACPI_PHYSICAL_ADDRESS Address) +{ + ACPI_STATUS Status; + UINT32 TableIndex; + + + ACPI_FUNCTION_TRACE (AcpiInstallPhysicalTable); + + + Status = AcpiTbInstallStandardTable (Address, + ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, FALSE, &TableIndex); + + return_ACPI_STATUS (Status); +} + +ACPI_EXPORT_SYMBOL_INIT (AcpiInstallPhysicalTable) + + /******************************************************************************* * * FUNCTION: AcpiLoadTable @@ -481,7 +502,7 @@ AcpiLoadTable ( ACPI_INFO (("Host-directed Dynamic ACPI Table Load:")); Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table), - ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex); + ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table, FALSE, &TableIndex); if (TableIdx) { *TableIdx = TableIndex; diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c index 624aa687..de114cb6 100644 --- a/src/acpica/source/components/utilities/utdelete.c +++ b/src/acpica/source/components/utilities/utdelete.c @@ -594,6 +594,7 @@ AcpiUtUpdateRefCount ( ACPI_WARNING ((AE_INFO, "Obj %p, Reference Count is already zero, cannot decrement\n", Object)); + return; } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h index 6e162d6a..17d70d4e 100644 --- a/src/acpica/source/include/acdisasm.h +++ b/src/acpica/source/include/acdisasm.h @@ -257,6 +257,7 @@ typedef enum ACPI_DMT_AEST_RES, ACPI_DMT_AEST_XFACE, ACPI_DMT_AEST_XRUPT, + ACPI_DMT_AGDI, ACPI_DMT_ASF, ACPI_DMT_CEDT, ACPI_DMT_DMAR, @@ -280,6 +281,11 @@ typedef enum ACPI_DMT_NFIT, ACPI_DMT_NHLT1, ACPI_DMT_NHLT1a, + ACPI_DMT_NHLT1b, + ACPI_DMT_NHLT1c, + ACPI_DMT_NHLT1d, + ACPI_DMT_NHLT1e, + ACPI_DMT_NHLT1f, ACPI_DMT_PCCT, ACPI_DMT_PHAT, ACPI_DMT_PMTT, @@ -381,6 +387,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestVendorError[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestGicError[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestXface[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoAestXrupt[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoAgdi[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf0[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1a[]; @@ -559,9 +566,13 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5c[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6a[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6b[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7a[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7b[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt8[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt9[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhatHdr[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0a[]; @@ -635,6 +646,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoSvkl0[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaHdr[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaClient[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTdel[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2a[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm211[]; @@ -882,6 +894,10 @@ void AcpiDmDumpTcpa ( ACPI_TABLE_HEADER *Table); +void +AcpiDmDumpTdel ( + ACPI_TABLE_HEADER *Table); + void AcpiDmDumpTpm2 ( ACPI_TABLE_HEADER *Table); diff --git a/src/acpica/source/include/acevents.h b/src/acpica/source/include/acevents.h index 77475ac9..dda14495 100644 --- a/src/acpica/source/include/acevents.h +++ b/src/acpica/source/include/acevents.h @@ -457,6 +457,13 @@ AcpiEvPciBarRegionSetup ( void *HandlerContext, void **RegionContext); +ACPI_STATUS +AcpiEvDataTableRegionSetup ( + ACPI_HANDLE Handle, + UINT32 Function, + void *HandlerContext, + void **RegionContext); + ACPI_STATUS AcpiEvDefaultRegionSetup ( ACPI_HANDLE Handle, diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h index e7d9f1c9..51a397f2 100644 --- a/src/acpica/source/include/acobject.h +++ b/src/acpica/source/include/acobject.h @@ -313,6 +313,7 @@ typedef struct acpi_object_region union acpi_operand_object *Next; ACPI_PHYSICAL_ADDRESS Address; UINT32 Length; + void *Pointer; /* Only for data table regions */ } ACPI_OBJECT_REGION; diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h index 7f4b31ee..c07d0de2 100644 --- a/src/acpica/source/include/acpixf.h +++ b/src/acpica/source/include/acpixf.h @@ -154,7 +154,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20210930 +#define ACPI_CA_VERSION 0x20211217 #include "acconfig.h" #include "actypes.h" @@ -658,8 +658,12 @@ AcpiDecodePldBuffer ( ACPI_EXTERNAL_RETURN_STATUS ( ACPI_STATUS ACPI_INIT_FUNCTION AcpiInstallTable ( - ACPI_PHYSICAL_ADDRESS Address, - BOOLEAN Physical)) + ACPI_TABLE_HEADER *Table)) + +ACPI_EXTERNAL_RETURN_STATUS ( +ACPI_STATUS ACPI_INIT_FUNCTION +AcpiInstallPhysicalTable ( + ACPI_PHYSICAL_ADDRESS Address)) ACPI_EXTERNAL_RETURN_STATUS ( ACPI_STATUS diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h index 038085c8..d0845643 100644 --- a/src/acpica/source/include/actables.h +++ b/src/acpica/source/include/actables.h @@ -193,7 +193,8 @@ ACPI_STATUS AcpiTbAcquireTempTable ( ACPI_TABLE_DESC *TableDesc, ACPI_PHYSICAL_ADDRESS Address, - UINT8 Flags); + UINT8 Flags, + ACPI_TABLE_HEADER *Table); void AcpiTbReleaseTempTable ( @@ -279,6 +280,7 @@ ACPI_STATUS AcpiTbInstallStandardTable ( ACPI_PHYSICAL_ADDRESS Address, UINT8 Flags, + ACPI_TABLE_HEADER *Table, BOOLEAN Reload, BOOLEAN Override, UINT32 *TableIndex); @@ -296,6 +298,7 @@ ACPI_STATUS AcpiTbInstallAndLoadTable ( ACPI_PHYSICAL_ADDRESS Address, UINT8 Flags, + ACPI_TABLE_HEADER *Table, BOOLEAN Override, UINT32 *TableIndex); diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h index 8a9ff736..7402d97b 100644 --- a/src/acpica/source/include/actbinfo.h +++ b/src/acpica/source/include/actbinfo.h @@ -152,6 +152,7 @@ /* * Macros used to generate offsets to specific table fields */ +#define ACPI_AGDI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_AGDI,f) #define ACPI_FACS_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_FACS,f) #define ACPI_GAS_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_GENERIC_ADDRESS,f) #define ACPI_HDR_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_HEADER,f) @@ -197,6 +198,7 @@ #define ACPI_STAO_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_STAO,f) #define ACPI_SVKL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SVKL,f) #define ACPI_TCPA_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_HDR,f) +#define ACPI_TDEL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TDEL,f) #define ACPI_TPM2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM2,f) #define ACPI_TPM23_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM23,f) #define ACPI_UEFI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_UEFI,f) @@ -339,9 +341,13 @@ #define ACPI_NHLT5B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B,f) #define ACPI_NHLT5C_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C,f) #define ACPI_NHLT6_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_VENDOR_MIC_CONFIG,f) +#define ACPI_NHLT6A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_VENDOR_MIC_COUNT,f) +#define ACPI_NHLT6B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG,f) #define ACPI_NHLT7_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_COUNT,f) #define ACPI_NHLT7A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_DATA,f) +#define ACPI_NHLT7B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_DATA_B,f) #define ACPI_NHLT8_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_TABLE_TERMINATOR,f) +#define ACPI_NHLT9_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION,f) #define ACPI_PCCT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_SUBSPACE,f) #define ACPI_PCCT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED,f) #define ACPI_PCCT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f) @@ -408,6 +414,7 @@ #define ACPI_AEST0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_AEST_PROCESSOR,f,o) #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_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/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h index 0c80aae2..eaa2e243 100644 --- a/src/acpica/source/include/actbl2.h +++ b/src/acpica/source/include/actbl2.h @@ -168,6 +168,7 @@ * file. Useful because they make it more difficult to inadvertently type in * the wrong signature. */ +#define ACPI_SIG_AGDI "AGDI" /* Arm Generic Diagnostic Dump and Reset Device Interface */ #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 */ @@ -192,6 +193,7 @@ #define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */ #define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */ #define ACPI_SIG_SVKL "SVKL" /* Storage Volume Key Location Table */ +#define ACPI_SIG_TDEL "TDEL" /* TD Event Log Table */ /* @@ -309,7 +311,7 @@ typedef struct acpi_aest_processor_tlb typedef struct acpi_aest_processor_generic { - UINT8 *Resource; + UINT32 Resource; } ACPI_AEST_PROCESSOR_GENERIC; @@ -400,6 +402,28 @@ typedef struct acpi_aest_node_interrupt #define ACPI_AEST_XRUPT_RESERVED 2 /* 2 and above are reserved */ +/******************************************************************************* + * AGDI - Arm Generic Diagnostic Dump and Reset Device Interface + * + * Conforms to "ACPI for Arm Components 1.1, Platform Design Document" + * ARM DEN0093 v1.1 + * + ******************************************************************************/ +typedef struct acpi_table_agdi +{ + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ + UINT8 Flags; + UINT8 Reserved[3]; + UINT32 SdeiEvent; + UINT32 Gsiv; + +} ACPI_TABLE_AGDI; + +/* Mask for Flags field above */ + +#define ACPI_AGDI_SIGNALING_MODE (1) + + /******************************************************************************* * * BDAT - BIOS Data ACPI Table @@ -1796,6 +1820,12 @@ typedef struct acpi_table_nhlt } ACPI_TABLE_NHLT; +typedef struct acpi_table_nhlt_endpoint_count +{ + UINT8 EndpointCount; + +} ACPI_TABLE_NHLT_ENDPOINT_COUNT; + typedef struct acpi_nhlt_endpoint { UINT32 DescriptorLength; @@ -1852,6 +1882,8 @@ typedef struct acpi_nhlt_endpoint #define ACPI_NHLT_DIR_RENDER_FEEDBACK 3 #define ACPI_NHLT_DIR_RESERVED 4 /* 4 and above are reserved */ +/* Capabilities = 2 */ + typedef struct acpi_nhlt_device_specific_config { UINT32 CapabilitiesSize; @@ -1860,6 +1892,8 @@ typedef struct acpi_nhlt_device_specific_config } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG; +/* Capabilities = 3 */ + typedef struct acpi_nhlt_device_specific_config_a { UINT32 CapabilitiesSize; @@ -1869,14 +1903,24 @@ typedef struct acpi_nhlt_device_specific_config_a } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A; -/* Values for Config Type above */ +/* Capabilities = 3 */ + +typedef struct acpi_nhlt_device_specific_config_d +{ + UINT8 VirtualSlot; + UINT8 ConfigType; + UINT8 ArrayType; -#define ACPI_NHLT_TYPE_MIC_ARRAY 0x01 -#define ACPI_NHLT_TYPE_GENERIC 0x00 +} ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D; -/* Mask for Extension field of ArrayType */ +/* Values for Config Type above */ + +#define ACPI_NHLT_CONFIG_TYPE_GENERIC 0x00 +#define ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY 0x01 +#define ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK 0x03 +#define ACPI_NHLT_CONFIG_TYPE_RESERVED 0x04 /* 4 and above are reserved */ -#define ACPI_NHLT_ARRAY_TYPE_MASK 0x10 +/* Capabilities = 0 */ typedef struct acpi_nhlt_device_specific_config_b { @@ -1884,6 +1928,8 @@ typedef struct acpi_nhlt_device_specific_config_b } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B; +/* Capabilities = 1 */ + typedef struct acpi_nhlt_device_specific_config_c { UINT32 CapabilitiesSize; @@ -1891,6 +1937,13 @@ typedef struct acpi_nhlt_device_specific_config_c } ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C; +typedef struct acpi_nhlt_render_device_specific_config +{ + UINT32 CapabilitiesSize; + UINT8 VirtualSlot; + +} ACPI_NHLT_RENDER_DEVICE_SPECIFIC_CONFIG; + typedef struct acpi_nhlt_wave_extensible { UINT16 FormatTag; @@ -1963,18 +2016,24 @@ typedef struct acpi_nhlt_mic_device_specific_config /* Values for ArrayTypeExt above */ -#define SMALL_LINEAR_2ELEMENT 0x0A -#define BIG_LINEAR_2ELEMENT 0x0B -#define FIRST_GEOMETRY_LINEAR_4ELEMENT 0x0C -#define PLANAR_LSHAPED_4ELEMENT 0x0D -#define SECOND_GEOMETRY_LINEAR_4ELEMENT 0x0E -#define VENDOR_DEFINED 0x0F -#define ARRAY_TYPE_MASK 0x0F -#define ARRAY_TYPE_EXT_MASK 0x10 +#define ACPI_NHLT_ARRAY_TYPE_RESERVED 0x09 // 9 and below are reserved +#define ACPI_NHLT_SMALL_LINEAR_2ELEMENT 0x0A +#define ACPI_NHLT_BIG_LINEAR_2ELEMENT 0x0B +#define ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT 0x0C +#define ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT 0x0D +#define ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT 0x0E +#define ACPI_NHLT_VENDOR_DEFINED 0x0F +#define ACPI_NHLT_ARRAY_TYPE_MASK 0x0F +#define ACPI_NHLT_ARRAY_TYPE_EXT_MASK 0x10 + +#define ACPI_NHLT_NO_EXTENSION 0x0 +#define ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT (1<<4) -#define NO_EXTENSION 0x0 -#define MIC_SNR_SENSITIVITY_EXT 0x1 +typedef struct acpi_nhlt_vendor_mic_count +{ + UINT8 MicrophoneCount; +} ACPI_NHLT_VENDOR_MIC_COUNT; typedef struct acpi_nhlt_vendor_mic_config { @@ -1996,22 +2055,25 @@ typedef struct acpi_nhlt_vendor_mic_config /* Values for Type field above */ -#define MIC_OMNIDIRECTIONAL 0 -#define MIC_SUBCARDIOID 1 -#define MIC_CARDIOID 2 -#define MIC_SUPER_CARDIOID 3 -#define MIC_HYPER_CARDIOID 4 -#define MIC_8_SHAPED 5 -#define MIC_VENDOR_DEFINED 7 +#define ACPI_NHLT_MIC_OMNIDIRECTIONAL 0 +#define ACPI_NHLT_MIC_SUBCARDIOID 1 +#define ACPI_NHLT_MIC_CARDIOID 2 +#define ACPI_NHLT_MIC_SUPER_CARDIOID 3 +#define ACPI_NHLT_MIC_HYPER_CARDIOID 4 +#define ACPI_NHLT_MIC_8_SHAPED 5 +#define ACPI_NHLT_MIC_RESERVED6 6 // 6 is reserved +#define ACPI_NHLT_MIC_VENDOR_DEFINED 7 +#define ACPI_NHLT_MIC_RESERVED 8 // 8 and above are reserved /* Values for Panel field above */ -#define MIC_TOP 0 -#define MIC_BOTTOM 1 -#define MIC_LEFT 2 -#define MIC_RIGHT 3 -#define MIC_FRONT 4 -#define MIC_REAR 5 +#define ACPI_NHLT_MIC_POSITION_TOP 0 +#define ACPI_NHLT_MIC_POSITION_BOTTOM 1 +#define ACPI_NHLT_MIC_POSITION_LEFT 2 +#define ACPI_NHLT_MIC_POSITION_RIGHT 3 +#define ACPI_NHLT_MIC_POSITION_FRONT 4 +#define ACPI_NHLT_MIC_POSITION_BACK 5 +#define ACPI_NHLT_MIC_POSITION_RESERVED 6 // 6 and above are reserved typedef struct acpi_nhlt_vendor_mic_device_specific_config { @@ -2030,9 +2092,10 @@ typedef struct acpi_nhlt_mic_snr_sensitivity_extension } ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION; +/* Render device with feedback */ + typedef struct acpi_nhlt_render_feedback_device_specific_config { - ACPI_NHLT_DEVICE_SPECIFIC_CONFIG DeviceConfig; UINT8 FeedbackVirtualSlot; // Render slot in case of capture UINT16 FeedbackChannels; // Informative only UINT16 FeedbackValidBitsPerSample; @@ -2052,10 +2115,15 @@ typedef struct acpi_nhlt_linux_specific_data UINT8 DeviceId[16]; UINT8 DeviceInstanceId; UINT8 DevicePortId; - UINT8 Filler[18]; } ACPI_NHLT_LINUX_SPECIFIC_DATA; +typedef struct acpi_nhlt_linux_specific_data_b +{ + UINT8 SpecificData[18]; + +} ACPI_NHLT_LINUX_SPECIFIC_DATA_B; + typedef struct acpi_nhlt_table_terminator { UINT32 TerminatorValue; @@ -3008,6 +3076,24 @@ enum acpi_svkl_format }; +/******************************************************************************* + * + * TDEL - TD-Event Log + * From: "Guest-Host-Communication Interface (GHCI) for Intel + * Trust Domain Extensions (Intel TDX)". + * September 2020 + * + ******************************************************************************/ + +typedef struct acpi_table_tdel +{ + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ + UINT32 Reserved; + UINT64 LogAreaMinimumLength; + UINT64 LogAreaStartAddress; + +} ACPI_TABLE_TDEL; + /* Reset to default packing */ #pragma pack() diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h index 5138342c..6805b48f 100644 --- a/src/acpica/source/include/actypes.h +++ b/src/acpica/source/include/actypes.h @@ -660,7 +660,6 @@ typedef UINT64 ACPI_INTEGER; #define ACPI_TO_POINTER(i) ACPI_CAST_PTR (void, (ACPI_SIZE) (i)) #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) 0) #define ACPI_OFFSET(d, f) ACPI_PTR_DIFF (&(((d *) 0)->f), (void *) 0) -#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i) #define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i) /* Optimizations for 4-character (32-bit) ACPI_NAME manipulation */ @@ -687,9 +686,14 @@ typedef UINT64 ACPI_INTEGER; * Can be used with AccessSize field of ACPI_GENERIC_ADDRESS and * ACPI_RESOURCE_GENERIC_REGISTER. */ -#define ACPI_ACCESS_BIT_WIDTH(AccessSize) (1 << ((AccessSize) + 2)) -#define ACPI_ACCESS_BYTE_WIDTH(AccessSize) (1 << ((AccessSize) - 1)) - +#define ACPI_ACCESS_BIT_SHIFT 2 +#define ACPI_ACCESS_BYTE_SHIFT -1 +#define ACPI_ACCESS_BIT_MAX (31 - ACPI_ACCESS_BIT_SHIFT) +#define ACPI_ACCESS_BYTE_MAX (31 - ACPI_ACCESS_BYTE_SHIFT) +#define ACPI_ACCESS_BIT_DEFAULT (8 - ACPI_ACCESS_BIT_SHIFT) +#define ACPI_ACCESS_BYTE_DEFAULT (8 - ACPI_ACCESS_BYTE_SHIFT) +#define ACPI_ACCESS_BIT_WIDTH(size) (1 << ((size) + ACPI_ACCESS_BIT_SHIFT)) +#define ACPI_ACCESS_BYTE_WIDTH(size) (1 << ((size) + ACPI_ACCESS_BYTE_SHIFT)) /******************************************************************************* * @@ -1319,6 +1323,14 @@ typedef struct acpi_connection_info } ACPI_CONNECTION_INFO; +/* Special Context data for PCC Opregion (ACPI 6.3) */ + +typedef struct acpi_pcc_info { + UINT8 SubspaceId; + UINT16 Length; + UINT8 *InternalBuffer; +} ACPI_PCC_INFO; + typedef ACPI_STATUS (*ACPI_ADR_SPACE_SETUP) ( @@ -1458,6 +1470,12 @@ typedef struct acpi_mem_space_context } ACPI_MEM_SPACE_CONTEXT; +typedef struct acpi_data_table_space_context +{ + void *Pointer; + +} ACPI_DATA_TABLE_MAPPING; + /* * ACPI_MEMORY_LIST is used only if the ACPICA local cache is enabled
Changes in this release of ACPICA are detailed at the following link on the ACPICA developer mailing list: https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/XA2YNYE3AZ67XXHUXVRPITIWCVQD5XHV/ Signed-off-by: Colin Ian King <colin.i.king@gmail.com> --- src/acpica/source/common/acfileio.c | 11 +- src/acpica/source/common/ahtable.c | 3 + src/acpica/source/common/dmtable.c | 158 ++++++- src/acpica/source/common/dmtbdump.c | 70 +++- src/acpica/source/common/dmtbdump1.c | 2 - src/acpica/source/common/dmtbdump2.c | 247 +++++++---- src/acpica/source/common/dmtbinfo.c | 6 +- src/acpica/source/common/dmtbinfo2.c | 79 +++- src/acpica/source/common/dmtbinfo3.c | 14 + src/acpica/source/compiler/aslcache.c | 5 + src/acpica/source/compiler/aslfiles.c | 4 +- src/acpica/source/compiler/aslmessages.c | 2 + src/acpica/source/compiler/aslmessages.h | 2 + src/acpica/source/compiler/aslstartup.c | 23 +- src/acpica/source/compiler/asluuid.c | 1 - src/acpica/source/compiler/dtcompiler.h | 3 + src/acpica/source/compiler/dttable.c | 59 ++- src/acpica/source/compiler/dttable2.c | 385 +++++++++++++++++- src/acpica/source/compiler/dttemplate.h | 93 +++++ src/acpica/source/compiler/dtutils.c | 11 + .../source/components/dispatcher/dsopcode.c | 1 + .../source/components/events/evhandler.c | 2 +- .../source/components/events/evregion.c | 9 + .../source/components/events/evrgnini.c | 58 +++ .../source/components/executer/exconfig.c | 2 +- .../source/components/executer/excreate.c | 1 + .../source/components/executer/exfield.c | 4 +- .../source/components/executer/exoparg1.c | 2 +- .../source/components/executer/exregion.c | 14 +- .../source/components/hardware/hwesleep.c | 5 +- .../source/components/hardware/hwsleep.c | 7 +- .../source/components/hardware/hwxfsleep.c | 2 - src/acpica/source/components/tables/tbdata.c | 85 ++-- src/acpica/source/components/tables/tbfadt.c | 6 +- .../source/components/tables/tbinstal.c | 12 +- src/acpica/source/components/tables/tbprint.c | 3 +- src/acpica/source/components/tables/tbutils.c | 3 +- .../source/components/tables/tbxfload.c | 57 ++- .../source/components/utilities/utdelete.c | 1 + src/acpica/source/include/acdisasm.h | 16 + src/acpica/source/include/acevents.h | 7 + src/acpica/source/include/acobject.h | 1 + src/acpica/source/include/acpixf.h | 10 +- src/acpica/source/include/actables.h | 5 +- src/acpica/source/include/actbinfo.h | 7 + src/acpica/source/include/actbl2.h | 148 +++++-- src/acpica/source/include/actypes.h | 26 +- 47 files changed, 1442 insertions(+), 230 deletions(-)