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
