diff mbox series

[1/2] ACPICA: Update to version 20211217

Message ID 20220130163419.493806-2-colin.i.king@gmail.com
State Accepted
Headers show
Series ACPICA: Update to version 20211217 | expand

Commit Message

Colin Ian King Jan. 30, 2022, 4:34 p.m. UTC
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(-)

Comments

Alex Hung Jan. 30, 2022, 9:32 p.m. UTC | #1
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>
Ivan Hu Feb. 14, 2022, 1:33 a.m. UTC | #2
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 mbox series

Patch

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