diff mbox series

[1/2] ACPICA: Update to version 20210331

Message ID 20210406095908.387434-2-colin.king@canonical.com
State Accepted
Headers show
Series ACPICA: Update to version 20210331 | expand

Commit Message

Colin Ian King April 6, 2021, 9:59 a.m. UTC
From: Colin Ian King <colin.king@canonical.com>

Changes in this release of ACPICA are detailed at the following
link on the ACPICA developer mailing list:

https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/JIJRABDX3TW4BDBVXRT5IG2GPBJXWQEI/

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/acpica/source/common/acfileio.c           |   3 +
 src/acpica/source/common/ahids.c              |   2 +
 src/acpica/source/common/ahpredef.c           |   4 +
 src/acpica/source/common/ahtable.c            |   3 +
 src/acpica/source/common/ahuuids.c            |   1 +
 src/acpica/source/common/cmfsize.c            |   2 +-
 src/acpica/source/common/dmrestag.c           |  14 +-
 src/acpica/source/common/dmtable.c            | 103 +++-
 src/acpica/source/common/dmtbdump1.c          |  76 +++
 src/acpica/source/common/dmtbdump2.c          | 468 ++++++++++++------
 src/acpica/source/common/dmtbdump3.c          | 100 ++++
 src/acpica/source/common/dmtbinfo1.c          |  34 +-
 src/acpica/source/common/dmtbinfo2.c          | 247 +++++++--
 src/acpica/source/common/dmtbinfo3.c          |  72 +++
 src/acpica/source/compiler/aslallocate.c      |   2 +-
 src/acpica/source/compiler/aslascii.c         |   4 +-
 src/acpica/source/compiler/aslcompiler.h      |   4 +
 src/acpica/source/compiler/aslcompiler.l      |   1 +
 src/acpica/source/compiler/aslerror.c         |   6 +-
 src/acpica/source/compiler/aslhelpers.y       |   5 +
 src/acpica/source/compiler/aslmap.c           |   1 +
 src/acpica/source/compiler/aslmessages.c      |   3 +-
 src/acpica/source/compiler/aslmessages.h      |   1 +
 src/acpica/source/compiler/aslnamesp.c        |   3 +-
 src/acpica/source/compiler/aslopcodes.c       |   2 +-
 src/acpica/source/compiler/asloperands.c      |   2 +-
 src/acpica/source/compiler/aslparser.y        |   2 +-
 src/acpica/source/compiler/aslprintf.c        |   2 +-
 src/acpica/source/compiler/aslresource.c      |   5 +
 src/acpica/source/compiler/aslresources.y     |  20 +-
 src/acpica/source/compiler/aslrestype2s.c     | 136 +++++
 src/acpica/source/compiler/asltokens.y        |   1 +
 src/acpica/source/compiler/asltransform.c     |   5 +
 src/acpica/source/compiler/asltypes.y         |   2 +
 src/acpica/source/compiler/dtcompiler.h       |  15 +
 src/acpica/source/compiler/dttable1.c         | 143 +++++-
 src/acpica/source/compiler/dttable2.c         | 454 ++++++++++++++---
 src/acpica/source/compiler/dttemplate.h       | 343 ++++++++-----
 src/acpica/source/compiler/dtutils.c          |   5 +
 .../components/disassembler/dmresrcl2.c       |  90 +++-
 .../source/components/events/evhandler.c      |   7 +
 .../source/components/events/evregion.c       |  75 +--
 .../source/components/events/evxfregn.c       |   1 +
 .../source/components/namespace/nsaccess.c    |   3 +-
 .../source/components/namespace/nsrepair2.c   |  18 +-
 .../source/components/resources/rscalc.c      |   4 +-
 .../source/components/resources/rsdump.c      |  10 +
 .../source/components/resources/rsdumpinfo.c  |  15 +
 .../source/components/resources/rsinfo.c      |   6 +-
 .../source/components/resources/rslist.c      |  10 +-
 .../source/components/resources/rsmisc.c      |  18 +
 .../source/components/resources/rsserial.c    |  70 +++
 .../source/components/utilities/utresdecode.c |  11 +-
 .../source/components/utilities/utresrc.c     |   1 +
 src/acpica/source/include/acdisasm.h          |  44 +-
 src/acpica/source/include/acobject.h          |   1 +
 src/acpica/source/include/acoutput.h          |   2 +-
 src/acpica/source/include/acpixf.h            |   2 +-
 src/acpica/source/include/acpredef.h          |  15 +
 src/acpica/source/include/acresrc.h           |   4 +
 src/acpica/source/include/acrestyp.h          |  12 +-
 src/acpica/source/include/actbinfo.h          |  26 +-
 src/acpica/source/include/actbl1.h            |  63 ++-
 src/acpica/source/include/actbl2.h            | 280 +++++++++--
 src/acpica/source/include/actbl3.h            |  84 +++-
 src/acpica/source/include/acutils.h           |   1 +
 src/acpica/source/include/acuuid.h            |   1 +
 src/acpica/source/include/amlresrc.h          |  25 +-
 src/acpica/source/include/platform/acgcc.h    |   2 +-
 69 files changed, 2717 insertions(+), 480 deletions(-)

Comments

Alex Hung April 6, 2021, 8:39 p.m. UTC | #1
On 2021-04-06 3:59 a.m., Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/JIJRABDX3TW4BDBVXRT5IG2GPBJXWQEI/
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  src/acpica/source/common/acfileio.c           |   3 +
>  src/acpica/source/common/ahids.c              |   2 +
>  src/acpica/source/common/ahpredef.c           |   4 +
>  src/acpica/source/common/ahtable.c            |   3 +
>  src/acpica/source/common/ahuuids.c            |   1 +
>  src/acpica/source/common/cmfsize.c            |   2 +-
>  src/acpica/source/common/dmrestag.c           |  14 +-
>  src/acpica/source/common/dmtable.c            | 103 +++-
>  src/acpica/source/common/dmtbdump1.c          |  76 +++
>  src/acpica/source/common/dmtbdump2.c          | 468 ++++++++++++------
>  src/acpica/source/common/dmtbdump3.c          | 100 ++++
>  src/acpica/source/common/dmtbinfo1.c          |  34 +-
>  src/acpica/source/common/dmtbinfo2.c          | 247 +++++++--
>  src/acpica/source/common/dmtbinfo3.c          |  72 +++
>  src/acpica/source/compiler/aslallocate.c      |   2 +-
>  src/acpica/source/compiler/aslascii.c         |   4 +-
>  src/acpica/source/compiler/aslcompiler.h      |   4 +
>  src/acpica/source/compiler/aslcompiler.l      |   1 +
>  src/acpica/source/compiler/aslerror.c         |   6 +-
>  src/acpica/source/compiler/aslhelpers.y       |   5 +
>  src/acpica/source/compiler/aslmap.c           |   1 +
>  src/acpica/source/compiler/aslmessages.c      |   3 +-
>  src/acpica/source/compiler/aslmessages.h      |   1 +
>  src/acpica/source/compiler/aslnamesp.c        |   3 +-
>  src/acpica/source/compiler/aslopcodes.c       |   2 +-
>  src/acpica/source/compiler/asloperands.c      |   2 +-
>  src/acpica/source/compiler/aslparser.y        |   2 +-
>  src/acpica/source/compiler/aslprintf.c        |   2 +-
>  src/acpica/source/compiler/aslresource.c      |   5 +
>  src/acpica/source/compiler/aslresources.y     |  20 +-
>  src/acpica/source/compiler/aslrestype2s.c     | 136 +++++
>  src/acpica/source/compiler/asltokens.y        |   1 +
>  src/acpica/source/compiler/asltransform.c     |   5 +
>  src/acpica/source/compiler/asltypes.y         |   2 +
>  src/acpica/source/compiler/dtcompiler.h       |  15 +
>  src/acpica/source/compiler/dttable1.c         | 143 +++++-
>  src/acpica/source/compiler/dttable2.c         | 454 ++++++++++++++---
>  src/acpica/source/compiler/dttemplate.h       | 343 ++++++++-----
>  src/acpica/source/compiler/dtutils.c          |   5 +
>  .../components/disassembler/dmresrcl2.c       |  90 +++-
>  .../source/components/events/evhandler.c      |   7 +
>  .../source/components/events/evregion.c       |  75 +--
>  .../source/components/events/evxfregn.c       |   1 +
>  .../source/components/namespace/nsaccess.c    |   3 +-
>  .../source/components/namespace/nsrepair2.c   |  18 +-
>  .../source/components/resources/rscalc.c      |   4 +-
>  .../source/components/resources/rsdump.c      |  10 +
>  .../source/components/resources/rsdumpinfo.c  |  15 +
>  .../source/components/resources/rsinfo.c      |   6 +-
>  .../source/components/resources/rslist.c      |  10 +-
>  .../source/components/resources/rsmisc.c      |  18 +
>  .../source/components/resources/rsserial.c    |  70 +++
>  .../source/components/utilities/utresdecode.c |  11 +-
>  .../source/components/utilities/utresrc.c     |   1 +
>  src/acpica/source/include/acdisasm.h          |  44 +-
>  src/acpica/source/include/acobject.h          |   1 +
>  src/acpica/source/include/acoutput.h          |   2 +-
>  src/acpica/source/include/acpixf.h            |   2 +-
>  src/acpica/source/include/acpredef.h          |  15 +
>  src/acpica/source/include/acresrc.h           |   4 +
>  src/acpica/source/include/acrestyp.h          |  12 +-
>  src/acpica/source/include/actbinfo.h          |  26 +-
>  src/acpica/source/include/actbl1.h            |  63 ++-
>  src/acpica/source/include/actbl2.h            | 280 +++++++++--
>  src/acpica/source/include/actbl3.h            |  84 +++-
>  src/acpica/source/include/acutils.h           |   1 +
>  src/acpica/source/include/acuuid.h            |   1 +
>  src/acpica/source/include/amlresrc.h          |  25 +-
>  src/acpica/source/include/platform/acgcc.h    |   2 +-
>  69 files changed, 2717 insertions(+), 480 deletions(-)
> 
> diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c
> index 628cf7a4..99f89729 100644
> --- a/src/acpica/source/common/acfileio.c
> +++ b/src/acpica/source/common/acfileio.c
> @@ -559,6 +559,9 @@ AcValidateTableHeader (
>  
>      if (Actual < sizeof (ACPI_TABLE_HEADER))
>      {
> +        fprintf (stderr,
> +            "Could not read entire table header: Actual %u, Requested %u\n",
> +            (UINT32) Actual, (UINT32) sizeof (ACPI_TABLE_HEADER));
>          return (AE_ERROR);
>      }
>  
> diff --git a/src/acpica/source/common/ahids.c b/src/acpica/source/common/ahids.c
> index 1e6edaf7..b58bc082 100644
> --- a/src/acpica/source/common/ahids.c
> +++ b/src/acpica/source/common/ahids.c
> @@ -188,6 +188,8 @@ const AH_DEVICE_ID  AslDeviceIds[] =
>      {"ACPI0012",    "NVDIMM Root Device"},
>      {"ACPI0013",    "Generic Event Device"},
>      {"ACPI0014",    "Wireless Power Calibration Device"},
> +    {"ACPI0015",    "USB4 host interface device"},
> +    {"ACPI0016",    "Compute Express Link Host Bridge"},
>      {"ADMA0F28",    "Intel Audio DMA"},
>      {"AMCR0F28",    "Intel Audio Machine Driver"},
>      {"ATK4001",     "Asus Radio Control Button"},
> diff --git a/src/acpica/source/common/ahpredef.c b/src/acpica/source/common/ahpredef.c
> index e6e2ffc7..d92417d1 100644
> --- a/src/acpica/source/common/ahpredef.c
> +++ b/src/acpica/source/common/ahpredef.c
> @@ -200,12 +200,16 @@ const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
>      AH_PREDEF ("_BMC",    "Battery Maintenance Control", "Sets battery maintenance and control features"),
>      AH_PREDEF ("_BMD",    "Battery Maintenance Data", "Returns battery maintenance, control, and state data"),
>      AH_PREDEF ("_BMS",    "Battery Measurement Sampling Time", "Sets the battery measurement sampling time"),
> +    AH_PREDEF ("_BPC",    "Battery Power Characteristics", "Returns static values used to configure power threshold support in the platform firmware"),
> +    AH_PREDEF ("_BPS",    "Battery Power State", "Returns the power delivery capabilities of the battery at the present time"),
> +    AH_PREDEF ("_BPT",    "Battery Power Threshold", "Set a relative battery peak power capability change threshold"),
>      AH_PREDEF ("_BQC",    "Brightness Query Current", "Returns the current display brightness level"),
>      AH_PREDEF ("_BST",    "Battery Status", "Returns a Control Method Battery status block"),
>      AH_PREDEF ("_BTH",    "Battery Throttle Limit", "Thermal limit for charging and discharging"),
>      AH_PREDEF ("_BTM",    "Battery Time", "Returns the battery runtime"),
>      AH_PREDEF ("_BTP",    "Battery Trip Point", "Sets a Control Method Battery trip point"),
>      AH_PREDEF ("_CBA",    "Configuration Base Address", "Sets the base address for a PCI Express host bridge"),
> +    AH_PREDEF ("_CBR",    "CXL Host Bridge Register Info", "Get the memory location of CXL Host Bridge Registers"),
>      AH_PREDEF ("_CCA",    "Cache Coherency Attribute", "Returns a device's support level for cache coherency"),
>      AH_PREDEF ("_CDM",    "Clock Domain", "Returns a logical processor's clock domain identifier"),
>      AH_PREDEF ("_CID",    "Compatible ID", "Returns a device's Plug and Play Compatible ID list"),
> diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c
> index ac3c416b..e318ddf3 100644
> --- a/src/acpica/source/common/ahtable.c
> +++ b/src/acpica/source/common/ahtable.c
> @@ -203,6 +203,7 @@ const AH_TABLE      AcpiGbl_SupportedTables[] =
>      {ACPI_SIG_BERT, "Boot Error Record Table"},
>      {ACPI_SIG_BGRT, "Boot Graphics Resource Table"},
>      {ACPI_SIG_BOOT, "Simple Boot Flag Table"},
> +    {ACPI_SIG_CEDT, "CXL Early Discovery Table"},
>      {ACPI_SIG_CPEP, "Corrected Platform Error Polling table"},
>      {ACPI_SIG_CSRT, "Core System Resource Table"},
>      {ACPI_SIG_DBG2, "Debug Port table type 2"},
> @@ -231,6 +232,7 @@ const AH_TABLE      AcpiGbl_SupportedTables[] =
>      {ACPI_SIG_MSDM, "Microsoft Data Management table"},
>      {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"},
>      {ACPI_SIG_PCCT, "Platform Communications Channel Table"},
> +    {ACPI_SIG_PHAT, "Platform Health Assessment Table"},
>      {ACPI_SIG_PDTT, "Platform Debug Trigger Table"},
>      {ACPI_SIG_PMTT, "Platform Memory Topology Table"},
>      {ACPI_SIG_PPTT, "Processor Properties Topology Table"},
> @@ -251,6 +253,7 @@ const AH_TABLE      AcpiGbl_SupportedTables[] =
>      {ACPI_SIG_TCPA, "Trusted Computing Platform Alliance 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"},
>      {ACPI_SIG_WAET, "Windows ACPI Emulated Devices Table"},
>      {ACPI_SIG_WDAT, "Watchdog Action Table"},
>      {ACPI_SIG_WDDT, "Watchdog Description Table"},
> diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c
> index 427f9169..eef1c568 100644
> --- a/src/acpica/source/common/ahuuids.c
> +++ b/src/acpica/source/common/ahuuids.c
> @@ -208,6 +208,7 @@ const AH_UUID  Gbl_AcpiUuids[] =
>      {"Device Graphs for _DSD",      UUID_DEVICE_GRAPHS},
>      {"Hierarchical Data Extension", UUID_HIERARCHICAL_DATA_EXTENSION},
>      {"ARM Coresight Graph",         UUID_CORESIGHT_GRAPH},
> +    {"USB4 Capabilities",           UUID_USB4_CAPABILITIES},
>      {NULL, NULL}
>  };
>  
> diff --git a/src/acpica/source/common/cmfsize.c b/src/acpica/source/common/cmfsize.c
> index e0c66e31..38ec915a 100644
> --- a/src/acpica/source/common/cmfsize.c
> +++ b/src/acpica/source/common/cmfsize.c
> @@ -1,6 +1,6 @@
>  /******************************************************************************
>   *
> - * Module Name: cfsize - Common get file size function
> + * Module Name: cmfsize - Common get file size function
>   *
>   *****************************************************************************/
>  
> diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
> index d8a04406..59d5c4f4 100644
> --- a/src/acpica/source/common/dmrestag.c
> +++ b/src/acpica/source/common/dmrestag.c
> @@ -384,6 +384,14 @@ static const ACPI_RESOURCE_TAG      AcpiDmGpioIoTags[] =
>  
>  /* Subtype tables for SerialBus descriptors */
>  
> +static const ACPI_RESOURCE_TAG      AcpiDmCsi2SerialBusTags[] =    /* ACPI 6.4 */
> +{
> +    {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
> +    {( 7 * 8) + 0,  ACPI_RESTAG_PHYTYPE},
> +    {( 7 * 8) + 2,  ACPI_RESTAG_LOCALPORT},
> +    {0,             NULL}
> +};
> +
>  static const ACPI_RESOURCE_TAG      AcpiDmI2cSerialBusTags[] =
>  {
>      {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
> @@ -424,6 +432,7 @@ static const ACPI_RESOURCE_TAG      AcpiDmUartSerialBusTags[] =
>      {0,             NULL}
>  };
>  
> +
>  /* Subtype tables for PinFunction descriptor */
>  
>  static const ACPI_RESOURCE_TAG      AcpiDmPinFunctionTags[] =
> @@ -539,7 +548,8 @@ static const ACPI_RESOURCE_TAG      *AcpiGbl_SerialResourceTags[] =
>      NULL,                           /* 0x00 Reserved */
>      AcpiDmI2cSerialBusTags,         /* 0x01 I2C SerialBus */
>      AcpiDmSpiSerialBusTags,         /* 0x02 SPI SerialBus */
> -    AcpiDmUartSerialBusTags         /* 0x03 UART SerialBus */
> +    AcpiDmUartSerialBusTags,        /* 0x03 UART SerialBus */
> +    AcpiDmCsi2SerialBusTags         /* 0x04 CSI2 SerialBus */
>  };
>  
>  /*
> @@ -987,7 +997,7 @@ AcpiDmGetResourceTag (
>  
>      case ACPI_RESOURCE_NAME_SERIAL_BUS:
>  
> -        /* SerialBus has 3 subtypes: I2C, SPI, and UART */
> +        /* SerialBus has 4 subtypes: I2C, SPI, UART, and CSI2 */
>  
>          if ((Resource->CommonSerialBus.Type == 0) ||
>              (Resource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE))
> diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
> index 3e4c6c34..ffec889a 100644
> --- a/src/acpica/source/common/dmtable.c
> +++ b/src/acpica/source/common/dmtable.c
> @@ -184,6 +184,12 @@ static const char           *AcpiDmAsfSubnames[] =
>      "Unknown Subtable Type"         /* Reserved */
>  };
>  
> +static const char           *AcpiDmCedtSubnames[] =
> +{
> +    "CXL Host Bridge Structure",
> +    "Unknown Subtable Type"         /* Reserved */
> +};
> +
>  static const char           *AcpiDmDmarSubnames[] =
>  {
>      "Hardware Unit Definition",
> @@ -367,15 +373,24 @@ static const char           *AcpiDmPcctSubnames[] =
>      "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
>      "Extended PCC Master Subspace",     /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
>      "Extended PCC Slave Subspace",      /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
> +    "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */
>      "Unknown Subtable Type"             /* Reserved */
>  };
>  
> +static const char           *AcpiDmPhatSubnames[] =
> +{
> +    "Firmware Version Data",        /* ACPI_PHAT_TYPE_FW_VERSION_DATA */
> +    "Firmware Health Data",         /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */
> +    "Unknown Subtable Type"         /* Reserved */
> +};
> +
>  static const char           *AcpiDmPmttSubnames[] =
>  {
>      "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
>      "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
>      "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM */
> -    "Unknown Subtable Type"         /* Reserved */
> +    "Unknown Subtable Type",        /* Reserved */
> +    "Vendor Specific"               /* ACPI_PMTT_TYPE_VENDOR */
>  };
>  
>  static const char           *AcpiDmPpttSubnames[] =
> @@ -434,6 +449,16 @@ static const char           *AcpiDmLpitSubnames[] =
>      "Unknown Subtable Type"         /* Reserved */
>  };
>  
> +static const char           *AcpiDmViotSubnames[] =
> +{
> +    "Unknown Subtable Type",        /* 0 -Reserved */
> +    "PCI Range",
> +    "MMIO Endpoint",
> +    "VirtIO-PCI IOMMU",
> +    "VirtIO-MMIO IOMMU",
> +    "Unknown Subtable Type"         /* Reserved */
> +};
> +
>  #define ACPI_FADT_PM_RESERVED       9
>  
>  static const char           *AcpiDmFadtProfiles[] =
> @@ -474,8 +499,8 @@ static const char           *AcpiDmGasAccessWidth[] =
>   * handler. This table must be NULL terminated. RSDP and FACS are
>   * special-cased elsewhere.
>   *
> - * Note: Any tables added here should be duplicated within AcpiSupportedTables
> - * in the file common/ahtable.c
> + * Note: Any tables added here should be duplicated within
> + * AcpiGbl_SupportedTables in the file common/ahtable.c
>   *
>   ******************************************************************************/
>  
> @@ -485,6 +510,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>      {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert},
>      {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt},
>      {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot},
> +    {ACPI_SIG_CEDT, NULL,                   AcpiDmDumpCedt, DtCompileCedt,  TemplateCedt},
>      {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep},
>      {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt},
>      {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2,    AcpiDmDumpDbg2, DtCompileDbg2,  TemplateDbg2},
> @@ -512,6 +538,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>      {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
>      {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
>      {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt,    AcpiDmDumpPdtt, DtCompilePdtt,  TemplatePdtt},
> +    {ACPI_SIG_PHAT, NULL,                   AcpiDmDumpPhat, DtCompilePhat,  TemplatePhat},
>      {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
>      {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
>      {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
> @@ -529,6 +556,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>      {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
>      {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    AcpiDmDumpTpm2, DtCompileTpm2,  TemplateTpm2},
>      {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
> +    {ACPI_SIG_VIOT, AcpiDmTableInfoViot,    AcpiDmDumpViot, DtCompileViot,  TemplateViot},
>      {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
>      {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat},
>      {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
> @@ -936,6 +964,7 @@ AcpiDmDumpTable (
>          case ACPI_DMT_CHKSUM:
>          case ACPI_DMT_SPACEID:
>          case ACPI_DMT_ACCWIDTH:
> +        case ACPI_DMT_CEDT:
>          case ACPI_DMT_IVRS:
>          case ACPI_DMT_GTDT:
>          case ACPI_DMT_MADT:
> @@ -952,6 +981,7 @@ AcpiDmDumpTable (
>          case ACPI_DMT_ERSTACT:
>          case ACPI_DMT_ERSTINST:
>          case ACPI_DMT_DMAR_SCOPE:
> +        case ACPI_DMT_VIOT:
>  
>              ByteLength = 1;
>              break;
> @@ -961,6 +991,7 @@ AcpiDmDumpTable (
>          case ACPI_DMT_HEST:
>          case ACPI_DMT_HMAT:
>          case ACPI_DMT_NFIT:
> +        case ACPI_DMT_PHAT:
>  
>              ByteLength = 2;
>              break;
> @@ -1030,6 +1061,17 @@ AcpiDmDumpTable (
>              ByteLength = SubtableLength;
>              break;
>  
> +        case ACPI_DMT_PMTT_VENDOR:
> +            /*
> +             * Calculate the length of the vendor data for the PMTT table:
> +             * Length = (Current Subtable ptr + Subtable length) -
> +             *          Start of the vendor data (Target)
> +             */
> +            ByteLength = ((ACPI_CAST_PTR (char, Table) +
> +                            (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
> +                            ACPI_CAST_PTR (char, Target));
> +            break;
> +
>          case ACPI_DMT_STRING:
>  
>              ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
> @@ -1346,6 +1388,20 @@ AcpiDmDumpTable (
>              AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
>              break;
>  
> +        case ACPI_DMT_CEDT:
> +
> +            /* CEDT subtable types */
> +
> +            Temp8 = *Target;
> +            if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
> +            {
> +                Temp8 = ACPI_CEDT_TYPE_RESERVED;
> +            }
> +
> +            AcpiOsPrintf (UINT8_FORMAT, *Target,
> +                AcpiDmCedtSubnames[Temp8]);
> +            break;
> +
>          case ACPI_DMT_DMAR:
>  
>              /* DMAR subtable types */
> @@ -1559,16 +1615,33 @@ AcpiDmDumpTable (
>                  AcpiDmPcctSubnames[Temp8]);
>              break;
>  
> +        case ACPI_DMT_PHAT:
> +
> +            /* PMTT subtable types */
> +
> +            Temp16 = *Target;
> +            if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
> +            {
> +                Temp16 = ACPI_PHAT_TYPE_RESERVED;
> +            }
> +
> +            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16(Target),
> +                AcpiDmPhatSubnames[Temp16]);
> +            break;
> +
>          case ACPI_DMT_PMTT:
>  
>              /* PMTT subtable types */
>  
>              Temp8 = *Target;
> -            if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
> +            if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
> +            {
> +                Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
> +            }
> +            else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
>              {
>                  Temp8 = ACPI_PMTT_TYPE_RESERVED;
>              }
> -
>              AcpiOsPrintf (UINT8_FORMAT, *Target,
>                  AcpiDmPmttSubnames[Temp8]);
>              break;
> @@ -1599,6 +1672,8 @@ AcpiDmDumpTable (
>              break;
>  
>          case ACPI_DMT_RAW_BUFFER:
> +        case ACPI_DMT_BUFFER:
> +        case ACPI_DMT_PMTT_VENDOR:
>  
>              if (ByteLength == 0)
>              {
> @@ -1606,8 +1681,7 @@ AcpiDmDumpTable (
>                  break;
>              }
>  
> -            AcpiDmDumpBuffer (Table, CurrentOffset, ByteLength,
> -                CurrentOffset, NULL);
> +            AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL);
>              break;
>  
>          case ACPI_DMT_SDEV:
> @@ -1676,6 +1750,7 @@ AcpiDmDumpTable (
>              {
>              case ACPI_IVRS_TYPE_HARDWARE1:
>              case ACPI_IVRS_TYPE_HARDWARE2:
> +            case ACPI_IVRS_TYPE_HARDWARE3:
>  
>                  Name = AcpiDmIvrsSubnames[0];
>                  break;
> @@ -1710,6 +1785,20 @@ AcpiDmDumpTable (
>                  AcpiDmLpitSubnames[Temp32]);
>              break;
>  
> +        case ACPI_DMT_VIOT:
> +
> +            /* VIOT subtable types */
> +
> +            Temp8 = *Target;
> +            if (Temp8 > ACPI_VIOT_RESERVED)
> +            {
> +                Temp8 = ACPI_VIOT_RESERVED;
> +            }
> +
> +            AcpiOsPrintf (UINT8_FORMAT, *Target,
> +                AcpiDmViotSubnames[Temp8]);
> +            break;
> +
>          case ACPI_DMT_EXIT:
>  
>              return (AE_OK);
> diff --git a/src/acpica/source/common/dmtbdump1.c b/src/acpica/source/common/dmtbdump1.c
> index 72d667e9..8fc53acf 100644
> --- a/src/acpica/source/common/dmtbdump1.c
> +++ b/src/acpica/source/common/dmtbdump1.c
> @@ -329,6 +329,82 @@ AcpiDmDumpAsf (
>      }
>  }
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmDumpCedt
> + *
> + * PARAMETERS:  Table               - A CEDT table
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Format the contents of a CEDT. This table type consists
> + *              of an open-ended number of subtables.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmDumpCedt (
> +    ACPI_TABLE_HEADER       *Table)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_CEDT_HEADER        *Subtable;
> +    UINT32                  Length = Table->Length;
> +    UINT32                  Offset = sizeof (ACPI_TABLE_CEDT);
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +
> +
> +    /* There is no main table (other than the standard ACPI header) */
> +
> +    Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
> +    while (Offset < Table->Length)
> +    {
> +        /* Common subtable header */
> +
> +        AcpiOsPrintf ("\n");
> +        Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +            Subtable->Length, AcpiDmTableInfoCedtHdr);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +        switch (Subtable->Type)
> +        {
> +        case ACPI_CEDT_TYPE_CHBS:
> +
> +            InfoTable = AcpiDmTableInfoCedt0;
> +            break;
> +
> +        default:
> +
> +            AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
> +                Subtable->Type);
> +
> +            /* Attempt to continue */
> +
> +            if (!Subtable->Length)
> +            {
> +                AcpiOsPrintf ("Invalid zero length subtable\n");
> +                return;
> +            }
> +            goto NextSubtable;
> +        }
> +
> +        Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +            Subtable->Length, InfoTable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +NextSubtable:
> +        /* Point to next subtable */
> +
> +        Offset += Subtable->Length;
> +        Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
> +            Subtable->Length);
> +    }
> +}
>  
>  /*******************************************************************************
>   *
> diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c
> index b8ece375..80d9d459 100644
> --- a/src/acpica/source/common/dmtbdump2.c
> +++ b/src/acpica/source/common/dmtbdump2.c
> @@ -181,6 +181,7 @@ AcpiDmDumpIort (
>      ACPI_IORT_NODE          *IortNode;
>      ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
>      ACPI_IORT_SMMU          *IortSmmu = NULL;
> +    ACPI_IORT_RMR           *IortRmr = NULL;
>      UINT32                  Offset;
>      UINT32                  NodeOffset;
>      UINT32                  Length;
> @@ -188,6 +189,7 @@ AcpiDmDumpIort (
>      char                    *String;
>      UINT32                  i;
>      UINT32                  MappingByteLength;
> +    UINT8                   Revision;
>  
>  
>      /* Main table */
> @@ -198,6 +200,17 @@ AcpiDmDumpIort (
>          return;
>      }
>  
> +    Revision = Table->Revision;
> +
> +    /* Both IORT Rev E and E.a have known issues and are not supported */
> +
> +    if (Revision == 1 || Revision == 2)
> +    {
> +        AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n",
> +                      Revision);
> +        return;
> +    }
> +
>      Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
>      Offset = sizeof (ACPI_TABLE_IORT);
>  
> @@ -221,8 +234,18 @@ AcpiDmDumpIort (
>          IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
>          AcpiOsPrintf ("\n");
>          Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
> -        Status = AcpiDmDumpTable (Table->Length, Offset,
> -            IortNode, Length, AcpiDmTableInfoIortHdr);
> +
> +        if (Revision == 0)
> +        {
> +            Status = AcpiDmDumpTable (Table->Length, Offset,
> +                IortNode, Length, AcpiDmTableInfoIortHdr);
> +        }
> +        else if (Revision >= 3)
> +        {
> +            Status = AcpiDmDumpTable (Table->Length, Offset,
> +                IortNode, Length, AcpiDmTableInfoIortHdr3);
> +        }
> +
>          if (ACPI_FAILURE (Status))
>          {
>              return;
> @@ -272,6 +295,13 @@ AcpiDmDumpIort (
>              Length = IortNode->Length - NodeOffset;
>              break;
>  
> +        case ACPI_IORT_NODE_RMR:
> +
> +            InfoTable = AcpiDmTableInfoIort6;
> +            Length = IortNode->Length - NodeOffset;
> +            IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset);
> +            break;
> +
>          default:
>  
>              AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
> @@ -391,7 +421,30 @@ AcpiDmDumpIort (
>              }
>              break;
>  
> -        default:
> +        case ACPI_IORT_NODE_RMR:
> +
> +            /* Validate IortRmr to avoid compiler warnings */
> +            if (IortRmr)
> +            {
> +                NodeOffset = IortRmr->RmrOffset;
> +                Length = sizeof (ACPI_IORT_RMR_DESC);
> +                for (i = 0; i < IortRmr->RmrCount; i++)
> +                {
> +                    AcpiOsPrintf ("\n");
> +                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
> +                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
> +                        Length, AcpiDmTableInfoIort6a);
> +                    if (ACPI_FAILURE (Status))
> +                    {
> +                        return;
> +                    }
> +
> +                    NodeOffset += Length;
> +                }
> +            }
> +            break;
> +
> +	default:
>  
>              break;
>          }
> @@ -434,8 +487,6 @@ NextSubtable:
>   *
>   ******************************************************************************/
>  
> -static UINT8 EntrySizes[] = {4,8,16,32};
> -
>  void
>  AcpiDmDumpIvrs (
>      ACPI_TABLE_HEADER       *Table)
> @@ -445,6 +496,7 @@ AcpiDmDumpIvrs (
>      UINT32                  EntryOffset;
>      UINT32                  EntryLength;
>      UINT32                  EntryType;
> +    ACPI_IVRS_DEVICE_HID    *HidSubtable;
>      ACPI_IVRS_DE_HEADER     *DeviceEntry;
>      ACPI_IVRS_HEADER        *Subtable;
>      ACPI_DMTABLE_INFO       *InfoTable;
> @@ -481,6 +533,7 @@ AcpiDmDumpIvrs (
>              break;
>  
>          case ACPI_IVRS_TYPE_HARDWARE2:
> +        case ACPI_IVRS_TYPE_HARDWARE3:
>  
>              InfoTable = AcpiDmTableInfoIvrs01;
>              break;
> @@ -520,7 +573,8 @@ AcpiDmDumpIvrs (
>          /* The hardware subtable can contain multiple device entries */
>  
>          if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
> -            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2)
> +            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||
> +            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)
>          {
>              if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)
>              {
> @@ -545,11 +599,10 @@ AcpiDmDumpIvrs (
>                   *
>                   * 00 = 4 byte
>                   * 01 = 8 byte
> -                 * 10 = 16 byte - currently no entries defined
> -                 * 11 = 32 byte - currently no entries defined
> +                 * 1x = variable length
>                   */
>                  EntryType = DeviceEntry->Type;
> -                EntryLength = EntrySizes [EntryType >> 6];
> +                EntryLength = EntryType >> 6 == 1 ? 8 : 4;
>  
>                  switch (EntryType)
>                  {
> @@ -588,6 +641,14 @@ AcpiDmDumpIvrs (
>                      InfoTable = AcpiDmTableInfoIvrs8c;
>                      break;
>  
> +                /* Variable-length entries */
> +
> +                case ACPI_IVRS_TYPE_HID:
> +
> +                    EntryLength = 22;
> +                    InfoTable = AcpiDmTableInfoIvrsHid;
> +                    break;
> +
>                  default:
>                      InfoTable = AcpiDmTableInfoIvrs4;
>                      AcpiOsPrintf (
> @@ -606,9 +667,24 @@ AcpiDmDumpIvrs (
>                      return;
>                  }
>  
> +                HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);
>                  EntryOffset += EntryLength;
>                  DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
>                      EntryLength);
> +
> +                if (EntryType == ACPI_IVRS_TYPE_HID)
> +                {
> +                    EntryLength = HidSubtable->UidLength;
> +                    Status = AcpiDmDumpTable (Table->Length, EntryOffset,
> +                        Table, EntryLength, AcpiDmTableInfoIvrsHid1);
> +                    if (ACPI_FAILURE (Status))
> +                    {
> +                        return;
> +                    }
> +                    EntryOffset += EntryLength;
> +                    DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,
> +                        DeviceEntry, EntryLength);
> +                }
>              }
>          }
>  
> @@ -825,6 +901,11 @@ AcpiDmDumpMadt (
>              InfoTable = AcpiDmTableInfoMadt15;
>              break;
>  
> +        case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
> +
> +            InfoTable = AcpiDmTableInfoMadt16;
> +            break;
> +
>          default:
>  
>              AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
> @@ -1380,6 +1461,11 @@ AcpiDmDumpPcct (
>              InfoTable = AcpiDmTableInfoPcct4;
>              break;
>  
> +        case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
> +
> +            InfoTable = AcpiDmTableInfoPcct5;
> +            break;
> +
>          default:
>  
>              AcpiOsPrintf (
> @@ -1461,201 +1547,224 @@ AcpiDmDumpPdtt (
>  
>  /*******************************************************************************
>   *
> - * FUNCTION:    AcpiDmDumpPmtt
> + * FUNCTION:    AcpiDmDumpPhat
>   *
> - * PARAMETERS:  Table               - A PMTT table
> + * PARAMETERS:  Table               - A PHAT table
>   *
>   * RETURN:      None
>   *
> - * DESCRIPTION: Format the contents of a PMTT. This table type consists
> - *              of an open-ended number of subtables.
> + * DESCRIPTION: Format the contents of a PHAT.
>   *
>   ******************************************************************************/
>  
>  void
> -AcpiDmDumpPmtt (
> +AcpiDmDumpPhat (
>      ACPI_TABLE_HEADER       *Table)
>  {
>      ACPI_STATUS             Status;
> -    ACPI_PMTT_HEADER        *Subtable;
> -    ACPI_PMTT_HEADER        *MemSubtable;
> -    ACPI_PMTT_HEADER        *DimmSubtable;
> -    ACPI_PMTT_DOMAIN        *DomainArray;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +    ACPI_PHAT_HEADER        *Subtable;
> +    ACPI_PHAT_VERSION_DATA  *VersionData;
> +    UINT32                  RecordCount;
>      UINT32                  Length = Table->Length;
> -    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
> -    UINT32                  MemOffset;
> -    UINT32                  DimmOffset;
> -    UINT32                  DomainOffset;
> -    UINT32                  DomainCount;
> -
> +    UINT32                  Offset = sizeof (ACPI_TABLE_PHAT);
> +    UINT32                  SubtableLength;
> +    UINT32                  PathLength;
> +    UINT32                  VendorLength;
>  
> -    /* Main table */
>  
> -    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
> -    if (ACPI_FAILURE (Status))
> -    {
> -        return;
> -    }
> +    Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
>  
> -    /* Subtables */
> -
> -    Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
>      while (Offset < Table->Length)
>      {
>          /* Common subtable header */
>  
>          AcpiOsPrintf ("\n");
> -        Status = AcpiDmDumpTable (Length, Offset, Subtable,
> -            Subtable->Length, AcpiDmTableInfoPmttHdr);
> +        Status = AcpiDmDumpTable (Length, 0, Subtable,
> +            sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
>          if (ACPI_FAILURE (Status))
>          {
>              return;
>          }
>  
> -        /* Only Socket subtables are expected at this level */
> -
> -        if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET)
> +        switch (Subtable->Type)
>          {
> -            AcpiOsPrintf (
> -                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
> +        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
> +
> +            InfoTable = AcpiDmTableInfoPhat0;
> +            SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);
> +            break;
> +
> +        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
> +
> +            InfoTable = AcpiDmTableInfoPhat1;
> +            SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);
> +            break;
> +
> +        default:
> +
> +            AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
>                  Subtable->Type);
> +
>              return;
>          }
>  
> -        /* Dump the fixed-length portion of the subtable */
> -
> -        Status = AcpiDmDumpTable (Length, Offset, Subtable,
> -            Subtable->Length, AcpiDmTableInfoPmtt0);
> +        Status = AcpiDmDumpTable (Length, 0, Subtable,
> +            SubtableLength, InfoTable);
>          if (ACPI_FAILURE (Status))
>          {
>              return;
>          }
>  
> -        /* Walk the memory controller subtables */
> -
> -        MemOffset = sizeof (ACPI_PMTT_SOCKET);
> -        MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
> -            sizeof (ACPI_PMTT_SOCKET));
> -
> -        while (((Offset + MemOffset) < Table->Length) &&
> -            (MemOffset < Subtable->Length))
> +        switch (Subtable->Type)
>          {
> -            /* Common subtable header */
> +        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
>  
> -            AcpiOsPrintf ("\n");
> -            Status = AcpiDmDumpTable (Length,
> -                Offset + MemOffset, MemSubtable,
> -                MemSubtable->Length, AcpiDmTableInfoPmttHdr);
> -            if (ACPI_FAILURE (Status))
> +            VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
> +            RecordCount = VersionData->ElementCount;
> +            while (RecordCount)
>              {
> -                return;
> +                Status = AcpiDmDumpTable (Length, Offset,
> +                    ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)),
> +                    sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return;
> +                }
> +
> +                RecordCount--;
>              }
>  
> -            /* Only memory controller subtables are expected at this level */
> +            break;
> +
> +        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
>  
> -            if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER)
> +            /* account for the null terminator */
> +
> +            PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1;
> +            Status = AcpiDmDumpTable (Length, Offset,
> +                ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
> +                PathLength, AcpiDmTableInfoPhat1a);
> +            if (ACPI_FAILURE (Status))
>              {
> -                AcpiOsPrintf (
> -                    "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
> -                    MemSubtable->Type);
>                  return;
>              }
>  
> -            /* Dump the fixed-length portion of the controller subtable */
> +            /* Get vendor data - data length is the remaining subtable length */
>  
> -            Status = AcpiDmDumpTable (Length,
> -                Offset + MemOffset, MemSubtable,
> -                MemSubtable->Length, AcpiDmTableInfoPmtt1);
> +            VendorLength =
> +                Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength;
> +            Status = AcpiDmDumpTable (Length, 0,
> +                ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength),
> +                VendorLength, AcpiDmTableInfoPhat1b);
>              if (ACPI_FAILURE (Status))
>              {
>                  return;
>              }
> +            break;
>  
> -            /* Walk the variable count of proximity domains */
> +        default:
>  
> -            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
> -            DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
> -            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
> -                sizeof (ACPI_PMTT_CONTROLLER));
> +            AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
> +                Subtable->Type);
> +            return;
> +        }
>  
> -            while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
> -                ((MemOffset + DomainOffset) < Subtable->Length) &&
> -                DomainCount)
> -            {
> -                Status = AcpiDmDumpTable (Length,
> -                    Offset + MemOffset + DomainOffset, DomainArray,
> -                    sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
> -                if (ACPI_FAILURE (Status))
> -                {
> -                    return;
> -                }
> +        /* Next subtable */
>  
> -                DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
> -                DomainArray++;
> -                DomainCount--;
> -            }
> +        Offset += Subtable->Length;
> +        Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable,
> +            Subtable->Length);
> +    }
> +}
>  
> -            if (DomainCount)
> -            {
> -                AcpiOsPrintf (
> -                    "\n**** DomainCount exceeds subtable length\n\n");
> -            }
>  
> -            /* Walk the physical component (DIMM) subtables */
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmDumpPmtt
> + *
> + * PARAMETERS:  Table               - A PMTT table
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Format the contents of a PMTT. This table type consists
> + *              of an open-ended number of subtables.
> + *
> + ******************************************************************************/
>  
> -            DimmOffset = DomainOffset;
> -            DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
> -                DomainOffset);
> +void
> +AcpiDmDumpPmtt (
> +    ACPI_TABLE_HEADER       *Table)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_PMTT_HEADER        *Subtable;
> +    UINT32                  Length = Table->Length;
> +    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
>  
> -            while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
> -                (DimmOffset < MemSubtable->Length))
> -            {
> -                /* Common subtable header */
>  
> -                AcpiOsPrintf ("\n");
> -                Status = AcpiDmDumpTable (Length,
> -                    Offset + MemOffset + DimmOffset, DimmSubtable,
> -                    DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
> -                if (ACPI_FAILURE (Status))
> -                {
> -                    return;
> -                }
> +    /* Main table */
>  
> -                /* Only DIMM subtables are expected at this level */
> +    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return;
> +    }
>  
> -                if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM)
> -                {
> -                    AcpiOsPrintf (
> -                        "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
> -                        DimmSubtable->Type);
> -                    return;
> -                }
> +    /* Subtables */
>  
> -                /* Dump the fixed-length DIMM subtable */
> +    Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
> +    while (Offset < Table->Length)
> +    {
> +        /* Each of the types below contain the common subtable header */
>  
> -                Status = AcpiDmDumpTable (Length,
> -                    Offset + MemOffset + DimmOffset, DimmSubtable,
> -                    DimmSubtable->Length, AcpiDmTableInfoPmtt2);
> -                if (ACPI_FAILURE (Status))
> -                {
> -                    return;
> -                }
> +        AcpiOsPrintf ("\n");
> +        switch (Subtable->Type)
> +        {
> +        case ACPI_PMTT_TYPE_SOCKET:
> +
> +            Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +                Subtable->Length, AcpiDmTableInfoPmtt0);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
> +            }
> +            break;
>  
> -                /* Point to next DIMM subtable */
> +        case ACPI_PMTT_TYPE_CONTROLLER:
> +            Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +                Subtable->Length, AcpiDmTableInfoPmtt1);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
> +            }
> +            break;
>  
> -                DimmOffset += DimmSubtable->Length;
> -                DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
> -                    DimmSubtable, DimmSubtable->Length);
> +       case ACPI_PMTT_TYPE_DIMM:
> +            Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +                Subtable->Length, AcpiDmTableInfoPmtt2);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
>              }
> +            break;
>  
> -            /* Point to next Controller subtable */
> +        case ACPI_PMTT_TYPE_VENDOR:
> +            Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +                Subtable->Length, AcpiDmTableInfoPmttVendor);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
> +            }
> +            break;
>  
> -            MemOffset += MemSubtable->Length;
> -            MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
> -                MemSubtable, MemSubtable->Length);
> +        default:
> +            AcpiOsPrintf (
> +                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
> +                Subtable->Type);
> +            return;
>          }
>  
> -        /* Point to next Socket subtable */
> +        /* Point to next subtable */
>  
>          Offset += Subtable->Length;
>          Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
> @@ -1786,6 +1895,21 @@ AcpiDmDumpPptt (
>              }
>              break;
>  
> +        case ACPI_PPTT_TYPE_CACHE:
> +
> +            if (Table->Revision < 3)
> +            {
> +                break;
> +            }
> +            Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
> +                ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
> +                sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
> +            }
> +            break;
> +
>          default:
>  
>              break;
> @@ -1906,17 +2030,20 @@ void
>  AcpiDmDumpSdev (
>      ACPI_TABLE_HEADER       *Table)
>  {
> -    ACPI_STATUS             Status;
> -    ACPI_SDEV_HEADER        *Subtable;
> -    ACPI_SDEV_PCIE          *Pcie;
> -    ACPI_SDEV_NAMESPACE     *Namesp;
> -    ACPI_DMTABLE_INFO       *InfoTable;
> -    UINT32                  Length = Table->Length;
> -    UINT32                  Offset = sizeof (ACPI_TABLE_SDEV);
> -    UINT16                  PathOffset;
> -    UINT16                  PathLength;
> -    UINT16                  VendorDataOffset;
> -    UINT16                  VendorDataLength;
> +    ACPI_STATUS                 Status;
> +    ACPI_SDEV_HEADER            *Subtable;
> +    ACPI_SDEV_PCIE              *Pcie;
> +    ACPI_SDEV_NAMESPACE         *Namesp;
> +    ACPI_DMTABLE_INFO           *InfoTable;
> +    ACPI_DMTABLE_INFO           *SecureComponentInfoTable;
> +    UINT32                      Length = Table->Length;
> +    UINT32                      Offset = sizeof (ACPI_TABLE_SDEV);
> +    UINT16                      PathOffset;
> +    UINT16                      PathLength;
> +    UINT16                      VendorDataOffset;
> +    UINT16                      VendorDataLength;
> +    ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
> +    UINT32                      CurrentOffset = 0;
>  
>  
>      /* Main table */
> @@ -1959,7 +2086,7 @@ AcpiDmDumpSdev (
>          }
>  
>          AcpiOsPrintf ("\n");
> -        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
> +        Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
>              Subtable->Length, InfoTable);
>          if (ACPI_FAILURE (Status))
>          {
> @@ -1970,6 +2097,52 @@ AcpiDmDumpSdev (
>          {
>          case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
>  
> +            CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
> +            if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
> +            {
> +                SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
> +                    ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
> +
> +                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
> +                    ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
> +                    sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return;
> +                }
> +                CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
> +
> +                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
> +                    ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
> +                    sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return;
> +                }
> +                CurrentOffset += sizeof (ACPI_SDEV_HEADER);
> +
> +                switch (Subtable->Type)
> +                {
> +                case ACPI_SDEV_TYPE_ID_COMPONENT:
> +
> +                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
> +                    break;
> +
> +                case ACPI_SDEV_TYPE_MEM_COMPONENT:
> +
> +                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
> +                    break;
> +
> +                default:
> +                    goto NextSubtable;
> +                }
> +
> +                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
> +                    ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
> +                    SecureComponent->SecureComponentLength, SecureComponentInfoTable);
> +                CurrentOffset += SecureComponent->SecureComponentLength;
> +            }
> +
>              /* Dump the PCIe device ID(s) */
>  
>              Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
> @@ -1978,13 +2151,14 @@ AcpiDmDumpSdev (
>  
>              if (PathLength)
>              {
> -                Status = AcpiDmDumpTable (Table->Length, 0,
> +                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
>                      ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
>                      PathLength, AcpiDmTableInfoSdev0a);
>                  if (ACPI_FAILURE (Status))
>                  {
>                      return;
>                  }
> +                CurrentOffset += PathLength;
>              }
>  
>              /* Dump the vendor-specific data */
> diff --git a/src/acpica/source/common/dmtbdump3.c b/src/acpica/source/common/dmtbdump3.c
> index fde8f7a8..7f559eee 100644
> --- a/src/acpica/source/common/dmtbdump3.c
> +++ b/src/acpica/source/common/dmtbdump3.c
> @@ -601,6 +601,106 @@ AcpiDmDumpTpm2 (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmDumpViot
> + *
> + * PARAMETERS:  Table               - A VIOT table
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Format the contents of a VIOT
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmDumpViot (
> +    ACPI_TABLE_HEADER       *Table)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_TABLE_VIOT         *Viot;
> +    ACPI_VIOT_HEADER        *ViotHeader;
> +    UINT16                  Length;
> +    UINT16                  Offset;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +
> +    /* Main table */
> +
> +    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoViot);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return;
> +    }
> +
> +    Viot = ACPI_CAST_PTR (ACPI_TABLE_VIOT, Table);
> +
> +    Offset = Viot->NodeOffset;
> +    while (Offset < Table->Length)
> +    {
> +        /* Common subtable header */
> +        ViotHeader = ACPI_ADD_PTR (ACPI_VIOT_HEADER, Table, Offset);
> +        AcpiOsPrintf ("\n");
> +
> +        Length = sizeof (ACPI_VIOT_HEADER);
> +        Status = AcpiDmDumpTable (Table->Length, Offset, ViotHeader, Length,
> +            AcpiDmTableInfoViotHeader);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +        Length = ViotHeader->Length;
> +        switch (ViotHeader->Type)
> +        {
> +        case ACPI_VIOT_NODE_PCI_RANGE:
> +
> +            InfoTable = AcpiDmTableInfoViot1;
> +            break;
> +
> +        case ACPI_VIOT_NODE_MMIO:
> +
> +            InfoTable = AcpiDmTableInfoViot2;
> +            break;
> +
> +        case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
> +
> +            InfoTable = AcpiDmTableInfoViot3;
> +            break;
> +
> +        case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
> +
> +            InfoTable = AcpiDmTableInfoViot4;
> +            break;
> +
> +        default:
> +
> +            AcpiOsPrintf ("\n*** Unknown VIOT node type 0x%X\n",
> +                ViotHeader->Type);
> +
> +            /* Attempt to continue */
> +
> +            if (!Length)
> +            {
> +                AcpiOsPrintf ("Invalid zero length VIOT node\n");
> +                return;
> +            }
> +            goto NextSubtable;
> +        }
> +
> +        AcpiOsPrintf ("\n");
> +        Status = AcpiDmDumpTable (Table->Length, Offset, ViotHeader, Length,
> +            InfoTable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +NextSubtable:
> +        Offset += Length;
> +    }
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    AcpiDmDumpWdat
> diff --git a/src/acpica/source/common/dmtbinfo1.c b/src/acpica/source/common/dmtbinfo1.c
> index 5931c01e..ea545f53 100644
> --- a/src/acpica/source/common/dmtbinfo1.c
> +++ b/src/acpica/source/common/dmtbinfo1.c
> @@ -344,6 +344,33 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoBoot[] =
>  };
>  
>  
> +/*******************************************************************************
> + *
> + * CEDT - CXL Early Discovery Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoCedtHdr[] =
> +{
> +    {ACPI_DMT_CEDT,     ACPI_CEDT_OFFSET (Type),               "Subtable Type", 0},
> +    {ACPI_DMT_UINT8,    ACPI_CEDT_OFFSET (Reserved),           "Reserved", 0},
> +    {ACPI_DMT_UINT16,   ACPI_CEDT_OFFSET (Length),             "Length", DT_LENGTH},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0: CXL Host Bridge Structure */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoCedt0[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (Uid),               "Associated host bridge", 0},
> +    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (CxlVersion),        "Specification version", 0},
> +    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (Reserved),          "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_CEDT0_OFFSET (Base),              "Register base", 0},
> +    {ACPI_DMT_UINT64,   ACPI_CEDT0_OFFSET (Length),            "Register length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
>  /*******************************************************************************
>   *
>   * CPEP - Corrected Platform Error Polling table
> @@ -1134,9 +1161,12 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat0[] =
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1[] =
>  {
>      {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (Flags),                  "Flags (decoded below)", 0},
> -    {ACPI_DMT_FLAGS4_0, ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Memory Hierarchy", 0},
> +    {ACPI_DMT_FLAGS4_0, ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Memory Hierarchy", 0},         /* First 4 bits */
> +    {ACPI_DMT_FLAG4,    ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Use Minimum Transfer Size", 0},
> +    {ACPI_DMT_FLAG5,    ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Non-sequential Transfers", 0},
>      {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (DataType),               "Data Type", 0},
> -    {ACPI_DMT_UINT16,   ACPI_HMAT1_OFFSET (Reserved1),              "Reserved1", 0},
> +    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (MinTransferSize),        "Minimum Transfer Size", 0},
> +    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (Reserved1),              "Reserved1", 0},
>      {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfInitiatorPDs),   "Initiator Proximity Domains #", 0},
>      {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfTargetPDs),      "Target Proximity Domains #", 0},
>      {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (Reserved2),              "Reserved2", 0},
> diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c
> index 0d61cb7a..9bb4b48c 100644
> --- a/src/acpica/source/common/dmtbinfo2.c
> +++ b/src/acpica/source/common/dmtbinfo2.c
> @@ -218,7 +218,20 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoIortHdr[] =
>      {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Type),                   "Type", 0},
>      {ACPI_DMT_UINT16,   ACPI_IORTH_OFFSET (Length),                 "Length", DT_LENGTH},
>      {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Revision),               "Revision", 0},
> -    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Identifier),             "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingCount),           "Mapping Count", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingOffset),          "Mapping Offset", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Common Subtable header (one per Subtable)- Revision 3 */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIortHdr3[] =
> +{
> +    {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Type),                   "Type", 0},
> +    {ACPI_DMT_UINT16,   ACPI_IORTH_OFFSET (Length),                 "Length", DT_LENGTH},
> +    {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Revision),               "Revision", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Identifier),             "Identifier", 0},
>      {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingCount),           "Mapping Count", 0},
>      {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingOffset),          "Mapping Offset", 0},
>      ACPI_DMT_TERMINATOR
> @@ -369,6 +382,25 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoIort5[] =
>  };
>  
>  
> +/* 0x06: RMR */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIort6[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (Flags),                  "Flags (decoded below)", 0},
> +    {ACPI_DMT_FLAG0,    ACPI_IORT6_FLAG_OFFSET (Flags, 0),          "Remapping Permitted", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (RmrCount),               "Number of RMR Descriptors", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (RmrOffset),              "RMR Descriptor Offset", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIort6a[] =
> +{
> +    {ACPI_DMT_UINT64,   ACPI_IORT6A_OFFSET (BaseAddress),           "Base Address of RMR", DT_OPTIONAL},
> +    {ACPI_DMT_UINT64,   ACPI_IORT6A_OFFSET (Length),                "Length of RMR", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORT6A_OFFSET (Reserved),              "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>  /*******************************************************************************
>   *
>   * IVRS - I/O Virtualization Reporting Structure
> @@ -478,6 +510,24 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrs8c[] =
>      ACPI_DMT_TERMINATOR
>  };
>  
> +/* Variable-length device entry */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrsHid[] =
> +{
> +    ACPI_DMT_IVRS_DE_HEADER,
> +    {ACPI_DMT_NAME8,    ACPI_IVRSHID_OFFSET (AcpiHid),              "ACPI HID", 0},
> +    {ACPI_DMT_NAME8,    ACPI_IVRSHID_OFFSET (AcpiCid),              "ACPI CID", 0},
> +    {ACPI_DMT_UINT8,    ACPI_IVRSHID_OFFSET (UidType),              "UID Format", DT_DESCRIBES_OPTIONAL},
> +    {ACPI_DMT_UINT8,    ACPI_IVRSHID_OFFSET (UidLength),            "UID Length", DT_DESCRIBES_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrsHid1[] =
> +{
> +    {ACPI_DMT_RAW_BUFFER, 0,                                        "UID", DT_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>  
>  /*******************************************************************************
>   *
> @@ -751,6 +801,16 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoMadt15[] =
>     ACPI_DMT_TERMINATOR
>  };
>  
> +/* 16: Multiprocessor wakeup structure (ACPI 6.4) */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoMadt16[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_MADT16_OFFSET (MailboxVersion),        "Mailbox Version", 0},
> +    {ACPI_DMT_UINT32,   ACPI_MADT16_OFFSET (Reserved),              "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_MADT16_OFFSET (BaseAddress),           "Mailbox Address", 0},
> +   ACPI_DMT_TERMINATOR
> +};
> +
>  
>  /*******************************************************************************
>   *
> @@ -938,12 +998,14 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoNfit0[] =
>      {ACPI_DMT_UINT16,   ACPI_NFIT0_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
>      {ACPI_DMT_FLAG0,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Add/Online Operation Only", 0},
>      {ACPI_DMT_FLAG1,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Proximity Domain Valid", 0},
> +    {ACPI_DMT_FLAG2,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Location Cookie Valid", 0},
>      {ACPI_DMT_UINT32,   ACPI_NFIT0_OFFSET (Reserved),               "Reserved", 0},
>      {ACPI_DMT_UINT32,   ACPI_NFIT0_OFFSET (ProximityDomain),        "Proximity Domain", 0},
>      {ACPI_DMT_UUID,     ACPI_NFIT0_OFFSET (RangeGuid[0]),           "Region Type GUID", 0},
>      {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (Address),                "Address Range Base", 0},
>      {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (Length),                 "Address Range Length", 0},
>      {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (MemoryMapping),          "Memory Map Attribute", 0},
> +    {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (LocationCookie),         "Location Cookie", 0},      /* ACPI 6.4 */
>      ACPI_DMT_TERMINATOR
>  };
>  
> @@ -1219,6 +1281,25 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct4[] =
>      ACPI_DMT_TERMINATOR
>  };
>  
> +/* 5: HW Registers based Communications Subspace */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct5[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_PCCT5_OFFSET (Version),                "Version", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (BaseAddress),            "Base Address", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (Length),                 "Length", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (DoorbellRegister),       "Doorbell Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (DoorbellPreserve),       "Preserve Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (DoorbellWrite),          "Write Mask", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (CmdCompleteRegister),    "Command Complete Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (CmdCompleteMask),        "Command Complete Check Mask", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (ErrorStatusRegister),    "Error Status Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (ErrorStatusMask),        "Error Status Mask", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT5_OFFSET (NominalLatency),         "Nominal Latency", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT5_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>  
>  /*******************************************************************************
>   *
> @@ -1247,37 +1328,91 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPdtt0[] =
>  
>  /*******************************************************************************
>   *
> - * PMTT - Platform Memory Topology Table
> + * PHAT - Platform Health Assessment Table (ACPI 6.4)
>   *
>   ******************************************************************************/
>  
> -ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt[] =
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhatHdr[] =
>  {
> -    {ACPI_DMT_UINT32,   ACPI_PMTT_OFFSET (Reserved),                "Reserved", 0},
> +    {ACPI_DMT_PHAT,     ACPI_PHATH_OFFSET (Type),                 "Subtable Type", 0},
> +    {ACPI_DMT_UINT16,   ACPI_PHATH_OFFSET (Length),               "Length", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PHATH_OFFSET (Revision),             "Revision", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> -/* Common Subtable header (one per Subtable) */
> +/* 0: Firmware version table */
>  
> -ACPI_DMTABLE_INFO           AcpiDmTableInfoPmttHdr[] =
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat0[] =
>  {
> -    {ACPI_DMT_PMTT,     ACPI_PMTTH_OFFSET (Type),                   "Subtable Type", 0},
> -    {ACPI_DMT_UINT8,    ACPI_PMTTH_OFFSET (Reserved1),              "Reserved", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Length),                 "Length", DT_LENGTH},
> -    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
> -    {ACPI_DMT_FLAG0,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Top-level Device", 0},
> -    {ACPI_DMT_FLAG1,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Physical Element", 0},
> -    {ACPI_DMT_FLAGS2,   ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Memory Type", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Reserved2),              "Reserved", 0},
> +    {ACPI_DMT_UINT24,   ACPI_PHAT0_OFFSET (Reserved),             "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PHAT0_OFFSET (ElementCount),         "Element Count", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat0a[] =
> +{
> +    {ACPI_DMT_UUID,     ACPI_PHAT0A_OFFSET (Guid),                "GUID", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PHAT0A_OFFSET (VersionValue),        "Version Value", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PHAT0A_OFFSET (ProducerId),          "Producer ID", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 1: Firmware Health Data Record */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_PHAT1_OFFSET (Reserved),             "Reserved", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PHAT1_OFFSET (Health),               "Health", 0},
> +    {ACPI_DMT_UUID,     ACPI_PHAT1_OFFSET (DeviceGuid),           "Device GUID", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PHAT1_OFFSET (DeviceSpecificOffset), "Device specific offset", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1a[] =
> +{
> +    {ACPI_DMT_STRING,   0,                                          "Namepath", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1b[] =
> +{
> +    {ACPI_DMT_RAW_BUFFER, 0,                                        "Vendor Data", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
> +/*******************************************************************************
> + *
> + * PMTT - Platform Memory Topology Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_PMTT_OFFSET (MemoryDeviceCount),       "Memory Device Count", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Common Subtable header (one per Subtable) */
> +
> +#define ACPI_DM_PMTT_HEADER \
> +    {ACPI_DMT_PMTT,     ACPI_PMTTH_OFFSET (Type),                   "Subtable Type", 0}, \
> +    {ACPI_DMT_UINT8,    ACPI_PMTTH_OFFSET (Reserved1),              "Reserved", 0}, \
> +    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Length),                 "Length", DT_LENGTH}, \
> +    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG}, \
> +    {ACPI_DMT_FLAG0,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Top-level Device", 0}, \
> +    {ACPI_DMT_FLAG1,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Physical Element", 0}, \
> +    {ACPI_DMT_FLAGS2,   ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Memory Type", 0}, \
> +    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Reserved2),              "Reserved", 0}, \
> +    {ACPI_DMT_UINT32,   ACPI_PMTTH_OFFSET (MemoryDeviceCount),      "Memory Device Count", 0}
> +
>  /* PMTT Subtables */
>  
>  /* 0: Socket */
>  
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt0[] =
>  {
> +    ACPI_DM_PMTT_HEADER,
>      {ACPI_DMT_UINT16,   ACPI_PMTT0_OFFSET (SocketId),               "Socket ID", 0},
>      {ACPI_DMT_UINT16,   ACPI_PMTT0_OFFSET (Reserved),               "Reserved", 0},
>      ACPI_DMT_TERMINATOR
> @@ -1287,33 +1422,28 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt0[] =
>  
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt1[] =
>  {
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (ReadLatency),            "Read Latency", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (WriteLatency),           "Write Latency", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (ReadBandwidth),          "Read Bandwidth", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (WriteBandwidth),         "Write Bandwidth", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (AccessWidth),            "Access Width", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (Alignment),              "Alignment", 0},
> +    ACPI_DM_PMTT_HEADER,
> +    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (ControllerId),           "Controller ID", 0},
>      {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (Reserved),               "Reserved", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (DomainCount),            "Domain Count", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> -/* 1a: Proximity Domain */
> +/* 2: Physical Component */
>  
> -ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt1a[] =
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
>  {
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1A_OFFSET (ProximityDomain),       "Proximity Domain", 0},
> +    ACPI_DM_PMTT_HEADER,
> +    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (BiosHandle),             "Bios Handle", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> -/* 2: Physical Component */
> +/* 0xFF: Vendor Specific */
>  
> -ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPmttVendor[] =
>  {
> -    {ACPI_DMT_UINT16,   ACPI_PMTT2_OFFSET (ComponentId),            "Component ID", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTT2_OFFSET (Reserved),               "Reserved", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (MemorySize),             "Memory Size", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (BiosHandle),             "Bios Handle", 0},
> +    ACPI_DM_PMTT_HEADER,
> +    {ACPI_DMT_UUID,         ACPI_PMTT_VENDOR_OFFSET (TypeUuid),     "Type Uuid", 0},
> +    {ACPI_DMT_PMTT_VENDOR,  ACPI_PMTT_VENDOR_OFFSET (Specific),     "Vendor Data", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> @@ -1371,6 +1501,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
>      {ACPI_DMT_FLAG4,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache Type valid", 0},
>      {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Write Policy valid", 0},
>      {ACPI_DMT_FLAG6,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
> +    {ACPI_DMT_FLAG7,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache ID valid", 0},
>      {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NextLevelOfCache),       "Next Level of Cache", 0},
>      {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Size),                   "Size", 0},
>      {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NumberOfSets),           "Number of Sets", 0},
> @@ -1383,6 +1514,14 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
>      ACPI_DMT_TERMINATOR
>  };
>  
> +/* 1: cache type v1 */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1a[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_PPTT1A_OFFSET (CacheId),               "Cache ID", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>  /* 2: ID */
>  
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt2[] =
> @@ -1499,6 +1638,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevHdr[] =
>      {ACPI_DMT_SDEV,     ACPI_SDEVH_OFFSET (Type),                   "Subtable Type", 0},
>      {ACPI_DMT_UINT8,    ACPI_SDEVH_OFFSET (Flags),                  "Flags (decoded below)", 0},
>      {ACPI_DMT_FLAG0,    ACPI_SDEVH_FLAG_OFFSET (Flags,0),           "Allow handoff to unsecure OS", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_SDEVH_FLAG_OFFSET (Flags,0),           "Secure access components present", 0},
>      {ACPI_DMT_UINT16,   ACPI_SDEVH_OFFSET (Length),                 "Length", 0},
>      ACPI_DMT_TERMINATOR
>  };
> @@ -1522,6 +1662,53 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev0a[] =
>      ACPI_DMT_TERMINATOR
>  };
>  
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev0b[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_SDEV0B_OFFSET (SecureComponentOffset), "Secure Access Components Offset", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEV0B_OFFSET (SecureComponentLength), "Secure Access Components Length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Secure access components */
> +
> +/* Common secure access components header secure access component */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompHdr[] =
> +{
> +    {ACPI_DMT_UINT8,    ACPI_SDEVCH_OFFSET (Type),                   "Secure Component Type", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVCH_OFFSET (Flags),                  "Flags (decoded below)", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVCH_OFFSET (Length),                 "Length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0: Identification Based Secure Access Component */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompId[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareIdOffset),      "Hardware ID Offset", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareIdLength),      "Hardware ID Length", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (SubsystemIdOffset),     "Subsystem ID Offset", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (SubsystemIdLength),     "Subsystem ID Length", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareRevision),      "Hardware Revision", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (HardwareRevPresent),    "Hardware Rev Present", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (ClassCodePresent),      "Class Code Present", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciBaseClass),          "PCI Base Class", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciSubClass),           "PCI SubClass", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciProgrammingXface),   "PCI Programming Xface", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 1: Memory Based Secure Access Component */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompMem[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_SDEVC1_OFFSET (Reserved),              "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_SDEVC1_OFFSET (MemoryBaseAddress),     "Memory Base Address", 0},
> +    {ACPI_DMT_UINT64,   ACPI_SDEVC1_OFFSET (MemoryLength),          "Memory Length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
>  /* 1: PCIe Endpoint Device Based Device Structure */
>  
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev1[] =
> diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c
> index 99661d06..773ba16e 100644
> --- a/src/acpica/source/common/dmtbinfo3.c
> +++ b/src/acpica/source/common/dmtbinfo3.c
> @@ -378,6 +378,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat5[] =
>      {ACPI_DMT_BUF16,    ACPI_SRAT5_OFFSET (DeviceHandle),           "Device Handle", 0},
>      {ACPI_DMT_UINT32,   ACPI_SRAT5_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
>      {ACPI_DMT_FLAG0,    ACPI_SRAT5_FLAG_OFFSET (Flags,0),           "Enabled", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_SRAT5_FLAG_OFFSET (Flags,0),           "Architectural Transactions", 0},
>      {ACPI_DMT_UINT32,   ACPI_SRAT5_OFFSET (Reserved1),              "Reserved2", 0},
>      ACPI_DMT_TERMINATOR
>  };
> @@ -526,6 +527,77 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoUefi[] =
>  };
>  
>  
> +/*******************************************************************************
> + *
> + * VIOT - Virtual I/O Translation Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_VIOT_OFFSET (NodeCount),               "Node count", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT_OFFSET (NodeOffset),              "Node offset", 0},
> +    {ACPI_DMT_UINT64,   ACPI_VIOT_OFFSET (Reserved),                "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Common VIOT subtable header */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViotHeader[] =
> +{
> +    {ACPI_DMT_VIOT,     ACPI_VIOTH_OFFSET (Type),                   "Type", 0},
> +    {ACPI_DMT_UINT8,    ACPI_VIOTH_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOTH_OFFSET (Length),                 "Length", DT_LENGTH},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* VIOT Subtables */
> +
> +/* 0x01: PCI Range Node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot1[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_VIOT1_OFFSET (EndpointStart),          "Endpoint start", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (SegmentStart),           "PCI Segment start", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (SegmentEnd),             "PCI Segment end", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (BdfStart),               "PCI BDF start", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (BdfEnd),                 "PCI BDF end", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (OutputNode),             "Output node", 0},
> +    {ACPI_DMT_UINT48,   ACPI_VIOT1_OFFSET (Reserved),               "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0x02: MMIO Endpoint Node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot2[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_VIOT2_OFFSET (Endpoint),               "Endpoint", 0},
> +    {ACPI_DMT_UINT64,   ACPI_VIOT2_OFFSET (BaseAddress),            "Base address", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT2_OFFSET (OutputNode),             "Output node", 0},
> +    {ACPI_DMT_UINT48,   ACPI_VIOT2_OFFSET (Reserved),               "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0x03: PCI Virtio-IOMMU Node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot3[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_VIOT3_OFFSET (Segment),                "PCI Segment", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT3_OFFSET (Bdf),                    "PCI BDF number", 0},
> +    {ACPI_DMT_UINT64,   ACPI_VIOT3_OFFSET (Reserved),               "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0x04: MMIO Virtio-IOMMU Node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot4[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_VIOT4_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_VIOT4_OFFSET (BaseAddress),            "Base address", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
>  /*******************************************************************************
>   *
>   * WAET - Windows ACPI Emulated devices Table
> diff --git a/src/acpica/source/compiler/aslallocate.c b/src/acpica/source/compiler/aslallocate.c
> index 4007687b..8be711b2 100644
> --- a/src/acpica/source/compiler/aslallocate.c
> +++ b/src/acpica/source/compiler/aslallocate.c
> @@ -153,7 +153,7 @@
>  
>  /*
>   * Local heap allocation wrappers. See aslcache.c for allocation from local
> - * cache alloctions
> + * cache allocations
>   */
>  
>  
> diff --git a/src/acpica/source/compiler/aslascii.c b/src/acpica/source/compiler/aslascii.c
> index d02ca80c..0e8c4d4e 100644
> --- a/src/acpica/source/compiler/aslascii.c
> +++ b/src/acpica/source/compiler/aslascii.c
> @@ -184,7 +184,7 @@ FlConsumeNewComment (
>   *              not handle comment delimiters within string literals. However,
>   *              on the rare chance this happens and an invalid character is
>   *              missed, the parser will catch the error by failing in some
> - *              spectactular manner.
> + *              spectacular manner.
>   *
>   ******************************************************************************/
>  
> @@ -216,7 +216,7 @@ FlIsFileAsciiSource (
>  
>      while (fread (&Byte, 1, 1, Handle) == 1)
>      {
> -        /* Ignore comment fields (allow non-ascii within) */
> +        /* Ignore comment fields (allow non-ASCII within) */
>  
>          if (OpeningComment)
>          {
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index 3cd56d1f..e48e4674 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -1538,6 +1538,10 @@ ASL_RESOURCE_NODE *
>  RsDoUartSerialBusDescriptor (
>      ASL_RESOURCE_INFO       *Info);
>  
> +ASL_RESOURCE_NODE *
> +RsDoCsi2SerialBusDescriptor (
> +    ASL_RESOURCE_INFO       *Info);
> +
>  ASL_RESOURCE_NODE *
>  RsDoPinFunctionDescriptor (
>      ASL_RESOURCE_INFO       *Info);
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index 629b9972..e0985362 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -434,6 +434,7 @@ NamePathTail                [.]{NameSeg}
>  "ResourceTemplate"          { count (1); return (PARSEOP_RESOURCETEMPLATE); }
>  "RawDataBuffer"             { count (1); return (PARSEOP_DATABUFFER); }
>  
> +"Csi2Bus"                   { count (1); return (PARSEOP_CSI2_SERIALBUS); }
>  "DMA"                       { count (1); return (PARSEOP_DMA); }
>  "DWordIO"                   { count (1); return (PARSEOP_DWORDIO); }
>  "DWordMemory"               { count (1); return (PARSEOP_DWORDMEMORY); }
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index 6c684f2f..d73d7de9 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -1125,7 +1125,7 @@ void
>  AslCheckExpectedExceptions (
>      void)
>  {
> -    UINT8                   i;
> +    UINT32                  i;
>      ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
>      ASL_LOCATION_NODE       *LocationNode;
>  
> @@ -1188,7 +1188,7 @@ AslLogExpectedException (
>  
>      if (MessageId > 6999)
>      {
> -        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
> +        printf ("\"%s\" is not a valid warning/remark/error ID\n",
>              MessageIdString);
>          return (AE_BAD_PARAMETER);
>      }
> @@ -1336,7 +1336,7 @@ AslElevateException (
>  
>      if (MessageId > 6999)
>      {
> -        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
> +        printf ("\"%s\" is not a valid warning/remark/error ID\n",
>              MessageIdString);
>          return (AE_BAD_PARAMETER);
>      }
> diff --git a/src/acpica/source/compiler/aslhelpers.y b/src/acpica/source/compiler/aslhelpers.y
> index 0b302904..abb729c3 100644
> --- a/src/acpica/source/compiler/aslhelpers.y
> +++ b/src/acpica/source/compiler/aslhelpers.y
> @@ -360,6 +360,11 @@ OptionalSlaveMode
>      | ',' SlaveModeKeyword          {$$ = $2;}
>      ;
>  
> +OptionalSlaveMode_First
> +    :                               {$$ = NULL;}
> +    | SlaveModeKeyword              {$$ = $1;}
> +    ;
> +
>  OptionalShareType
>      :                               {$$ = NULL;}
>      | ','                           {$$ = NULL;}
> diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
> index ed27a155..7b591bc6 100644
> --- a/src/acpica/source/compiler/aslmap.c
> +++ b/src/acpica/source/compiler/aslmap.c
> @@ -346,6 +346,7 @@ const ASL_MAPPING_ENTRY     AslKeywordMapping [] =
>  /* FUNCTION */                  OP_TABLE_ENTRY (AML_METHOD_OP,              0,                              OP_AML_PACKAGE,     0),
>  /* GPIOINT */                   OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>  /* GPIOIO */                    OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
> +/* CSI2SERIALBUS */             OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>  /* I2CSERIALBUS */              OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>  /* I2CSERIALBUSV2 */            OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>  /* IF */                        OP_TABLE_ENTRY (AML_IF_OP,                  0,                              OP_AML_PACKAGE,     0),
> diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
> index 87ebc48e..c9697645 100644
> --- a/src/acpica/source/compiler/aslmessages.c
> +++ b/src/acpica/source/compiler/aslmessages.c
> @@ -384,7 +384,8 @@ const char                      *AslCompilerMsgs [] =
>  /*    ASL_MSG_EXTERNAL_FOUND_HERE */        "External declaration below ",
>  /*    ASL_MSG_LOWER_CASE_NAMESEG */         "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case",
>  /*    ASL_MSG_LOWER_CASE_NAMEPATH */        "At least one lower case letter found in NamePath, ASL is case insensitive - converting to upper case",
> -/*    ASL_MSG_UUID_NOT_FOUND */             "Unknown UUID string"
> +/*    ASL_MSG_UUID_NOT_FOUND */             "Unknown UUID string",
> +/*    ASL_MSG_LEGACY_DDB_TYPE */            "DDBHandleObj has been deprecated along with the Unload operator. DDBHandlObj objects are only used in Unload"
>  };
>  
>  /* Table compiler */
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index a4842cdf..1d9f7bec 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -389,6 +389,7 @@ typedef enum
>      ASL_MSG_LOWER_CASE_NAMESEG,
>      ASL_MSG_LOWER_CASE_NAMEPATH,
>      ASL_MSG_UUID_NOT_FOUND,
> +    ASL_MSG_LEGACY_DDB_TYPE,
>  
>  
>      /* These messages are used by the Data Table compiler only */
> diff --git a/src/acpica/source/compiler/aslnamesp.c b/src/acpica/source/compiler/aslnamesp.c
> index 7dc9ed7e..6f9bb65a 100644
> --- a/src/acpica/source/compiler/aslnamesp.c
> +++ b/src/acpica/source/compiler/aslnamesp.c
> @@ -519,7 +519,8 @@ NsDoOneNamespaceObject (
>   *
>   * RETURN:      Status
>   *
> - * DESCRIPTION: Print the full pathname and addtional info for a namespace node.
> + * DESCRIPTION: Print the full pathname and additional info for a namespace
> + * node.
>   *
>   ******************************************************************************/
>  
> diff --git a/src/acpica/source/compiler/aslopcodes.c b/src/acpica/source/compiler/aslopcodes.c
> index f5cb0214..2f2c7744 100644
> --- a/src/acpica/source/compiler/aslopcodes.c
> +++ b/src/acpica/source/compiler/aslopcodes.c
> @@ -676,7 +676,7 @@ OpcDoUnicode (
>   *                      Bits 4-0    - 3rd character of mfg code
>   *              Byte 2: Bits 7-4    - 1st hex digit of product number
>   *                      Bits 3-0    - 2nd hex digit of product number
> - *              Byte 3: Bits 7-4    - 3st hex digit of product number
> + *              Byte 3: Bits 7-4    - 3rd hex digit of product number
>   *                      Bits 3-0    - Hex digit of the revision number
>   *
>   ******************************************************************************/
> diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c
> index bd4a4d85..ae3b918d 100644
> --- a/src/acpica/source/compiler/asloperands.c
> +++ b/src/acpica/source/compiler/asloperands.c
> @@ -1090,7 +1090,7 @@ OpnDoDefinitionBlock (
>           * Use the definition block file parameter instead of the input
>           * filename. Since all files were opened previously, remove the
>           * existing file and open a new file with the name of this
> -         * definiton block parameter. Since AML code generation has yet
> +         * definition block parameter. Since AML code generation has yet
>           * to happen, the previous file can be removed without any impacts.
>           */
>          FlCloseFile (ASL_FILE_AML_OUTPUT);
> diff --git a/src/acpica/source/compiler/aslparser.y b/src/acpica/source/compiler/aslparser.y
> index c91acedf..0a6fb64d 100644
> --- a/src/acpica/source/compiler/aslparser.y
> +++ b/src/acpica/source/compiler/aslparser.y
> @@ -208,7 +208,7 @@ AslLocalAllocate (
>   * These shift/reduce conflicts are expected. There should be zero
>   * reduce/reduce conflicts.
>   */
> -%expect 124
> +%expect 127
>  
>  /*! [Begin] no source code translation */
>  
> diff --git a/src/acpica/source/compiler/aslprintf.c b/src/acpica/source/compiler/aslprintf.c
> index 62d411e1..04f2d31e 100644
> --- a/src/acpica/source/compiler/aslprintf.c
> +++ b/src/acpica/source/compiler/aslprintf.c
> @@ -352,7 +352,7 @@ OpcParsePrintf (
>  
>              /*
>               * Append an empty string if the first argument is
> -             * not a string. This will implicitly conver the 2nd
> +             * not a string. This will implicitly convert the 2nd
>               * concat source to a string per the ACPI specification.
>               */
>              if (!Op->Asl.Child)
> diff --git a/src/acpica/source/compiler/aslresource.c b/src/acpica/source/compiler/aslresource.c
> index 434a74c6..a2d85568 100644
> --- a/src/acpica/source/compiler/aslresource.c
> +++ b/src/acpica/source/compiler/aslresource.c
> @@ -990,6 +990,11 @@ RsDoOneResourceDescriptor (
>          Rnode = RsDoUartSerialBusDescriptor (Info);
>          break;
>  
> +    case PARSEOP_CSI2_SERIALBUS:
> +
> +        Rnode = RsDoCsi2SerialBusDescriptor (Info);
> +        break;
> +
>      case PARSEOP_PINCONFIG:
>  
>          Rnode = RsDoPinConfigDescriptor (Info);
> diff --git a/src/acpica/source/compiler/aslresources.y b/src/acpica/source/compiler/aslresources.y
> index 00a0958b..86c8981f 100644
> --- a/src/acpica/source/compiler/aslresources.y
> +++ b/src/acpica/source/compiler/aslresources.y
> @@ -190,7 +190,8 @@ ResourceMacroList
>      ;
>  
>  ResourceMacroTerm
> -    : DMATerm                       {}
> +    : Csi2SerialBusTerm             {}
> +    | DMATerm                       {}
>      | DWordIOTerm                   {}
>      | DWordMemoryTerm               {}
>      | DWordSpaceTerm                {}
> @@ -233,6 +234,23 @@ ResourceMacroTerm
>      | WordSpaceTerm                 {}
>      ;
>  
> +Csi2SerialBusTerm
> +    : PARSEOP_CSI2_SERIALBUS
> +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafOp (PARSEOP_CSI2_SERIALBUS);}
> +        OptionalSlaveMode_First     {UtCheckIntegerRange ($4, 0x00, 0x01);} /* 04: SlaveMode */
> +        ',' ByteConstExpr           {UtCheckIntegerRange ($7, 0x00, 0x03);} /* 07: PhyType */
> +        OptionalByteConstExpr       {UtCheckIntegerRange ($9, 0x00, 0xFC);} /* 09: LocalPortInstance */
> +        ',' StringData              /* 12: ResourceSource */
> +        ',' ByteConstExpr           /* 14: ResourceSourceIndex */
> +        OptionalResourceType        /* 15; ResourceType (ResourceUsage) */
> +        OptionalNameString          /* 16: DescriptorName */
> +        OptionalBuffer_Last         /* 17: VendorData */
> +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkOpChildren ($<n>3,8,
> +                                        $4,$7,$9,$12,$14,$15,$16,$17);}
> +    | PARSEOP_CSI2_SERIALBUS
> +        PARSEOP_OPEN_PAREN
> +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
> +
>  DMATerm
>      : PARSEOP_DMA
>          PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafOp (PARSEOP_DMA);}
> diff --git a/src/acpica/source/compiler/aslrestype2s.c b/src/acpica/source/compiler/aslrestype2s.c
> index 8539edea..607aca8b 100644
> --- a/src/acpica/source/compiler/aslrestype2s.c
> +++ b/src/acpica/source/compiler/aslrestype2s.c
> @@ -1387,6 +1387,142 @@ RsDoUartSerialBusDescriptor (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    RsDoCsi2SerialBusDescriptor
> + *
> + * PARAMETERS:  Info                - Parse Op and resource template offset
> + *
> + * RETURN:      Completed resource node
> + *
> + * DESCRIPTION: Construct a long "Csi2SerialBus" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoCsi2SerialBusDescriptor (
> +    ASL_RESOURCE_INFO       *Info)
> +{
> +    AML_RESOURCE            *Descriptor;
> +    ACPI_PARSE_OBJECT       *InitializerOp;
> +    ASL_RESOURCE_NODE       *Rnode;
> +    char                    *ResourceSource = NULL;
> +    UINT8                   *VendorData = NULL;
> +    UINT16                  ResSourceLength;
> +    UINT16                  VendorLength;
> +    UINT16                  DescriptorSize;
> +    UINT32                  CurrentByteOffset;
> +    UINT32                  i;
> +
> +
> +    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
> +    CurrentByteOffset = Info->CurrentByteOffset;
> +
> +    /*
> +     * Calculate lengths for fields that have variable length:
> +     * 1) Resource Source string
> +     * 2) Vendor Data buffer
> +     */
> +    ResSourceLength = RsGetStringDataLength (InitializerOp);
> +    VendorLength = RsGetBufferDataLength (InitializerOp);
> +
> +    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_CSI2_SERIALBUS) +
> +        ResSourceLength + VendorLength;
> +
> +    /* Allocate the local resource node and initialize */
> +
> +    Rnode = RsAllocateResourceNode (DescriptorSize +
> +        sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> +    Descriptor = Rnode->Buffer;
> +    Descriptor->Csi2SerialBus.ResourceLength = DescriptorSize;
> +    Descriptor->Csi2SerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS;
> +    Descriptor->Csi2SerialBus.RevisionId = AML_RESOURCE_CSI2_REVISION;
> +    Descriptor->Csi2SerialBus.TypeRevisionId = AML_RESOURCE_CSI2_TYPE_REVISION;
> +    Descriptor->Csi2SerialBus.Type = AML_RESOURCE_CSI2_SERIALBUSTYPE;
> +    Descriptor->Csi2SerialBus.TypeDataLength = AML_RESOURCE_CSI2_MIN_DATA_LEN + VendorLength;
> +
> +    /* Build pointers to optional areas */
> +
> +    VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_CSI2_SERIALBUS));
> +    ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength);
> +
> +    /* Process all child initialization nodes */
> +
> +    for (i = 0; InitializerOp; i++)
> +    {
> +        switch (i)
> +        {
> +        case 0: /* Slave Mode [Flag] (_SLV) */
> +
> +            RsSetFlagBits (&Descriptor->Csi2SerialBus.Flags, InitializerOp, 0, 0);
> +            RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.Flags), 0);
> +            break;
> +
> +        case 1: /* Phy Type [Flag] (_PHY) */
> +
> +            RsSetFlagBits16 ((UINT16 *) &Descriptor->Csi2SerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
> +            RsCreateBitField (InitializerOp, ACPI_RESTAG_PHYTYPE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (Csi2SerialBus.TypeSpecificFlags), 0);
> +            break;
> +
> +        case 2: /* Local Port Instance [Integer] (_PRT) */
> +
> +            RsSetFlagBits16 ((UINT16 *) &Descriptor->Csi2SerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
> +            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_LOCALPORT,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (Csi2SerialBus.TypeSpecificFlags), 2, 6);
> +            break;
> +
> +        case 3: /* ResSource [Optional Field - STRING] */
> +
> +            if (ResSourceLength)
> +            {
> +                /* Copy string to the descriptor */
> +
> +                strcpy (ResourceSource,
> +                    InitializerOp->Asl.Value.String);
> +            }
> +            break;
> +
> +        case 4: /* Resource Index */
> +
> +            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> +            {
> +                Descriptor->Csi2SerialBus.ResSourceIndex =
> +                    (UINT8) InitializerOp->Asl.Value.Integer;
> +            }
> +            break;
> +
> +        case 5: /* Resource Usage (consumer/producer) */
> +
> +            RsSetFlagBits (&Descriptor->Csi2SerialBus.Flags, InitializerOp, 1, 1);
> +            break;
> +
> +        case 6: /* Resource Tag (Descriptor Name) */
> +
> +            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
> +            break;
> +
> +        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +
> +            RsGetVendorData (InitializerOp, VendorData,
> +                CurrentByteOffset + sizeof (AML_RESOURCE_CSI2_SERIALBUS));
> +            break;
> +
> +        default:    /* Ignore any extra nodes */
> +
> +            break;
> +        }
> +
> +        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> +    }
> +
> +    MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource);
> +    return (Rnode);
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    RsDoPinFunctionDescriptor
> diff --git a/src/acpica/source/compiler/asltokens.y b/src/acpica/source/compiler/asltokens.y
> index 788f4b8c..5e205e01 100644
> --- a/src/acpica/source/compiler/asltokens.y
> +++ b/src/acpica/source/compiler/asltokens.y
> @@ -283,6 +283,7 @@ NoEcho('
>  %token <i> PARSEOP_FUNCTION
>  %token <i> PARSEOP_GPIO_INT
>  %token <i> PARSEOP_GPIO_IO
> +%token <i> PARSEOP_CSI2_SERIALBUS
>  %token <i> PARSEOP_I2C_SERIALBUS
>  %token <i> PARSEOP_I2C_SERIALBUS_V2
>  %token <i> PARSEOP_IF
> diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
> index dcab8b39..91655420 100644
> --- a/src/acpica/source/compiler/asltransform.c
> +++ b/src/acpica/source/compiler/asltransform.c
> @@ -541,6 +541,11 @@ TrTransformSubtree (
>          AslError (ASL_WARNING, ASL_MSG_LEGACY_PROCESSOR_OP, Op, Op->Asl.ExternalName);
>          break;
>  
> +    case PARSEOP_OBJECTTYPE_DDB:
> +
> +        AslError (ASL_WARNING, ASL_MSG_LEGACY_DDB_TYPE, Op, Op->Asl.ExternalName);
> +        break;
> +
>      default:
>  
>          /* Nothing to do here for other opcodes */
> diff --git a/src/acpica/source/compiler/asltypes.y b/src/acpica/source/compiler/asltypes.y
> index b68ca665..aaa732f4 100644
> --- a/src/acpica/source/compiler/asltypes.y
> +++ b/src/acpica/source/compiler/asltypes.y
> @@ -410,6 +410,7 @@ NoEcho('
>  /* Resource Descriptors */
>  
>  %type <n> ConnectionTerm
> +%type <n> Csi2SerialBusTerm
>  %type <n> DMATerm
>  %type <n> DWordIOTerm
>  %type <n> DWordMemoryTerm
> @@ -501,6 +502,7 @@ NoEcho('
>  %type <n> OptionalShareType
>  %type <n> OptionalShareType_First
>  %type <n> OptionalSlaveMode
> +%type <n> OptionalSlaveMode_First
>  %type <n> OptionalStopBits
>  %type <n> OptionalStringData
>  %type <n> OptionalSyncLevel
> diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
> index 7bc403eb..f2d00644 100644
> --- a/src/acpica/source/compiler/dtcompiler.h
> +++ b/src/acpica/source/compiler/dtcompiler.h
> @@ -573,6 +573,10 @@ ACPI_STATUS
>  DtCompileCpep (
>      void                    **PFieldList);
>  
> +ACPI_STATUS
> +DtCompileCedt (
> +    void                    **PFieldList);
> +
>  ACPI_STATUS
>  DtCompileCsrt (
>      void                    **PFieldList);
> @@ -657,6 +661,10 @@ ACPI_STATUS
>  DtCompilePdtt (
>      void                    **PFieldList);
>  
> +ACPI_STATUS
> +DtCompilePhat (
> +    void                    **PFieldList);
> +
>  ACPI_STATUS
>  DtCompilePmtt (
>      void                    **PFieldList);
> @@ -705,6 +713,10 @@ ACPI_STATUS
>  DtCompileUefi (
>      void                    **PFieldList);
>  
> +ACPI_STATUS
> +DtCompileViot (
> +    void                    **PFieldList);
> +
>  ACPI_STATUS
>  DtCompileWdat (
>      void                    **PFieldList);
> @@ -733,6 +745,7 @@ extern const unsigned char  TemplateAsf[];
>  extern const unsigned char  TemplateBoot[];
>  extern const unsigned char  TemplateBert[];
>  extern const unsigned char  TemplateBgrt[];
> +extern const unsigned char  TemplateCedt[];
>  extern const unsigned char  TemplateCpep[];
>  extern const unsigned char  TemplateCsrt[];
>  extern const unsigned char  TemplateDbg2[];
> @@ -760,6 +773,7 @@ extern const unsigned char  TemplateMsdm[];
>  extern const unsigned char  TemplateNfit[];
>  extern const unsigned char  TemplatePcct[];
>  extern const unsigned char  TemplatePdtt[];
> +extern const unsigned char  TemplatePhat[];
>  extern const unsigned char  TemplatePmtt[];
>  extern const unsigned char  TemplatePptt[];
>  extern const unsigned char  TemplateRasf[];
> @@ -777,6 +791,7 @@ extern const unsigned char  TemplateStao[];
>  extern const unsigned char  TemplateTcpa[];
>  extern const unsigned char  TemplateTpm2[];
>  extern const unsigned char  TemplateUefi[];
> +extern const unsigned char  TemplateViot[];
>  extern const unsigned char  TemplateWaet[];
>  extern const unsigned char  TemplateWdat[];
>  extern const unsigned char  TemplateWddt[];
> diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c
> index 286ecaa7..458a7174 100644
> --- a/src/acpica/source/compiler/dttable1.c
> +++ b/src/acpica/source/compiler/dttable1.c
> @@ -342,6 +342,80 @@ DtCompileAsf (
>  }
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    DtCompileCedt
> + *
> + * PARAMETERS:  List                - Current field list pointer
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Compile CEDT.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +DtCompileCedt (
> +    void                    **List)
> +{
> +    ACPI_STATUS             Status;
> +    DT_SUBTABLE             *Subtable;
> +    DT_SUBTABLE             *ParentTable;
> +    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> +    ACPI_CEDT_HEADER        *CedtHeader;
> +    DT_FIELD                *SubtableStart;
> +
> +
> +    /* Walk the parse tree */
> +
> +    while (*PFieldList)
> +    {
> +        SubtableStart = *PFieldList;
> +
> +        /* CEDT Header */
> +
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedtHdr,
> +            &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPushSubtable (Subtable);
> +
> +        CedtHeader = ACPI_CAST_PTR (ACPI_CEDT_HEADER, Subtable->Buffer);
> +
> +        switch (CedtHeader->Type)
> +        {
> +        case ACPI_CEDT_TYPE_CHBS:
> +
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CEDT");
> +            return (AE_ERROR);
> +        }
> +
> +        /* CEDT Subtable */
> +
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt0, &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPopSubtable ();
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
>  /******************************************************************************
>   *
>   * FUNCTION:    DtCompileCpep
> @@ -1582,10 +1656,12 @@ DtCompileIort (
>      DT_SUBTABLE             *ParentTable;
>      DT_FIELD                **PFieldList = (DT_FIELD **) List;
>      DT_FIELD                *SubtableStart;
> +    ACPI_TABLE_HEADER       *Table;
>      ACPI_TABLE_IORT         *Iort;
>      ACPI_IORT_NODE          *IortNode;
>      ACPI_IORT_ITS_GROUP     *IortItsGroup;
>      ACPI_IORT_SMMU          *IortSmmu;
> +    ACPI_IORT_RMR           *IortRmr;
>      UINT32                  NodeNumber;
>      UINT32                  NodeLength;
>      UINT32                  IdMappingNumber;
> @@ -1593,6 +1669,8 @@ DtCompileIort (
>      UINT32                  ContextIrptNumber;
>      UINT32                  PmuIrptNumber;
>      UINT32                  PaddingLength;
> +    UINT8                   Revision;
> +    UINT32                  RmrCount;
>  
>  
>      ParentTable = DtPeekSubtable ();
> @@ -1605,6 +1683,17 @@ DtCompileIort (
>      }
>      DtInsertSubtable (ParentTable, Subtable);
>  
> +    Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
> +    Revision = Table->Revision;
> +
> +    /* Both IORT Rev E and E.a have known issues and are not supported */
> +
> +    if (Revision == 1 || Revision == 2)
> +    {
> +        DtError (ASL_ERROR, ASL_MSG_UNSUPPORTED, NULL, "IORT table revision");
> +        return (AE_ERROR);
> +    }
> +
>      /*
>       * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
>       * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
> @@ -1645,8 +1734,17 @@ DtCompileIort (
>      while (*PFieldList)
>      {
>          SubtableStart = *PFieldList;
> -        Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
> -            &Subtable);
> +        if (Revision == 0)
> +        {
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
> +                &Subtable);
> +        }
> +        else if (Revision >= 3)
> +        {
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr3,
> +                &Subtable);
> +        }
> +
>          if (ACPI_FAILURE (Status))
>          {
>              return (Status);
> @@ -1864,7 +1962,46 @@ DtCompileIort (
>              NodeLength += Subtable->Length;
>              break;
>  
> -        default:
> +        case ACPI_IORT_NODE_RMR:
> +
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6,
> +                &Subtable);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
> +
> +            DtInsertSubtable (ParentTable, Subtable);
> +            IortRmr = ACPI_CAST_PTR (ACPI_IORT_RMR, Subtable->Buffer);
> +            NodeLength += Subtable->Length;
> +
> +            /* Compile RMR Descriptors */
> +
> +            RmrCount = 0;
> +            IortRmr->RmrOffset = NodeLength;
> +            while (*PFieldList)
> +            {
> +                Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +
> +                if (!Subtable)
> +                {
> +                    break;
> +                }
> +
> +                DtInsertSubtable (ParentTable, Subtable);
> +                NodeLength += sizeof (ACPI_IORT_RMR_DESC);
> +                RmrCount++;
> +            }
> +
> +            IortRmr->RmrCount = RmrCount;
> +            break;
> +
> +	default:
>  
>              DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
>              return (AE_ERROR);
> diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c
> index 732635bf..f6efcf3d 100644
> --- a/src/acpica/source/compiler/dttable2.c
> +++ b/src/acpica/source/compiler/dttable2.c
> @@ -366,6 +366,11 @@ DtCompileMadt (
>              InfoTable = AcpiDmTableInfoMadt15;
>              break;
>  
> +        case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
> +
> +            InfoTable = AcpiDmTableInfoMadt16;
> +            break;
> +
>          default:
>  
>              DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
> @@ -858,6 +863,11 @@ DtCompilePcct (
>              InfoTable = AcpiDmTableInfoPcct4;
>              break;
>  
> +        case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
> +
> +            InfoTable = AcpiDmTableInfoPcct5;
> +            break;
> +
>          default:
>  
>              DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
> @@ -939,6 +949,142 @@ DtCompilePdtt (
>  }
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    DtCompilePhat
> + *
> + * PARAMETERS:  List                - Current field list pointer
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Compile Phat.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +DtCompilePhat (
> +    void                    **List)
> +{
> +    ACPI_STATUS             Status = AE_OK;
> +    DT_SUBTABLE             *Subtable;
> +    DT_SUBTABLE             *ParentTable;
> +    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> +    ACPI_PHAT_HEADER        *PhatHeader;
> +    ACPI_DMTABLE_INFO       *Info;
> +    ACPI_PHAT_VERSION_DATA  *VersionData;
> +    UINT32                  RecordCount;
> +
> +
> +    /* The table consist of subtables */
> +
> +    while (*PFieldList)
> +    {
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPushSubtable (Subtable);
> +
> +        PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
> +
> +        switch (PhatHeader->Type)
> +        {
> +        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
> +
> +            Info = AcpiDmTableInfoPhat0;
> +            PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
> +            break;
> +
> +        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
> +
> +            Info = AcpiDmTableInfoPhat1;
> +            PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
> +            return (AE_ERROR);
> +
> +            break;
> +        }
> +
> +        Status = DtCompileTable (PFieldList, Info, &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +
> +        switch (PhatHeader->Type)
> +        {
> +        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
> +
> +            VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
> +                (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
> +            RecordCount = VersionData->ElementCount;
> +
> +            while (RecordCount)
> +            {
> +                Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                ParentTable = DtPeekSubtable ();
> +                DtInsertSubtable (ParentTable, Subtable);
> +
> +                RecordCount--;
> +                PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
> +            }
> +            break;
> +
> +        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
> +
> +            /* Compile device path */
> +
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
> +            ParentTable = DtPeekSubtable ();
> +            DtInsertSubtable (ParentTable, Subtable);
> +
> +            PhatHeader->Length += (UINT16) Subtable->Length;
> +
> +            /* Compile vendor specific data */
> +
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
> +            ParentTable = DtPeekSubtable ();
> +            DtInsertSubtable (ParentTable, Subtable);
> +
> +            PhatHeader->Length += (UINT16) Subtable->Length;
> +
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
> +            return (AE_ERROR);
> +        }
> +    }
> +
> +    return (Status);
> +}
> +
> +
>  /******************************************************************************
>   *
>   * FUNCTION:    DtCompilePmtt
> @@ -960,10 +1106,7 @@ DtCompilePmtt (
>      DT_SUBTABLE             *ParentTable;
>      DT_FIELD                **PFieldList = (DT_FIELD **) List;
>      DT_FIELD                *SubtableStart;
> -    ACPI_PMTT_HEADER        *PmttHeader;
> -    ACPI_PMTT_CONTROLLER    *PmttController;
> -    UINT16                  DomainCount;
> -    UINT8                   PrevType = ACPI_PMTT_TYPE_SOCKET;
> +    UINT16                  Type;
>  
>  
>      /* Main table */
> @@ -978,41 +1121,21 @@ DtCompilePmtt (
>      DtInsertSubtable (ParentTable, Subtable);
>      DtPushSubtable (Subtable);
>  
> +    /* Subtables */
> +
>      while (*PFieldList)
>      {
>          SubtableStart = *PFieldList;
> -        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
> -            &Subtable);
> -        if (ACPI_FAILURE (Status))
> -        {
> -            return (Status);
> -        }
> -
> -        PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
> -        while (PrevType >= PmttHeader->Type)
> -        {
> -            DtPopSubtable ();
> -
> -            if (PrevType == ACPI_PMTT_TYPE_SOCKET)
> -            {
> -                break;
> -            }
> -
> -            PrevType--;
> -        }
> +        DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
>  
> -        PrevType = PmttHeader->Type;
> -
> -        ParentTable = DtPeekSubtable ();
> -        DtInsertSubtable (ParentTable, Subtable);
> -        DtPushSubtable (Subtable);
> -
> -        switch (PmttHeader->Type)
> +        switch (Type)
>          {
>          case ACPI_PMTT_TYPE_SOCKET:
>  
>              /* Subtable: Socket Structure */
>  
> +            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
> +
>              Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
>                  &Subtable);
>              if (ACPI_FAILURE (Status))
> @@ -1020,14 +1143,14 @@ DtCompilePmtt (
>                  return (Status);
>              }
>  
> -            ParentTable = DtPeekSubtable ();
> -            DtInsertSubtable (ParentTable, Subtable);
>              break;
>  
>          case ACPI_PMTT_TYPE_CONTROLLER:
>  
>              /* Subtable: Memory Controller Structure */
>  
> +            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
> +
>              Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
>                  &Subtable);
>              if (ACPI_FAILURE (Status))
> @@ -1035,40 +1158,34 @@ DtCompilePmtt (
>                  return (Status);
>              }
>  
> -            ParentTable = DtPeekSubtable ();
> -            DtInsertSubtable (ParentTable, Subtable);
> +            break;
>  
> -            PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
> -                (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
> -            DomainCount = PmttController->DomainCount;
> +        case ACPI_PMTT_TYPE_DIMM:
>  
> -            while (DomainCount)
> -            {
> -                Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
> -                    &Subtable);
> -                if (ACPI_FAILURE (Status))
> -                {
> -                    return (Status);
> -                }
> +            /* Subtable: Physical Component (DIMM) Structure */
>  
> -                DtInsertSubtable (ParentTable, Subtable);
> -                DomainCount--;
> +            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
> +                &Subtable);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
>              }
> +
>              break;
>  
> -        case ACPI_PMTT_TYPE_DIMM:
> +        case ACPI_PMTT_TYPE_VENDOR:
>  
> -            /* Subtable: Physical Component Structure */
> +            /* Subtable: Vendor-specific Structure */
>  
> -            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
> +            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
>                  &Subtable);
>              if (ACPI_FAILURE (Status))
>              {
>                  return (Status);
>              }
>  
> -            ParentTable = DtPeekSubtable ();
> -            DtInsertSubtable (ParentTable, Subtable);
>              break;
>  
>          default:
> @@ -1076,6 +1193,8 @@ DtCompilePmtt (
>              DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
>              return (AE_ERROR);
>          }
> +
> +        DtInsertSubtable (ParentTable, Subtable);
>      }
>  
>      return (Status);
> @@ -1106,6 +1225,7 @@ DtCompilePptt (
>      ACPI_DMTABLE_INFO       *InfoTable;
>      DT_FIELD                **PFieldList = (DT_FIELD **) List;
>      DT_FIELD                *SubtableStart;
> +    ACPI_TABLE_HEADER       *PpttAcpiHeader;
>  
>  
>      ParentTable = DtPeekSubtable ();
> @@ -1191,6 +1311,20 @@ DtCompilePptt (
>              }
>              break;
>  
> +        case ACPI_PPTT_TYPE_CACHE:
> +
> +            PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
> +                AslGbl_RootTable->Buffer);
> +            if (PpttAcpiHeader->Revision < 3)
> +            {
> +                break;
> +            }
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
> +                &Subtable);
> +            DtInsertSubtable (ParentTable, Subtable);
> +            PpttHeader->Length += (UINT8)(Subtable->Length);
> +            break;
> +
>          default:
>  
>              break;
> @@ -1336,16 +1470,20 @@ ACPI_STATUS
>  DtCompileSdev (
>      void                    **List)
>  {
> -    ACPI_STATUS             Status;
> -    ACPI_SDEV_HEADER        *SdevHeader;
> -    DT_SUBTABLE             *Subtable;
> -    DT_SUBTABLE             *ParentTable;
> -    ACPI_DMTABLE_INFO       *InfoTable;
> -    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> -    DT_FIELD                *SubtableStart;
> -    ACPI_SDEV_PCIE          *Pcie = NULL;
> -    ACPI_SDEV_NAMESPACE     *Namesp = NULL;
> -    UINT32                  EntryCount;
> +    ACPI_STATUS                 Status;
> +    ACPI_SDEV_HEADER            *SdevHeader;
> +    ACPI_SDEV_HEADER            *SecureComponentHeader;
> +    DT_SUBTABLE                 *Subtable;
> +    DT_SUBTABLE                 *ParentTable;
> +    ACPI_DMTABLE_INFO           *InfoTable;
> +    ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
> +    DT_FIELD                    **PFieldList = (DT_FIELD **) List;
> +    DT_FIELD                    *SubtableStart;
> +    ACPI_SDEV_PCIE              *Pcie = NULL;
> +    ACPI_SDEV_NAMESPACE         *Namesp = NULL;
> +    UINT32                      EntryCount;
> +    ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
> +    UINT16                      ComponentLength = 0;
>  
>  
>      /* Subtables */
> @@ -1375,6 +1513,8 @@ DtCompileSdev (
>  
>              InfoTable = AcpiDmTableInfoSdev0;
>              Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
> +            SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
> +                ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
>              break;
>  
>          case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
> @@ -1406,6 +1546,86 @@ DtCompileSdev (
>          {
>          case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
>  
> +            /*
> +             * Device Id Offset will be be calculated differently depending on
> +             * the presence of secure access components.
> +             */
> +            Namesp->DeviceIdOffset = 0;
> +            ComponentLength = 0;
> +
> +            /* If the secure access component exists, get the structures */
> +
> +            if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
> +            {
> +                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                ParentTable = DtPeekSubtable ();
> +                DtInsertSubtable (ParentTable, Subtable);
> +
> +                Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
> +
> +                /* Compile a secure access component header */
> +
> +                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                ParentTable = DtPeekSubtable ();
> +                DtInsertSubtable (ParentTable, Subtable);
> +
> +                /* Compile the secure access component */
> +
> +                SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
> +                switch (SecureComponentHeader->Type)
> +                {
> +                case ACPI_SDEV_TYPE_ID_COMPONENT:
> +
> +                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
> +                    Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
> +                    ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
> +                    break;
> +
> +                case ACPI_SDEV_TYPE_MEM_COMPONENT:
> +
> +                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
> +                    Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
> +                    ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
> +                    break;
> +
> +                default:
> +
> +                    /* Any other secure component types are undefined */
> +
> +                    return (AE_ERROR);
> +                }
> +
> +                Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                ParentTable = DtPeekSubtable ();
> +                DtInsertSubtable (ParentTable, Subtable);
> +
> +                SecureComponent->SecureComponentOffset =
> +                    sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
> +                SecureComponent->SecureComponentLength = ComponentLength;
> +
> +
> +                /*
> +                 * Add the secure component to the subtable to be added for the
> +                 * the namespace subtable's length
> +                 */
> +                ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
> +            }
> +
>              /* Append DeviceId namespace string */
>  
>              Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
> @@ -1423,7 +1643,8 @@ DtCompileSdev (
>              ParentTable = DtPeekSubtable ();
>              DtInsertSubtable (ParentTable, Subtable);
>  
> -            Namesp->DeviceIdOffset = sizeof (ACPI_SDEV_NAMESPACE);
> +            Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
> +
>              Namesp->DeviceIdLength = (UINT16) Subtable->Length;
>  
>              /* Append Vendor data */
> @@ -1453,7 +1674,7 @@ DtCompileSdev (
>                      /* Final size of entire namespace structure */
>  
>                      SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
> -                        Subtable->Length + Namesp->DeviceIdLength);
> +                        Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
>                  }
>              }
>  
> @@ -2137,6 +2358,111 @@ DtCompileUefi (
>  }
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    DtCompileViot
> + *
> + * PARAMETERS:  List                - Current field list pointer
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Compile VIOT.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +DtCompileViot (
> +    void                    **List)
> +{
> +    ACPI_STATUS             Status;
> +    DT_SUBTABLE             *Subtable;
> +    DT_SUBTABLE             *ParentTable;
> +    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> +    DT_FIELD                *SubtableStart;
> +    ACPI_TABLE_VIOT         *Viot;
> +    ACPI_VIOT_HEADER        *ViotHeader;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +    UINT16                  NodeCount;
> +
> +    ParentTable = DtPeekSubtable ();
> +
> +    Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (Status);
> +    }
> +    DtInsertSubtable (ParentTable, Subtable);
> +
> +    /*
> +     * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
> +     * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
> +     */
> +    Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
> +        sizeof (ACPI_TABLE_HEADER));
> +
> +    Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
> +
> +    NodeCount = 0;
> +    while (*PFieldList) {
> +        SubtableStart = *PFieldList;
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
> +            &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPushSubtable (Subtable);
> +
> +        ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
> +
> +        switch (ViotHeader->Type)
> +        {
> +        case ACPI_VIOT_NODE_PCI_RANGE:
> +
> +            InfoTable = AcpiDmTableInfoViot1;
> +            break;
> +
> +        case ACPI_VIOT_NODE_MMIO:
> +
> +            InfoTable = AcpiDmTableInfoViot2;
> +            break;
> +
> +        case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
> +
> +            InfoTable = AcpiDmTableInfoViot3;
> +            break;
> +
> +        case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
> +
> +            InfoTable = AcpiDmTableInfoViot4;
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
> +            return (AE_ERROR);
> +        }
> +
> +        Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPopSubtable ();
> +        NodeCount++;
> +    }
> +
> +    Viot->NodeCount = NodeCount;
> +    return (AE_OK);
> +}
> +
> +
>  /******************************************************************************
>   *
>   * FUNCTION:    DtCompileWdat
> diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
> index ddbcce8a..fbe68ec9 100644
> --- a/src/acpica/source/compiler/dttemplate.h
> +++ b/src/acpica/source/compiler/dttemplate.h
> @@ -204,6 +204,27 @@ const unsigned char TemplateBoot[] =
>      0x28,0x05,0x10,0x20,0x00,0x00,0x00,0x00   /* 00000020    "(.. ...." */
>  };
>  
> +const unsigned char TemplateCedt[] =
> +{
> +    0x43,0x45,0x44,0x54,0x84,0x00,0x00,0x00,  /* 00000000    "CEDT...." */
> +    0x01,0x8B,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" */
> +    0x05,0x01,0x21,0x20,0x00,0x00,0x20,0x00,  /* 00000020    "..! .. ." */
> +    0x33,0x33,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000028    "33......" */
> +    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xD5,  /* 00000030    ".....!C." */
> +    0x00,0x00,0x00,0x00,0x45,0x23,0x01,0x00,  /* 00000038    "....E#.." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,  /* 00000040    "...... ." */
> +    0x44,0x44,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000048    "DD......" */
> +    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xA5,  /* 00000050    ".....!C." */
> +    0x00,0x00,0x00,0x00,0x45,0x23,0xB1,0x00,  /* 00000058    "....E#.." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,  /* 00000060    "...... ." */
> +    0x55,0x55,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000068    "UU......" */
> +    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xB5,  /* 00000070    ".....!C." */
> +    0x00,0x00,0x00,0x00,0x45,0x23,0xB1,0x00,  /* 00000078    "....E#.." */
> +    0x00,0x00,0x00,0x00                       /* 00000080    "...."     */
> +};
> +
>  const unsigned char TemplateCpep[] =
>  {
>      0x43,0x50,0x45,0x50,0x34,0x00,0x00,0x00,  /* 00000000    "CPEP4..." */
> @@ -697,39 +718,39 @@ const unsigned char TemplateHpet[] =
>  
>  const unsigned char TemplateIort[] =
>  {
> -    0x49,0x4F,0x52,0x54,0xF8,0x01,0x00,0x00,  /* 00000000    "IORT...." */
> -    0x00,0x72,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".rINTEL " */
> +    0x49,0x4F,0x52,0x54,0x3C,0x02,0x00,0x00,  /* 00000000    "IORT<..." */
> +    0x03,0xF1,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" */
> -    0x13,0x03,0x18,0x20,0x06,0x00,0x00,0x00,  /* 00000020    "... ...." */
> +    0x05,0x01,0x21,0x20,0x07,0x00,0x00,0x00,  /* 00000020    "..! ...." */
>      0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "4......." */
> -    0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,  /* 00000030    "........" */
> +    0x49,0x4F,0x52,0x54,0x00,0x18,0x00,0x01,  /* 00000030    "IORT...." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000040    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,  /* 00000048    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x04,  /* 00000048    "........" */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000050    "........" */
>      0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "l......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
>      0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,  /* 00000068    ".\_SB.PC" */
>      0x49,0x30,0x2E,0x44,0x45,0x56,0x30,0x00,  /* 00000070    "I0.DEV0." */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A8    "........" */
> +    0x49,0x4F,0x52,0x54,0x3C,0x02,0x00,0x00,  /* 00000078    "IORT<..." */
> +    0x03,0xF2,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000080    "..INTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000088    "Template" */
> +    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000090    "....INTL" */
> +    0x05,0x01,0x21,0x20,0x07,0x00,0x00,0x00,  /* 00000098    "..! ...." */
> +    0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "4......." */
> +    0x49,0x4F,0x52,0x54,0x00,0x18,0x00,0x01,  /* 000000A8    "IORT...." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000C0    "........" */
> -    0x00,0x00,0x00,0x00,0x02,0x38,0x00,0x00,  /* 000000C8    ".....8.." */
> +    0x00,0x00,0x00,0x00,0x02,0x38,0x00,0x03,  /* 000000C8    ".....8.." */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000000D0    "........" */
>      0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000D8    "$......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F8    "........" */
> -    0x00,0x00,0x00,0x00,0x03,0x60,0x00,0x01,  /* 00000100    ".....`.." */
> +    0x00,0x00,0x00,0x00,0x03,0x60,0x00,0x03,  /* 00000100    ".....`.." */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000108    "........" */
>      0x4C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "L......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
> @@ -741,7 +762,7 @@ const unsigned char TemplateIort[] =
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
> -    0x00,0x00,0x00,0x00,0x04,0x58,0x00,0x01,  /* 00000160    ".....X.." */
> +    0x00,0x00,0x00,0x00,0x04,0x58,0x00,0x04,  /* 00000160    ".....X.." */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000168    "........" */
>      0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000170    "D......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000178    "........" */
> @@ -752,14 +773,23 @@ const unsigned char TemplateIort[] =
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001A0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001A8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B0    "........" */
> -    0x00,0x00,0x00,0x00,0x05,0x3C,0x00,0x01,  /* 000001B8    ".....<.." */
> +    0x00,0x00,0x00,0x00,0x05,0x3C,0x00,0x02,  /* 000001B8    ".....<.." */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000001C0    "........" */
>      0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C8    "(......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001D0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001D8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001E0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001E8    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00   /* 000001F0    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000001F0    "........" */
> +    0x06,0x44,0x00,0x01,0x00,0x00,0x00,0x00,  /* 000001F8    ".D......" */
> +    0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,  /* 00000200    "....0..." */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000208    "........" */
> +    0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000210    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000218    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000220    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000228    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000230    "........" */
> +    0x01,0x00,0x00,0x00                       /* 00000238    "...."     */
>  };
>  
>  const unsigned char TemplateIvrs[] =
> @@ -817,11 +847,11 @@ const unsigned char TemplateLpit[] =
>  
>  const unsigned char TemplateMadt[] =
>  {
> -    0x41,0x50,0x49,0x43,0x5A,0x01,0x00,0x00,  /* 00000000    "APICZ..." */
> -    0x05,0xEF,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x41,0x50,0x49,0x43,0x6A,0x01,0x00,0x00,  /* 00000000    "APICj..." */
> +    0x05,0x9D,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
>      0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
>      0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x08,0x01,0x19,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "... ...." */
> +    0x13,0x11,0x20,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "..  ...." */
>      0x01,0x00,0x00,0x00,0x00,0x08,0x00,0x00,  /* 00000028    "........" */
>      0x01,0x00,0x00,0x00,0x01,0x0C,0x01,0x00,  /* 00000030    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
> @@ -860,7 +890,9 @@ const unsigned char TemplateMadt[] =
>      0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x14,  /* 00000140    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
> -    0x00,0x00                                 /* 00000158    ".."       */
> +    0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000160    "........" */
> +    0x00,0x00                                 /* 00000168    ".."       */
>  };
>  
>  const unsigned char TemplateMcfg[] =
> @@ -956,91 +988,92 @@ const unsigned char TemplateMsct[] =
>  
>  const unsigned char TemplateNfit[] =
>  {
> -    0x4E,0x46,0x49,0x54,0x80,0x01,0x00,0x00,  /* 00000000    "NFIT...." */
> -    0x01,0x07,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x4E,0x46,0x49,0x54,0x88,0x01,0x00,0x00,  /* 00000000    "NFIT...." */
> +    0x01,0x81,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
>      0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
>      0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x29,0x09,0x17,0x20,0x00,0x00,0x00,0x00,  /* 00000020    ").. ...." */
> -    0x00,0x00,0x38,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "..8....." */
> +    0x13,0x11,0x20,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "..  ...." */
> +    0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "..@....." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
>      0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47,  /* 00000038    "0....].G" */
>      0xA6,0xB0,0x0A,0x2D,0xB9,0x40,0x82,0x49,  /* 00000040    "...-.@.I" */
>      0x00,0x00,0x00,0x7C,0x03,0x00,0x00,0x00,  /* 00000048    "...|...." */
>      0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
>      0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
> -    0x01,0x00,0x30,0x00,0x01,0x00,0x00,0x00,  /* 00000060    "..0....." */
> -    0x04,0x00,0x00,0x00,0x01,0x00,0x01,0x00,  /* 00000068    "........" */
> -    0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,  /* 00000070    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
> -    0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> -    0x01,0x00,0x03,0x00,0x2A,0x00,0x00,0x00,  /* 00000088    "....*..." */
> -    0x02,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000090    ".. ....." */
> -    0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,  /* 00000098    "........" */
> -    0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,  /* 000000A0    "........" */
> -    0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,  /* 000000A8    "........" */
> -    0x03,0x00,0x28,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "..(....." */
> -    0xB4,0x13,0x5D,0x40,0x91,0x0B,0x29,0x93,  /* 000000B8    "..]@..)." */
> -    0x67,0xE8,0x23,0x4C,0x00,0x00,0x00,0x88,  /* 000000C0    "g.#L...." */
> -    0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,  /* 000000C8    ".."3DUfw" */
> -    0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,  /* 000000D0    "........" */
> -    0x04,0x00,0x50,0x00,0x01,0x00,0x86,0x80,  /* 000000D8    "..P....." */
> -    0x17,0x20,0x01,0x00,0x86,0x80,0x17,0x20,  /* 000000E0    ". ..... " */
> -    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E8    "........" */
> -    0x89,0x00,0x54,0x76,0x01,0x03,0x00,0x01,  /* 000000F0    "..Tv...." */
> -    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F8    ". ......" */
> -    0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000100    "........" */
> -    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000108    "........" */
> -    0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
> -    0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000120    "........" */
> -    0x05,0x00,0x28,0x00,0x01,0x00,0x00,0x01,  /* 00000128    "..(....." */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000130    "........" */
> -    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000138    ". ......" */
> -    0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,  /* 00000140    "........" */
> -    0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
> -    0x06,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000150    ".. ....." */
> -    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
> -    0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,  /* 00000160    "........" */
> -    0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,  /* 00000168    "........" */
> -    0x07,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000170    "........" */
> -    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000178    "........" */
> +    0x00,0xEF,0xCD,0xAB,0x78,0x56,0x34,0x12,  /* 00000060    "....xV4." */
> +    0x01,0x00,0x30,0x00,0x01,0x00,0x00,0x00,  /* 00000068    "..0....." */
> +    0x04,0x00,0x00,0x00,0x01,0x00,0x01,0x00,  /* 00000070    "........" */
> +    0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> +    0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
> +    0x01,0x00,0x03,0x00,0x2A,0x00,0x00,0x00,  /* 00000090    "....*..." */
> +    0x02,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000098    ".. ....." */
> +    0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,  /* 000000A0    "........" */
> +    0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,  /* 000000A8    "........" */
> +    0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,  /* 000000B0    "........" */
> +    0x03,0x00,0x28,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "..(....." */
> +    0xB4,0x13,0x5D,0x40,0x91,0x0B,0x29,0x93,  /* 000000C0    "..]@..)." */
> +    0x67,0xE8,0x23,0x4C,0x00,0x00,0x00,0x88,  /* 000000C8    "g.#L...." */
> +    0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,  /* 000000D0    ".."3DUfw" */
> +    0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,  /* 000000D8    "........" */
> +    0x04,0x00,0x50,0x00,0x01,0x00,0x86,0x80,  /* 000000E0    "..P....." */
> +    0x17,0x20,0x01,0x00,0x86,0x80,0x17,0x20,  /* 000000E8    ". ..... " */
> +    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F0    "........" */
> +    0x89,0x00,0x54,0x76,0x01,0x03,0x00,0x01,  /* 000000F8    "..Tv...." */
> +    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000100    ". ......" */
> +    0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000108    "........" */
> +    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
> +    0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
> +    0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000120    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000128    "........" */
> +    0x05,0x00,0x28,0x00,0x01,0x00,0x00,0x01,  /* 00000130    "..(....." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000138    "........" */
> +    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000140    ". ......" */
> +    0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,  /* 00000148    "........" */
> +    0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
> +    0x06,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000158    ".. ....." */
> +    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000160    "........" */
> +    0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,  /* 00000168    "........" */
> +    0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,  /* 00000170    "........" */
> +    0x07,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000178    "........" */
> +    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000180    "........" */
>  };
>  
>  const unsigned char TemplatePcct[] =
>  {
> -    0x50,0x43,0x43,0x54,0x4e,0x02,0x00,0x00,  /* 00000000    "PCCTN..." */
> -    0x01,0x47,0x49,0x4e,0x54,0x45,0x4c,0x20,  /* 00000008    ".GINTEL " */
> -    0x54,0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,  /* 00000010    "Template" */
> -    0x01,0x00,0x00,0x00,0x49,0x4e,0x54,0x4c,  /* 00000018    "....INTL" */
> -    0x03,0x03,0x17,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
> +    0x50,0x43,0x43,0x54,0xAE,0x02,0x00,0x00,  /* 00000000    "PCCT...." */
> +    0x01,0xE6,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
> +    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x25,0x09,0x20,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "%.  ...." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
> -    0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
> +    0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
>      0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,  /* 00000038    "........" */
>      0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,  /* 00000040    """""""""" */
>      0x01,0x32,0x00,0x03,0x33,0x33,0x33,0x33,  /* 00000048    ".2..3333" */
>      0x33,0x33,0x33,0x33,0x44,0x44,0x44,0x44,  /* 00000050    "3333DDDD" */
>      0x44,0x44,0x44,0x44,0x55,0x55,0x55,0x55,  /* 00000058    "DDDDUUUU" */
>      0x55,0x55,0x55,0x55,0x66,0x66,0x66,0x66,  /* 00000060    "UUUUffff" */
> -    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3e,  /* 00000068    "wwww...>" */
> +    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3E,  /* 00000068    "wwww...>" */
>      0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000070    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 00000080    ".......2" */
>      0x00,0x03,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000088    "..DDDDDD" */
>      0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000090    "DDDDDDDD" */
>      0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 00000098    "DDUUUUUU" */
> -    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000a0    "UUffffww" */
> -    0x77,0x77,0x88,0x88,0x02,0x5a,0x01,0x00,  /* 000000a8    "ww...Z.." */
> -    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000b0    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000b8    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000c0    ".....2.." */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000c8    "DDDDDDDD" */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000d0    "DDDDDDDD" */
> -    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000d8    "UUUUUUUU" */
> -    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000e0    "ffffwwww" */
> -    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000e8    "...2..33" */
> -    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000f0    "333333DD" */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000f8    "DDDDDDUU" */
> -    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0xa4,  /* 00000100    "UUUUUU.." */
> +    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000A0    "UUffffww" */
> +    0x77,0x77,0x88,0x88,0x02,0x5A,0x01,0x00,  /* 000000A8    "ww...Z.." */
> +    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000C0    ".....2.." */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000C8    "DDDDDDDD" */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000D0    "DDDDDDDD" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000D8    "UUUUUUUU" */
> +    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000E0    "ffffwwww" */
> +    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000E8    "...2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000F0    "333333DD" */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000F8    "DDDDDDUU" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0xA4,  /* 00000100    "UUUUUU.." */
>      0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000108    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
>      0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000118    "...2..33" */
> @@ -1060,18 +1093,18 @@ const unsigned char TemplatePcct[] =
>      0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 00000188    "333333DD" */
>      0x44,0x44,0x44,0x44,0x44,0x44,0x01,0x32,  /* 00000190    "DDDDDD.2" */
>      0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000198    "..333333" */
> -    0x33,0x33,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001a0    "33UUUUUU" */
> -    0x55,0x55,0x04,0xa4,0x01,0x00,0x00,0x00,  /* 000001a8    "UU......" */
> -    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001b0    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 000001b8    ".......2" */
> -    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001c0    "..333333" */
> -    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000001c8    "33DDDDDD" */
> -    0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001d0    "DDUUUUUU" */
> -    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000001d8    "UUffffww" */
> -    0x77,0x77,0x88,0x88,0x88,0x88,0x01,0x32,  /* 000001e0    "ww.....2" */
> -    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001e8    "..333333" */
> -    0x33,0x33,0x99,0x99,0x99,0x99,0x99,0x99,  /* 000001f0    "33......" */
> -    0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001f8    "........" */
> +    0x33,0x33,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001A0    "33UUUUUU" */
> +    0x55,0x55,0x04,0xA4,0x01,0x00,0x00,0x00,  /* 000001A8    "UU......" */
> +    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B0    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 000001B8    ".......2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001C0    "..333333" */
> +    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000001C8    "33DDDDDD" */
> +    0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001D0    "DDUUUUUU" */
> +    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000001D8    "UUffffww" */
> +    0x77,0x77,0x88,0x88,0x88,0x88,0x01,0x32,  /* 000001E0    "ww.....2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001E8    "..333333" */
> +    0x33,0x33,0x99,0x99,0x99,0x99,0x99,0x99,  /* 000001F0    "33......" */
> +    0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001F8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000200    "........" */
>      0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000208    "...2..33" */
>      0x33,0x33,0x33,0x33,0x33,0x33,0x22,0x22,  /* 00000210    "333333""" */
> @@ -1081,7 +1114,19 @@ const unsigned char TemplatePcct[] =
>      0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000230    "33DDDDDD" */
>      0x44,0x44,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000238    "DD.2..33" */
>      0x33,0x33,0x33,0x33,0x33,0x33,0x55,0x55,  /* 00000240    "333333UU" */
> -    0x55,0x55,0x55,0x55,0x55,0x55             /* 00000248    "UUUUUU|   */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x05,0x60,  /* 00000248    "UUUUUU.`" */
> +    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000250    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000258    "........" */
> +    0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000260    "...2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000268    "33333333" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000270    "33333333" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x01,0x32,  /* 00000278    "333333.2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000280    "..333333" */
> +    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000288    "33DDDDDD" */
> +    0x44,0x44,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000290    "DD.2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x55,0x55,  /* 00000298    "333333UU" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0x00,  /* 000002A0    "UUUUUU.." */
> +    0x00,0x00,0x05,0x00,0x00,0x00             /* 000002A8    "......"   */
>  };
>  
>  const unsigned char TemplatePdtt[] =
> @@ -1095,31 +1140,50 @@ const unsigned char TemplatePdtt[] =
>      0xCC,0x01,0xDD,0x00                       /* 00000030    "...."     */
>  };
>  
> +const unsigned char TemplatePhat [] =
> +{
> +    0x50,0x48,0x41,0x54,0x6F,0x00,0x00,0x00,  /* 00000000    "PHATo..." */
> +    0x01,0xC7,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
> +    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x05,0x01,0x21,0x20,0x00,0x00,0x28,0x00,  /* 00000020    "..! ..(." */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "........" */
> +    0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47,  /* 00000030    "0....].G" */
> +    0xA6,0xB0,0x0A,0x2D,0xB9,0x40,0x82,0x49,  /* 00000038    "...-.@.I" */
> +    0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,  /* 00000040    "........" */
> +    0x0C,0x0B,0x0A,0x09,0x01,0x00,0x23,0x00,  /* 00000048    "......#." */
> +    0x00,0x00,0x00,0x00,0x30,0x05,0xAF,0x91,  /* 00000050    "....0..." */
> +    0x86,0x5D,0x0E,0x47,0xA6,0xB0,0x0A,0x2D,  /* 00000058    ".].G...-" */
> +    0xB9,0x40,0x82,0x49,0x00,0x00,0x00,0x00,  /* 00000060    ".@.I...." */
> +    0x61,0x73,0x64,0x66,0x00,0xFF,0x11        /* 00000068    "asdf..."  */
> +};
> +
>  const unsigned char TemplatePmtt[] =
>  {
> -    0x50,0x4D,0x54,0x54,0xB4,0x00,0x00,0x00,  /* 00000000    "PMTT...." */
> -    0x01,0x3A,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".:INTEL " */
> +    0x50,0x4D,0x54,0x54,0xBB,0x00,0x00,0x00,  /* 00000000    "PMTT...." */
> +    0x02,0x2E,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" */
> -    0x26,0x08,0x11,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "&.. ...." */
> -    0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x00,0x54,0x00,  /* 00000030    "......T." */
> -    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000048    "........" */
> -    0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
> -    0x02,0x00,0x14,0x00,0x02,0x00,0x00,0x00,  /* 00000060    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
> -    0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,  /* 00000070    "........" */
> -    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> -    0x01,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000088    ".. ....." */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "........" */
> -    0x00,0x00,0x0C,0x00,0x01,0x00,0x00,0x00,  /* 000000A8    "........" */
> -    0x00,0x00,0x00,0x00                       /* 000000B0    "...."     */
> +    0x05,0x01,0x21,0x20,0x08,0x00,0x00,0x00,  /* 00000020    "..! ...." */
> +    0x00,0x00,0x10,0x00,0x0D,0x00,0x00,0x00,  /* 00000028    "........" */
> +    0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
> +    0x01,0x00,0x10,0x00,0x04,0x00,0x00,0x00,  /* 00000038    "........" */
> +    0x02,0x00,0x00,0x00,0x44,0x44,0x00,0x00,  /* 00000040    "....DD.." */
> +    0x02,0x00,0x10,0x00,0x04,0x00,0x00,0x00,  /* 00000048    "........" */
> +    0x01,0x00,0x00,0x00,0x78,0x56,0x34,0x12,  /* 00000050    "....xV4." */
> +    0xFF,0x00,0x23,0x00,0x0D,0x00,0x00,0x00,  /* 00000058    "..#....." */
> +    0x03,0x00,0x00,0x00,0x03,0x02,0x01,0x00,  /* 00000060    "........" */
> +    0x08,0x04,0x07,0x06,0x08,0x09,0x0A,0x0B,  /* 00000068    "........" */
> +    0x0C,0x0D,0x0E,0x0F,0x55,0x66,0x77,0x88,  /* 00000070    "....Ufw." */
> +    0x11,0xAA,0xBB,0x00,0x00,0x10,0x00,0x0D,  /* 00000078    "........" */
> +    0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,  /* 00000080    "........" */
> +    0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,  /* 00000088    "........" */
> +    0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
> +    0x00,0x00,0x00,0x02,0x00,0x10,0x00,0x04,  /* 00000098    "........" */
> +    0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x78,  /* 000000A0    ".......x" */
> +    0x56,0x34,0x12,0x02,0x00,0x10,0x00,0x04,  /* 000000A8    "V4......" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,  /* 000000B0    ".......x" */
> +    0x56,0x34,0x12                            /* 000000B8    "V4."      */
>  };
>  
>  const unsigned char TemplatePptt[] =
> @@ -1205,21 +1269,24 @@ const unsigned char TemplateSdei[] =
>  
>  const unsigned char TemplateSdev[] =
>  {
> -    0x53,0x44,0x45,0x56,0x72,0x00,0x00,0x00,  /* 00000000    "SDEVr..." */
> -    0x01,0x2F,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "./INTEL " */
> +    0x53,0x44,0x45,0x56,0x89,0x00,0x00,0x00,  /* 00000000    "SDEV...." */
> +    0x01,0x6E,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".nINTEL " */
>      0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
>      0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x31,0x08,0x17,0x20,0x00,0x01,0x2A,0x00,  /* 00000020    "1.. ..*." */
> -    0x0C,0x00,0x16,0x00,0x22,0x00,0x08,0x00,  /* 00000028    "...."..." */
> -    0x5C,0x5C,0x5F,0x53,0x42,0x5F,0x2E,0x50,  /* 00000030    "\\_SB_.P" */
> -    0x43,0x49,0x30,0x2E,0x55,0x53,0x42,0x31,  /* 00000038    "CI0.USB1" */
> -    0x2E,0x53,0x55,0x42,0x31,0x00,0x00,0x11,  /* 00000040    ".SUB1..." */
> -    0x22,0x33,0x44,0x55,0x66,0x77,0x01,0x01,  /* 00000048    ""3DUfw.." */
> -    0x24,0x00,0x10,0x00,0x20,0x00,0x10,0x00,  /* 00000050    "$... ..." */
> -    0x04,0x00,0x14,0x00,0x10,0x00,0x11,0x22,  /* 00000058    "......."" */
> -    0x33,0x44,0xEE,0xDD,0xCC,0xBB,0xAA,0x55,  /* 00000060    "3D.....U" */
> -    0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,  /* 00000068    "fw......" */
> -    0xEE,0xFF                                 /* 00000070    ".."       */
> +    0x05,0x01,0x21,0x20,0x00,0x03,0x41,0x00,  /* 00000020    "..! ..A." */
> +    0x23,0x00,0x16,0x00,0x39,0x00,0x08,0x00,  /* 00000028    "#...9..." */
> +    0x10,0x00,0x13,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
> +    0x01,0x00,0x03,0x02,0x05,0x04,0x07,0x06,  /* 00000038    "........" */
> +    0x09,0x08,0x0A,0x0B,0x0C,0x0D,0x0E,0x5C,  /* 00000040    ".......\" */
> +    0x5C,0x5F,0x53,0x42,0x5F,0x2E,0x50,0x43,  /* 00000048    "\_SB_.PC" */
> +    0x49,0x30,0x2E,0x55,0x53,0x42,0x31,0x2E,  /* 00000050    "I0.USB1." */
> +    0x53,0x55,0x42,0x31,0x00,0x00,0x11,0x22,  /* 00000058    "SUB1..."" */
> +    0x33,0x44,0x55,0x66,0x77,0x01,0x01,0x24,  /* 00000060    "3DUfw..$" */
> +    0x00,0x10,0x00,0x20,0x00,0x10,0x00,0x04,  /* 00000068    "... ...." */
> +    0x00,0x14,0x00,0x10,0x00,0x11,0x22,0x33,  /* 00000070    "......"3" */
> +    0x44,0xEE,0xDD,0xCC,0xBB,0xAA,0x55,0x66,  /* 00000078    "D.....Uf" */
> +    0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,  /* 00000080    "w......." */
> +    0xFF                                      /* 00000088    "."        */
>  };
>  
>  const unsigned char TemplateSlic[] =
> @@ -1450,6 +1517,26 @@ const unsigned char TemplateUefi[] =
>      0x0C,0x0D,0x0E,0x0F,0x00,0x00             /* 00000030    "......"   */
>  };
>  
> +const unsigned char TemplateViot[] =
> +{
> +    0x56,0x49,0x4F,0x54,0x80,0x00,0x00,0x00,  /* 00000000    "VIOT...." */
> +    0x00,0x52,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".RINTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
> +    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x05,0x01,0x21,0x20,0x04,0x00,0x30,0x00,  /* 00000020    "..! ..0." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
> +    0x01,0x00,0x18,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,  /* 00000038    "........" */
> +    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "`......." */
> +    0x02,0x00,0x18,0x00,0x00,0x00,0x01,0x00,  /* 00000048    "........" */
> +    0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
> +    0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "p......." */
> +    0x03,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
> +    0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000070    "........" */
> +    0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x00   /* 00000078    "........" */
> +};
> +
>  const unsigned char TemplateWaet[] =
>  {
>      0x57,0x41,0x45,0x54,0x28,0x00,0x00,0x00,  /* 00000000    "WAET(..." */
> diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
> index a508b51c..d69ad2fb 100644
> --- a/src/acpica/source/compiler/dtutils.c
> +++ b/src/acpica/source/compiler/dtutils.c
> @@ -438,6 +438,7 @@ DtGetFieldType (
>      case ACPI_DMT_BUF16:
>      case ACPI_DMT_BUF128:
>      case ACPI_DMT_PCI_PATH:
> +    case ACPI_DMT_PMTT_VENDOR:
>  
>          Type = DT_FIELD_TYPE_BUFFER;
>          break;
> @@ -573,6 +574,7 @@ DtGetFieldLength (
>      case ACPI_DMT_CHKSUM:
>      case ACPI_DMT_SPACEID:
>      case ACPI_DMT_ACCWIDTH:
> +    case ACPI_DMT_CEDT:
>      case ACPI_DMT_IVRS:
>      case ACPI_DMT_GTDT:
>      case ACPI_DMT_MADT:
> @@ -589,6 +591,7 @@ DtGetFieldLength (
>      case ACPI_DMT_ERSTACT:
>      case ACPI_DMT_ERSTINST:
>      case ACPI_DMT_DMAR_SCOPE:
> +    case ACPI_DMT_VIOT:
>  
>          ByteLength = 1;
>          break;
> @@ -599,6 +602,7 @@ DtGetFieldLength (
>      case ACPI_DMT_HMAT:
>      case ACPI_DMT_NFIT:
>      case ACPI_DMT_PCI_PATH:
> +    case ACPI_DMT_PHAT:
>  
>          ByteLength = 2;
>          break;
> @@ -673,6 +677,7 @@ DtGetFieldLength (
>  
>      case ACPI_DMT_BUFFER:
>      case ACPI_DMT_RAW_BUFFER:
> +    case ACPI_DMT_PMTT_VENDOR:
>  
>          Value = DtGetFieldValue (Field);
>          if (Value)
> diff --git a/src/acpica/source/components/disassembler/dmresrcl2.c b/src/acpica/source/components/disassembler/dmresrcl2.c
> index e98a15db..ae15e3d8 100644
> --- a/src/acpica/source/components/disassembler/dmresrcl2.c
> +++ b/src/acpica/source/components/disassembler/dmresrcl2.c
> @@ -159,6 +159,13 @@
>  
>  /* Local prototypes */
>  
> +static void
> +AcpiDmCsi2SerialBusDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level);
> +
>  static void
>  AcpiDmI2cSerialBusDescriptor (
>      ACPI_OP_WALK_INFO       *Info,
> @@ -200,7 +207,8 @@ static ACPI_RESOURCE_HANDLER        SerialBusResourceDispatch [] =
>      NULL,
>      AcpiDmI2cSerialBusDescriptor,
>      AcpiDmSpiSerialBusDescriptor,
> -    AcpiDmUartSerialBusDescriptor
> +    AcpiDmUartSerialBusDescriptor,
> +    AcpiDmCsi2SerialBusDescriptor
>  };
>  
>  
> @@ -674,6 +682,15 @@ AcpiDmDumpSerialBusVendorData (
>              sizeof (AML_RESOURCE_UART_SERIALBUS));
>          break;
>  
> +    case AML_RESOURCE_CSI2_SERIALBUSTYPE:
> +
> +        VendorLength = Resource->CommonSerialBus.TypeDataLength -
> +            AML_RESOURCE_CSI2_MIN_DATA_LEN;
> +
> +        VendorData = ACPI_ADD_PTR (UINT8, Resource,
> +            sizeof (AML_RESOURCE_CSI2_SERIALBUS));
> +        break;
> +
>      default:
>  
>          return;
> @@ -685,6 +702,75 @@ AcpiDmDumpSerialBusVendorData (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmCsi2SerialBusDescriptor
> + *
> + * PARAMETERS:  Info                - Extra resource info
> + *              Resource            - Pointer to the resource descriptor
> + *              Length              - Length of the descriptor in bytes
> + *              Level               - Current source code indentation level
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Decode a CSI2 serial bus descriptor
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmCsi2SerialBusDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level)
> +{
> +    UINT32                  ResourceSourceOffset;
> +    char                    *DeviceName;
> +
> +
> +    /* SlaveMode, PhyType, LocalPortInstance */
> +
> +    AcpiDmIndent (Level);
> +    AcpiOsPrintf ("Csi2Bus (%s,",
> +        AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->Csi2SerialBus.Flags)]);
> +
> +    AcpiOsPrintf (" 0x%2.2X, 0x%2.2X,\n",
> +        Resource->Csi2SerialBus.TypeSpecificFlags & 0x03,
> +        Resource->Csi2SerialBus.TypeSpecificFlags & 0xFC);
> +
> +    /* ResourceSource is a required field */
> +
> +    ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
> +        Resource->CommonSerialBus.TypeDataLength;
> +
> +    AcpiDmIndent (Level + 1);
> +    DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
> +    AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
> +
> +    /* ResourceSourceIndex, ResourceUsage */
> +
> +    AcpiOsPrintf (",\n");
> +    AcpiDmIndent (Level + 1);
> +    AcpiOsPrintf ("0x%2.2X, ", Resource->Csi2SerialBus.ResSourceIndex);
> +
> +    AcpiOsPrintf ("%s, ",
> +        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->Csi2SerialBus.Flags, 1)]);
> +
> +    /* Insert a descriptor name */
> +
> +    AcpiDmDescriptorName ();
> +
> +    /* Dump the vendor data */
> +
> +    AcpiOsPrintf (",\n");
> +    AcpiDmIndent (Level + 1);
> +    AcpiDmDumpSerialBusVendorData (Resource, Level);
> +    AcpiOsPrintf (")\n");
> +
> +    MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    AcpiDmI2cSerialBusDescriptor
> @@ -939,7 +1025,7 @@ AcpiDmUartSerialBusDescriptor (
>   *
>   * RETURN:      None
>   *
> - * DESCRIPTION: Decode a I2C/SPI/UART serial bus descriptor
> + * DESCRIPTION: Decode a I2C/SPI/UART/CSI2 serial bus descriptor
>   *
>   ******************************************************************************/
>  
> diff --git a/src/acpica/source/components/events/evhandler.c b/src/acpica/source/components/events/evhandler.c
> index 9faccba3..39171014 100644
> --- a/src/acpica/source/components/events/evhandler.c
> +++ b/src/acpica/source/components/events/evhandler.c
> @@ -677,6 +677,13 @@ AcpiEvInstallSpaceHandler (
>  
>      /* Init handler obj */
>  
> +    Status = AcpiOsCreateMutex (&HandlerObj->AddressSpace.ContextMutex);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        AcpiUtRemoveReference (HandlerObj);
> +        goto UnlockAndExit;
> +    }
> +
>      HandlerObj->AddressSpace.SpaceId = (UINT8) SpaceId;
>      HandlerObj->AddressSpace.HandlerFlags = Flags;
>      HandlerObj->AddressSpace.RegionList = NULL;
> diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c
> index 4f5bb7e0..2624cd65 100644
> --- a/src/acpica/source/components/events/evregion.c
> +++ b/src/acpica/source/components/events/evregion.c
> @@ -270,6 +270,8 @@ AcpiEvAddressSpaceDispatch (
>      ACPI_OPERAND_OBJECT     *RegionObj2;
>      void                    *RegionContext = NULL;
>      ACPI_CONNECTION_INFO    *Context;
> +    ACPI_MUTEX              ContextMutex;
> +    BOOLEAN                 ContextLocked;
>      ACPI_PHYSICAL_ADDRESS   Address;
>  
>  
> @@ -296,6 +298,8 @@ AcpiEvAddressSpaceDispatch (
>      }
>  
>      Context = HandlerDesc->AddressSpace.Context;
> +    ContextMutex = HandlerDesc->AddressSpace.ContextMutex;
> +    ContextLocked = FALSE;
>  
>      /*
>       * It may be the case that the region has never been initialized.
> @@ -362,6 +366,23 @@ AcpiEvAddressSpaceDispatch (
>      Handler = HandlerDesc->AddressSpace.Handler;
>      Address = (RegionObj->Region.Address + RegionOffset);
>  
> +    ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> +        "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
> +        &RegionObj->Region.Handler->AddressSpace, Handler,
> +        ACPI_FORMAT_UINT64 (Address),
> +        AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
> +
> +    if (!(HandlerDesc->AddressSpace.HandlerFlags &
> +        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
> +    {
> +        /*
> +         * For handlers other than the default (supplied) handlers, we must
> +         * exit the interpreter because the handler *might* block -- we don't
> +         * know what it will do, so we can't hold the lock on the interpreter.
> +         */
> +        AcpiExExitInterpreter();
> +    }
> +
>      /*
>       * Special handling for GenericSerialBus and GeneralPurposeIo:
>       * There are three extra parameters that must be passed to the
> @@ -370,50 +391,42 @@ AcpiEvAddressSpaceDispatch (
>       *   2) Length of the above buffer
>       *   3) Actual access length from the AccessAs() op
>       *
> +     * Since we pass these extra parameters via the context, which is
> +     * shared between threads, we must lock the context to avoid these
> +     * parameters being changed from another thread before the handler
> +     * has completed running.
> +     *
>       * In addition, for GeneralPurposeIo, the Address and BitWidth fields
>       * are defined as follows:
>       *   1) Address is the pin number index of the field (bit offset from
>       *      the previous Connection)
>       *   2) BitWidth is the actual bit length of the field (number of pins)
>       */
> -    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS) &&
> +    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS ||
> +         RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO) &&
>          Context &&
>          FieldObj)
>      {
> -        /* Get the Connection (ResourceTemplate) buffer */
>  
> -        Context->Connection = FieldObj->Field.ResourceBuffer;
> -        Context->Length = FieldObj->Field.ResourceLength;
> -        Context->AccessLength = FieldObj->Field.AccessLength;
> -    }
> -    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO) &&
> -        Context &&
> -        FieldObj)
> -    {
> +        Status = AcpiOsAcquireMutex (ContextMutex, ACPI_WAIT_FOREVER);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            goto ReEnterInterpreter;
> +        }
> +
> +        ContextLocked = TRUE;
> +
>          /* Get the Connection (ResourceTemplate) buffer */
>  
>          Context->Connection = FieldObj->Field.ResourceBuffer;
>          Context->Length = FieldObj->Field.ResourceLength;
>          Context->AccessLength = FieldObj->Field.AccessLength;
> -        Address = FieldObj->Field.PinNumberIndex;
> -        BitWidth = FieldObj->Field.BitLength;
> -    }
>  
> -    ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> -        "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
> -        &RegionObj->Region.Handler->AddressSpace, Handler,
> -        ACPI_FORMAT_UINT64 (Address),
> -        AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
> -
> -    if (!(HandlerDesc->AddressSpace.HandlerFlags &
> -        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
> -    {
> -        /*
> -         * For handlers other than the default (supplied) handlers, we must
> -         * exit the interpreter because the handler *might* block -- we don't
> -         * know what it will do, so we can't hold the lock on the interpreter.
> -         */
> -        AcpiExExitInterpreter();
> +        if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO)
> +        {
> +            Address = FieldObj->Field.PinNumberIndex;
> +            BitWidth = FieldObj->Field.BitLength;
> +        }
>      }
>  
>      /* Call the handler */
> @@ -421,6 +434,11 @@ AcpiEvAddressSpaceDispatch (
>      Status = Handler (Function, Address, BitWidth, Value, Context,
>          RegionObj2->Extra.RegionContext);
>  
> +    if (ContextLocked)
> +    {
> +        AcpiOsReleaseMutex (ContextMutex);
> +    }
> +
>      if (ACPI_FAILURE (Status))
>      {
>          ACPI_EXCEPTION ((AE_INFO, Status, "Returned by Handler for [%s]",
> @@ -438,6 +456,7 @@ AcpiEvAddressSpaceDispatch (
>          }
>      }
>  
> +ReEnterInterpreter:
>      if (!(HandlerDesc->AddressSpace.HandlerFlags &
>          ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
>      {
> diff --git a/src/acpica/source/components/events/evxfregn.c b/src/acpica/source/components/events/evxfregn.c
> index 9113d8a2..3febc81c 100644
> --- a/src/acpica/source/components/events/evxfregn.c
> +++ b/src/acpica/source/components/events/evxfregn.c
> @@ -362,6 +362,7 @@ AcpiRemoveAddressSpaceHandler (
>  
>              /* Now we can delete the handler object */
>  
> +            AcpiOsReleaseMutex (HandlerObj->AddressSpace.ContextMutex);
>              AcpiUtRemoveReference (HandlerObj);
>              goto UnlockAndExit;
>          }
> diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
> index c332896f..4286223e 100644
> --- a/src/acpica/source/components/namespace/nsaccess.c
> +++ b/src/acpica/source/components/namespace/nsaccess.c
> @@ -251,14 +251,13 @@ AcpiNsRootInitialize (
>           * predefined names are at the root level. It is much easier to
>           * just create and link the new node(s) here.
>           */
> -        NewNode = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_NAMESPACE_NODE));
> +        NewNode = AcpiNsCreateNode (*ACPI_CAST_PTR (UINT32, InitVal->Name));
>          if (!NewNode)
>          {
>              Status = AE_NO_MEMORY;
>              goto UnlockAndExit;
>          }
>  
> -        ACPI_COPY_NAMESEG (NewNode->Name.Ascii, InitVal->Name);
>          NewNode->DescriptorType = ACPI_DESC_TYPE_NAMED;
>          NewNode->Type = InitVal->Type;
>  
> diff --git a/src/acpica/source/components/namespace/nsrepair2.c b/src/acpica/source/components/namespace/nsrepair2.c
> index 8ec425ee..d3dcd318 100644
> --- a/src/acpica/source/components/namespace/nsrepair2.c
> +++ b/src/acpica/source/components/namespace/nsrepair2.c
> @@ -690,8 +690,9 @@ AcpiNsRepair_HID (
>      ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
>  {
>      ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
> -    char                    *Dest;
> +    ACPI_OPERAND_OBJECT     *NewString;
>      char                    *Source;
> +    char                    *Dest;
>  
>  
>      ACPI_FUNCTION_NAME (NsRepair_HID);
> @@ -716,6 +717,14 @@ AcpiNsRepair_HID (
>          return_ACPI_STATUS (AE_OK);
>      }
>  
> +    /* It is simplest to always create a new string object */
> +
> +    NewString = AcpiUtCreateStringObject (ReturnObject->String.Length);
> +    if (!NewString)
> +    {
> +        return_ACPI_STATUS (AE_NO_MEMORY);
> +    }
> +
>      /*
>       * Remove a leading asterisk if present. For some unknown reason, there
>       * are many machines in the field that contains IDs like this.
> @@ -726,7 +735,7 @@ AcpiNsRepair_HID (
>      if (*Source == '*')
>      {
>          Source++;
> -        ReturnObject->String.Length--;
> +        NewString->String.Length--;
>  
>          ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
>              "%s: Removed invalid leading asterisk\n", Info->FullPathname));
> @@ -740,12 +749,13 @@ AcpiNsRepair_HID (
>       * "NNNN####" where N is an uppercase letter or decimal digit, and
>       * # is a hex digit.
>       */
> -    for (Dest = ReturnObject->String.Pointer; *Source; Dest++, Source++)
> +    for (Dest = NewString->String.Pointer; *Source; Dest++, Source++)
>      {
>          *Dest = (char) toupper ((int) *Source);
>      }
> -    ReturnObject->String.Pointer[ReturnObject->String.Length] = 0;
>  
> +    AcpiUtRemoveReference (ReturnObject);
> +    *ReturnObjectPtr = NewString;
>      return_ACPI_STATUS (AE_OK);
>  }
>  
> diff --git a/src/acpica/source/components/resources/rscalc.c b/src/acpica/source/components/resources/rscalc.c
> index d435323f..2e878e80 100644
> --- a/src/acpica/source/components/resources/rscalc.c
> +++ b/src/acpica/source/components/resources/rscalc.c
> @@ -816,9 +816,9 @@ AcpiRsGetListLength (
>          *SizeNeeded += BufferSize;
>  
>          ACPI_DEBUG_PRINT ((ACPI_DB_RESOURCES,
> -            "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
> +            "Type %.2X, AmlLength %.2X InternalLength %.2X%8X\n",
>              AcpiUtGetResourceType (AmlBuffer),
> -            AcpiUtGetDescriptorLength (AmlBuffer), BufferSize));
> +            AcpiUtGetDescriptorLength (AmlBuffer), ACPI_FORMAT_UINT64(*SizeNeeded)));
>  
>          /*
>           * Point to the next resource within the AML stream using the length
> diff --git a/src/acpica/source/components/resources/rsdump.c b/src/acpica/source/components/resources/rsdump.c
> index 7f597f16..44b552ad 100644
> --- a/src/acpica/source/components/resources/rsdump.c
> +++ b/src/acpica/source/components/resources/rsdump.c
> @@ -277,6 +277,11 @@ AcpiRsDumpResourceList (
>                  ResourceList->Type);
>              return;
>          }
> +        else if (!ResourceList->Type)
> +        {
> +            ACPI_ERROR ((AE_INFO, "Invalid Zero Resource Type"));
> +            return;
> +        }
>  
>          /* Sanity check the length. It must not be zero, or we loop forever */
>  
> @@ -460,6 +465,11 @@ AcpiRsDumpDescriptor (
>              AcpiRsOutString (Name, Table->Pointer [*Target & 0x07]);
>              break;
>  
> +        case ACPI_RSD_6BITFLAG:
> +
> +            AcpiRsOutInteger8 (Name, (ACPI_GET8 (Target) & 0x3F));
> +            break;
> +
>          case ACPI_RSD_SHORTLIST:
>              /*
>               * Short byte list (single line output) for DMA and IRQ resources
> diff --git a/src/acpica/source/components/resources/rsdumpinfo.c b/src/acpica/source/components/resources/rsdumpinfo.c
> index f1688120..26f4993d 100644
> --- a/src/acpica/source/components/resources/rsdumpinfo.c
> +++ b/src/acpica/source/components/resources/rsdumpinfo.c
> @@ -454,6 +454,21 @@ ACPI_RSDUMP_INFO        AcpiRsDumpCommonSerialBus[11] =
>      ACPI_RS_DUMP_COMMON_SERIAL_BUS
>  };
>  
> +ACPI_RSDUMP_INFO        AcpiRsDumpCsi2SerialBus[11] =
> +{
> +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpCsi2SerialBus),      "Camera Serial Bus",        NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.RevisionId),         "RevisionId",               NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.Type),               "Type",                     AcpiGbl_SbtDecode},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.ProducerConsumer),   "ProducerConsumer",         AcpiGbl_ConsumeDecode},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.SlaveMode),          "SlaveMode",                AcpiGbl_SmDecode},
> +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.PhyType),            "PhyType",                  AcpiGbl_PhyDecode},
> +    {ACPI_RSD_6BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.LocalPortInstance),  "LocalPortInstance",        NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.TypeRevisionId),     "TypeRevisionId",           NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Csi2SerialBus.VendorLength),       "VendorLength",             NULL},
> +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (Csi2SerialBus.VendorData),        "VendorData",               NULL},
> +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Csi2SerialBus.ResourceSource),     "ResourceSource",           NULL},
> +};
> +
>  ACPI_RSDUMP_INFO        AcpiRsDumpI2cSerialBus[14] =
>  {
>      {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpI2cSerialBus),       "I2C Serial Bus",           NULL},
> diff --git a/src/acpica/source/components/resources/rsinfo.c b/src/acpica/source/components/resources/rsinfo.c
> index b3a7180a..9687bfb4 100644
> --- a/src/acpica/source/components/resources/rsinfo.c
> +++ b/src/acpica/source/components/resources/rsinfo.c
> @@ -245,7 +245,7 @@ ACPI_RSCONVERT_INFO         *AcpiGbl_GetResourceDispatch[] =
>      AcpiRsConvertPinGroupConfig,    /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
>  };
>  
> -/* Subtype table for SerialBus -- I2C, SPI, and UART */
> +/* Subtype table for SerialBus -- I2C, SPI, UART, and CSI2 */
>  
>  ACPI_RSCONVERT_INFO         *AcpiGbl_ConvertResourceSerialBusDispatch[] =
>  {
> @@ -253,6 +253,7 @@ ACPI_RSCONVERT_INFO         *AcpiGbl_ConvertResourceSerialBusDispatch[] =
>      AcpiRsConvertI2cSerialBus,
>      AcpiRsConvertSpiSerialBus,
>      AcpiRsConvertUartSerialBus,
> +    AcpiRsConvertCsi2SerialBus
>  };
>  
>  
> @@ -295,6 +296,7 @@ ACPI_RSDUMP_INFO            *AcpiGbl_DumpSerialBusDispatch[] =
>      AcpiRsDumpI2cSerialBus,         /* AML_RESOURCE_I2C_BUS_TYPE */
>      AcpiRsDumpSpiSerialBus,         /* AML_RESOURCE_SPI_BUS_TYPE */
>      AcpiRsDumpUartSerialBus,        /* AML_RESOURCE_UART_BUS_TYPE */
> +    AcpiRsDumpCsi2SerialBus,        /* AML_RESOURCE_CSI2_BUS_TYPE */
>  };
>  #endif
>  
> @@ -384,6 +386,7 @@ const UINT8                 AcpiGbl_AmlResourceSerialBusSizes[] =
>      sizeof (AML_RESOURCE_I2C_SERIALBUS),
>      sizeof (AML_RESOURCE_SPI_SERIALBUS),
>      sizeof (AML_RESOURCE_UART_SERIALBUS),
> +    sizeof (AML_RESOURCE_CSI2_SERIALBUS),
>  };
>  
>  const UINT8                 AcpiGbl_ResourceStructSerialBusSizes[] =
> @@ -392,4 +395,5 @@ const UINT8                 AcpiGbl_ResourceStructSerialBusSizes[] =
>      ACPI_RS_SIZE (ACPI_RESOURCE_I2C_SERIALBUS),
>      ACPI_RS_SIZE (ACPI_RESOURCE_SPI_SERIALBUS),
>      ACPI_RS_SIZE (ACPI_RESOURCE_UART_SERIALBUS),
> +    ACPI_RS_SIZE (ACPI_RESOURCE_CSI2_SERIALBUS),
>  };
> diff --git a/src/acpica/source/components/resources/rslist.c b/src/acpica/source/components/resources/rslist.c
> index 4ee8aa63..1867c0a9 100644
> --- a/src/acpica/source/components/resources/rslist.c
> +++ b/src/acpica/source/components/resources/rslist.c
> @@ -216,7 +216,7 @@ AcpiRsConvertAmlToResources (
>          }
>          else
>          {
> -            /* This is an I2C, SPI, or UART SerialBus descriptor */
> +            /* This is an I2C, SPI, UART, or CSI2 SerialBus descriptor */
>  
>              ConversionTable = AcpiGbl_ConvertResourceSerialBusDispatch [
>                  AmlResource->CommonSerialBus.Type];
> @@ -246,6 +246,12 @@ AcpiRsConvertAmlToResources (
>          return_ACPI_STATUS (Status);
>      }
>  
> +    if (!Resource->Length)
> +    {
> +        ACPI_EXCEPTION ((AE_INFO, Status,
> +            "Zero-length resource returned from RsConvertAmlToResource"));
> +    }
> +
>      ACPI_DEBUG_PRINT ((ACPI_DB_RESOURCES,
>          "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
>          AcpiUtGetResourceType (Aml), Length,
> @@ -326,7 +332,7 @@ AcpiRsConvertResourcesToAml (
>              }
>              else
>              {
> -                /* This is an I2C, SPI, or UART SerialBus descriptor */
> +                /* This is an I2C, SPI, UART or CSI2 SerialBus descriptor */
>  
>                  ConversionTable = AcpiGbl_ConvertResourceSerialBusDispatch[
>                      Resource->Data.CommonSerialBus.Type];
> diff --git a/src/acpica/source/components/resources/rsmisc.c b/src/acpica/source/components/resources/rsmisc.c
> index 31a7d9ee..f0f186b8 100644
> --- a/src/acpica/source/components/resources/rsmisc.c
> +++ b/src/acpica/source/components/resources/rsmisc.c
> @@ -225,6 +225,8 @@ AcpiRsConvertAmlToResource (
>      Count = INIT_TABLE_LENGTH (Info);
>      while (Count)
>      {
> +        Target = NULL;
> +
>          /*
>           * Source is the external AML byte stream buffer,
>           * destination is the internal resource descriptor
> @@ -275,6 +277,14 @@ AcpiRsConvertAmlToResource (
>                  ((ACPI_GET8 (Source) >> Info->Value) & 0x07));
>              break;
>  
> +        case ACPI_RSC_6BITFLAG:
> +            /*
> +             * Mask and shift the flag bits
> +             */
> +            ACPI_SET8 (Destination,
> +                ((ACPI_GET8 (Source) >> Info->Value) & 0x3F));
> +            break;
> +
>          case ACPI_RSC_COUNT:
>  
>              ItemCount = ACPI_GET8 (Source);
> @@ -654,6 +664,14 @@ AcpiRsConvertResourceToAml (
>                  ((ACPI_GET8 (Source) & 0x07) << Info->Value));
>              break;
>  
> +        case ACPI_RSC_6BITFLAG:
> +            /*
> +             * Mask and shift the flag bits
> +             */
> +            ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
> +                ((ACPI_GET8 (Source) & 0x3F) << Info->Value));
> +            break;
> +
>          case ACPI_RSC_COUNT:
>  
>              ItemCount = ACPI_GET8 (Source);
> diff --git a/src/acpica/source/components/resources/rsserial.c b/src/acpica/source/components/resources/rsserial.c
> index 2df8eb77..d505ea94 100644
> --- a/src/acpica/source/components/resources/rsserial.c
> +++ b/src/acpica/source/components/resources/rsserial.c
> @@ -327,6 +327,76 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertPinFunction[13] =
>  };
>  
>  
> +/*******************************************************************************
> + *
> + * AcpiRsConvertCsi2SerialBus
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO     AcpiRsConvertCsi2SerialBus[14] =
> +{
> +    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_SERIAL_BUS,
> +                        ACPI_RS_SIZE (ACPI_RESOURCE_CSI2_SERIALBUS),
> +                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertCsi2SerialBus)},
> +
> +    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_SERIAL_BUS,
> +                        sizeof (AML_RESOURCE_CSI2_SERIALBUS),
> +                        0},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.CommonSerialBus.RevisionId),
> +                        AML_OFFSET (CommonSerialBus.RevisionId),
> +                        1},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.Type),
> +                        AML_OFFSET (Csi2SerialBus.Type),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.ProducerConsumer),
> +                        AML_OFFSET (Csi2SerialBus.Flags),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.SlaveMode),
> +                        AML_OFFSET (Csi2SerialBus.Flags),
> +                        0},
> +
> +    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.PhyType),
> +                        AML_OFFSET (Csi2SerialBus.TypeSpecificFlags),
> +                        0},
> +
> +    {ACPI_RSC_6BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.LocalPortInstance),
> +                        AML_OFFSET (Csi2SerialBus.TypeSpecificFlags),
> +                        2},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.TypeRevisionId),
> +                        AML_OFFSET (Csi2SerialBus.TypeRevisionId),
> +                        1},
> +
> +    /* Vendor data */
> +
> +    {ACPI_RSC_COUNT_SERIAL_VEN, ACPI_RS_OFFSET (Data.Csi2SerialBus.VendorLength),
> +                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
> +                        AML_RESOURCE_CSI2_MIN_DATA_LEN},
> +
> +    {ACPI_RSC_MOVE_SERIAL_VEN,  ACPI_RS_OFFSET (Data.Csi2SerialBus.VendorData),
> +                        0,
> +                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
> +
> +    /* Resource Source */
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.Index),
> +                        AML_OFFSET (Csi2SerialBus.ResSourceIndex),
> +                        1},
> +
> +    {ACPI_RSC_COUNT_SERIAL_RES, ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.StringLength),
> +                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
> +                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
> +
> +    {ACPI_RSC_MOVE_SERIAL_RES,  ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.StringPtr),
> +                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
> +                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
> +};
> +
> +
>  /*******************************************************************************
>   *
>   * AcpiRsConvertI2cSerialBus
> diff --git a/src/acpica/source/components/utilities/utresdecode.c b/src/acpica/source/components/utilities/utresdecode.c
> index e7c10afa..561240f0 100644
> --- a/src/acpica/source/components/utilities/utresdecode.c
> +++ b/src/acpica/source/components/utilities/utresdecode.c
> @@ -240,6 +240,14 @@ const char                      *AcpiGbl_MtpDecode[] =
>      "AddressRangeNVS"
>  };
>  
> +const char                      *AcpiGbl_PhyDecode[] =
> +{
> +    "Type C",
> +    "Type D",
> +    "Unknown Type",
> +    "Unknown Type"
> +};
> +
>  const char                      *AcpiGbl_RngDecode[] =
>  {
>      "InvalidRanges",
> @@ -331,7 +339,8 @@ const char                      *AcpiGbl_SbtDecode[] =
>      "/* UNKNOWN serial bus type */",
>      "I2C",
>      "SPI",
> -    "UART"
> +    "UART",
> +    "CSI2"
>  };
>  
>  /* I2C serial bus access mode */
> diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
> index b7c4aace..70e5119e 100644
> --- a/src/acpica/source/components/utilities/utresrc.c
> +++ b/src/acpica/source/components/utilities/utresrc.c
> @@ -212,6 +212,7 @@ const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
>      ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS),
>      ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS),
>      ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS),
> +    ACPI_AML_SIZE_LARGE (AML_RESOURCE_CSI2_SERIALBUS),
>  };
>  
>  
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index 94c002da..f02f3239 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -251,6 +251,7 @@ typedef enum
>      /* Types that are specific to particular ACPI tables */
>  
>      ACPI_DMT_ASF,
> +    ACPI_DMT_CEDT,
>      ACPI_DMT_DMAR,
>      ACPI_DMT_DMAR_SCOPE,
>      ACPI_DMT_EINJACT,
> @@ -269,13 +270,16 @@ typedef enum
>      ACPI_DMT_MADT,
>      ACPI_DMT_NFIT,
>      ACPI_DMT_PCCT,
> +    ACPI_DMT_PHAT,
>      ACPI_DMT_PMTT,
> +    ACPI_DMT_PMTT_VENDOR,
>      ACPI_DMT_PPTT,
>      ACPI_DMT_SDEI,
>      ACPI_DMT_SDEV,
>      ACPI_DMT_SLIC,
>      ACPI_DMT_SRAT,
>      ACPI_DMT_TPM2,
> +    ACPI_DMT_VIOT,
>  
>      /* Special opcodes */
>  
> @@ -364,6 +368,8 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoAsfHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBoot[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBert[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBgrt[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCedtHdr[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCedt0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCpep[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCpep0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCsrt0[];
> @@ -451,8 +457,11 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort3b[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort3c[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort4[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort5[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort6[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort6a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortAcc[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortHdr[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortHdr3[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortMap[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortPad[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs[];
> @@ -463,6 +472,8 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs4[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8b[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8c[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHid[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHid1[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt0[];
> @@ -481,6 +492,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt12[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt13[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt14[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt15[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt16[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadtHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMcfg[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMcfg0[];
> @@ -507,11 +519,17 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit7[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPdtt[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhatHdr[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat0[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat0a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1b[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt1[];
> -extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt1a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt2[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmttVendor[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmttHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcctHdr[];
> @@ -520,10 +538,12 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct1[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct2[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct3[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct4[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct5[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPdtt0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt2[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPpttHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRasf[];
> @@ -539,6 +559,10 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0b[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompHdr[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompId[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompMem[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1b[];
> @@ -565,6 +589,12 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm211[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm23[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm23a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoUefi[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViotHeader[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot2[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot3[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot4[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWaet[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWdat[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWdat0[];
> @@ -640,6 +670,10 @@ void
>  AcpiDmDumpAsf (
>      ACPI_TABLE_HEADER       *Table);
>  
> +void
> +AcpiDmDumpCedt (
> +    ACPI_TABLE_HEADER       *Table);
> +
>  void
>  AcpiDmDumpCpep (
>      ACPI_TABLE_HEADER       *Table);
> @@ -728,6 +762,10 @@ void
>  AcpiDmDumpPdtt (
>      ACPI_TABLE_HEADER       *Table);
>  
> +void
> +AcpiDmDumpPhat (
> +    ACPI_TABLE_HEADER       *Table);
> +
>  void
>  AcpiDmDumpPmtt (
>      ACPI_TABLE_HEADER       *Table);
> @@ -776,6 +814,10 @@ void
>  AcpiDmDumpTpm2 (
>      ACPI_TABLE_HEADER       *Table);
>  
> +void
> +AcpiDmDumpViot (
> +    ACPI_TABLE_HEADER       *Table);
> +
>  void
>  AcpiDmDumpWdat (
>      ACPI_TABLE_HEADER       *Table);
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index f047efb8..e7d9f1c9 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -521,6 +521,7 @@ typedef struct acpi_object_addr_handler
>      ACPI_ADR_SPACE_HANDLER          Handler;
>      ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
>      void                            *Context;
> +    ACPI_MUTEX                      ContextMutex;
>      ACPI_ADR_SPACE_SETUP            Setup;
>      union acpi_operand_object       *RegionList;        /* Regions using this handler */
>      union acpi_operand_object       *Next;
> diff --git a/src/acpica/source/include/acoutput.h b/src/acpica/source/include/acoutput.h
> index 1d6aacca..46774ad0 100644
> --- a/src/acpica/source/include/acoutput.h
> +++ b/src/acpica/source/include/acoutput.h
> @@ -508,7 +508,7 @@
>   *
>   * A less-safe version of the macros is provided for optional use if the
>   * compiler uses excessive CPU stack (for example, this may happen in the
> - * debug case if code optimzation is disabled.)
> + * debug case if code optimization is disabled.)
>   */
>  
>  /* Exit trace helper macro */
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index cb24eb4e..0733ac41 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                 0x20210105
> +#define ACPI_CA_VERSION                 0x20210331
>  
>  #include "acconfig.h"
>  #include "actypes.h"
> diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h
> index 22aece65..bc55155c 100644
> --- a/src/acpica/source/include/acpredef.h
> +++ b/src/acpica/source/include/acpredef.h
> @@ -472,6 +472,17 @@ const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
>      {{"_BMS",   METHOD_1ARGS (ACPI_TYPE_INTEGER),
>                  METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
>  
> +    {{"_BPC",   METHOD_0ARGS,
> +                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (4 Int) */
> +                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 4,0,0,0),
> +
> +    {{"_BPS",   METHOD_0ARGS,
> +                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (5 Int) */
> +                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 5,0,0,0),
> +
> +    {{"_BPT",   METHOD_1ARGS (ACPI_TYPE_PACKAGE),
> +                METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
> +
>      {{"_BQC",   METHOD_0ARGS,
>                  METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
>  
> @@ -491,6 +502,10 @@ const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
>      {{"_CBA",   METHOD_0ARGS,
>                  METHOD_RETURNS (ACPI_RTYPE_INTEGER)}}, /* See PCI firmware spec 3.0 */
>  
> +    {{"_CBR",   METHOD_0ARGS,
> +                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (3 Int) */
> +                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 3,0,0,0),
> +
>      {{"_CCA",   METHOD_0ARGS,
>                  METHOD_RETURNS (ACPI_RTYPE_INTEGER)}}, /* ACPI 5.1 */
>  
> diff --git a/src/acpica/source/include/acresrc.h b/src/acpica/source/include/acresrc.h
> index 082918d7..816d4fa4 100644
> --- a/src/acpica/source/include/acresrc.h
> +++ b/src/acpica/source/include/acresrc.h
> @@ -192,6 +192,7 @@ typedef enum
>      ACPI_RSC_1BITFLAG,
>      ACPI_RSC_2BITFLAG,
>      ACPI_RSC_3BITFLAG,
> +    ACPI_RSC_6BITFLAG,
>      ACPI_RSC_ADDRESS,
>      ACPI_RSC_BITMASK,
>      ACPI_RSC_BITMASK16,
> @@ -252,6 +253,7 @@ typedef enum
>      ACPI_RSD_1BITFLAG,
>      ACPI_RSD_2BITFLAG,
>      ACPI_RSD_3BITFLAG,
> +    ACPI_RSD_6BITFLAG,
>      ACPI_RSD_ADDRESS,
>      ACPI_RSD_DWORDLIST,
>      ACPI_RSD_LITERAL,
> @@ -495,6 +497,7 @@ extern ACPI_RSCONVERT_INFO      AcpiRsConvertAddress64[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertExtAddress64[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertGpio[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertFixedDma[];
> +extern ACPI_RSCONVERT_INFO      AcpiRsConvertCsi2SerialBus[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertI2cSerialBus[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertSpiSerialBus[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertUartSerialBus[];
> @@ -550,6 +553,7 @@ extern ACPI_RSDUMP_INFO         AcpiRsDumpGpio[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpPinFunction[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpFixedDma[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpCommonSerialBus[];
> +extern ACPI_RSDUMP_INFO         AcpiRsDumpCsi2SerialBus[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpI2cSerialBus[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpSpiSerialBus[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpUartSerialBus[];
> diff --git a/src/acpica/source/include/acrestyp.h b/src/acpica/source/include/acrestyp.h
> index d2cd4c4d..3c258de9 100644
> --- a/src/acpica/source/include/acrestyp.h
> +++ b/src/acpica/source/include/acrestyp.h
> @@ -593,7 +593,7 @@ typedef struct acpi_resource_gpio
>  #define ACPI_IO_RESTRICT_NONE_PRESERVE          3
>  
>  
> -/* Common structure for I2C, SPI, and UART serial descriptors */
> +/* Common structure for I2C, SPI, UART, CSI2 serial descriptors */
>  
>  #define ACPI_RESOURCE_SERIAL_COMMON \
>      UINT8                           RevisionId; \
> @@ -618,6 +618,7 @@ typedef struct acpi_resource_common_serialbus
>  #define ACPI_RESOURCE_SERIAL_TYPE_I2C           1
>  #define ACPI_RESOURCE_SERIAL_TYPE_SPI           2
>  #define ACPI_RESOURCE_SERIAL_TYPE_UART          3
> +#define ACPI_RESOURCE_SERIAL_TYPE_CSI2          4
>  
>  /* Values for SlaveMode field above */
>  
> @@ -732,6 +733,14 @@ typedef struct acpi_resource_uart_serialbus
>  #define ACPI_UART_CLEAR_TO_SEND                 (1<<6)
>  #define ACPI_UART_REQUEST_TO_SEND               (1<<7)
>  
> +typedef struct acpi_resource_csi2_serialbus
> +{
> +    ACPI_RESOURCE_SERIAL_COMMON
> +    UINT8                           LocalPortInstance;
> +    UINT8                           PhyType;
> +
> +} ACPI_RESOURCE_CSI2_SERIALBUS;
> +
>  typedef struct acpi_resource_pin_function
>  {
>      UINT8                           RevisionId;
> @@ -872,6 +881,7 @@ typedef union acpi_resource_data
>      ACPI_RESOURCE_I2C_SERIALBUS             I2cSerialBus;
>      ACPI_RESOURCE_SPI_SERIALBUS             SpiSerialBus;
>      ACPI_RESOURCE_UART_SERIALBUS            UartSerialBus;
> +    ACPI_RESOURCE_CSI2_SERIALBUS            Csi2SerialBus;
>      ACPI_RESOURCE_COMMON_SERIALBUS          CommonSerialBus;
>      ACPI_RESOURCE_PIN_FUNCTION              PinFunction;
>      ACPI_RESOURCE_PIN_CONFIG                PinConfig;
> diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h
> index b10cc9ef..af10c774 100644
> --- a/src/acpica/source/include/actbinfo.h
> +++ b/src/acpica/source/include/actbinfo.h
> @@ -196,6 +196,7 @@
>  #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)
> +#define ACPI_VIOT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_VIOT,f)
>  #define ACPI_WAET_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WAET,f)
>  #define ACPI_WDAT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDAT,f)
>  #define ACPI_WDDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDDT,f)
> @@ -213,6 +214,8 @@
>  #define ACPI_ASF2a_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_ASF_CONTROL_DATA,f)
>  #define ACPI_ASF3_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_ASF_RMCP,f)
>  #define ACPI_ASF4_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_ASF_ADDRESS,f)
> +#define ACPI_CEDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_CEDT_HEADER, f)
> +#define ACPI_CEDT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CEDT_CHBS, f)
>  #define ACPI_CPEP0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CPEP_POLLING,f)
>  #define ACPI_CSRT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CSRT_GROUP,f)
>  #define ACPI_CSRT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CSRT_SHARED_INFO,f)
> @@ -260,6 +263,8 @@
>  #define ACPI_IORT3A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IORT_SMMU_GSI,f)
>  #define ACPI_IORT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_SMMU_V3,f)
>  #define ACPI_IORT5_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_PMCG,f)
> +#define ACPI_IORT6_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_RMR,f)
> +#define ACPI_IORT6A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IORT_RMR_DESC,f)
>  #define ACPI_IORTA_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_MEMORY_ACCESS,f)
>  #define ACPI_IORTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_NODE,f)
>  #define ACPI_IORTM_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_ID_MAPPING,f)
> @@ -271,6 +276,7 @@
>  #define ACPI_IVRS8A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8A,f)
>  #define ACPI_IVRS8B_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8B,f)
>  #define ACPI_IVRS8C_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8C,f)
> +#define ACPI_IVRSHID_OFFSET(f)          (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE_HID,f)
>  #define ACPI_LPITH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_LPIT_HEADER,f)
>  #define ACPI_LPIT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_LPIT_NATIVE,f)
>  #define ACPI_MADT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MADT_LOCAL_APIC,f)
> @@ -289,6 +295,7 @@
>  #define ACPI_MADT13_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_MSI_FRAME,f)
>  #define ACPI_MADT14_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_REDISTRIBUTOR,f)
>  #define ACPI_MADT15_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_TRANSLATOR,f)
> +#define ACPI_MADT16_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_MULTIPROC_WAKEUP,f)
>  #define ACPI_MADTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
>  #define ACPI_MCFG0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MCFG_ALLOCATION,f)
>  #define ACPI_MPST0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MPST_POWER_NODE,f)
> @@ -311,21 +318,31 @@
>  #define ACPI_PCCT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f)
>  #define ACPI_PCCT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f)
>  #define ACPI_PCCT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f)
> +#define ACPI_PCCT5_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REG,f)
>  #define ACPI_PDTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PDTT_CHANNEL,f)
> +#define ACPI_PHATH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_HEADER,f)
> +#define ACPI_PHAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_VERSION_DATA,f)
> +#define ACPI_PHAT0A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PHAT_VERSION_ELEMENT,f)
> +#define ACPI_PHAT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_HEALTH_DATA,f)
>  #define ACPI_PMTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_SOCKET,f)
>  #define ACPI_PMTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_CONTROLLER,f)
> -#define ACPI_PMTT1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PMTT_DOMAIN,f)
>  #define ACPI_PMTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_PHYSICAL_COMPONENT,f)
> +#define ACPI_PMTT_VENDOR_OFFSET(f)      (UINT16) ACPI_OFFSET (ACPI_PMTT_VENDOR_SPECIFIC,f)
>  #define ACPI_PMTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_HEADER,f)
>  #define ACPI_PPTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
>  #define ACPI_PPTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_PROCESSOR,f)
>  #define ACPI_PPTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_CACHE,f)
> +#define ACPI_PPTT1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PPTT_CACHE_V1,f)
>  #define ACPI_PPTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_ID,f)
>  #define ACPI_S3PTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_FPDT_HEADER,f)
>  #define ACPI_S3PT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_RESUME,f)
>  #define ACPI_S3PT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_SUSPEND,f)
>  #define ACPI_SDEVH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_HEADER,f)
>  #define ACPI_SDEV0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_NAMESPACE,f)
> +#define ACPI_SDEV0B_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_SECURE_COMPONENT,f)
> +#define ACPI_SDEVCH_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_HEADER,f)
> +#define ACPI_SDEVC0_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_ID_COMPONENT, f)
> +#define ACPI_SDEVC1_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_MEM_COMPONENT, f)
>  #define ACPI_SDEV1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE,f)
>  #define ACPI_SDEV1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE_PATH,f)
>  #define ACPI_SLIC_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIC,f)
> @@ -341,6 +358,11 @@
>  #define ACPI_TPM2A_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f)
>  #define ACPI_TPM211_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_TPM2_ARM_SMC,f)
>  #define ACPI_TPM23A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_TPM23_TRAILER,f)
> +#define ACPI_VIOTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_HEADER,f)
> +#define ACPI_VIOT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_PCI_RANGE,f)
> +#define ACPI_VIOT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_MMIO,f)
> +#define ACPI_VIOT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_VIRTIO_IOMMU_PCI,f)
> +#define ACPI_VIOT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_VIRTIO_IOMMU_MMIO,f)
>  #define ACPI_WDAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_WDAT_ENTRY,f)
>  
>  /*
> @@ -358,6 +380,7 @@
>  #define ACPI_HPET_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_HPET,f,o)
>  #define ACPI_PPTT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_PROCESSOR,f,o)
>  #define ACPI_PPTT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_CACHE,f,o)
> +#define ACPI_PPTT1A_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_PPTT_CACHE_V1,f,o)
>  #define ACPI_SRAT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_CPU_AFFINITY,f,o)
>  #define ACPI_SRAT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_MEM_AFFINITY,f,o)
>  #define ACPI_SRAT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_X2APIC_CPU_AFFINITY,f,o)
> @@ -372,6 +395,7 @@
>  #define ACPI_IORT3_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU,f,o)
>  #define ACPI_IORT3a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_GSI,f,o)
>  #define ACPI_IORT4_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_V3,f,o)
> +#define ACPI_IORT6_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_RMR,f,o)
>  #define ACPI_IORTA_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_MEMORY_ACCESS,f,o)
>  #define ACPI_IORTM_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_ID_MAPPING,f,o)
>  #define ACPI_LPITH_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_LPIT_HEADER,f,o)
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index 5f54ecc0..437a122b 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -172,6 +172,7 @@
>  #define ACPI_SIG_BERT           "BERT"      /* Boot Error Record Table */
>  #define ACPI_SIG_BGRT           "BGRT"      /* Boot Graphics Resource Table */
>  #define ACPI_SIG_BOOT           "BOOT"      /* Simple Boot Flag Table */
> +#define ACPI_SIG_CEDT           "CEDT"      /* CXL Early Discovery Table */
>  #define ACPI_SIG_CPEP           "CPEP"      /* Corrected Platform Error Polling table */
>  #define ACPI_SIG_CSRT           "CSRT"      /* Core System Resource Table */
>  #define ACPI_SIG_DBG2           "DBG2"      /* Debug Port table type 2 */
> @@ -492,6 +493,58 @@ typedef struct acpi_table_boot
>  } ACPI_TABLE_BOOT;
>  
>  
> +/*******************************************************************************
> + *
> + * CEDT - CXL Early Discovery Table
> + *        Version 1
> + *
> + * Conforms to the "CXL Early Discovery Table" (CXL 2.0)
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_cedt
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +
> +} ACPI_TABLE_CEDT;
> +
> +/* CEDT subtable header (Performance Record Structure) */
> +
> +typedef struct acpi_cedt_header
> +{
> +    UINT8                   Type;
> +    UINT8                   Reserved;
> +    UINT16                  Length;
> +
> +} ACPI_CEDT_HEADER;
> +
> +/* Values for Type field above */
> +
> +enum AcpiCedtType
> +{
> +    ACPI_CEDT_TYPE_CHBS                 = 0,
> +    ACPI_CEDT_TYPE_RESERVED             = 1
> +};
> +
> +
> +/*
> + * CEDT subtables
> + */
> +
> +/* 0: CXL Host Bridge Structure */
> +
> +typedef struct acpi_cedt_chbs
> +{
> +    ACPI_CEDT_HEADER        Header;
> +    UINT32                  Uid;
> +    UINT32                  CxlVersion;
> +    UINT32                  Reserved;
> +    UINT64                  Base;
> +    UINT64                  Length;
> +
> +} ACPI_CEDT_CHBS;
> +
> +
>  /*******************************************************************************
>   *
>   * CPEP - Corrected Platform Error Polling table (ACPI 4.0)
> @@ -1829,7 +1882,8 @@ typedef struct acpi_hmat_locality
>      ACPI_HMAT_STRUCTURE     Header;
>      UINT8                   Flags;
>      UINT8                   DataType;
> -    UINT16                  Reserved1;
> +    UINT8                   MinTransferSize;
> +    UINT8                   Reserved1;
>      UINT32                  NumberOfInitiatorPDs;
>      UINT32                  NumberOfTargetPDs;
>      UINT32                  Reserved2;
> @@ -1839,14 +1893,17 @@ typedef struct acpi_hmat_locality
>  
>  /* Masks for Flags field above */
>  
> -#define ACPI_HMAT_MEMORY_HIERARCHY  (0x0F)
> +#define ACPI_HMAT_MEMORY_HIERARCHY  (0x0F)      /* Bits 0-3 */
>  
> -/* Values for Memory Hierarchy flag */
> +/* Values for Memory Hierarchy flags */
>  
>  #define ACPI_HMAT_MEMORY            0
>  #define ACPI_HMAT_1ST_LEVEL_CACHE   1
>  #define ACPI_HMAT_2ND_LEVEL_CACHE   2
>  #define ACPI_HMAT_3RD_LEVEL_CACHE   3
> +#define ACPI_HMAT_MINIMUM_XFER_SIZE 0x10        /* Bit 4: ACPI 6.4 */
> +#define ACPI_HMAT_NON_SEQUENTIAL_XFERS 0x20     /* Bit 5: ACPI 6.4 */
> +
>  
>  /* Values for DataType field above */
>  
> diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
> index 82096fe9..71c39e86 100644
> --- a/src/acpica/source/include/actbl2.h
> +++ b/src/acpica/source/include/actbl2.h
> @@ -180,6 +180,7 @@
>  #define ACPI_SIG_NFIT           "NFIT"      /* NVDIMM Firmware Interface Table */
>  #define ACPI_SIG_PCCT           "PCCT"      /* Platform Communications Channel Table */
>  #define ACPI_SIG_PDTT           "PDTT"      /* Platform Debug Trigger Table */
> +#define ACPI_SIG_PHAT           "PHAT"      /* Platform Health Assessment Table */
>  #define ACPI_SIG_PMTT           "PMTT"      /* Platform Memory Topology Table */
>  #define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
>  #define ACPI_SIG_RASF           "RASF"      /* RAS Feature table */
> @@ -213,7 +214,7 @@
>   * IORT - IO Remapping Table
>   *
>   * Conforms to "IO Remapping Table System Software on ARM Platforms",
> - * Document number: ARM DEN 0049D, March 2018
> + * Document number: ARM DEN 0049E.b, Feb 2021
>   *
>   ******************************************************************************/
>  
> @@ -235,7 +236,7 @@ typedef struct acpi_iort_node
>      UINT8                   Type;
>      UINT16                  Length;
>      UINT8                   Revision;
> -    UINT32                  Reserved;
> +    UINT32                  Identifier;
>      UINT32                  MappingCount;
>      UINT32                  MappingOffset;
>      char                    NodeData[1];
> @@ -251,7 +252,8 @@ enum AcpiIortNodeType
>      ACPI_IORT_NODE_PCI_ROOT_COMPLEX     = 0x02,
>      ACPI_IORT_NODE_SMMU                 = 0x03,
>      ACPI_IORT_NODE_SMMU_V3              = 0x04,
> -    ACPI_IORT_NODE_PMCG                 = 0x05
> +    ACPI_IORT_NODE_PMCG                 = 0x05,
> +    ACPI_IORT_NODE_RMR                  = 0x06,
>  };
>  
>  
> @@ -332,10 +334,11 @@ typedef struct acpi_iort_root_complex
>  
>  } ACPI_IORT_ROOT_COMPLEX;
>  
> -/* Values for AtsAttribute field above */
> +/* Masks for AtsAttribute field above */
>  
> -#define ACPI_IORT_ATS_SUPPORTED         0x00000001  /* The root complex supports ATS */
> -#define ACPI_IORT_ATS_UNSUPPORTED       0x00000000  /* The root complex doesn't support ATS */
> +#define ACPI_IORT_ATS_SUPPORTED         (1)     /* The root complex ATS support */
> +#define ACPI_IORT_PRI_SUPPORTED         (1<<1)  /* The root complex PRI support */
> +#define ACPI_IORT_PASID_FWD_SUPPORTED   (1<<2)  /* The root complex PASID forward support */
>  
>  
>  typedef struct acpi_iort_smmu
> @@ -416,6 +419,19 @@ typedef struct acpi_iort_pmcg
>  
>  } ACPI_IORT_PMCG;
>  
> +typedef struct acpi_iort_rmr {
> +    UINT32 Flags;
> +    UINT32 RmrCount;
> +    UINT32 RmrOffset;
> +
> +} ACPI_IORT_RMR;
> +
> +typedef struct acpi_iort_rmr_desc {
> +    UINT64 BaseAddress;
> +    UINT64 Length;
> +    UINT32 Reserved;
> +
> +} ACPI_IORT_RMR_DESC;
>  
>  /*******************************************************************************
>   *
> @@ -459,6 +475,7 @@ enum AcpiIvrsType
>  {
>      ACPI_IVRS_TYPE_HARDWARE1        = 0x10,
>      ACPI_IVRS_TYPE_HARDWARE2        = 0x11,
> +    ACPI_IVRS_TYPE_HARDWARE3        = 0x40,
>      ACPI_IVRS_TYPE_MEMORY1          = 0x20,
>      ACPI_IVRS_TYPE_MEMORY2          = 0x21,
>      ACPI_IVRS_TYPE_MEMORY3          = 0x22
> @@ -555,7 +572,11 @@ enum AcpiIvrsDeviceEntryType
>      ACPI_IVRS_TYPE_ALIAS_START      = 67, /* Uses ACPI_IVRS_DEVICE8A */
>      ACPI_IVRS_TYPE_EXT_SELECT       = 70, /* Uses ACPI_IVRS_DEVICE8B */
>      ACPI_IVRS_TYPE_EXT_START        = 71, /* Uses ACPI_IVRS_DEVICE8B */
> -    ACPI_IVRS_TYPE_SPECIAL          = 72  /* Uses ACPI_IVRS_DEVICE8C */
> +    ACPI_IVRS_TYPE_SPECIAL          = 72, /* Uses ACPI_IVRS_DEVICE8C */
> +
> +    /* Variable-length device entries */
> +
> +    ACPI_IVRS_TYPE_HID              = 240 /* Uses ACPI_IVRS_DEVICE_HID */
>  };
>  
>  /* Values for Data field above */
> @@ -616,6 +637,18 @@ typedef struct acpi_ivrs_device8c
>  #define ACPI_IVHD_IOAPIC            1
>  #define ACPI_IVHD_HPET              2
>  
> +/* Type 240: variable-length device entry */
> +
> +typedef struct acpi_ivrs_device_hid
> +{
> +    ACPI_IVRS_DE_HEADER     Header;
> +    UINT64                  AcpiHid;
> +    UINT64                  AcpiCid;
> +    UINT8                   UidType;
> +    UINT8                   UidLength;
> +
> +} ACPI_IVRS_DEVICE_HID;
> +
>  
>  /* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition Block (IVMD) */
>  
> @@ -733,7 +766,8 @@ enum AcpiMadtType
>      ACPI_MADT_TYPE_GENERIC_MSI_FRAME        = 13,
>      ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR    = 14,
>      ACPI_MADT_TYPE_GENERIC_TRANSLATOR       = 15,
> -    ACPI_MADT_TYPE_RESERVED                 = 16    /* 16 and greater are reserved */
> +    ACPI_MADT_TYPE_MULTIPROC_WAKEUP         = 16,
> +    ACPI_MADT_TYPE_RESERVED                 = 17    /* 17 and greater are reserved */
>  };
>  
>  
> @@ -989,6 +1023,17 @@ typedef struct acpi_madt_generic_translator
>  
>  } ACPI_MADT_GENERIC_TRANSLATOR;
>  
> +/* 16: Multiprocessor wakeup (ACPI 6.4) */
> +
> +typedef struct acpi_madt_multiproc_wakeup
> +{
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT16                  MailboxVersion;
> +    UINT32                  Reserved;           /* reserved - must be zero */
> +    UINT64                  BaseAddress;
> +
> +} ACPI_MADT_MULTIPROC_WAKEUP;
> +
>  
>  /*
>   * Common flags fields for MADT subtables
> @@ -1299,6 +1344,7 @@ typedef struct acpi_nfit_system_address
>      UINT64                  Address;
>      UINT64                  Length;
>      UINT64                  MemoryMapping;
> +    UINT64                  LocationCookie;     /* ACPI 6.4 */
>  
>  } ACPI_NFIT_SYSTEM_ADDRESS;
>  
> @@ -1306,6 +1352,7 @@ typedef struct acpi_nfit_system_address
>  
>  #define ACPI_NFIT_ADD_ONLINE_ONLY       (1)     /* 00: Add/Online Operation Only */
>  #define ACPI_NFIT_PROXIMITY_VALID       (1<<1)  /* 01: Proximity Domain Valid */
> +#define ACPI_NFIT_LOCATION_COOKIE_VALID (1<<2)  /* 02: SPA location cookie valid (ACPI 6.4) */
>  
>  /* Range Type GUIDs appear in the include/acuuid.h file */
>  
> @@ -1529,7 +1576,8 @@ enum AcpiPcctType
>      ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2    = 2,    /* ACPI 6.1 */
>      ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE      = 3,    /* ACPI 6.2 */
>      ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE       = 4,    /* ACPI 6.2 */
> -    ACPI_PCCT_TYPE_RESERVED                     = 5     /* 5 and greater are reserved */
> +    ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE         = 5,    /* ACPI 6.4 */
> +    ACPI_PCCT_TYPE_RESERVED                     = 6     /* 6 and greater are reserved */
>  };
>  
>  /*
> @@ -1658,6 +1706,26 @@ typedef struct acpi_pcct_ext_pcc_slave
>  
>  } ACPI_PCCT_EXT_PCC_SLAVE;
>  
> +/* 5: HW Registers based Communications Subspace */
> +
> +typedef struct acpi_pcct_hw_reg
> +{
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT16                  Version;
> +    UINT64                  BaseAddress;
> +    UINT64                  Length;
> +    ACPI_GENERIC_ADDRESS    DoorbellRegister;
> +    UINT64                  DoorbellPreserve;
> +    UINT64                  DoorbellWrite;
> +    ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
> +    UINT64                  CmdCompleteMask;
> +    ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
> +    UINT64                  ErrorStatusMask;
> +    UINT32                  NominalLatency;
> +    UINT32                  MinTurnaroundTime;
> +
> +} ACPI_PCCT_HW_REG;
> +
>  
>  /* Values for doorbell flags above */
>  
> @@ -1728,6 +1796,79 @@ typedef struct acpi_pdtt_channel
>  #define ACPI_PDTT_TRIGGER_ORDER             (1<<2)
>  
>  
> +/*******************************************************************************
> + *
> + * PHAT - Platform Health Assessment Table (ACPI 6.4)
> + *        Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_phat
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +
> +} ACPI_TABLE_PHAT;
> +
> +/* Common header for PHAT subtables that follow main table */
> +
> +typedef struct acpi_phat_header
> +{
> +    UINT16                  Type;
> +    UINT16                  Length;
> +    UINT8                   Revision;
> +
> +} ACPI_PHAT_HEADER;
> +
> +
> +/* Values for Type field above */
> +
> +#define ACPI_PHAT_TYPE_FW_VERSION_DATA  0
> +#define ACPI_PHAT_TYPE_FW_HEALTH_DATA   1
> +#define ACPI_PHAT_TYPE_RESERVED         2 /* 0x02-0xFFFF are reserved */
> +
> +/*
> + * PHAT subtables, correspond to Type in ACPI_PHAT_HEADER
> + */
> +
> +/* 0: Firmware Version Data Record */
> +
> +typedef struct acpi_phat_version_data
> +{
> +    ACPI_PHAT_HEADER        Header;
> +    UINT8                   Reserved[3];
> +    UINT32                  ElementCount;
> +
> +} ACPI_PHAT_VERSION_DATA;
> +
> +typedef struct acpi_phat_version_element
> +{
> +    UINT8                   Guid[16];
> +    UINT64                  VersionValue;
> +    UINT32                  ProducerId;
> +
> +} ACPI_PHAT_VERSION_ELEMENT;
> +
> +
> +/* 1: Firmware Health Data Record */
> +
> +typedef struct acpi_phat_health_data
> +{
> +    ACPI_PHAT_HEADER        Header;
> +    UINT8                   Reserved[2];
> +    UINT8                   Health;
> +    UINT8                   DeviceGuid[16];
> +    UINT32                  DeviceSpecificOffset; /* Zero if no Device-specific data */
> +
> +} ACPI_PHAT_HEALTH_DATA;
> +
> +/* Values for Health field above */
> +
> +#define ACPI_PHAT_ERRORS_FOUND          0
> +#define ACPI_PHAT_NO_ERRORS             1
> +#define ACPI_PHAT_UNKNOWN_ERRORS        2
> +#define ACPI_PHAT_ADVISORY              3
> +
> +
>  /*******************************************************************************
>   *
>   * PMTT - Platform Memory Topology Table (ACPI 5.0)
> @@ -1738,7 +1879,11 @@ typedef struct acpi_pdtt_channel
>  typedef struct acpi_table_pmtt
>  {
>      ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> -    UINT32                  Reserved;
> +    UINT32                  MemoryDeviceCount;
> +    /*
> +     * Immediately followed by:
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
>  
>  } ACPI_TABLE_PMTT;
>  
> @@ -1752,6 +1897,12 @@ typedef struct acpi_pmtt_header
>      UINT16                  Length;
>      UINT16                  Flags;
>      UINT16                  Reserved2;
> +    UINT32                  MemoryDeviceCount;  /* Zero means no memory device structs follow */
> +    /*
> +     * Immediately followed by:
> +     * UINT8 TypeSpecificData[]
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
>  
>  } ACPI_PMTT_HEADER;
>  
> @@ -1760,7 +1911,8 @@ typedef struct acpi_pmtt_header
>  #define ACPI_PMTT_TYPE_SOCKET           0
>  #define ACPI_PMTT_TYPE_CONTROLLER       1
>  #define ACPI_PMTT_TYPE_DIMM             2
> -#define ACPI_PMTT_TYPE_RESERVED         3 /* 0x03-0xFF are reserved */
> +#define ACPI_PMTT_TYPE_RESERVED         3 /* 0x03-0xFE are reserved */
> +#define ACPI_PMTT_TYPE_VENDOR           0xFF
>  
>  /* Values for Flags field above */
>  
> @@ -1783,6 +1935,10 @@ typedef struct acpi_pmtt_socket
>      UINT16                  Reserved;
>  
>  } ACPI_PMTT_SOCKET;
> +    /*
> +     * Immediately followed by:
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
>  
>  
>  /* 1: Memory Controller subtable */
> @@ -1790,24 +1946,14 @@ typedef struct acpi_pmtt_socket
>  typedef struct acpi_pmtt_controller
>  {
>      ACPI_PMTT_HEADER        Header;
> -    UINT32                  ReadLatency;
> -    UINT32                  WriteLatency;
> -    UINT32                  ReadBandwidth;
> -    UINT32                  WriteBandwidth;
> -    UINT16                  AccessWidth;
> -    UINT16                  Alignment;
> +    UINT16                  ControllerId;
>      UINT16                  Reserved;
> -    UINT16                  DomainCount;
>  
>  } ACPI_PMTT_CONTROLLER;
> -
> -/* 1a: Proximity Domain substructure */
> -
> -typedef struct acpi_pmtt_domain
> -{
> -    UINT32                  ProximityDomain;
> -
> -} ACPI_PMTT_DOMAIN;
> +    /*
> +     * Immediately followed by:
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
>  
>  
>  /* 2: Physical Component Identifier (DIMM) */
> @@ -1815,14 +1961,27 @@ typedef struct acpi_pmtt_domain
>  typedef struct acpi_pmtt_physical_component
>  {
>      ACPI_PMTT_HEADER        Header;
> -    UINT16                  ComponentId;
> -    UINT16                  Reserved;
> -    UINT32                  MemorySize;
>      UINT32                  BiosHandle;
>  
>  } ACPI_PMTT_PHYSICAL_COMPONENT;
>  
>  
> +/* 0xFF: Vendor Specific Data */
> +
> +typedef struct acpi_pmtt_vendor_specific
> +{
> +    ACPI_PMTT_HEADER        Header;
> +    UINT8                   TypeUuid[16];
> +    UINT8                   Specific[];
> +    /*
> +     * Immediately followed by:
> +     * UINT8 VendorSpecificData[];
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
> +
> +} ACPI_PMTT_VENDOR_SPECIFIC;
> +
> +
>  /*******************************************************************************
>   *
>   * PPTT - Processor Properties Topology Table (ACPI 6.2)
> @@ -1885,6 +2044,15 @@ typedef struct acpi_pptt_cache
>  
>  } ACPI_PPTT_CACHE;
>  
> +/* 1: Cache Type Structure for PPTT version 3 */
> +
> +typedef struct acpi_pptt_cache_v1
> +{
> +    UINT32                  CacheId;
> +
> +} ACPI_PPTT_CACHE_V1;
> +
> +
>  /* Flags */
>  
>  #define ACPI_PPTT_SIZE_PROPERTY_VALID       (1)     /* Physical property valid */
> @@ -1894,6 +2062,7 @@ typedef struct acpi_pptt_cache
>  #define ACPI_PPTT_CACHE_TYPE_VALID          (1<<4)  /* Cache type valid */
>  #define ACPI_PPTT_WRITE_POLICY_VALID        (1<<5)  /* Write policy valid */
>  #define ACPI_PPTT_LINE_SIZE_VALID           (1<<6)  /* Line size valid */
> +#define ACPI_PPTT_CACHE_ID_VALID            (1<<7)  /* Cache ID valid */
>  
>  /* Masks for Attributes */
>  
> @@ -2108,6 +2277,7 @@ enum AcpiSdevType
>  /* Values for flags above */
>  
>  #define ACPI_SDEV_HANDOFF_TO_UNSECURE_OS    (1)
> +#define ACPI_SDEV_SECURE_COMPONENTS_PRESENT (1<<1)
>  
>  /*
>   * SDEV subtables
> @@ -2125,6 +2295,58 @@ typedef struct acpi_sdev_namespace
>  
>  } ACPI_SDEV_NAMESPACE;
>  
> +typedef struct acpi_sdev_secure_component
> +{
> +    UINT16                  SecureComponentOffset;
> +    UINT16                  SecureComponentLength;
> +
> +} ACPI_SDEV_SECURE_COMPONENT;
> +
> +
> +/*
> + * SDEV sub-subtables ("Components") for above
> + */
> +typedef struct acpi_sdev_component
> +{
> +    ACPI_SDEV_HEADER        Header;
> +
> +} ACPI_SDEV_COMPONENT;
> +
> +
> +/* Values for sub-subtable type above */
> +
> +enum AcpiSacType
> +{
> +    ACPI_SDEV_TYPE_ID_COMPONENT     = 0,
> +    ACPI_SDEV_TYPE_MEM_COMPONENT    = 1
> +};
> +
> +typedef struct acpi_sdev_id_component
> +{
> +    ACPI_SDEV_HEADER        Header;
> +    UINT16                  HardwareIdOffset;
> +    UINT16                  HardwareIdLength;
> +    UINT16                  SubsystemIdOffset;
> +    UINT16                  SubsystemIdLength;
> +    UINT16                  HardwareRevision;
> +    UINT8                   HardwareRevPresent;
> +    UINT8                   ClassCodePresent;
> +    UINT8                   PciBaseClass;
> +    UINT8                   PciSubClass;
> +    UINT8                   PciProgrammingXface;
> +
> +} ACPI_SDEV_ID_COMPONENT;
> +
> +typedef struct acpi_sdev_mem_component
> +{
> +    ACPI_SDEV_HEADER        Header;
> +    UINT32                  Reserved;
> +    UINT64                  MemoryBaseAddress;
> +    UINT64                  MemoryLength;
> +
> +} ACPI_SDEV_MEM_COMPONENT;
> +
> +
>  /* 1: PCIe Endpoint Device Based Device Structure */
>  
>  typedef struct acpi_sdev_pcie
> diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h
> index 1c79143b..d4260a1d 100644
> --- a/src/acpica/source/include/actbl3.h
> +++ b/src/acpica/source/include/actbl3.h
> @@ -177,6 +177,7 @@
>  #define ACPI_SIG_TCPA           "TCPA"      /* Trusted Computing Platform Alliance table */
>  #define ACPI_SIG_TPM2           "TPM2"      /* Trusted Platform Module 2.0 H/W interface table */
>  #define ACPI_SIG_UEFI           "UEFI"      /* Uefi Boot Optimization Table */
> +#define ACPI_SIG_VIOT           "VIOT"      /* Virtual I/O Translation Table */
>  #define ACPI_SIG_WAET           "WAET"      /* Windows ACPI Emulated devices Table */
>  #define ACPI_SIG_WDAT           "WDAT"      /* Watchdog Action Table */
>  #define ACPI_SIG_WDDT           "WDDT"      /* Watchdog Timer Description Table */
> @@ -463,7 +464,8 @@ typedef struct acpi_srat_generic_affinity
>  
>  /* Flags for ACPI_SRAT_GENERIC_AFFINITY */
>  
> -#define ACPI_SRAT_GENERIC_AFFINITY_ENABLED (1) /* 00: Use affinity structure */
> +#define ACPI_SRAT_GENERIC_AFFINITY_ENABLED     (1)      /* 00: Use affinity structure */
> +#define ACPI_SRAT_ARCHITECTURAL_TRANSACTIONS   (1<<1)   /* ACPI 6.4 */
>  
>  /*******************************************************************************
>   *
> @@ -682,6 +684,86 @@ typedef struct acpi_table_uefi
>  } ACPI_TABLE_UEFI;
>  
>  
> +/*******************************************************************************
> + *
> + * VIOT - Virtual I/O Translation Table
> + *        Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_viot
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +    UINT16                  NodeCount;
> +    UINT16                  NodeOffset;
> +    UINT8                   Reserved[8];
> +
> +} ACPI_TABLE_VIOT;
> +
> +/* VIOT subtable header */
> +
> +typedef struct acpi_viot_header
> +{
> +    UINT8                   Type;
> +    UINT8                   Reserved;
> +    UINT16                  Length;
> +
> +} ACPI_VIOT_HEADER;
> +
> +/* Values for Type field above */
> +
> +enum AcpiViotNodeType
> +{
> +    ACPI_VIOT_NODE_PCI_RANGE            = 0x01,
> +    ACPI_VIOT_NODE_MMIO                 = 0x02,
> +    ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI     = 0x03,
> +    ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO    = 0x04,
> +    ACPI_VIOT_RESERVED                  = 0x05
> +};
> +
> +/* VIOT subtables */
> +
> +typedef struct acpi_viot_pci_range
> +{
> +    ACPI_VIOT_HEADER        Header;
> +    UINT32                  EndpointStart;
> +    UINT16                  SegmentStart;
> +    UINT16                  SegmentEnd;
> +    UINT16                  BdfStart;
> +    UINT16                  BdfEnd;
> +    UINT16                  OutputNode;
> +    UINT8                   Reserved[6];
> +
> +} ACPI_VIOT_PCI_RANGE;
> +
> +typedef struct acpi_viot_mmio
> +{
> +    ACPI_VIOT_HEADER        Header;
> +    UINT32                  Endpoint;
> +    UINT64                  BaseAddress;
> +    UINT16                  OutputNode;
> +    UINT8                   Reserved[6];
> +
> +} ACPI_VIOT_MMIO;
> +
> +typedef struct acpi_viot_virtio_iommu_pci
> +{
> +    ACPI_VIOT_HEADER        Header;
> +    UINT16                  Segment;
> +    UINT16                  Bdf;
> +    UINT8                   Reserved[8];
> +
> +} ACPI_VIOT_VIRTIO_IOMMU_PCI;
> +
> +typedef struct acpi_viot_virtio_iommu_mmio
> +{
> +    ACPI_VIOT_HEADER        Header;
> +    UINT8                   Reserved[4];
> +    UINT64                  BaseAddress;
> +
> +} ACPI_VIOT_VIRTIO_IOMMU_MMIO;
> +
> +
>  /*******************************************************************************
>   *
>   * WAET - Windows ACPI Emulated devices Table
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index b520f641..4d485422 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -171,6 +171,7 @@ extern const char                       *AcpiGbl_MaxDecode[];
>  extern const char                       *AcpiGbl_MemDecode[];
>  extern const char                       *AcpiGbl_MinDecode[];
>  extern const char                       *AcpiGbl_MtpDecode[];
> +extern const char                       *AcpiGbl_PhyDecode[];
>  extern const char                       *AcpiGbl_RngDecode[];
>  extern const char                       *AcpiGbl_RwDecode[];
>  extern const char                       *AcpiGbl_ShrDecode[];
> diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h
> index 72b253a4..48f4c9a1 100644
> --- a/src/acpica/source/include/acuuid.h
> +++ b/src/acpica/source/include/acuuid.h
> @@ -210,5 +210,6 @@
>  #define UUID_DEVICE_GRAPHS              "ab02a46b-74c7-45a2-bd68-f7d344ef2153"
>  #define UUID_HIERARCHICAL_DATA_EXTENSION "dbb8e3e6-5886-4ba6-8795-1319f52a966b"
>  #define UUID_CORESIGHT_GRAPH            "3ecbc8b6-1d0e-4fb3-8107-e627f805c6cd"
> +#define UUID_USB4_CAPABILITIES          "23a0d13a-26ab-486c-9c5f-0ffa525a575a"
>  
>  #endif /* __ACUUID_H__ */
> diff --git a/src/acpica/source/include/amlresrc.h b/src/acpica/source/include/amlresrc.h
> index 094ab1d9..a97a1c63 100644
> --- a/src/acpica/source/include/amlresrc.h
> +++ b/src/acpica/source/include/amlresrc.h
> @@ -183,6 +183,7 @@
>  #define ACPI_RESTAG_IORESTRICTION               "_IOR"
>  #define ACPI_RESTAG_LENGTH                      "_LEN"
>  #define ACPI_RESTAG_LINE                        "_LIN"
> +#define ACPI_RESTAG_LOCALPORT                   "_PRT"
>  #define ACPI_RESTAG_MEMATTRIBUTES               "_MTP"  /* Memory(0), Reserved(1), ACPI(2), NVS(3) */
>  #define ACPI_RESTAG_MEMTYPE                     "_MEM"  /* NonCache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */
>  #define ACPI_RESTAG_MAXADDR                     "_MAX"
> @@ -192,6 +193,7 @@
>  #define ACPI_RESTAG_MODE                        "_MOD"
>  #define ACPI_RESTAG_PARITY                      "_PAR"
>  #define ACPI_RESTAG_PHASE                       "_PHA"
> +#define ACPI_RESTAG_PHYTYPE                     "_PHY"
>  #define ACPI_RESTAG_PIN                         "_PIN"
>  #define ACPI_RESTAG_PINCONFIG                   "_PPI"
>  #define ACPI_RESTAG_PINCONFIG_TYPE              "_TYP"
> @@ -568,7 +570,8 @@ typedef struct aml_resource_gpio
>  #define AML_RESOURCE_I2C_SERIALBUSTYPE          1
>  #define AML_RESOURCE_SPI_SERIALBUSTYPE          2
>  #define AML_RESOURCE_UART_SERIALBUSTYPE         3
> -#define AML_RESOURCE_MAX_SERIALBUSTYPE          3
> +#define AML_RESOURCE_CSI2_SERIALBUSTYPE         4
> +#define AML_RESOURCE_MAX_SERIALBUSTYPE          4
>  #define AML_RESOURCE_VENDOR_SERIALBUSTYPE       192 /* Vendor defined is 0xC0-0xFF (NOT SUPPORTED) */
>  
>  typedef struct aml_resource_common_serialbus
> @@ -578,6 +581,24 @@ typedef struct aml_resource_common_serialbus
>  
>  } AML_RESOURCE_COMMON_SERIALBUS;
>  
> +
> +typedef struct aml_resource_csi2_serialbus
> +{
> +    AML_RESOURCE_LARGE_HEADER_COMMON
> +    AML_RESOURCE_SERIAL_COMMON
> +
> +    /*
> +     * Optional fields follow immediately:
> +     * 1) Vendor Data bytes
> +     * 2) Resource Source String
> +     */
> +
> +} AML_RESOURCE_CSI2_SERIALBUS;
> +
> +#define AML_RESOURCE_CSI2_REVISION              1       /* ACPI 6.4 */
> +#define AML_RESOURCE_CSI2_TYPE_REVISION         1       /* ACPI 6.4 */
> +#define AML_RESOURCE_CSI2_MIN_DATA_LEN          0       /* ACPI 6.4 */
> +
>  typedef struct aml_resource_i2c_serialbus
>  {
>      AML_RESOURCE_LARGE_HEADER_COMMON
> @@ -617,7 +638,6 @@ typedef struct aml_resource_spi_serialbus
>  #define AML_RESOURCE_SPI_TYPE_REVISION          1       /* ACPI 5.0 */
>  #define AML_RESOURCE_SPI_MIN_DATA_LEN           9
>  
> -
>  typedef struct aml_resource_uart_serialbus
>  {
>      AML_RESOURCE_LARGE_HEADER_COMMON
> @@ -792,6 +812,7 @@ typedef union aml_resource
>      AML_RESOURCE_I2C_SERIALBUS              I2cSerialBus;
>      AML_RESOURCE_SPI_SERIALBUS              SpiSerialBus;
>      AML_RESOURCE_UART_SERIALBUS             UartSerialBus;
> +    AML_RESOURCE_CSI2_SERIALBUS             Csi2SerialBus;
>      AML_RESOURCE_COMMON_SERIALBUS           CommonSerialBus;
>      AML_RESOURCE_PIN_FUNCTION               PinFunction;
>      AML_RESOURCE_PIN_CONFIG                 PinConfig;
> diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
> index 57c61717..148190a3 100644
> --- a/src/acpica/source/include/platform/acgcc.h
> +++ b/src/acpica/source/include/platform/acgcc.h
> @@ -203,7 +203,7 @@ typedef __builtin_va_list       va_list;
>  #endif
>  
>  /*
> - * Explictly mark intentional explicit fallthrough to silence
> + * Explicitly mark intentional explicit fallthrough to silence
>   * -Wimplicit-fallthrough in GCC 7.1+.
>   */
>  
> 

Acked-by: Alex Hung <alex.hung@canonical.com>
Ivan Hu April 12, 2021, 6:46 a.m. UTC | #2
On 4/6/21 5:59 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/JIJRABDX3TW4BDBVXRT5IG2GPBJXWQEI/
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  src/acpica/source/common/acfileio.c           |   3 +
>  src/acpica/source/common/ahids.c              |   2 +
>  src/acpica/source/common/ahpredef.c           |   4 +
>  src/acpica/source/common/ahtable.c            |   3 +
>  src/acpica/source/common/ahuuids.c            |   1 +
>  src/acpica/source/common/cmfsize.c            |   2 +-
>  src/acpica/source/common/dmrestag.c           |  14 +-
>  src/acpica/source/common/dmtable.c            | 103 +++-
>  src/acpica/source/common/dmtbdump1.c          |  76 +++
>  src/acpica/source/common/dmtbdump2.c          | 468 ++++++++++++------
>  src/acpica/source/common/dmtbdump3.c          | 100 ++++
>  src/acpica/source/common/dmtbinfo1.c          |  34 +-
>  src/acpica/source/common/dmtbinfo2.c          | 247 +++++++--
>  src/acpica/source/common/dmtbinfo3.c          |  72 +++
>  src/acpica/source/compiler/aslallocate.c      |   2 +-
>  src/acpica/source/compiler/aslascii.c         |   4 +-
>  src/acpica/source/compiler/aslcompiler.h      |   4 +
>  src/acpica/source/compiler/aslcompiler.l      |   1 +
>  src/acpica/source/compiler/aslerror.c         |   6 +-
>  src/acpica/source/compiler/aslhelpers.y       |   5 +
>  src/acpica/source/compiler/aslmap.c           |   1 +
>  src/acpica/source/compiler/aslmessages.c      |   3 +-
>  src/acpica/source/compiler/aslmessages.h      |   1 +
>  src/acpica/source/compiler/aslnamesp.c        |   3 +-
>  src/acpica/source/compiler/aslopcodes.c       |   2 +-
>  src/acpica/source/compiler/asloperands.c      |   2 +-
>  src/acpica/source/compiler/aslparser.y        |   2 +-
>  src/acpica/source/compiler/aslprintf.c        |   2 +-
>  src/acpica/source/compiler/aslresource.c      |   5 +
>  src/acpica/source/compiler/aslresources.y     |  20 +-
>  src/acpica/source/compiler/aslrestype2s.c     | 136 +++++
>  src/acpica/source/compiler/asltokens.y        |   1 +
>  src/acpica/source/compiler/asltransform.c     |   5 +
>  src/acpica/source/compiler/asltypes.y         |   2 +
>  src/acpica/source/compiler/dtcompiler.h       |  15 +
>  src/acpica/source/compiler/dttable1.c         | 143 +++++-
>  src/acpica/source/compiler/dttable2.c         | 454 ++++++++++++++---
>  src/acpica/source/compiler/dttemplate.h       | 343 ++++++++-----
>  src/acpica/source/compiler/dtutils.c          |   5 +
>  .../components/disassembler/dmresrcl2.c       |  90 +++-
>  .../source/components/events/evhandler.c      |   7 +
>  .../source/components/events/evregion.c       |  75 +--
>  .../source/components/events/evxfregn.c       |   1 +
>  .../source/components/namespace/nsaccess.c    |   3 +-
>  .../source/components/namespace/nsrepair2.c   |  18 +-
>  .../source/components/resources/rscalc.c      |   4 +-
>  .../source/components/resources/rsdump.c      |  10 +
>  .../source/components/resources/rsdumpinfo.c  |  15 +
>  .../source/components/resources/rsinfo.c      |   6 +-
>  .../source/components/resources/rslist.c      |  10 +-
>  .../source/components/resources/rsmisc.c      |  18 +
>  .../source/components/resources/rsserial.c    |  70 +++
>  .../source/components/utilities/utresdecode.c |  11 +-
>  .../source/components/utilities/utresrc.c     |   1 +
>  src/acpica/source/include/acdisasm.h          |  44 +-
>  src/acpica/source/include/acobject.h          |   1 +
>  src/acpica/source/include/acoutput.h          |   2 +-
>  src/acpica/source/include/acpixf.h            |   2 +-
>  src/acpica/source/include/acpredef.h          |  15 +
>  src/acpica/source/include/acresrc.h           |   4 +
>  src/acpica/source/include/acrestyp.h          |  12 +-
>  src/acpica/source/include/actbinfo.h          |  26 +-
>  src/acpica/source/include/actbl1.h            |  63 ++-
>  src/acpica/source/include/actbl2.h            | 280 +++++++++--
>  src/acpica/source/include/actbl3.h            |  84 +++-
>  src/acpica/source/include/acutils.h           |   1 +
>  src/acpica/source/include/acuuid.h            |   1 +
>  src/acpica/source/include/amlresrc.h          |  25 +-
>  src/acpica/source/include/platform/acgcc.h    |   2 +-
>  69 files changed, 2717 insertions(+), 480 deletions(-)
> 
> diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c
> index 628cf7a4..99f89729 100644
> --- a/src/acpica/source/common/acfileio.c
> +++ b/src/acpica/source/common/acfileio.c
> @@ -559,6 +559,9 @@ AcValidateTableHeader (
>  
>      if (Actual < sizeof (ACPI_TABLE_HEADER))
>      {
> +        fprintf (stderr,
> +            "Could not read entire table header: Actual %u, Requested %u\n",
> +            (UINT32) Actual, (UINT32) sizeof (ACPI_TABLE_HEADER));
>          return (AE_ERROR);
>      }
>  
> diff --git a/src/acpica/source/common/ahids.c b/src/acpica/source/common/ahids.c
> index 1e6edaf7..b58bc082 100644
> --- a/src/acpica/source/common/ahids.c
> +++ b/src/acpica/source/common/ahids.c
> @@ -188,6 +188,8 @@ const AH_DEVICE_ID  AslDeviceIds[] =
>      {"ACPI0012",    "NVDIMM Root Device"},
>      {"ACPI0013",    "Generic Event Device"},
>      {"ACPI0014",    "Wireless Power Calibration Device"},
> +    {"ACPI0015",    "USB4 host interface device"},
> +    {"ACPI0016",    "Compute Express Link Host Bridge"},
>      {"ADMA0F28",    "Intel Audio DMA"},
>      {"AMCR0F28",    "Intel Audio Machine Driver"},
>      {"ATK4001",     "Asus Radio Control Button"},
> diff --git a/src/acpica/source/common/ahpredef.c b/src/acpica/source/common/ahpredef.c
> index e6e2ffc7..d92417d1 100644
> --- a/src/acpica/source/common/ahpredef.c
> +++ b/src/acpica/source/common/ahpredef.c
> @@ -200,12 +200,16 @@ const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
>      AH_PREDEF ("_BMC",    "Battery Maintenance Control", "Sets battery maintenance and control features"),
>      AH_PREDEF ("_BMD",    "Battery Maintenance Data", "Returns battery maintenance, control, and state data"),
>      AH_PREDEF ("_BMS",    "Battery Measurement Sampling Time", "Sets the battery measurement sampling time"),
> +    AH_PREDEF ("_BPC",    "Battery Power Characteristics", "Returns static values used to configure power threshold support in the platform firmware"),
> +    AH_PREDEF ("_BPS",    "Battery Power State", "Returns the power delivery capabilities of the battery at the present time"),
> +    AH_PREDEF ("_BPT",    "Battery Power Threshold", "Set a relative battery peak power capability change threshold"),
>      AH_PREDEF ("_BQC",    "Brightness Query Current", "Returns the current display brightness level"),
>      AH_PREDEF ("_BST",    "Battery Status", "Returns a Control Method Battery status block"),
>      AH_PREDEF ("_BTH",    "Battery Throttle Limit", "Thermal limit for charging and discharging"),
>      AH_PREDEF ("_BTM",    "Battery Time", "Returns the battery runtime"),
>      AH_PREDEF ("_BTP",    "Battery Trip Point", "Sets a Control Method Battery trip point"),
>      AH_PREDEF ("_CBA",    "Configuration Base Address", "Sets the base address for a PCI Express host bridge"),
> +    AH_PREDEF ("_CBR",    "CXL Host Bridge Register Info", "Get the memory location of CXL Host Bridge Registers"),
>      AH_PREDEF ("_CCA",    "Cache Coherency Attribute", "Returns a device's support level for cache coherency"),
>      AH_PREDEF ("_CDM",    "Clock Domain", "Returns a logical processor's clock domain identifier"),
>      AH_PREDEF ("_CID",    "Compatible ID", "Returns a device's Plug and Play Compatible ID list"),
> diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c
> index ac3c416b..e318ddf3 100644
> --- a/src/acpica/source/common/ahtable.c
> +++ b/src/acpica/source/common/ahtable.c
> @@ -203,6 +203,7 @@ const AH_TABLE      AcpiGbl_SupportedTables[] =
>      {ACPI_SIG_BERT, "Boot Error Record Table"},
>      {ACPI_SIG_BGRT, "Boot Graphics Resource Table"},
>      {ACPI_SIG_BOOT, "Simple Boot Flag Table"},
> +    {ACPI_SIG_CEDT, "CXL Early Discovery Table"},
>      {ACPI_SIG_CPEP, "Corrected Platform Error Polling table"},
>      {ACPI_SIG_CSRT, "Core System Resource Table"},
>      {ACPI_SIG_DBG2, "Debug Port table type 2"},
> @@ -231,6 +232,7 @@ const AH_TABLE      AcpiGbl_SupportedTables[] =
>      {ACPI_SIG_MSDM, "Microsoft Data Management table"},
>      {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"},
>      {ACPI_SIG_PCCT, "Platform Communications Channel Table"},
> +    {ACPI_SIG_PHAT, "Platform Health Assessment Table"},
>      {ACPI_SIG_PDTT, "Platform Debug Trigger Table"},
>      {ACPI_SIG_PMTT, "Platform Memory Topology Table"},
>      {ACPI_SIG_PPTT, "Processor Properties Topology Table"},
> @@ -251,6 +253,7 @@ const AH_TABLE      AcpiGbl_SupportedTables[] =
>      {ACPI_SIG_TCPA, "Trusted Computing Platform Alliance 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"},
>      {ACPI_SIG_WAET, "Windows ACPI Emulated Devices Table"},
>      {ACPI_SIG_WDAT, "Watchdog Action Table"},
>      {ACPI_SIG_WDDT, "Watchdog Description Table"},
> diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c
> index 427f9169..eef1c568 100644
> --- a/src/acpica/source/common/ahuuids.c
> +++ b/src/acpica/source/common/ahuuids.c
> @@ -208,6 +208,7 @@ const AH_UUID  Gbl_AcpiUuids[] =
>      {"Device Graphs for _DSD",      UUID_DEVICE_GRAPHS},
>      {"Hierarchical Data Extension", UUID_HIERARCHICAL_DATA_EXTENSION},
>      {"ARM Coresight Graph",         UUID_CORESIGHT_GRAPH},
> +    {"USB4 Capabilities",           UUID_USB4_CAPABILITIES},
>      {NULL, NULL}
>  };
>  
> diff --git a/src/acpica/source/common/cmfsize.c b/src/acpica/source/common/cmfsize.c
> index e0c66e31..38ec915a 100644
> --- a/src/acpica/source/common/cmfsize.c
> +++ b/src/acpica/source/common/cmfsize.c
> @@ -1,6 +1,6 @@
>  /******************************************************************************
>   *
> - * Module Name: cfsize - Common get file size function
> + * Module Name: cmfsize - Common get file size function
>   *
>   *****************************************************************************/
>  
> diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
> index d8a04406..59d5c4f4 100644
> --- a/src/acpica/source/common/dmrestag.c
> +++ b/src/acpica/source/common/dmrestag.c
> @@ -384,6 +384,14 @@ static const ACPI_RESOURCE_TAG      AcpiDmGpioIoTags[] =
>  
>  /* Subtype tables for SerialBus descriptors */
>  
> +static const ACPI_RESOURCE_TAG      AcpiDmCsi2SerialBusTags[] =    /* ACPI 6.4 */
> +{
> +    {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
> +    {( 7 * 8) + 0,  ACPI_RESTAG_PHYTYPE},
> +    {( 7 * 8) + 2,  ACPI_RESTAG_LOCALPORT},
> +    {0,             NULL}
> +};
> +
>  static const ACPI_RESOURCE_TAG      AcpiDmI2cSerialBusTags[] =
>  {
>      {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
> @@ -424,6 +432,7 @@ static const ACPI_RESOURCE_TAG      AcpiDmUartSerialBusTags[] =
>      {0,             NULL}
>  };
>  
> +
>  /* Subtype tables for PinFunction descriptor */
>  
>  static const ACPI_RESOURCE_TAG      AcpiDmPinFunctionTags[] =
> @@ -539,7 +548,8 @@ static const ACPI_RESOURCE_TAG      *AcpiGbl_SerialResourceTags[] =
>      NULL,                           /* 0x00 Reserved */
>      AcpiDmI2cSerialBusTags,         /* 0x01 I2C SerialBus */
>      AcpiDmSpiSerialBusTags,         /* 0x02 SPI SerialBus */
> -    AcpiDmUartSerialBusTags         /* 0x03 UART SerialBus */
> +    AcpiDmUartSerialBusTags,        /* 0x03 UART SerialBus */
> +    AcpiDmCsi2SerialBusTags         /* 0x04 CSI2 SerialBus */
>  };
>  
>  /*
> @@ -987,7 +997,7 @@ AcpiDmGetResourceTag (
>  
>      case ACPI_RESOURCE_NAME_SERIAL_BUS:
>  
> -        /* SerialBus has 3 subtypes: I2C, SPI, and UART */
> +        /* SerialBus has 4 subtypes: I2C, SPI, UART, and CSI2 */
>  
>          if ((Resource->CommonSerialBus.Type == 0) ||
>              (Resource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE))
> diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
> index 3e4c6c34..ffec889a 100644
> --- a/src/acpica/source/common/dmtable.c
> +++ b/src/acpica/source/common/dmtable.c
> @@ -184,6 +184,12 @@ static const char           *AcpiDmAsfSubnames[] =
>      "Unknown Subtable Type"         /* Reserved */
>  };
>  
> +static const char           *AcpiDmCedtSubnames[] =
> +{
> +    "CXL Host Bridge Structure",
> +    "Unknown Subtable Type"         /* Reserved */
> +};
> +
>  static const char           *AcpiDmDmarSubnames[] =
>  {
>      "Hardware Unit Definition",
> @@ -367,15 +373,24 @@ static const char           *AcpiDmPcctSubnames[] =
>      "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
>      "Extended PCC Master Subspace",     /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
>      "Extended PCC Slave Subspace",      /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
> +    "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */
>      "Unknown Subtable Type"             /* Reserved */
>  };
>  
> +static const char           *AcpiDmPhatSubnames[] =
> +{
> +    "Firmware Version Data",        /* ACPI_PHAT_TYPE_FW_VERSION_DATA */
> +    "Firmware Health Data",         /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */
> +    "Unknown Subtable Type"         /* Reserved */
> +};
> +
>  static const char           *AcpiDmPmttSubnames[] =
>  {
>      "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
>      "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
>      "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM */
> -    "Unknown Subtable Type"         /* Reserved */
> +    "Unknown Subtable Type",        /* Reserved */
> +    "Vendor Specific"               /* ACPI_PMTT_TYPE_VENDOR */
>  };
>  
>  static const char           *AcpiDmPpttSubnames[] =
> @@ -434,6 +449,16 @@ static const char           *AcpiDmLpitSubnames[] =
>      "Unknown Subtable Type"         /* Reserved */
>  };
>  
> +static const char           *AcpiDmViotSubnames[] =
> +{
> +    "Unknown Subtable Type",        /* 0 -Reserved */
> +    "PCI Range",
> +    "MMIO Endpoint",
> +    "VirtIO-PCI IOMMU",
> +    "VirtIO-MMIO IOMMU",
> +    "Unknown Subtable Type"         /* Reserved */
> +};
> +
>  #define ACPI_FADT_PM_RESERVED       9
>  
>  static const char           *AcpiDmFadtProfiles[] =
> @@ -474,8 +499,8 @@ static const char           *AcpiDmGasAccessWidth[] =
>   * handler. This table must be NULL terminated. RSDP and FACS are
>   * special-cased elsewhere.
>   *
> - * Note: Any tables added here should be duplicated within AcpiSupportedTables
> - * in the file common/ahtable.c
> + * Note: Any tables added here should be duplicated within
> + * AcpiGbl_SupportedTables in the file common/ahtable.c
>   *
>   ******************************************************************************/
>  
> @@ -485,6 +510,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>      {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert},
>      {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt},
>      {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot},
> +    {ACPI_SIG_CEDT, NULL,                   AcpiDmDumpCedt, DtCompileCedt,  TemplateCedt},
>      {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep},
>      {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt},
>      {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2,    AcpiDmDumpDbg2, DtCompileDbg2,  TemplateDbg2},
> @@ -512,6 +538,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>      {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
>      {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
>      {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt,    AcpiDmDumpPdtt, DtCompilePdtt,  TemplatePdtt},
> +    {ACPI_SIG_PHAT, NULL,                   AcpiDmDumpPhat, DtCompilePhat,  TemplatePhat},
>      {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
>      {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
>      {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
> @@ -529,6 +556,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>      {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
>      {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    AcpiDmDumpTpm2, DtCompileTpm2,  TemplateTpm2},
>      {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
> +    {ACPI_SIG_VIOT, AcpiDmTableInfoViot,    AcpiDmDumpViot, DtCompileViot,  TemplateViot},
>      {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
>      {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat},
>      {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
> @@ -936,6 +964,7 @@ AcpiDmDumpTable (
>          case ACPI_DMT_CHKSUM:
>          case ACPI_DMT_SPACEID:
>          case ACPI_DMT_ACCWIDTH:
> +        case ACPI_DMT_CEDT:
>          case ACPI_DMT_IVRS:
>          case ACPI_DMT_GTDT:
>          case ACPI_DMT_MADT:
> @@ -952,6 +981,7 @@ AcpiDmDumpTable (
>          case ACPI_DMT_ERSTACT:
>          case ACPI_DMT_ERSTINST:
>          case ACPI_DMT_DMAR_SCOPE:
> +        case ACPI_DMT_VIOT:
>  
>              ByteLength = 1;
>              break;
> @@ -961,6 +991,7 @@ AcpiDmDumpTable (
>          case ACPI_DMT_HEST:
>          case ACPI_DMT_HMAT:
>          case ACPI_DMT_NFIT:
> +        case ACPI_DMT_PHAT:
>  
>              ByteLength = 2;
>              break;
> @@ -1030,6 +1061,17 @@ AcpiDmDumpTable (
>              ByteLength = SubtableLength;
>              break;
>  
> +        case ACPI_DMT_PMTT_VENDOR:
> +            /*
> +             * Calculate the length of the vendor data for the PMTT table:
> +             * Length = (Current Subtable ptr + Subtable length) -
> +             *          Start of the vendor data (Target)
> +             */
> +            ByteLength = ((ACPI_CAST_PTR (char, Table) +
> +                            (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
> +                            ACPI_CAST_PTR (char, Target));
> +            break;
> +
>          case ACPI_DMT_STRING:
>  
>              ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
> @@ -1346,6 +1388,20 @@ AcpiDmDumpTable (
>              AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
>              break;
>  
> +        case ACPI_DMT_CEDT:
> +
> +            /* CEDT subtable types */
> +
> +            Temp8 = *Target;
> +            if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
> +            {
> +                Temp8 = ACPI_CEDT_TYPE_RESERVED;
> +            }
> +
> +            AcpiOsPrintf (UINT8_FORMAT, *Target,
> +                AcpiDmCedtSubnames[Temp8]);
> +            break;
> +
>          case ACPI_DMT_DMAR:
>  
>              /* DMAR subtable types */
> @@ -1559,16 +1615,33 @@ AcpiDmDumpTable (
>                  AcpiDmPcctSubnames[Temp8]);
>              break;
>  
> +        case ACPI_DMT_PHAT:
> +
> +            /* PMTT subtable types */
> +
> +            Temp16 = *Target;
> +            if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
> +            {
> +                Temp16 = ACPI_PHAT_TYPE_RESERVED;
> +            }
> +
> +            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16(Target),
> +                AcpiDmPhatSubnames[Temp16]);
> +            break;
> +
>          case ACPI_DMT_PMTT:
>  
>              /* PMTT subtable types */
>  
>              Temp8 = *Target;
> -            if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
> +            if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
> +            {
> +                Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
> +            }
> +            else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
>              {
>                  Temp8 = ACPI_PMTT_TYPE_RESERVED;
>              }
> -
>              AcpiOsPrintf (UINT8_FORMAT, *Target,
>                  AcpiDmPmttSubnames[Temp8]);
>              break;
> @@ -1599,6 +1672,8 @@ AcpiDmDumpTable (
>              break;
>  
>          case ACPI_DMT_RAW_BUFFER:
> +        case ACPI_DMT_BUFFER:
> +        case ACPI_DMT_PMTT_VENDOR:
>  
>              if (ByteLength == 0)
>              {
> @@ -1606,8 +1681,7 @@ AcpiDmDumpTable (
>                  break;
>              }
>  
> -            AcpiDmDumpBuffer (Table, CurrentOffset, ByteLength,
> -                CurrentOffset, NULL);
> +            AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL);
>              break;
>  
>          case ACPI_DMT_SDEV:
> @@ -1676,6 +1750,7 @@ AcpiDmDumpTable (
>              {
>              case ACPI_IVRS_TYPE_HARDWARE1:
>              case ACPI_IVRS_TYPE_HARDWARE2:
> +            case ACPI_IVRS_TYPE_HARDWARE3:
>  
>                  Name = AcpiDmIvrsSubnames[0];
>                  break;
> @@ -1710,6 +1785,20 @@ AcpiDmDumpTable (
>                  AcpiDmLpitSubnames[Temp32]);
>              break;
>  
> +        case ACPI_DMT_VIOT:
> +
> +            /* VIOT subtable types */
> +
> +            Temp8 = *Target;
> +            if (Temp8 > ACPI_VIOT_RESERVED)
> +            {
> +                Temp8 = ACPI_VIOT_RESERVED;
> +            }
> +
> +            AcpiOsPrintf (UINT8_FORMAT, *Target,
> +                AcpiDmViotSubnames[Temp8]);
> +            break;
> +
>          case ACPI_DMT_EXIT:
>  
>              return (AE_OK);
> diff --git a/src/acpica/source/common/dmtbdump1.c b/src/acpica/source/common/dmtbdump1.c
> index 72d667e9..8fc53acf 100644
> --- a/src/acpica/source/common/dmtbdump1.c
> +++ b/src/acpica/source/common/dmtbdump1.c
> @@ -329,6 +329,82 @@ AcpiDmDumpAsf (
>      }
>  }
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmDumpCedt
> + *
> + * PARAMETERS:  Table               - A CEDT table
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Format the contents of a CEDT. This table type consists
> + *              of an open-ended number of subtables.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmDumpCedt (
> +    ACPI_TABLE_HEADER       *Table)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_CEDT_HEADER        *Subtable;
> +    UINT32                  Length = Table->Length;
> +    UINT32                  Offset = sizeof (ACPI_TABLE_CEDT);
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +
> +
> +    /* There is no main table (other than the standard ACPI header) */
> +
> +    Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
> +    while (Offset < Table->Length)
> +    {
> +        /* Common subtable header */
> +
> +        AcpiOsPrintf ("\n");
> +        Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +            Subtable->Length, AcpiDmTableInfoCedtHdr);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +        switch (Subtable->Type)
> +        {
> +        case ACPI_CEDT_TYPE_CHBS:
> +
> +            InfoTable = AcpiDmTableInfoCedt0;
> +            break;
> +
> +        default:
> +
> +            AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
> +                Subtable->Type);
> +
> +            /* Attempt to continue */
> +
> +            if (!Subtable->Length)
> +            {
> +                AcpiOsPrintf ("Invalid zero length subtable\n");
> +                return;
> +            }
> +            goto NextSubtable;
> +        }
> +
> +        Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +            Subtable->Length, InfoTable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +NextSubtable:
> +        /* Point to next subtable */
> +
> +        Offset += Subtable->Length;
> +        Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
> +            Subtable->Length);
> +    }
> +}
>  
>  /*******************************************************************************
>   *
> diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c
> index b8ece375..80d9d459 100644
> --- a/src/acpica/source/common/dmtbdump2.c
> +++ b/src/acpica/source/common/dmtbdump2.c
> @@ -181,6 +181,7 @@ AcpiDmDumpIort (
>      ACPI_IORT_NODE          *IortNode;
>      ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
>      ACPI_IORT_SMMU          *IortSmmu = NULL;
> +    ACPI_IORT_RMR           *IortRmr = NULL;
>      UINT32                  Offset;
>      UINT32                  NodeOffset;
>      UINT32                  Length;
> @@ -188,6 +189,7 @@ AcpiDmDumpIort (
>      char                    *String;
>      UINT32                  i;
>      UINT32                  MappingByteLength;
> +    UINT8                   Revision;
>  
>  
>      /* Main table */
> @@ -198,6 +200,17 @@ AcpiDmDumpIort (
>          return;
>      }
>  
> +    Revision = Table->Revision;
> +
> +    /* Both IORT Rev E and E.a have known issues and are not supported */
> +
> +    if (Revision == 1 || Revision == 2)
> +    {
> +        AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n",
> +                      Revision);
> +        return;
> +    }
> +
>      Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
>      Offset = sizeof (ACPI_TABLE_IORT);
>  
> @@ -221,8 +234,18 @@ AcpiDmDumpIort (
>          IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
>          AcpiOsPrintf ("\n");
>          Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
> -        Status = AcpiDmDumpTable (Table->Length, Offset,
> -            IortNode, Length, AcpiDmTableInfoIortHdr);
> +
> +        if (Revision == 0)
> +        {
> +            Status = AcpiDmDumpTable (Table->Length, Offset,
> +                IortNode, Length, AcpiDmTableInfoIortHdr);
> +        }
> +        else if (Revision >= 3)
> +        {
> +            Status = AcpiDmDumpTable (Table->Length, Offset,
> +                IortNode, Length, AcpiDmTableInfoIortHdr3);
> +        }
> +
>          if (ACPI_FAILURE (Status))
>          {
>              return;
> @@ -272,6 +295,13 @@ AcpiDmDumpIort (
>              Length = IortNode->Length - NodeOffset;
>              break;
>  
> +        case ACPI_IORT_NODE_RMR:
> +
> +            InfoTable = AcpiDmTableInfoIort6;
> +            Length = IortNode->Length - NodeOffset;
> +            IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset);
> +            break;
> +
>          default:
>  
>              AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
> @@ -391,7 +421,30 @@ AcpiDmDumpIort (
>              }
>              break;
>  
> -        default:
> +        case ACPI_IORT_NODE_RMR:
> +
> +            /* Validate IortRmr to avoid compiler warnings */
> +            if (IortRmr)
> +            {
> +                NodeOffset = IortRmr->RmrOffset;
> +                Length = sizeof (ACPI_IORT_RMR_DESC);
> +                for (i = 0; i < IortRmr->RmrCount; i++)
> +                {
> +                    AcpiOsPrintf ("\n");
> +                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
> +                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
> +                        Length, AcpiDmTableInfoIort6a);
> +                    if (ACPI_FAILURE (Status))
> +                    {
> +                        return;
> +                    }
> +
> +                    NodeOffset += Length;
> +                }
> +            }
> +            break;
> +
> +	default:
>  
>              break;
>          }
> @@ -434,8 +487,6 @@ NextSubtable:
>   *
>   ******************************************************************************/
>  
> -static UINT8 EntrySizes[] = {4,8,16,32};
> -
>  void
>  AcpiDmDumpIvrs (
>      ACPI_TABLE_HEADER       *Table)
> @@ -445,6 +496,7 @@ AcpiDmDumpIvrs (
>      UINT32                  EntryOffset;
>      UINT32                  EntryLength;
>      UINT32                  EntryType;
> +    ACPI_IVRS_DEVICE_HID    *HidSubtable;
>      ACPI_IVRS_DE_HEADER     *DeviceEntry;
>      ACPI_IVRS_HEADER        *Subtable;
>      ACPI_DMTABLE_INFO       *InfoTable;
> @@ -481,6 +533,7 @@ AcpiDmDumpIvrs (
>              break;
>  
>          case ACPI_IVRS_TYPE_HARDWARE2:
> +        case ACPI_IVRS_TYPE_HARDWARE3:
>  
>              InfoTable = AcpiDmTableInfoIvrs01;
>              break;
> @@ -520,7 +573,8 @@ AcpiDmDumpIvrs (
>          /* The hardware subtable can contain multiple device entries */
>  
>          if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
> -            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2)
> +            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||
> +            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)
>          {
>              if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)
>              {
> @@ -545,11 +599,10 @@ AcpiDmDumpIvrs (
>                   *
>                   * 00 = 4 byte
>                   * 01 = 8 byte
> -                 * 10 = 16 byte - currently no entries defined
> -                 * 11 = 32 byte - currently no entries defined
> +                 * 1x = variable length
>                   */
>                  EntryType = DeviceEntry->Type;
> -                EntryLength = EntrySizes [EntryType >> 6];
> +                EntryLength = EntryType >> 6 == 1 ? 8 : 4;
>  
>                  switch (EntryType)
>                  {
> @@ -588,6 +641,14 @@ AcpiDmDumpIvrs (
>                      InfoTable = AcpiDmTableInfoIvrs8c;
>                      break;
>  
> +                /* Variable-length entries */
> +
> +                case ACPI_IVRS_TYPE_HID:
> +
> +                    EntryLength = 22;
> +                    InfoTable = AcpiDmTableInfoIvrsHid;
> +                    break;
> +
>                  default:
>                      InfoTable = AcpiDmTableInfoIvrs4;
>                      AcpiOsPrintf (
> @@ -606,9 +667,24 @@ AcpiDmDumpIvrs (
>                      return;
>                  }
>  
> +                HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);
>                  EntryOffset += EntryLength;
>                  DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
>                      EntryLength);
> +
> +                if (EntryType == ACPI_IVRS_TYPE_HID)
> +                {
> +                    EntryLength = HidSubtable->UidLength;
> +                    Status = AcpiDmDumpTable (Table->Length, EntryOffset,
> +                        Table, EntryLength, AcpiDmTableInfoIvrsHid1);
> +                    if (ACPI_FAILURE (Status))
> +                    {
> +                        return;
> +                    }
> +                    EntryOffset += EntryLength;
> +                    DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,
> +                        DeviceEntry, EntryLength);
> +                }
>              }
>          }
>  
> @@ -825,6 +901,11 @@ AcpiDmDumpMadt (
>              InfoTable = AcpiDmTableInfoMadt15;
>              break;
>  
> +        case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
> +
> +            InfoTable = AcpiDmTableInfoMadt16;
> +            break;
> +
>          default:
>  
>              AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
> @@ -1380,6 +1461,11 @@ AcpiDmDumpPcct (
>              InfoTable = AcpiDmTableInfoPcct4;
>              break;
>  
> +        case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
> +
> +            InfoTable = AcpiDmTableInfoPcct5;
> +            break;
> +
>          default:
>  
>              AcpiOsPrintf (
> @@ -1461,201 +1547,224 @@ AcpiDmDumpPdtt (
>  
>  /*******************************************************************************
>   *
> - * FUNCTION:    AcpiDmDumpPmtt
> + * FUNCTION:    AcpiDmDumpPhat
>   *
> - * PARAMETERS:  Table               - A PMTT table
> + * PARAMETERS:  Table               - A PHAT table
>   *
>   * RETURN:      None
>   *
> - * DESCRIPTION: Format the contents of a PMTT. This table type consists
> - *              of an open-ended number of subtables.
> + * DESCRIPTION: Format the contents of a PHAT.
>   *
>   ******************************************************************************/
>  
>  void
> -AcpiDmDumpPmtt (
> +AcpiDmDumpPhat (
>      ACPI_TABLE_HEADER       *Table)
>  {
>      ACPI_STATUS             Status;
> -    ACPI_PMTT_HEADER        *Subtable;
> -    ACPI_PMTT_HEADER        *MemSubtable;
> -    ACPI_PMTT_HEADER        *DimmSubtable;
> -    ACPI_PMTT_DOMAIN        *DomainArray;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +    ACPI_PHAT_HEADER        *Subtable;
> +    ACPI_PHAT_VERSION_DATA  *VersionData;
> +    UINT32                  RecordCount;
>      UINT32                  Length = Table->Length;
> -    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
> -    UINT32                  MemOffset;
> -    UINT32                  DimmOffset;
> -    UINT32                  DomainOffset;
> -    UINT32                  DomainCount;
> -
> +    UINT32                  Offset = sizeof (ACPI_TABLE_PHAT);
> +    UINT32                  SubtableLength;
> +    UINT32                  PathLength;
> +    UINT32                  VendorLength;
>  
> -    /* Main table */
>  
> -    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
> -    if (ACPI_FAILURE (Status))
> -    {
> -        return;
> -    }
> +    Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
>  
> -    /* Subtables */
> -
> -    Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
>      while (Offset < Table->Length)
>      {
>          /* Common subtable header */
>  
>          AcpiOsPrintf ("\n");
> -        Status = AcpiDmDumpTable (Length, Offset, Subtable,
> -            Subtable->Length, AcpiDmTableInfoPmttHdr);
> +        Status = AcpiDmDumpTable (Length, 0, Subtable,
> +            sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
>          if (ACPI_FAILURE (Status))
>          {
>              return;
>          }
>  
> -        /* Only Socket subtables are expected at this level */
> -
> -        if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET)
> +        switch (Subtable->Type)
>          {
> -            AcpiOsPrintf (
> -                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
> +        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
> +
> +            InfoTable = AcpiDmTableInfoPhat0;
> +            SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);
> +            break;
> +
> +        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
> +
> +            InfoTable = AcpiDmTableInfoPhat1;
> +            SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);
> +            break;
> +
> +        default:
> +
> +            AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
>                  Subtable->Type);
> +
>              return;
>          }
>  
> -        /* Dump the fixed-length portion of the subtable */
> -
> -        Status = AcpiDmDumpTable (Length, Offset, Subtable,
> -            Subtable->Length, AcpiDmTableInfoPmtt0);
> +        Status = AcpiDmDumpTable (Length, 0, Subtable,
> +            SubtableLength, InfoTable);
>          if (ACPI_FAILURE (Status))
>          {
>              return;
>          }
>  
> -        /* Walk the memory controller subtables */
> -
> -        MemOffset = sizeof (ACPI_PMTT_SOCKET);
> -        MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
> -            sizeof (ACPI_PMTT_SOCKET));
> -
> -        while (((Offset + MemOffset) < Table->Length) &&
> -            (MemOffset < Subtable->Length))
> +        switch (Subtable->Type)
>          {
> -            /* Common subtable header */
> +        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
>  
> -            AcpiOsPrintf ("\n");
> -            Status = AcpiDmDumpTable (Length,
> -                Offset + MemOffset, MemSubtable,
> -                MemSubtable->Length, AcpiDmTableInfoPmttHdr);
> -            if (ACPI_FAILURE (Status))
> +            VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
> +            RecordCount = VersionData->ElementCount;
> +            while (RecordCount)
>              {
> -                return;
> +                Status = AcpiDmDumpTable (Length, Offset,
> +                    ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)),
> +                    sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return;
> +                }
> +
> +                RecordCount--;
>              }
>  
> -            /* Only memory controller subtables are expected at this level */
> +            break;
> +
> +        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
>  
> -            if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER)
> +            /* account for the null terminator */
> +
> +            PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1;
> +            Status = AcpiDmDumpTable (Length, Offset,
> +                ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
> +                PathLength, AcpiDmTableInfoPhat1a);
> +            if (ACPI_FAILURE (Status))
>              {
> -                AcpiOsPrintf (
> -                    "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
> -                    MemSubtable->Type);
>                  return;
>              }
>  
> -            /* Dump the fixed-length portion of the controller subtable */
> +            /* Get vendor data - data length is the remaining subtable length */
>  
> -            Status = AcpiDmDumpTable (Length,
> -                Offset + MemOffset, MemSubtable,
> -                MemSubtable->Length, AcpiDmTableInfoPmtt1);
> +            VendorLength =
> +                Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength;
> +            Status = AcpiDmDumpTable (Length, 0,
> +                ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength),
> +                VendorLength, AcpiDmTableInfoPhat1b);
>              if (ACPI_FAILURE (Status))
>              {
>                  return;
>              }
> +            break;
>  
> -            /* Walk the variable count of proximity domains */
> +        default:
>  
> -            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
> -            DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
> -            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
> -                sizeof (ACPI_PMTT_CONTROLLER));
> +            AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
> +                Subtable->Type);
> +            return;
> +        }
>  
> -            while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
> -                ((MemOffset + DomainOffset) < Subtable->Length) &&
> -                DomainCount)
> -            {
> -                Status = AcpiDmDumpTable (Length,
> -                    Offset + MemOffset + DomainOffset, DomainArray,
> -                    sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
> -                if (ACPI_FAILURE (Status))
> -                {
> -                    return;
> -                }
> +        /* Next subtable */
>  
> -                DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
> -                DomainArray++;
> -                DomainCount--;
> -            }
> +        Offset += Subtable->Length;
> +        Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable,
> +            Subtable->Length);
> +    }
> +}
>  
> -            if (DomainCount)
> -            {
> -                AcpiOsPrintf (
> -                    "\n**** DomainCount exceeds subtable length\n\n");
> -            }
>  
> -            /* Walk the physical component (DIMM) subtables */
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmDumpPmtt
> + *
> + * PARAMETERS:  Table               - A PMTT table
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Format the contents of a PMTT. This table type consists
> + *              of an open-ended number of subtables.
> + *
> + ******************************************************************************/
>  
> -            DimmOffset = DomainOffset;
> -            DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
> -                DomainOffset);
> +void
> +AcpiDmDumpPmtt (
> +    ACPI_TABLE_HEADER       *Table)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_PMTT_HEADER        *Subtable;
> +    UINT32                  Length = Table->Length;
> +    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
>  
> -            while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
> -                (DimmOffset < MemSubtable->Length))
> -            {
> -                /* Common subtable header */
>  
> -                AcpiOsPrintf ("\n");
> -                Status = AcpiDmDumpTable (Length,
> -                    Offset + MemOffset + DimmOffset, DimmSubtable,
> -                    DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
> -                if (ACPI_FAILURE (Status))
> -                {
> -                    return;
> -                }
> +    /* Main table */
>  
> -                /* Only DIMM subtables are expected at this level */
> +    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return;
> +    }
>  
> -                if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM)
> -                {
> -                    AcpiOsPrintf (
> -                        "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
> -                        DimmSubtable->Type);
> -                    return;
> -                }
> +    /* Subtables */
>  
> -                /* Dump the fixed-length DIMM subtable */
> +    Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
> +    while (Offset < Table->Length)
> +    {
> +        /* Each of the types below contain the common subtable header */
>  
> -                Status = AcpiDmDumpTable (Length,
> -                    Offset + MemOffset + DimmOffset, DimmSubtable,
> -                    DimmSubtable->Length, AcpiDmTableInfoPmtt2);
> -                if (ACPI_FAILURE (Status))
> -                {
> -                    return;
> -                }
> +        AcpiOsPrintf ("\n");
> +        switch (Subtable->Type)
> +        {
> +        case ACPI_PMTT_TYPE_SOCKET:
> +
> +            Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +                Subtable->Length, AcpiDmTableInfoPmtt0);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
> +            }
> +            break;
>  
> -                /* Point to next DIMM subtable */
> +        case ACPI_PMTT_TYPE_CONTROLLER:
> +            Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +                Subtable->Length, AcpiDmTableInfoPmtt1);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
> +            }
> +            break;
>  
> -                DimmOffset += DimmSubtable->Length;
> -                DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
> -                    DimmSubtable, DimmSubtable->Length);
> +       case ACPI_PMTT_TYPE_DIMM:
> +            Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +                Subtable->Length, AcpiDmTableInfoPmtt2);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
>              }
> +            break;
>  
> -            /* Point to next Controller subtable */
> +        case ACPI_PMTT_TYPE_VENDOR:
> +            Status = AcpiDmDumpTable (Length, Offset, Subtable,
> +                Subtable->Length, AcpiDmTableInfoPmttVendor);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
> +            }
> +            break;
>  
> -            MemOffset += MemSubtable->Length;
> -            MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
> -                MemSubtable, MemSubtable->Length);
> +        default:
> +            AcpiOsPrintf (
> +                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
> +                Subtable->Type);
> +            return;
>          }
>  
> -        /* Point to next Socket subtable */
> +        /* Point to next subtable */
>  
>          Offset += Subtable->Length;
>          Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
> @@ -1786,6 +1895,21 @@ AcpiDmDumpPptt (
>              }
>              break;
>  
> +        case ACPI_PPTT_TYPE_CACHE:
> +
> +            if (Table->Revision < 3)
> +            {
> +                break;
> +            }
> +            Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
> +                ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
> +                sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return;
> +            }
> +            break;
> +
>          default:
>  
>              break;
> @@ -1906,17 +2030,20 @@ void
>  AcpiDmDumpSdev (
>      ACPI_TABLE_HEADER       *Table)
>  {
> -    ACPI_STATUS             Status;
> -    ACPI_SDEV_HEADER        *Subtable;
> -    ACPI_SDEV_PCIE          *Pcie;
> -    ACPI_SDEV_NAMESPACE     *Namesp;
> -    ACPI_DMTABLE_INFO       *InfoTable;
> -    UINT32                  Length = Table->Length;
> -    UINT32                  Offset = sizeof (ACPI_TABLE_SDEV);
> -    UINT16                  PathOffset;
> -    UINT16                  PathLength;
> -    UINT16                  VendorDataOffset;
> -    UINT16                  VendorDataLength;
> +    ACPI_STATUS                 Status;
> +    ACPI_SDEV_HEADER            *Subtable;
> +    ACPI_SDEV_PCIE              *Pcie;
> +    ACPI_SDEV_NAMESPACE         *Namesp;
> +    ACPI_DMTABLE_INFO           *InfoTable;
> +    ACPI_DMTABLE_INFO           *SecureComponentInfoTable;
> +    UINT32                      Length = Table->Length;
> +    UINT32                      Offset = sizeof (ACPI_TABLE_SDEV);
> +    UINT16                      PathOffset;
> +    UINT16                      PathLength;
> +    UINT16                      VendorDataOffset;
> +    UINT16                      VendorDataLength;
> +    ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
> +    UINT32                      CurrentOffset = 0;
>  
>  
>      /* Main table */
> @@ -1959,7 +2086,7 @@ AcpiDmDumpSdev (
>          }
>  
>          AcpiOsPrintf ("\n");
> -        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
> +        Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
>              Subtable->Length, InfoTable);
>          if (ACPI_FAILURE (Status))
>          {
> @@ -1970,6 +2097,52 @@ AcpiDmDumpSdev (
>          {
>          case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
>  
> +            CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
> +            if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
> +            {
> +                SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
> +                    ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
> +
> +                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
> +                    ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
> +                    sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return;
> +                }
> +                CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
> +
> +                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
> +                    ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
> +                    sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return;
> +                }
> +                CurrentOffset += sizeof (ACPI_SDEV_HEADER);
> +
> +                switch (Subtable->Type)
> +                {
> +                case ACPI_SDEV_TYPE_ID_COMPONENT:
> +
> +                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
> +                    break;
> +
> +                case ACPI_SDEV_TYPE_MEM_COMPONENT:
> +
> +                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
> +                    break;
> +
> +                default:
> +                    goto NextSubtable;
> +                }
> +
> +                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
> +                    ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
> +                    SecureComponent->SecureComponentLength, SecureComponentInfoTable);
> +                CurrentOffset += SecureComponent->SecureComponentLength;
> +            }
> +
>              /* Dump the PCIe device ID(s) */
>  
>              Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
> @@ -1978,13 +2151,14 @@ AcpiDmDumpSdev (
>  
>              if (PathLength)
>              {
> -                Status = AcpiDmDumpTable (Table->Length, 0,
> +                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
>                      ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
>                      PathLength, AcpiDmTableInfoSdev0a);
>                  if (ACPI_FAILURE (Status))
>                  {
>                      return;
>                  }
> +                CurrentOffset += PathLength;
>              }
>  
>              /* Dump the vendor-specific data */
> diff --git a/src/acpica/source/common/dmtbdump3.c b/src/acpica/source/common/dmtbdump3.c
> index fde8f7a8..7f559eee 100644
> --- a/src/acpica/source/common/dmtbdump3.c
> +++ b/src/acpica/source/common/dmtbdump3.c
> @@ -601,6 +601,106 @@ AcpiDmDumpTpm2 (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmDumpViot
> + *
> + * PARAMETERS:  Table               - A VIOT table
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Format the contents of a VIOT
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmDumpViot (
> +    ACPI_TABLE_HEADER       *Table)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_TABLE_VIOT         *Viot;
> +    ACPI_VIOT_HEADER        *ViotHeader;
> +    UINT16                  Length;
> +    UINT16                  Offset;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +
> +    /* Main table */
> +
> +    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoViot);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return;
> +    }
> +
> +    Viot = ACPI_CAST_PTR (ACPI_TABLE_VIOT, Table);
> +
> +    Offset = Viot->NodeOffset;
> +    while (Offset < Table->Length)
> +    {
> +        /* Common subtable header */
> +        ViotHeader = ACPI_ADD_PTR (ACPI_VIOT_HEADER, Table, Offset);
> +        AcpiOsPrintf ("\n");
> +
> +        Length = sizeof (ACPI_VIOT_HEADER);
> +        Status = AcpiDmDumpTable (Table->Length, Offset, ViotHeader, Length,
> +            AcpiDmTableInfoViotHeader);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +        Length = ViotHeader->Length;
> +        switch (ViotHeader->Type)
> +        {
> +        case ACPI_VIOT_NODE_PCI_RANGE:
> +
> +            InfoTable = AcpiDmTableInfoViot1;
> +            break;
> +
> +        case ACPI_VIOT_NODE_MMIO:
> +
> +            InfoTable = AcpiDmTableInfoViot2;
> +            break;
> +
> +        case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
> +
> +            InfoTable = AcpiDmTableInfoViot3;
> +            break;
> +
> +        case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
> +
> +            InfoTable = AcpiDmTableInfoViot4;
> +            break;
> +
> +        default:
> +
> +            AcpiOsPrintf ("\n*** Unknown VIOT node type 0x%X\n",
> +                ViotHeader->Type);
> +
> +            /* Attempt to continue */
> +
> +            if (!Length)
> +            {
> +                AcpiOsPrintf ("Invalid zero length VIOT node\n");
> +                return;
> +            }
> +            goto NextSubtable;
> +        }
> +
> +        AcpiOsPrintf ("\n");
> +        Status = AcpiDmDumpTable (Table->Length, Offset, ViotHeader, Length,
> +            InfoTable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +NextSubtable:
> +        Offset += Length;
> +    }
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    AcpiDmDumpWdat
> diff --git a/src/acpica/source/common/dmtbinfo1.c b/src/acpica/source/common/dmtbinfo1.c
> index 5931c01e..ea545f53 100644
> --- a/src/acpica/source/common/dmtbinfo1.c
> +++ b/src/acpica/source/common/dmtbinfo1.c
> @@ -344,6 +344,33 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoBoot[] =
>  };
>  
>  
> +/*******************************************************************************
> + *
> + * CEDT - CXL Early Discovery Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoCedtHdr[] =
> +{
> +    {ACPI_DMT_CEDT,     ACPI_CEDT_OFFSET (Type),               "Subtable Type", 0},
> +    {ACPI_DMT_UINT8,    ACPI_CEDT_OFFSET (Reserved),           "Reserved", 0},
> +    {ACPI_DMT_UINT16,   ACPI_CEDT_OFFSET (Length),             "Length", DT_LENGTH},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0: CXL Host Bridge Structure */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoCedt0[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (Uid),               "Associated host bridge", 0},
> +    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (CxlVersion),        "Specification version", 0},
> +    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (Reserved),          "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_CEDT0_OFFSET (Base),              "Register base", 0},
> +    {ACPI_DMT_UINT64,   ACPI_CEDT0_OFFSET (Length),            "Register length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
>  /*******************************************************************************
>   *
>   * CPEP - Corrected Platform Error Polling table
> @@ -1134,9 +1161,12 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat0[] =
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1[] =
>  {
>      {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (Flags),                  "Flags (decoded below)", 0},
> -    {ACPI_DMT_FLAGS4_0, ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Memory Hierarchy", 0},
> +    {ACPI_DMT_FLAGS4_0, ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Memory Hierarchy", 0},         /* First 4 bits */
> +    {ACPI_DMT_FLAG4,    ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Use Minimum Transfer Size", 0},
> +    {ACPI_DMT_FLAG5,    ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Non-sequential Transfers", 0},
>      {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (DataType),               "Data Type", 0},
> -    {ACPI_DMT_UINT16,   ACPI_HMAT1_OFFSET (Reserved1),              "Reserved1", 0},
> +    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (MinTransferSize),        "Minimum Transfer Size", 0},
> +    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (Reserved1),              "Reserved1", 0},
>      {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfInitiatorPDs),   "Initiator Proximity Domains #", 0},
>      {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfTargetPDs),      "Target Proximity Domains #", 0},
>      {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (Reserved2),              "Reserved2", 0},
> diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c
> index 0d61cb7a..9bb4b48c 100644
> --- a/src/acpica/source/common/dmtbinfo2.c
> +++ b/src/acpica/source/common/dmtbinfo2.c
> @@ -218,7 +218,20 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoIortHdr[] =
>      {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Type),                   "Type", 0},
>      {ACPI_DMT_UINT16,   ACPI_IORTH_OFFSET (Length),                 "Length", DT_LENGTH},
>      {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Revision),               "Revision", 0},
> -    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Identifier),             "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingCount),           "Mapping Count", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingOffset),          "Mapping Offset", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Common Subtable header (one per Subtable)- Revision 3 */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIortHdr3[] =
> +{
> +    {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Type),                   "Type", 0},
> +    {ACPI_DMT_UINT16,   ACPI_IORTH_OFFSET (Length),                 "Length", DT_LENGTH},
> +    {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Revision),               "Revision", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Identifier),             "Identifier", 0},
>      {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingCount),           "Mapping Count", 0},
>      {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingOffset),          "Mapping Offset", 0},
>      ACPI_DMT_TERMINATOR
> @@ -369,6 +382,25 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoIort5[] =
>  };
>  
>  
> +/* 0x06: RMR */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIort6[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (Flags),                  "Flags (decoded below)", 0},
> +    {ACPI_DMT_FLAG0,    ACPI_IORT6_FLAG_OFFSET (Flags, 0),          "Remapping Permitted", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (RmrCount),               "Number of RMR Descriptors", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (RmrOffset),              "RMR Descriptor Offset", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIort6a[] =
> +{
> +    {ACPI_DMT_UINT64,   ACPI_IORT6A_OFFSET (BaseAddress),           "Base Address of RMR", DT_OPTIONAL},
> +    {ACPI_DMT_UINT64,   ACPI_IORT6A_OFFSET (Length),                "Length of RMR", 0},
> +    {ACPI_DMT_UINT32,   ACPI_IORT6A_OFFSET (Reserved),              "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>  /*******************************************************************************
>   *
>   * IVRS - I/O Virtualization Reporting Structure
> @@ -478,6 +510,24 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrs8c[] =
>      ACPI_DMT_TERMINATOR
>  };
>  
> +/* Variable-length device entry */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrsHid[] =
> +{
> +    ACPI_DMT_IVRS_DE_HEADER,
> +    {ACPI_DMT_NAME8,    ACPI_IVRSHID_OFFSET (AcpiHid),              "ACPI HID", 0},
> +    {ACPI_DMT_NAME8,    ACPI_IVRSHID_OFFSET (AcpiCid),              "ACPI CID", 0},
> +    {ACPI_DMT_UINT8,    ACPI_IVRSHID_OFFSET (UidType),              "UID Format", DT_DESCRIBES_OPTIONAL},
> +    {ACPI_DMT_UINT8,    ACPI_IVRSHID_OFFSET (UidLength),            "UID Length", DT_DESCRIBES_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrsHid1[] =
> +{
> +    {ACPI_DMT_RAW_BUFFER, 0,                                        "UID", DT_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>  
>  /*******************************************************************************
>   *
> @@ -751,6 +801,16 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoMadt15[] =
>     ACPI_DMT_TERMINATOR
>  };
>  
> +/* 16: Multiprocessor wakeup structure (ACPI 6.4) */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoMadt16[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_MADT16_OFFSET (MailboxVersion),        "Mailbox Version", 0},
> +    {ACPI_DMT_UINT32,   ACPI_MADT16_OFFSET (Reserved),              "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_MADT16_OFFSET (BaseAddress),           "Mailbox Address", 0},
> +   ACPI_DMT_TERMINATOR
> +};
> +
>  
>  /*******************************************************************************
>   *
> @@ -938,12 +998,14 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoNfit0[] =
>      {ACPI_DMT_UINT16,   ACPI_NFIT0_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
>      {ACPI_DMT_FLAG0,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Add/Online Operation Only", 0},
>      {ACPI_DMT_FLAG1,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Proximity Domain Valid", 0},
> +    {ACPI_DMT_FLAG2,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Location Cookie Valid", 0},
>      {ACPI_DMT_UINT32,   ACPI_NFIT0_OFFSET (Reserved),               "Reserved", 0},
>      {ACPI_DMT_UINT32,   ACPI_NFIT0_OFFSET (ProximityDomain),        "Proximity Domain", 0},
>      {ACPI_DMT_UUID,     ACPI_NFIT0_OFFSET (RangeGuid[0]),           "Region Type GUID", 0},
>      {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (Address),                "Address Range Base", 0},
>      {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (Length),                 "Address Range Length", 0},
>      {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (MemoryMapping),          "Memory Map Attribute", 0},
> +    {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (LocationCookie),         "Location Cookie", 0},      /* ACPI 6.4 */
>      ACPI_DMT_TERMINATOR
>  };
>  
> @@ -1219,6 +1281,25 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct4[] =
>      ACPI_DMT_TERMINATOR
>  };
>  
> +/* 5: HW Registers based Communications Subspace */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct5[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_PCCT5_OFFSET (Version),                "Version", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (BaseAddress),            "Base Address", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (Length),                 "Length", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (DoorbellRegister),       "Doorbell Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (DoorbellPreserve),       "Preserve Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (DoorbellWrite),          "Write Mask", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (CmdCompleteRegister),    "Command Complete Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (CmdCompleteMask),        "Command Complete Check Mask", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (ErrorStatusRegister),    "Error Status Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (ErrorStatusMask),        "Error Status Mask", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT5_OFFSET (NominalLatency),         "Nominal Latency", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT5_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>  
>  /*******************************************************************************
>   *
> @@ -1247,37 +1328,91 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPdtt0[] =
>  
>  /*******************************************************************************
>   *
> - * PMTT - Platform Memory Topology Table
> + * PHAT - Platform Health Assessment Table (ACPI 6.4)
>   *
>   ******************************************************************************/
>  
> -ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt[] =
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhatHdr[] =
>  {
> -    {ACPI_DMT_UINT32,   ACPI_PMTT_OFFSET (Reserved),                "Reserved", 0},
> +    {ACPI_DMT_PHAT,     ACPI_PHATH_OFFSET (Type),                 "Subtable Type", 0},
> +    {ACPI_DMT_UINT16,   ACPI_PHATH_OFFSET (Length),               "Length", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PHATH_OFFSET (Revision),             "Revision", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> -/* Common Subtable header (one per Subtable) */
> +/* 0: Firmware version table */
>  
> -ACPI_DMTABLE_INFO           AcpiDmTableInfoPmttHdr[] =
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat0[] =
>  {
> -    {ACPI_DMT_PMTT,     ACPI_PMTTH_OFFSET (Type),                   "Subtable Type", 0},
> -    {ACPI_DMT_UINT8,    ACPI_PMTTH_OFFSET (Reserved1),              "Reserved", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Length),                 "Length", DT_LENGTH},
> -    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
> -    {ACPI_DMT_FLAG0,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Top-level Device", 0},
> -    {ACPI_DMT_FLAG1,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Physical Element", 0},
> -    {ACPI_DMT_FLAGS2,   ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Memory Type", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Reserved2),              "Reserved", 0},
> +    {ACPI_DMT_UINT24,   ACPI_PHAT0_OFFSET (Reserved),             "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PHAT0_OFFSET (ElementCount),         "Element Count", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat0a[] =
> +{
> +    {ACPI_DMT_UUID,     ACPI_PHAT0A_OFFSET (Guid),                "GUID", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PHAT0A_OFFSET (VersionValue),        "Version Value", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PHAT0A_OFFSET (ProducerId),          "Producer ID", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 1: Firmware Health Data Record */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_PHAT1_OFFSET (Reserved),             "Reserved", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PHAT1_OFFSET (Health),               "Health", 0},
> +    {ACPI_DMT_UUID,     ACPI_PHAT1_OFFSET (DeviceGuid),           "Device GUID", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PHAT1_OFFSET (DeviceSpecificOffset), "Device specific offset", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1a[] =
> +{
> +    {ACPI_DMT_STRING,   0,                                          "Namepath", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1b[] =
> +{
> +    {ACPI_DMT_RAW_BUFFER, 0,                                        "Vendor Data", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
> +/*******************************************************************************
> + *
> + * PMTT - Platform Memory Topology Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_PMTT_OFFSET (MemoryDeviceCount),       "Memory Device Count", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Common Subtable header (one per Subtable) */
> +
> +#define ACPI_DM_PMTT_HEADER \
> +    {ACPI_DMT_PMTT,     ACPI_PMTTH_OFFSET (Type),                   "Subtable Type", 0}, \
> +    {ACPI_DMT_UINT8,    ACPI_PMTTH_OFFSET (Reserved1),              "Reserved", 0}, \
> +    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Length),                 "Length", DT_LENGTH}, \
> +    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG}, \
> +    {ACPI_DMT_FLAG0,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Top-level Device", 0}, \
> +    {ACPI_DMT_FLAG1,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Physical Element", 0}, \
> +    {ACPI_DMT_FLAGS2,   ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Memory Type", 0}, \
> +    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Reserved2),              "Reserved", 0}, \
> +    {ACPI_DMT_UINT32,   ACPI_PMTTH_OFFSET (MemoryDeviceCount),      "Memory Device Count", 0}
> +
>  /* PMTT Subtables */
>  
>  /* 0: Socket */
>  
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt0[] =
>  {
> +    ACPI_DM_PMTT_HEADER,
>      {ACPI_DMT_UINT16,   ACPI_PMTT0_OFFSET (SocketId),               "Socket ID", 0},
>      {ACPI_DMT_UINT16,   ACPI_PMTT0_OFFSET (Reserved),               "Reserved", 0},
>      ACPI_DMT_TERMINATOR
> @@ -1287,33 +1422,28 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt0[] =
>  
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt1[] =
>  {
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (ReadLatency),            "Read Latency", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (WriteLatency),           "Write Latency", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (ReadBandwidth),          "Read Bandwidth", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (WriteBandwidth),         "Write Bandwidth", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (AccessWidth),            "Access Width", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (Alignment),              "Alignment", 0},
> +    ACPI_DM_PMTT_HEADER,
> +    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (ControllerId),           "Controller ID", 0},
>      {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (Reserved),               "Reserved", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (DomainCount),            "Domain Count", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> -/* 1a: Proximity Domain */
> +/* 2: Physical Component */
>  
> -ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt1a[] =
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
>  {
> -    {ACPI_DMT_UINT32,   ACPI_PMTT1A_OFFSET (ProximityDomain),       "Proximity Domain", 0},
> +    ACPI_DM_PMTT_HEADER,
> +    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (BiosHandle),             "Bios Handle", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> -/* 2: Physical Component */
> +/* 0xFF: Vendor Specific */
>  
> -ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPmttVendor[] =
>  {
> -    {ACPI_DMT_UINT16,   ACPI_PMTT2_OFFSET (ComponentId),            "Component ID", 0},
> -    {ACPI_DMT_UINT16,   ACPI_PMTT2_OFFSET (Reserved),               "Reserved", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (MemorySize),             "Memory Size", 0},
> -    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (BiosHandle),             "Bios Handle", 0},
> +    ACPI_DM_PMTT_HEADER,
> +    {ACPI_DMT_UUID,         ACPI_PMTT_VENDOR_OFFSET (TypeUuid),     "Type Uuid", 0},
> +    {ACPI_DMT_PMTT_VENDOR,  ACPI_PMTT_VENDOR_OFFSET (Specific),     "Vendor Data", 0},
>      ACPI_DMT_TERMINATOR
>  };
>  
> @@ -1371,6 +1501,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
>      {ACPI_DMT_FLAG4,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache Type valid", 0},
>      {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Write Policy valid", 0},
>      {ACPI_DMT_FLAG6,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
> +    {ACPI_DMT_FLAG7,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache ID valid", 0},
>      {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NextLevelOfCache),       "Next Level of Cache", 0},
>      {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Size),                   "Size", 0},
>      {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NumberOfSets),           "Number of Sets", 0},
> @@ -1383,6 +1514,14 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
>      ACPI_DMT_TERMINATOR
>  };
>  
> +/* 1: cache type v1 */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1a[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_PPTT1A_OFFSET (CacheId),               "Cache ID", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>  /* 2: ID */
>  
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt2[] =
> @@ -1499,6 +1638,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevHdr[] =
>      {ACPI_DMT_SDEV,     ACPI_SDEVH_OFFSET (Type),                   "Subtable Type", 0},
>      {ACPI_DMT_UINT8,    ACPI_SDEVH_OFFSET (Flags),                  "Flags (decoded below)", 0},
>      {ACPI_DMT_FLAG0,    ACPI_SDEVH_FLAG_OFFSET (Flags,0),           "Allow handoff to unsecure OS", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_SDEVH_FLAG_OFFSET (Flags,0),           "Secure access components present", 0},
>      {ACPI_DMT_UINT16,   ACPI_SDEVH_OFFSET (Length),                 "Length", 0},
>      ACPI_DMT_TERMINATOR
>  };
> @@ -1522,6 +1662,53 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev0a[] =
>      ACPI_DMT_TERMINATOR
>  };
>  
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev0b[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_SDEV0B_OFFSET (SecureComponentOffset), "Secure Access Components Offset", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEV0B_OFFSET (SecureComponentLength), "Secure Access Components Length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Secure access components */
> +
> +/* Common secure access components header secure access component */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompHdr[] =
> +{
> +    {ACPI_DMT_UINT8,    ACPI_SDEVCH_OFFSET (Type),                   "Secure Component Type", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVCH_OFFSET (Flags),                  "Flags (decoded below)", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVCH_OFFSET (Length),                 "Length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0: Identification Based Secure Access Component */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompId[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareIdOffset),      "Hardware ID Offset", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareIdLength),      "Hardware ID Length", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (SubsystemIdOffset),     "Subsystem ID Offset", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (SubsystemIdLength),     "Subsystem ID Length", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareRevision),      "Hardware Revision", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (HardwareRevPresent),    "Hardware Rev Present", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (ClassCodePresent),      "Class Code Present", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciBaseClass),          "PCI Base Class", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciSubClass),           "PCI SubClass", 0},
> +    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciProgrammingXface),   "PCI Programming Xface", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 1: Memory Based Secure Access Component */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompMem[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_SDEVC1_OFFSET (Reserved),              "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_SDEVC1_OFFSET (MemoryBaseAddress),     "Memory Base Address", 0},
> +    {ACPI_DMT_UINT64,   ACPI_SDEVC1_OFFSET (MemoryLength),          "Memory Length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
>  /* 1: PCIe Endpoint Device Based Device Structure */
>  
>  ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev1[] =
> diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c
> index 99661d06..773ba16e 100644
> --- a/src/acpica/source/common/dmtbinfo3.c
> +++ b/src/acpica/source/common/dmtbinfo3.c
> @@ -378,6 +378,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat5[] =
>      {ACPI_DMT_BUF16,    ACPI_SRAT5_OFFSET (DeviceHandle),           "Device Handle", 0},
>      {ACPI_DMT_UINT32,   ACPI_SRAT5_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
>      {ACPI_DMT_FLAG0,    ACPI_SRAT5_FLAG_OFFSET (Flags,0),           "Enabled", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_SRAT5_FLAG_OFFSET (Flags,0),           "Architectural Transactions", 0},
>      {ACPI_DMT_UINT32,   ACPI_SRAT5_OFFSET (Reserved1),              "Reserved2", 0},
>      ACPI_DMT_TERMINATOR
>  };
> @@ -526,6 +527,77 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoUefi[] =
>  };
>  
>  
> +/*******************************************************************************
> + *
> + * VIOT - Virtual I/O Translation Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_VIOT_OFFSET (NodeCount),               "Node count", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT_OFFSET (NodeOffset),              "Node offset", 0},
> +    {ACPI_DMT_UINT64,   ACPI_VIOT_OFFSET (Reserved),                "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Common VIOT subtable header */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViotHeader[] =
> +{
> +    {ACPI_DMT_VIOT,     ACPI_VIOTH_OFFSET (Type),                   "Type", 0},
> +    {ACPI_DMT_UINT8,    ACPI_VIOTH_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOTH_OFFSET (Length),                 "Length", DT_LENGTH},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* VIOT Subtables */
> +
> +/* 0x01: PCI Range Node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot1[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_VIOT1_OFFSET (EndpointStart),          "Endpoint start", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (SegmentStart),           "PCI Segment start", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (SegmentEnd),             "PCI Segment end", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (BdfStart),               "PCI BDF start", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (BdfEnd),                 "PCI BDF end", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (OutputNode),             "Output node", 0},
> +    {ACPI_DMT_UINT48,   ACPI_VIOT1_OFFSET (Reserved),               "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0x02: MMIO Endpoint Node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot2[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_VIOT2_OFFSET (Endpoint),               "Endpoint", 0},
> +    {ACPI_DMT_UINT64,   ACPI_VIOT2_OFFSET (BaseAddress),            "Base address", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT2_OFFSET (OutputNode),             "Output node", 0},
> +    {ACPI_DMT_UINT48,   ACPI_VIOT2_OFFSET (Reserved),               "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0x03: PCI Virtio-IOMMU Node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot3[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_VIOT3_OFFSET (Segment),                "PCI Segment", 0},
> +    {ACPI_DMT_UINT16,   ACPI_VIOT3_OFFSET (Bdf),                    "PCI BDF number", 0},
> +    {ACPI_DMT_UINT64,   ACPI_VIOT3_OFFSET (Reserved),               "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0x04: MMIO Virtio-IOMMU Node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoViot4[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_VIOT4_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_VIOT4_OFFSET (BaseAddress),            "Base address", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
>  /*******************************************************************************
>   *
>   * WAET - Windows ACPI Emulated devices Table
> diff --git a/src/acpica/source/compiler/aslallocate.c b/src/acpica/source/compiler/aslallocate.c
> index 4007687b..8be711b2 100644
> --- a/src/acpica/source/compiler/aslallocate.c
> +++ b/src/acpica/source/compiler/aslallocate.c
> @@ -153,7 +153,7 @@
>  
>  /*
>   * Local heap allocation wrappers. See aslcache.c for allocation from local
> - * cache alloctions
> + * cache allocations
>   */
>  
>  
> diff --git a/src/acpica/source/compiler/aslascii.c b/src/acpica/source/compiler/aslascii.c
> index d02ca80c..0e8c4d4e 100644
> --- a/src/acpica/source/compiler/aslascii.c
> +++ b/src/acpica/source/compiler/aslascii.c
> @@ -184,7 +184,7 @@ FlConsumeNewComment (
>   *              not handle comment delimiters within string literals. However,
>   *              on the rare chance this happens and an invalid character is
>   *              missed, the parser will catch the error by failing in some
> - *              spectactular manner.
> + *              spectacular manner.
>   *
>   ******************************************************************************/
>  
> @@ -216,7 +216,7 @@ FlIsFileAsciiSource (
>  
>      while (fread (&Byte, 1, 1, Handle) == 1)
>      {
> -        /* Ignore comment fields (allow non-ascii within) */
> +        /* Ignore comment fields (allow non-ASCII within) */
>  
>          if (OpeningComment)
>          {
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index 3cd56d1f..e48e4674 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -1538,6 +1538,10 @@ ASL_RESOURCE_NODE *
>  RsDoUartSerialBusDescriptor (
>      ASL_RESOURCE_INFO       *Info);
>  
> +ASL_RESOURCE_NODE *
> +RsDoCsi2SerialBusDescriptor (
> +    ASL_RESOURCE_INFO       *Info);
> +
>  ASL_RESOURCE_NODE *
>  RsDoPinFunctionDescriptor (
>      ASL_RESOURCE_INFO       *Info);
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index 629b9972..e0985362 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -434,6 +434,7 @@ NamePathTail                [.]{NameSeg}
>  "ResourceTemplate"          { count (1); return (PARSEOP_RESOURCETEMPLATE); }
>  "RawDataBuffer"             { count (1); return (PARSEOP_DATABUFFER); }
>  
> +"Csi2Bus"                   { count (1); return (PARSEOP_CSI2_SERIALBUS); }
>  "DMA"                       { count (1); return (PARSEOP_DMA); }
>  "DWordIO"                   { count (1); return (PARSEOP_DWORDIO); }
>  "DWordMemory"               { count (1); return (PARSEOP_DWORDMEMORY); }
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index 6c684f2f..d73d7de9 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -1125,7 +1125,7 @@ void
>  AslCheckExpectedExceptions (
>      void)
>  {
> -    UINT8                   i;
> +    UINT32                  i;
>      ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
>      ASL_LOCATION_NODE       *LocationNode;
>  
> @@ -1188,7 +1188,7 @@ AslLogExpectedException (
>  
>      if (MessageId > 6999)
>      {
> -        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
> +        printf ("\"%s\" is not a valid warning/remark/error ID\n",
>              MessageIdString);
>          return (AE_BAD_PARAMETER);
>      }
> @@ -1336,7 +1336,7 @@ AslElevateException (
>  
>      if (MessageId > 6999)
>      {
> -        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
> +        printf ("\"%s\" is not a valid warning/remark/error ID\n",
>              MessageIdString);
>          return (AE_BAD_PARAMETER);
>      }
> diff --git a/src/acpica/source/compiler/aslhelpers.y b/src/acpica/source/compiler/aslhelpers.y
> index 0b302904..abb729c3 100644
> --- a/src/acpica/source/compiler/aslhelpers.y
> +++ b/src/acpica/source/compiler/aslhelpers.y
> @@ -360,6 +360,11 @@ OptionalSlaveMode
>      | ',' SlaveModeKeyword          {$$ = $2;}
>      ;
>  
> +OptionalSlaveMode_First
> +    :                               {$$ = NULL;}
> +    | SlaveModeKeyword              {$$ = $1;}
> +    ;
> +
>  OptionalShareType
>      :                               {$$ = NULL;}
>      | ','                           {$$ = NULL;}
> diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
> index ed27a155..7b591bc6 100644
> --- a/src/acpica/source/compiler/aslmap.c
> +++ b/src/acpica/source/compiler/aslmap.c
> @@ -346,6 +346,7 @@ const ASL_MAPPING_ENTRY     AslKeywordMapping [] =
>  /* FUNCTION */                  OP_TABLE_ENTRY (AML_METHOD_OP,              0,                              OP_AML_PACKAGE,     0),
>  /* GPIOINT */                   OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>  /* GPIOIO */                    OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
> +/* CSI2SERIALBUS */             OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>  /* I2CSERIALBUS */              OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>  /* I2CSERIALBUSV2 */            OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>  /* IF */                        OP_TABLE_ENTRY (AML_IF_OP,                  0,                              OP_AML_PACKAGE,     0),
> diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
> index 87ebc48e..c9697645 100644
> --- a/src/acpica/source/compiler/aslmessages.c
> +++ b/src/acpica/source/compiler/aslmessages.c
> @@ -384,7 +384,8 @@ const char                      *AslCompilerMsgs [] =
>  /*    ASL_MSG_EXTERNAL_FOUND_HERE */        "External declaration below ",
>  /*    ASL_MSG_LOWER_CASE_NAMESEG */         "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case",
>  /*    ASL_MSG_LOWER_CASE_NAMEPATH */        "At least one lower case letter found in NamePath, ASL is case insensitive - converting to upper case",
> -/*    ASL_MSG_UUID_NOT_FOUND */             "Unknown UUID string"
> +/*    ASL_MSG_UUID_NOT_FOUND */             "Unknown UUID string",
> +/*    ASL_MSG_LEGACY_DDB_TYPE */            "DDBHandleObj has been deprecated along with the Unload operator. DDBHandlObj objects are only used in Unload"
>  };
>  
>  /* Table compiler */
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index a4842cdf..1d9f7bec 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -389,6 +389,7 @@ typedef enum
>      ASL_MSG_LOWER_CASE_NAMESEG,
>      ASL_MSG_LOWER_CASE_NAMEPATH,
>      ASL_MSG_UUID_NOT_FOUND,
> +    ASL_MSG_LEGACY_DDB_TYPE,
>  
>  
>      /* These messages are used by the Data Table compiler only */
> diff --git a/src/acpica/source/compiler/aslnamesp.c b/src/acpica/source/compiler/aslnamesp.c
> index 7dc9ed7e..6f9bb65a 100644
> --- a/src/acpica/source/compiler/aslnamesp.c
> +++ b/src/acpica/source/compiler/aslnamesp.c
> @@ -519,7 +519,8 @@ NsDoOneNamespaceObject (
>   *
>   * RETURN:      Status
>   *
> - * DESCRIPTION: Print the full pathname and addtional info for a namespace node.
> + * DESCRIPTION: Print the full pathname and additional info for a namespace
> + * node.
>   *
>   ******************************************************************************/
>  
> diff --git a/src/acpica/source/compiler/aslopcodes.c b/src/acpica/source/compiler/aslopcodes.c
> index f5cb0214..2f2c7744 100644
> --- a/src/acpica/source/compiler/aslopcodes.c
> +++ b/src/acpica/source/compiler/aslopcodes.c
> @@ -676,7 +676,7 @@ OpcDoUnicode (
>   *                      Bits 4-0    - 3rd character of mfg code
>   *              Byte 2: Bits 7-4    - 1st hex digit of product number
>   *                      Bits 3-0    - 2nd hex digit of product number
> - *              Byte 3: Bits 7-4    - 3st hex digit of product number
> + *              Byte 3: Bits 7-4    - 3rd hex digit of product number
>   *                      Bits 3-0    - Hex digit of the revision number
>   *
>   ******************************************************************************/
> diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c
> index bd4a4d85..ae3b918d 100644
> --- a/src/acpica/source/compiler/asloperands.c
> +++ b/src/acpica/source/compiler/asloperands.c
> @@ -1090,7 +1090,7 @@ OpnDoDefinitionBlock (
>           * Use the definition block file parameter instead of the input
>           * filename. Since all files were opened previously, remove the
>           * existing file and open a new file with the name of this
> -         * definiton block parameter. Since AML code generation has yet
> +         * definition block parameter. Since AML code generation has yet
>           * to happen, the previous file can be removed without any impacts.
>           */
>          FlCloseFile (ASL_FILE_AML_OUTPUT);
> diff --git a/src/acpica/source/compiler/aslparser.y b/src/acpica/source/compiler/aslparser.y
> index c91acedf..0a6fb64d 100644
> --- a/src/acpica/source/compiler/aslparser.y
> +++ b/src/acpica/source/compiler/aslparser.y
> @@ -208,7 +208,7 @@ AslLocalAllocate (
>   * These shift/reduce conflicts are expected. There should be zero
>   * reduce/reduce conflicts.
>   */
> -%expect 124
> +%expect 127
>  
>  /*! [Begin] no source code translation */
>  
> diff --git a/src/acpica/source/compiler/aslprintf.c b/src/acpica/source/compiler/aslprintf.c
> index 62d411e1..04f2d31e 100644
> --- a/src/acpica/source/compiler/aslprintf.c
> +++ b/src/acpica/source/compiler/aslprintf.c
> @@ -352,7 +352,7 @@ OpcParsePrintf (
>  
>              /*
>               * Append an empty string if the first argument is
> -             * not a string. This will implicitly conver the 2nd
> +             * not a string. This will implicitly convert the 2nd
>               * concat source to a string per the ACPI specification.
>               */
>              if (!Op->Asl.Child)
> diff --git a/src/acpica/source/compiler/aslresource.c b/src/acpica/source/compiler/aslresource.c
> index 434a74c6..a2d85568 100644
> --- a/src/acpica/source/compiler/aslresource.c
> +++ b/src/acpica/source/compiler/aslresource.c
> @@ -990,6 +990,11 @@ RsDoOneResourceDescriptor (
>          Rnode = RsDoUartSerialBusDescriptor (Info);
>          break;
>  
> +    case PARSEOP_CSI2_SERIALBUS:
> +
> +        Rnode = RsDoCsi2SerialBusDescriptor (Info);
> +        break;
> +
>      case PARSEOP_PINCONFIG:
>  
>          Rnode = RsDoPinConfigDescriptor (Info);
> diff --git a/src/acpica/source/compiler/aslresources.y b/src/acpica/source/compiler/aslresources.y
> index 00a0958b..86c8981f 100644
> --- a/src/acpica/source/compiler/aslresources.y
> +++ b/src/acpica/source/compiler/aslresources.y
> @@ -190,7 +190,8 @@ ResourceMacroList
>      ;
>  
>  ResourceMacroTerm
> -    : DMATerm                       {}
> +    : Csi2SerialBusTerm             {}
> +    | DMATerm                       {}
>      | DWordIOTerm                   {}
>      | DWordMemoryTerm               {}
>      | DWordSpaceTerm                {}
> @@ -233,6 +234,23 @@ ResourceMacroTerm
>      | WordSpaceTerm                 {}
>      ;
>  
> +Csi2SerialBusTerm
> +    : PARSEOP_CSI2_SERIALBUS
> +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafOp (PARSEOP_CSI2_SERIALBUS);}
> +        OptionalSlaveMode_First     {UtCheckIntegerRange ($4, 0x00, 0x01);} /* 04: SlaveMode */
> +        ',' ByteConstExpr           {UtCheckIntegerRange ($7, 0x00, 0x03);} /* 07: PhyType */
> +        OptionalByteConstExpr       {UtCheckIntegerRange ($9, 0x00, 0xFC);} /* 09: LocalPortInstance */
> +        ',' StringData              /* 12: ResourceSource */
> +        ',' ByteConstExpr           /* 14: ResourceSourceIndex */
> +        OptionalResourceType        /* 15; ResourceType (ResourceUsage) */
> +        OptionalNameString          /* 16: DescriptorName */
> +        OptionalBuffer_Last         /* 17: VendorData */
> +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkOpChildren ($<n>3,8,
> +                                        $4,$7,$9,$12,$14,$15,$16,$17);}
> +    | PARSEOP_CSI2_SERIALBUS
> +        PARSEOP_OPEN_PAREN
> +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
> +
>  DMATerm
>      : PARSEOP_DMA
>          PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafOp (PARSEOP_DMA);}
> diff --git a/src/acpica/source/compiler/aslrestype2s.c b/src/acpica/source/compiler/aslrestype2s.c
> index 8539edea..607aca8b 100644
> --- a/src/acpica/source/compiler/aslrestype2s.c
> +++ b/src/acpica/source/compiler/aslrestype2s.c
> @@ -1387,6 +1387,142 @@ RsDoUartSerialBusDescriptor (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    RsDoCsi2SerialBusDescriptor
> + *
> + * PARAMETERS:  Info                - Parse Op and resource template offset
> + *
> + * RETURN:      Completed resource node
> + *
> + * DESCRIPTION: Construct a long "Csi2SerialBus" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoCsi2SerialBusDescriptor (
> +    ASL_RESOURCE_INFO       *Info)
> +{
> +    AML_RESOURCE            *Descriptor;
> +    ACPI_PARSE_OBJECT       *InitializerOp;
> +    ASL_RESOURCE_NODE       *Rnode;
> +    char                    *ResourceSource = NULL;
> +    UINT8                   *VendorData = NULL;
> +    UINT16                  ResSourceLength;
> +    UINT16                  VendorLength;
> +    UINT16                  DescriptorSize;
> +    UINT32                  CurrentByteOffset;
> +    UINT32                  i;
> +
> +
> +    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
> +    CurrentByteOffset = Info->CurrentByteOffset;
> +
> +    /*
> +     * Calculate lengths for fields that have variable length:
> +     * 1) Resource Source string
> +     * 2) Vendor Data buffer
> +     */
> +    ResSourceLength = RsGetStringDataLength (InitializerOp);
> +    VendorLength = RsGetBufferDataLength (InitializerOp);
> +
> +    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_CSI2_SERIALBUS) +
> +        ResSourceLength + VendorLength;
> +
> +    /* Allocate the local resource node and initialize */
> +
> +    Rnode = RsAllocateResourceNode (DescriptorSize +
> +        sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> +    Descriptor = Rnode->Buffer;
> +    Descriptor->Csi2SerialBus.ResourceLength = DescriptorSize;
> +    Descriptor->Csi2SerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS;
> +    Descriptor->Csi2SerialBus.RevisionId = AML_RESOURCE_CSI2_REVISION;
> +    Descriptor->Csi2SerialBus.TypeRevisionId = AML_RESOURCE_CSI2_TYPE_REVISION;
> +    Descriptor->Csi2SerialBus.Type = AML_RESOURCE_CSI2_SERIALBUSTYPE;
> +    Descriptor->Csi2SerialBus.TypeDataLength = AML_RESOURCE_CSI2_MIN_DATA_LEN + VendorLength;
> +
> +    /* Build pointers to optional areas */
> +
> +    VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_CSI2_SERIALBUS));
> +    ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength);
> +
> +    /* Process all child initialization nodes */
> +
> +    for (i = 0; InitializerOp; i++)
> +    {
> +        switch (i)
> +        {
> +        case 0: /* Slave Mode [Flag] (_SLV) */
> +
> +            RsSetFlagBits (&Descriptor->Csi2SerialBus.Flags, InitializerOp, 0, 0);
> +            RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.Flags), 0);
> +            break;
> +
> +        case 1: /* Phy Type [Flag] (_PHY) */
> +
> +            RsSetFlagBits16 ((UINT16 *) &Descriptor->Csi2SerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
> +            RsCreateBitField (InitializerOp, ACPI_RESTAG_PHYTYPE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (Csi2SerialBus.TypeSpecificFlags), 0);
> +            break;
> +
> +        case 2: /* Local Port Instance [Integer] (_PRT) */
> +
> +            RsSetFlagBits16 ((UINT16 *) &Descriptor->Csi2SerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
> +            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_LOCALPORT,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (Csi2SerialBus.TypeSpecificFlags), 2, 6);
> +            break;
> +
> +        case 3: /* ResSource [Optional Field - STRING] */
> +
> +            if (ResSourceLength)
> +            {
> +                /* Copy string to the descriptor */
> +
> +                strcpy (ResourceSource,
> +                    InitializerOp->Asl.Value.String);
> +            }
> +            break;
> +
> +        case 4: /* Resource Index */
> +
> +            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> +            {
> +                Descriptor->Csi2SerialBus.ResSourceIndex =
> +                    (UINT8) InitializerOp->Asl.Value.Integer;
> +            }
> +            break;
> +
> +        case 5: /* Resource Usage (consumer/producer) */
> +
> +            RsSetFlagBits (&Descriptor->Csi2SerialBus.Flags, InitializerOp, 1, 1);
> +            break;
> +
> +        case 6: /* Resource Tag (Descriptor Name) */
> +
> +            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
> +            break;
> +
> +        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +
> +            RsGetVendorData (InitializerOp, VendorData,
> +                CurrentByteOffset + sizeof (AML_RESOURCE_CSI2_SERIALBUS));
> +            break;
> +
> +        default:    /* Ignore any extra nodes */
> +
> +            break;
> +        }
> +
> +        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> +    }
> +
> +    MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource);
> +    return (Rnode);
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    RsDoPinFunctionDescriptor
> diff --git a/src/acpica/source/compiler/asltokens.y b/src/acpica/source/compiler/asltokens.y
> index 788f4b8c..5e205e01 100644
> --- a/src/acpica/source/compiler/asltokens.y
> +++ b/src/acpica/source/compiler/asltokens.y
> @@ -283,6 +283,7 @@ NoEcho('
>  %token <i> PARSEOP_FUNCTION
>  %token <i> PARSEOP_GPIO_INT
>  %token <i> PARSEOP_GPIO_IO
> +%token <i> PARSEOP_CSI2_SERIALBUS
>  %token <i> PARSEOP_I2C_SERIALBUS
>  %token <i> PARSEOP_I2C_SERIALBUS_V2
>  %token <i> PARSEOP_IF
> diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
> index dcab8b39..91655420 100644
> --- a/src/acpica/source/compiler/asltransform.c
> +++ b/src/acpica/source/compiler/asltransform.c
> @@ -541,6 +541,11 @@ TrTransformSubtree (
>          AslError (ASL_WARNING, ASL_MSG_LEGACY_PROCESSOR_OP, Op, Op->Asl.ExternalName);
>          break;
>  
> +    case PARSEOP_OBJECTTYPE_DDB:
> +
> +        AslError (ASL_WARNING, ASL_MSG_LEGACY_DDB_TYPE, Op, Op->Asl.ExternalName);
> +        break;
> +
>      default:
>  
>          /* Nothing to do here for other opcodes */
> diff --git a/src/acpica/source/compiler/asltypes.y b/src/acpica/source/compiler/asltypes.y
> index b68ca665..aaa732f4 100644
> --- a/src/acpica/source/compiler/asltypes.y
> +++ b/src/acpica/source/compiler/asltypes.y
> @@ -410,6 +410,7 @@ NoEcho('
>  /* Resource Descriptors */
>  
>  %type <n> ConnectionTerm
> +%type <n> Csi2SerialBusTerm
>  %type <n> DMATerm
>  %type <n> DWordIOTerm
>  %type <n> DWordMemoryTerm
> @@ -501,6 +502,7 @@ NoEcho('
>  %type <n> OptionalShareType
>  %type <n> OptionalShareType_First
>  %type <n> OptionalSlaveMode
> +%type <n> OptionalSlaveMode_First
>  %type <n> OptionalStopBits
>  %type <n> OptionalStringData
>  %type <n> OptionalSyncLevel
> diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
> index 7bc403eb..f2d00644 100644
> --- a/src/acpica/source/compiler/dtcompiler.h
> +++ b/src/acpica/source/compiler/dtcompiler.h
> @@ -573,6 +573,10 @@ ACPI_STATUS
>  DtCompileCpep (
>      void                    **PFieldList);
>  
> +ACPI_STATUS
> +DtCompileCedt (
> +    void                    **PFieldList);
> +
>  ACPI_STATUS
>  DtCompileCsrt (
>      void                    **PFieldList);
> @@ -657,6 +661,10 @@ ACPI_STATUS
>  DtCompilePdtt (
>      void                    **PFieldList);
>  
> +ACPI_STATUS
> +DtCompilePhat (
> +    void                    **PFieldList);
> +
>  ACPI_STATUS
>  DtCompilePmtt (
>      void                    **PFieldList);
> @@ -705,6 +713,10 @@ ACPI_STATUS
>  DtCompileUefi (
>      void                    **PFieldList);
>  
> +ACPI_STATUS
> +DtCompileViot (
> +    void                    **PFieldList);
> +
>  ACPI_STATUS
>  DtCompileWdat (
>      void                    **PFieldList);
> @@ -733,6 +745,7 @@ extern const unsigned char  TemplateAsf[];
>  extern const unsigned char  TemplateBoot[];
>  extern const unsigned char  TemplateBert[];
>  extern const unsigned char  TemplateBgrt[];
> +extern const unsigned char  TemplateCedt[];
>  extern const unsigned char  TemplateCpep[];
>  extern const unsigned char  TemplateCsrt[];
>  extern const unsigned char  TemplateDbg2[];
> @@ -760,6 +773,7 @@ extern const unsigned char  TemplateMsdm[];
>  extern const unsigned char  TemplateNfit[];
>  extern const unsigned char  TemplatePcct[];
>  extern const unsigned char  TemplatePdtt[];
> +extern const unsigned char  TemplatePhat[];
>  extern const unsigned char  TemplatePmtt[];
>  extern const unsigned char  TemplatePptt[];
>  extern const unsigned char  TemplateRasf[];
> @@ -777,6 +791,7 @@ extern const unsigned char  TemplateStao[];
>  extern const unsigned char  TemplateTcpa[];
>  extern const unsigned char  TemplateTpm2[];
>  extern const unsigned char  TemplateUefi[];
> +extern const unsigned char  TemplateViot[];
>  extern const unsigned char  TemplateWaet[];
>  extern const unsigned char  TemplateWdat[];
>  extern const unsigned char  TemplateWddt[];
> diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c
> index 286ecaa7..458a7174 100644
> --- a/src/acpica/source/compiler/dttable1.c
> +++ b/src/acpica/source/compiler/dttable1.c
> @@ -342,6 +342,80 @@ DtCompileAsf (
>  }
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    DtCompileCedt
> + *
> + * PARAMETERS:  List                - Current field list pointer
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Compile CEDT.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +DtCompileCedt (
> +    void                    **List)
> +{
> +    ACPI_STATUS             Status;
> +    DT_SUBTABLE             *Subtable;
> +    DT_SUBTABLE             *ParentTable;
> +    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> +    ACPI_CEDT_HEADER        *CedtHeader;
> +    DT_FIELD                *SubtableStart;
> +
> +
> +    /* Walk the parse tree */
> +
> +    while (*PFieldList)
> +    {
> +        SubtableStart = *PFieldList;
> +
> +        /* CEDT Header */
> +
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedtHdr,
> +            &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPushSubtable (Subtable);
> +
> +        CedtHeader = ACPI_CAST_PTR (ACPI_CEDT_HEADER, Subtable->Buffer);
> +
> +        switch (CedtHeader->Type)
> +        {
> +        case ACPI_CEDT_TYPE_CHBS:
> +
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CEDT");
> +            return (AE_ERROR);
> +        }
> +
> +        /* CEDT Subtable */
> +
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt0, &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPopSubtable ();
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
>  /******************************************************************************
>   *
>   * FUNCTION:    DtCompileCpep
> @@ -1582,10 +1656,12 @@ DtCompileIort (
>      DT_SUBTABLE             *ParentTable;
>      DT_FIELD                **PFieldList = (DT_FIELD **) List;
>      DT_FIELD                *SubtableStart;
> +    ACPI_TABLE_HEADER       *Table;
>      ACPI_TABLE_IORT         *Iort;
>      ACPI_IORT_NODE          *IortNode;
>      ACPI_IORT_ITS_GROUP     *IortItsGroup;
>      ACPI_IORT_SMMU          *IortSmmu;
> +    ACPI_IORT_RMR           *IortRmr;
>      UINT32                  NodeNumber;
>      UINT32                  NodeLength;
>      UINT32                  IdMappingNumber;
> @@ -1593,6 +1669,8 @@ DtCompileIort (
>      UINT32                  ContextIrptNumber;
>      UINT32                  PmuIrptNumber;
>      UINT32                  PaddingLength;
> +    UINT8                   Revision;
> +    UINT32                  RmrCount;
>  
>  
>      ParentTable = DtPeekSubtable ();
> @@ -1605,6 +1683,17 @@ DtCompileIort (
>      }
>      DtInsertSubtable (ParentTable, Subtable);
>  
> +    Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
> +    Revision = Table->Revision;
> +
> +    /* Both IORT Rev E and E.a have known issues and are not supported */
> +
> +    if (Revision == 1 || Revision == 2)
> +    {
> +        DtError (ASL_ERROR, ASL_MSG_UNSUPPORTED, NULL, "IORT table revision");
> +        return (AE_ERROR);
> +    }
> +
>      /*
>       * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
>       * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
> @@ -1645,8 +1734,17 @@ DtCompileIort (
>      while (*PFieldList)
>      {
>          SubtableStart = *PFieldList;
> -        Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
> -            &Subtable);
> +        if (Revision == 0)
> +        {
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
> +                &Subtable);
> +        }
> +        else if (Revision >= 3)
> +        {
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr3,
> +                &Subtable);
> +        }
> +
>          if (ACPI_FAILURE (Status))
>          {
>              return (Status);
> @@ -1864,7 +1962,46 @@ DtCompileIort (
>              NodeLength += Subtable->Length;
>              break;
>  
> -        default:
> +        case ACPI_IORT_NODE_RMR:
> +
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6,
> +                &Subtable);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
> +
> +            DtInsertSubtable (ParentTable, Subtable);
> +            IortRmr = ACPI_CAST_PTR (ACPI_IORT_RMR, Subtable->Buffer);
> +            NodeLength += Subtable->Length;
> +
> +            /* Compile RMR Descriptors */
> +
> +            RmrCount = 0;
> +            IortRmr->RmrOffset = NodeLength;
> +            while (*PFieldList)
> +            {
> +                Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +
> +                if (!Subtable)
> +                {
> +                    break;
> +                }
> +
> +                DtInsertSubtable (ParentTable, Subtable);
> +                NodeLength += sizeof (ACPI_IORT_RMR_DESC);
> +                RmrCount++;
> +            }
> +
> +            IortRmr->RmrCount = RmrCount;
> +            break;
> +
> +	default:
>  
>              DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
>              return (AE_ERROR);
> diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c
> index 732635bf..f6efcf3d 100644
> --- a/src/acpica/source/compiler/dttable2.c
> +++ b/src/acpica/source/compiler/dttable2.c
> @@ -366,6 +366,11 @@ DtCompileMadt (
>              InfoTable = AcpiDmTableInfoMadt15;
>              break;
>  
> +        case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
> +
> +            InfoTable = AcpiDmTableInfoMadt16;
> +            break;
> +
>          default:
>  
>              DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
> @@ -858,6 +863,11 @@ DtCompilePcct (
>              InfoTable = AcpiDmTableInfoPcct4;
>              break;
>  
> +        case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
> +
> +            InfoTable = AcpiDmTableInfoPcct5;
> +            break;
> +
>          default:
>  
>              DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
> @@ -939,6 +949,142 @@ DtCompilePdtt (
>  }
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    DtCompilePhat
> + *
> + * PARAMETERS:  List                - Current field list pointer
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Compile Phat.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +DtCompilePhat (
> +    void                    **List)
> +{
> +    ACPI_STATUS             Status = AE_OK;
> +    DT_SUBTABLE             *Subtable;
> +    DT_SUBTABLE             *ParentTable;
> +    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> +    ACPI_PHAT_HEADER        *PhatHeader;
> +    ACPI_DMTABLE_INFO       *Info;
> +    ACPI_PHAT_VERSION_DATA  *VersionData;
> +    UINT32                  RecordCount;
> +
> +
> +    /* The table consist of subtables */
> +
> +    while (*PFieldList)
> +    {
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPushSubtable (Subtable);
> +
> +        PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
> +
> +        switch (PhatHeader->Type)
> +        {
> +        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
> +
> +            Info = AcpiDmTableInfoPhat0;
> +            PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
> +            break;
> +
> +        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
> +
> +            Info = AcpiDmTableInfoPhat1;
> +            PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
> +            return (AE_ERROR);
> +
> +            break;
> +        }
> +
> +        Status = DtCompileTable (PFieldList, Info, &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +
> +        switch (PhatHeader->Type)
> +        {
> +        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
> +
> +            VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
> +                (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
> +            RecordCount = VersionData->ElementCount;
> +
> +            while (RecordCount)
> +            {
> +                Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                ParentTable = DtPeekSubtable ();
> +                DtInsertSubtable (ParentTable, Subtable);
> +
> +                RecordCount--;
> +                PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
> +            }
> +            break;
> +
> +        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
> +
> +            /* Compile device path */
> +
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
> +            ParentTable = DtPeekSubtable ();
> +            DtInsertSubtable (ParentTable, Subtable);
> +
> +            PhatHeader->Length += (UINT16) Subtable->Length;
> +
> +            /* Compile vendor specific data */
> +
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
> +            ParentTable = DtPeekSubtable ();
> +            DtInsertSubtable (ParentTable, Subtable);
> +
> +            PhatHeader->Length += (UINT16) Subtable->Length;
> +
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
> +            return (AE_ERROR);
> +        }
> +    }
> +
> +    return (Status);
> +}
> +
> +
>  /******************************************************************************
>   *
>   * FUNCTION:    DtCompilePmtt
> @@ -960,10 +1106,7 @@ DtCompilePmtt (
>      DT_SUBTABLE             *ParentTable;
>      DT_FIELD                **PFieldList = (DT_FIELD **) List;
>      DT_FIELD                *SubtableStart;
> -    ACPI_PMTT_HEADER        *PmttHeader;
> -    ACPI_PMTT_CONTROLLER    *PmttController;
> -    UINT16                  DomainCount;
> -    UINT8                   PrevType = ACPI_PMTT_TYPE_SOCKET;
> +    UINT16                  Type;
>  
>  
>      /* Main table */
> @@ -978,41 +1121,21 @@ DtCompilePmtt (
>      DtInsertSubtable (ParentTable, Subtable);
>      DtPushSubtable (Subtable);
>  
> +    /* Subtables */
> +
>      while (*PFieldList)
>      {
>          SubtableStart = *PFieldList;
> -        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
> -            &Subtable);
> -        if (ACPI_FAILURE (Status))
> -        {
> -            return (Status);
> -        }
> -
> -        PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
> -        while (PrevType >= PmttHeader->Type)
> -        {
> -            DtPopSubtable ();
> -
> -            if (PrevType == ACPI_PMTT_TYPE_SOCKET)
> -            {
> -                break;
> -            }
> -
> -            PrevType--;
> -        }
> +        DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
>  
> -        PrevType = PmttHeader->Type;
> -
> -        ParentTable = DtPeekSubtable ();
> -        DtInsertSubtable (ParentTable, Subtable);
> -        DtPushSubtable (Subtable);
> -
> -        switch (PmttHeader->Type)
> +        switch (Type)
>          {
>          case ACPI_PMTT_TYPE_SOCKET:
>  
>              /* Subtable: Socket Structure */
>  
> +            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
> +
>              Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
>                  &Subtable);
>              if (ACPI_FAILURE (Status))
> @@ -1020,14 +1143,14 @@ DtCompilePmtt (
>                  return (Status);
>              }
>  
> -            ParentTable = DtPeekSubtable ();
> -            DtInsertSubtable (ParentTable, Subtable);
>              break;
>  
>          case ACPI_PMTT_TYPE_CONTROLLER:
>  
>              /* Subtable: Memory Controller Structure */
>  
> +            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
> +
>              Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
>                  &Subtable);
>              if (ACPI_FAILURE (Status))
> @@ -1035,40 +1158,34 @@ DtCompilePmtt (
>                  return (Status);
>              }
>  
> -            ParentTable = DtPeekSubtable ();
> -            DtInsertSubtable (ParentTable, Subtable);
> +            break;
>  
> -            PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
> -                (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
> -            DomainCount = PmttController->DomainCount;
> +        case ACPI_PMTT_TYPE_DIMM:
>  
> -            while (DomainCount)
> -            {
> -                Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
> -                    &Subtable);
> -                if (ACPI_FAILURE (Status))
> -                {
> -                    return (Status);
> -                }
> +            /* Subtable: Physical Component (DIMM) Structure */
>  
> -                DtInsertSubtable (ParentTable, Subtable);
> -                DomainCount--;
> +            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
> +                &Subtable);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
>              }
> +
>              break;
>  
> -        case ACPI_PMTT_TYPE_DIMM:
> +        case ACPI_PMTT_TYPE_VENDOR:
>  
> -            /* Subtable: Physical Component Structure */
> +            /* Subtable: Vendor-specific Structure */
>  
> -            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
> +            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
>                  &Subtable);
>              if (ACPI_FAILURE (Status))
>              {
>                  return (Status);
>              }
>  
> -            ParentTable = DtPeekSubtable ();
> -            DtInsertSubtable (ParentTable, Subtable);
>              break;
>  
>          default:
> @@ -1076,6 +1193,8 @@ DtCompilePmtt (
>              DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
>              return (AE_ERROR);
>          }
> +
> +        DtInsertSubtable (ParentTable, Subtable);
>      }
>  
>      return (Status);
> @@ -1106,6 +1225,7 @@ DtCompilePptt (
>      ACPI_DMTABLE_INFO       *InfoTable;
>      DT_FIELD                **PFieldList = (DT_FIELD **) List;
>      DT_FIELD                *SubtableStart;
> +    ACPI_TABLE_HEADER       *PpttAcpiHeader;
>  
>  
>      ParentTable = DtPeekSubtable ();
> @@ -1191,6 +1311,20 @@ DtCompilePptt (
>              }
>              break;
>  
> +        case ACPI_PPTT_TYPE_CACHE:
> +
> +            PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
> +                AslGbl_RootTable->Buffer);
> +            if (PpttAcpiHeader->Revision < 3)
> +            {
> +                break;
> +            }
> +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
> +                &Subtable);
> +            DtInsertSubtable (ParentTable, Subtable);
> +            PpttHeader->Length += (UINT8)(Subtable->Length);
> +            break;
> +
>          default:
>  
>              break;
> @@ -1336,16 +1470,20 @@ ACPI_STATUS
>  DtCompileSdev (
>      void                    **List)
>  {
> -    ACPI_STATUS             Status;
> -    ACPI_SDEV_HEADER        *SdevHeader;
> -    DT_SUBTABLE             *Subtable;
> -    DT_SUBTABLE             *ParentTable;
> -    ACPI_DMTABLE_INFO       *InfoTable;
> -    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> -    DT_FIELD                *SubtableStart;
> -    ACPI_SDEV_PCIE          *Pcie = NULL;
> -    ACPI_SDEV_NAMESPACE     *Namesp = NULL;
> -    UINT32                  EntryCount;
> +    ACPI_STATUS                 Status;
> +    ACPI_SDEV_HEADER            *SdevHeader;
> +    ACPI_SDEV_HEADER            *SecureComponentHeader;
> +    DT_SUBTABLE                 *Subtable;
> +    DT_SUBTABLE                 *ParentTable;
> +    ACPI_DMTABLE_INFO           *InfoTable;
> +    ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
> +    DT_FIELD                    **PFieldList = (DT_FIELD **) List;
> +    DT_FIELD                    *SubtableStart;
> +    ACPI_SDEV_PCIE              *Pcie = NULL;
> +    ACPI_SDEV_NAMESPACE         *Namesp = NULL;
> +    UINT32                      EntryCount;
> +    ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
> +    UINT16                      ComponentLength = 0;
>  
>  
>      /* Subtables */
> @@ -1375,6 +1513,8 @@ DtCompileSdev (
>  
>              InfoTable = AcpiDmTableInfoSdev0;
>              Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
> +            SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
> +                ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
>              break;
>  
>          case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
> @@ -1406,6 +1546,86 @@ DtCompileSdev (
>          {
>          case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
>  
> +            /*
> +             * Device Id Offset will be be calculated differently depending on
> +             * the presence of secure access components.
> +             */
> +            Namesp->DeviceIdOffset = 0;
> +            ComponentLength = 0;
> +
> +            /* If the secure access component exists, get the structures */
> +
> +            if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
> +            {
> +                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                ParentTable = DtPeekSubtable ();
> +                DtInsertSubtable (ParentTable, Subtable);
> +
> +                Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
> +
> +                /* Compile a secure access component header */
> +
> +                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                ParentTable = DtPeekSubtable ();
> +                DtInsertSubtable (ParentTable, Subtable);
> +
> +                /* Compile the secure access component */
> +
> +                SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
> +                switch (SecureComponentHeader->Type)
> +                {
> +                case ACPI_SDEV_TYPE_ID_COMPONENT:
> +
> +                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
> +                    Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
> +                    ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
> +                    break;
> +
> +                case ACPI_SDEV_TYPE_MEM_COMPONENT:
> +
> +                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
> +                    Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
> +                    ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
> +                    break;
> +
> +                default:
> +
> +                    /* Any other secure component types are undefined */
> +
> +                    return (AE_ERROR);
> +                }
> +
> +                Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
> +                    &Subtable);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                ParentTable = DtPeekSubtable ();
> +                DtInsertSubtable (ParentTable, Subtable);
> +
> +                SecureComponent->SecureComponentOffset =
> +                    sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
> +                SecureComponent->SecureComponentLength = ComponentLength;
> +
> +
> +                /*
> +                 * Add the secure component to the subtable to be added for the
> +                 * the namespace subtable's length
> +                 */
> +                ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
> +            }
> +
>              /* Append DeviceId namespace string */
>  
>              Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
> @@ -1423,7 +1643,8 @@ DtCompileSdev (
>              ParentTable = DtPeekSubtable ();
>              DtInsertSubtable (ParentTable, Subtable);
>  
> -            Namesp->DeviceIdOffset = sizeof (ACPI_SDEV_NAMESPACE);
> +            Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
> +
>              Namesp->DeviceIdLength = (UINT16) Subtable->Length;
>  
>              /* Append Vendor data */
> @@ -1453,7 +1674,7 @@ DtCompileSdev (
>                      /* Final size of entire namespace structure */
>  
>                      SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
> -                        Subtable->Length + Namesp->DeviceIdLength);
> +                        Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
>                  }
>              }
>  
> @@ -2137,6 +2358,111 @@ DtCompileUefi (
>  }
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    DtCompileViot
> + *
> + * PARAMETERS:  List                - Current field list pointer
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Compile VIOT.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +DtCompileViot (
> +    void                    **List)
> +{
> +    ACPI_STATUS             Status;
> +    DT_SUBTABLE             *Subtable;
> +    DT_SUBTABLE             *ParentTable;
> +    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> +    DT_FIELD                *SubtableStart;
> +    ACPI_TABLE_VIOT         *Viot;
> +    ACPI_VIOT_HEADER        *ViotHeader;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +    UINT16                  NodeCount;
> +
> +    ParentTable = DtPeekSubtable ();
> +
> +    Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (Status);
> +    }
> +    DtInsertSubtable (ParentTable, Subtable);
> +
> +    /*
> +     * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
> +     * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
> +     */
> +    Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
> +        sizeof (ACPI_TABLE_HEADER));
> +
> +    Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
> +
> +    NodeCount = 0;
> +    while (*PFieldList) {
> +        SubtableStart = *PFieldList;
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
> +            &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPushSubtable (Subtable);
> +
> +        ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
> +
> +        switch (ViotHeader->Type)
> +        {
> +        case ACPI_VIOT_NODE_PCI_RANGE:
> +
> +            InfoTable = AcpiDmTableInfoViot1;
> +            break;
> +
> +        case ACPI_VIOT_NODE_MMIO:
> +
> +            InfoTable = AcpiDmTableInfoViot2;
> +            break;
> +
> +        case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
> +
> +            InfoTable = AcpiDmTableInfoViot3;
> +            break;
> +
> +        case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
> +
> +            InfoTable = AcpiDmTableInfoViot4;
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
> +            return (AE_ERROR);
> +        }
> +
> +        Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +
> +        ParentTable = DtPeekSubtable ();
> +        DtInsertSubtable (ParentTable, Subtable);
> +        DtPopSubtable ();
> +        NodeCount++;
> +    }
> +
> +    Viot->NodeCount = NodeCount;
> +    return (AE_OK);
> +}
> +
> +
>  /******************************************************************************
>   *
>   * FUNCTION:    DtCompileWdat
> diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
> index ddbcce8a..fbe68ec9 100644
> --- a/src/acpica/source/compiler/dttemplate.h
> +++ b/src/acpica/source/compiler/dttemplate.h
> @@ -204,6 +204,27 @@ const unsigned char TemplateBoot[] =
>      0x28,0x05,0x10,0x20,0x00,0x00,0x00,0x00   /* 00000020    "(.. ...." */
>  };
>  
> +const unsigned char TemplateCedt[] =
> +{
> +    0x43,0x45,0x44,0x54,0x84,0x00,0x00,0x00,  /* 00000000    "CEDT...." */
> +    0x01,0x8B,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" */
> +    0x05,0x01,0x21,0x20,0x00,0x00,0x20,0x00,  /* 00000020    "..! .. ." */
> +    0x33,0x33,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000028    "33......" */
> +    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xD5,  /* 00000030    ".....!C." */
> +    0x00,0x00,0x00,0x00,0x45,0x23,0x01,0x00,  /* 00000038    "....E#.." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,  /* 00000040    "...... ." */
> +    0x44,0x44,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000048    "DD......" */
> +    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xA5,  /* 00000050    ".....!C." */
> +    0x00,0x00,0x00,0x00,0x45,0x23,0xB1,0x00,  /* 00000058    "....E#.." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,  /* 00000060    "...... ." */
> +    0x55,0x55,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000068    "UU......" */
> +    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xB5,  /* 00000070    ".....!C." */
> +    0x00,0x00,0x00,0x00,0x45,0x23,0xB1,0x00,  /* 00000078    "....E#.." */
> +    0x00,0x00,0x00,0x00                       /* 00000080    "...."     */
> +};
> +
>  const unsigned char TemplateCpep[] =
>  {
>      0x43,0x50,0x45,0x50,0x34,0x00,0x00,0x00,  /* 00000000    "CPEP4..." */
> @@ -697,39 +718,39 @@ const unsigned char TemplateHpet[] =
>  
>  const unsigned char TemplateIort[] =
>  {
> -    0x49,0x4F,0x52,0x54,0xF8,0x01,0x00,0x00,  /* 00000000    "IORT...." */
> -    0x00,0x72,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".rINTEL " */
> +    0x49,0x4F,0x52,0x54,0x3C,0x02,0x00,0x00,  /* 00000000    "IORT<..." */
> +    0x03,0xF1,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" */
> -    0x13,0x03,0x18,0x20,0x06,0x00,0x00,0x00,  /* 00000020    "... ...." */
> +    0x05,0x01,0x21,0x20,0x07,0x00,0x00,0x00,  /* 00000020    "..! ...." */
>      0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "4......." */
> -    0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,  /* 00000030    "........" */
> +    0x49,0x4F,0x52,0x54,0x00,0x18,0x00,0x01,  /* 00000030    "IORT...." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000040    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,  /* 00000048    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x04,  /* 00000048    "........" */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000050    "........" */
>      0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "l......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
>      0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,  /* 00000068    ".\_SB.PC" */
>      0x49,0x30,0x2E,0x44,0x45,0x56,0x30,0x00,  /* 00000070    "I0.DEV0." */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A8    "........" */
> +    0x49,0x4F,0x52,0x54,0x3C,0x02,0x00,0x00,  /* 00000078    "IORT<..." */
> +    0x03,0xF2,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000080    "..INTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000088    "Template" */
> +    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000090    "....INTL" */
> +    0x05,0x01,0x21,0x20,0x07,0x00,0x00,0x00,  /* 00000098    "..! ...." */
> +    0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "4......." */
> +    0x49,0x4F,0x52,0x54,0x00,0x18,0x00,0x01,  /* 000000A8    "IORT...." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000C0    "........" */
> -    0x00,0x00,0x00,0x00,0x02,0x38,0x00,0x00,  /* 000000C8    ".....8.." */
> +    0x00,0x00,0x00,0x00,0x02,0x38,0x00,0x03,  /* 000000C8    ".....8.." */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000000D0    "........" */
>      0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000D8    "$......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F8    "........" */
> -    0x00,0x00,0x00,0x00,0x03,0x60,0x00,0x01,  /* 00000100    ".....`.." */
> +    0x00,0x00,0x00,0x00,0x03,0x60,0x00,0x03,  /* 00000100    ".....`.." */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000108    "........" */
>      0x4C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "L......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
> @@ -741,7 +762,7 @@ const unsigned char TemplateIort[] =
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
> -    0x00,0x00,0x00,0x00,0x04,0x58,0x00,0x01,  /* 00000160    ".....X.." */
> +    0x00,0x00,0x00,0x00,0x04,0x58,0x00,0x04,  /* 00000160    ".....X.." */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000168    "........" */
>      0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000170    "D......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000178    "........" */
> @@ -752,14 +773,23 @@ const unsigned char TemplateIort[] =
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001A0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001A8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B0    "........" */
> -    0x00,0x00,0x00,0x00,0x05,0x3C,0x00,0x01,  /* 000001B8    ".....<.." */
> +    0x00,0x00,0x00,0x00,0x05,0x3C,0x00,0x02,  /* 000001B8    ".....<.." */
>      0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000001C0    "........" */
>      0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C8    "(......." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001D0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001D8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001E0    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001E8    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00   /* 000001F0    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000001F0    "........" */
> +    0x06,0x44,0x00,0x01,0x00,0x00,0x00,0x00,  /* 000001F8    ".D......" */
> +    0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,  /* 00000200    "....0..." */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000208    "........" */
> +    0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000210    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000218    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000220    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000228    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000230    "........" */
> +    0x01,0x00,0x00,0x00                       /* 00000238    "...."     */
>  };
>  
>  const unsigned char TemplateIvrs[] =
> @@ -817,11 +847,11 @@ const unsigned char TemplateLpit[] =
>  
>  const unsigned char TemplateMadt[] =
>  {
> -    0x41,0x50,0x49,0x43,0x5A,0x01,0x00,0x00,  /* 00000000    "APICZ..." */
> -    0x05,0xEF,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x41,0x50,0x49,0x43,0x6A,0x01,0x00,0x00,  /* 00000000    "APICj..." */
> +    0x05,0x9D,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
>      0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
>      0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x08,0x01,0x19,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "... ...." */
> +    0x13,0x11,0x20,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "..  ...." */
>      0x01,0x00,0x00,0x00,0x00,0x08,0x00,0x00,  /* 00000028    "........" */
>      0x01,0x00,0x00,0x00,0x01,0x0C,0x01,0x00,  /* 00000030    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
> @@ -860,7 +890,9 @@ const unsigned char TemplateMadt[] =
>      0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x14,  /* 00000140    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
> -    0x00,0x00                                 /* 00000158    ".."       */
> +    0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000160    "........" */
> +    0x00,0x00                                 /* 00000168    ".."       */
>  };
>  
>  const unsigned char TemplateMcfg[] =
> @@ -956,91 +988,92 @@ const unsigned char TemplateMsct[] =
>  
>  const unsigned char TemplateNfit[] =
>  {
> -    0x4E,0x46,0x49,0x54,0x80,0x01,0x00,0x00,  /* 00000000    "NFIT...." */
> -    0x01,0x07,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x4E,0x46,0x49,0x54,0x88,0x01,0x00,0x00,  /* 00000000    "NFIT...." */
> +    0x01,0x81,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
>      0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
>      0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x29,0x09,0x17,0x20,0x00,0x00,0x00,0x00,  /* 00000020    ").. ...." */
> -    0x00,0x00,0x38,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "..8....." */
> +    0x13,0x11,0x20,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "..  ...." */
> +    0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "..@....." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
>      0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47,  /* 00000038    "0....].G" */
>      0xA6,0xB0,0x0A,0x2D,0xB9,0x40,0x82,0x49,  /* 00000040    "...-.@.I" */
>      0x00,0x00,0x00,0x7C,0x03,0x00,0x00,0x00,  /* 00000048    "...|...." */
>      0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
>      0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
> -    0x01,0x00,0x30,0x00,0x01,0x00,0x00,0x00,  /* 00000060    "..0....." */
> -    0x04,0x00,0x00,0x00,0x01,0x00,0x01,0x00,  /* 00000068    "........" */
> -    0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,  /* 00000070    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
> -    0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> -    0x01,0x00,0x03,0x00,0x2A,0x00,0x00,0x00,  /* 00000088    "....*..." */
> -    0x02,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000090    ".. ....." */
> -    0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,  /* 00000098    "........" */
> -    0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,  /* 000000A0    "........" */
> -    0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,  /* 000000A8    "........" */
> -    0x03,0x00,0x28,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "..(....." */
> -    0xB4,0x13,0x5D,0x40,0x91,0x0B,0x29,0x93,  /* 000000B8    "..]@..)." */
> -    0x67,0xE8,0x23,0x4C,0x00,0x00,0x00,0x88,  /* 000000C0    "g.#L...." */
> -    0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,  /* 000000C8    ".."3DUfw" */
> -    0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,  /* 000000D0    "........" */
> -    0x04,0x00,0x50,0x00,0x01,0x00,0x86,0x80,  /* 000000D8    "..P....." */
> -    0x17,0x20,0x01,0x00,0x86,0x80,0x17,0x20,  /* 000000E0    ". ..... " */
> -    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E8    "........" */
> -    0x89,0x00,0x54,0x76,0x01,0x03,0x00,0x01,  /* 000000F0    "..Tv...." */
> -    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F8    ". ......" */
> -    0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000100    "........" */
> -    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000108    "........" */
> -    0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
> -    0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000120    "........" */
> -    0x05,0x00,0x28,0x00,0x01,0x00,0x00,0x01,  /* 00000128    "..(....." */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000130    "........" */
> -    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000138    ". ......" */
> -    0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,  /* 00000140    "........" */
> -    0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
> -    0x06,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000150    ".. ....." */
> -    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
> -    0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,  /* 00000160    "........" */
> -    0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,  /* 00000168    "........" */
> -    0x07,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000170    "........" */
> -    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000178    "........" */
> +    0x00,0xEF,0xCD,0xAB,0x78,0x56,0x34,0x12,  /* 00000060    "....xV4." */
> +    0x01,0x00,0x30,0x00,0x01,0x00,0x00,0x00,  /* 00000068    "..0....." */
> +    0x04,0x00,0x00,0x00,0x01,0x00,0x01,0x00,  /* 00000070    "........" */
> +    0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> +    0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
> +    0x01,0x00,0x03,0x00,0x2A,0x00,0x00,0x00,  /* 00000090    "....*..." */
> +    0x02,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000098    ".. ....." */
> +    0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,  /* 000000A0    "........" */
> +    0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,  /* 000000A8    "........" */
> +    0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,  /* 000000B0    "........" */
> +    0x03,0x00,0x28,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "..(....." */
> +    0xB4,0x13,0x5D,0x40,0x91,0x0B,0x29,0x93,  /* 000000C0    "..]@..)." */
> +    0x67,0xE8,0x23,0x4C,0x00,0x00,0x00,0x88,  /* 000000C8    "g.#L...." */
> +    0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,  /* 000000D0    ".."3DUfw" */
> +    0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,  /* 000000D8    "........" */
> +    0x04,0x00,0x50,0x00,0x01,0x00,0x86,0x80,  /* 000000E0    "..P....." */
> +    0x17,0x20,0x01,0x00,0x86,0x80,0x17,0x20,  /* 000000E8    ". ..... " */
> +    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F0    "........" */
> +    0x89,0x00,0x54,0x76,0x01,0x03,0x00,0x01,  /* 000000F8    "..Tv...." */
> +    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000100    ". ......" */
> +    0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000108    "........" */
> +    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
> +    0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
> +    0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000120    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000128    "........" */
> +    0x05,0x00,0x28,0x00,0x01,0x00,0x00,0x01,  /* 00000130    "..(....." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000138    "........" */
> +    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000140    ". ......" */
> +    0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,  /* 00000148    "........" */
> +    0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
> +    0x06,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000158    ".. ....." */
> +    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000160    "........" */
> +    0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,  /* 00000168    "........" */
> +    0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,  /* 00000170    "........" */
> +    0x07,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000178    "........" */
> +    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000180    "........" */
>  };
>  
>  const unsigned char TemplatePcct[] =
>  {
> -    0x50,0x43,0x43,0x54,0x4e,0x02,0x00,0x00,  /* 00000000    "PCCTN..." */
> -    0x01,0x47,0x49,0x4e,0x54,0x45,0x4c,0x20,  /* 00000008    ".GINTEL " */
> -    0x54,0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,  /* 00000010    "Template" */
> -    0x01,0x00,0x00,0x00,0x49,0x4e,0x54,0x4c,  /* 00000018    "....INTL" */
> -    0x03,0x03,0x17,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
> +    0x50,0x43,0x43,0x54,0xAE,0x02,0x00,0x00,  /* 00000000    "PCCT...." */
> +    0x01,0xE6,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
> +    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x25,0x09,0x20,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "%.  ...." */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
> -    0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
> +    0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
>      0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,  /* 00000038    "........" */
>      0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,  /* 00000040    """""""""" */
>      0x01,0x32,0x00,0x03,0x33,0x33,0x33,0x33,  /* 00000048    ".2..3333" */
>      0x33,0x33,0x33,0x33,0x44,0x44,0x44,0x44,  /* 00000050    "3333DDDD" */
>      0x44,0x44,0x44,0x44,0x55,0x55,0x55,0x55,  /* 00000058    "DDDDUUUU" */
>      0x55,0x55,0x55,0x55,0x66,0x66,0x66,0x66,  /* 00000060    "UUUUffff" */
> -    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3e,  /* 00000068    "wwww...>" */
> +    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3E,  /* 00000068    "wwww...>" */
>      0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000070    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 00000080    ".......2" */
>      0x00,0x03,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000088    "..DDDDDD" */
>      0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000090    "DDDDDDDD" */
>      0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 00000098    "DDUUUUUU" */
> -    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000a0    "UUffffww" */
> -    0x77,0x77,0x88,0x88,0x02,0x5a,0x01,0x00,  /* 000000a8    "ww...Z.." */
> -    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000b0    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000b8    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000c0    ".....2.." */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000c8    "DDDDDDDD" */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000d0    "DDDDDDDD" */
> -    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000d8    "UUUUUUUU" */
> -    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000e0    "ffffwwww" */
> -    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000e8    "...2..33" */
> -    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000f0    "333333DD" */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000f8    "DDDDDDUU" */
> -    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0xa4,  /* 00000100    "UUUUUU.." */
> +    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000A0    "UUffffww" */
> +    0x77,0x77,0x88,0x88,0x02,0x5A,0x01,0x00,  /* 000000A8    "ww...Z.." */
> +    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000C0    ".....2.." */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000C8    "DDDDDDDD" */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000D0    "DDDDDDDD" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000D8    "UUUUUUUU" */
> +    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000E0    "ffffwwww" */
> +    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000E8    "...2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000F0    "333333DD" */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000F8    "DDDDDDUU" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0xA4,  /* 00000100    "UUUUUU.." */
>      0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000108    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
>      0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000118    "...2..33" */
> @@ -1060,18 +1093,18 @@ const unsigned char TemplatePcct[] =
>      0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 00000188    "333333DD" */
>      0x44,0x44,0x44,0x44,0x44,0x44,0x01,0x32,  /* 00000190    "DDDDDD.2" */
>      0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000198    "..333333" */
> -    0x33,0x33,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001a0    "33UUUUUU" */
> -    0x55,0x55,0x04,0xa4,0x01,0x00,0x00,0x00,  /* 000001a8    "UU......" */
> -    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001b0    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 000001b8    ".......2" */
> -    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001c0    "..333333" */
> -    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000001c8    "33DDDDDD" */
> -    0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001d0    "DDUUUUUU" */
> -    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000001d8    "UUffffww" */
> -    0x77,0x77,0x88,0x88,0x88,0x88,0x01,0x32,  /* 000001e0    "ww.....2" */
> -    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001e8    "..333333" */
> -    0x33,0x33,0x99,0x99,0x99,0x99,0x99,0x99,  /* 000001f0    "33......" */
> -    0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001f8    "........" */
> +    0x33,0x33,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001A0    "33UUUUUU" */
> +    0x55,0x55,0x04,0xA4,0x01,0x00,0x00,0x00,  /* 000001A8    "UU......" */
> +    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B0    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 000001B8    ".......2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001C0    "..333333" */
> +    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000001C8    "33DDDDDD" */
> +    0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001D0    "DDUUUUUU" */
> +    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000001D8    "UUffffww" */
> +    0x77,0x77,0x88,0x88,0x88,0x88,0x01,0x32,  /* 000001E0    "ww.....2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001E8    "..333333" */
> +    0x33,0x33,0x99,0x99,0x99,0x99,0x99,0x99,  /* 000001F0    "33......" */
> +    0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001F8    "........" */
>      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000200    "........" */
>      0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000208    "...2..33" */
>      0x33,0x33,0x33,0x33,0x33,0x33,0x22,0x22,  /* 00000210    "333333""" */
> @@ -1081,7 +1114,19 @@ const unsigned char TemplatePcct[] =
>      0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000230    "33DDDDDD" */
>      0x44,0x44,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000238    "DD.2..33" */
>      0x33,0x33,0x33,0x33,0x33,0x33,0x55,0x55,  /* 00000240    "333333UU" */
> -    0x55,0x55,0x55,0x55,0x55,0x55             /* 00000248    "UUUUUU|   */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x05,0x60,  /* 00000248    "UUUUUU.`" */
> +    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000250    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000258    "........" */
> +    0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000260    "...2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000268    "33333333" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000270    "33333333" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x01,0x32,  /* 00000278    "333333.2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000280    "..333333" */
> +    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000288    "33DDDDDD" */
> +    0x44,0x44,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000290    "DD.2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x55,0x55,  /* 00000298    "333333UU" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0x00,  /* 000002A0    "UUUUUU.." */
> +    0x00,0x00,0x05,0x00,0x00,0x00             /* 000002A8    "......"   */
>  };
>  
>  const unsigned char TemplatePdtt[] =
> @@ -1095,31 +1140,50 @@ const unsigned char TemplatePdtt[] =
>      0xCC,0x01,0xDD,0x00                       /* 00000030    "...."     */
>  };
>  
> +const unsigned char TemplatePhat [] =
> +{
> +    0x50,0x48,0x41,0x54,0x6F,0x00,0x00,0x00,  /* 00000000    "PHATo..." */
> +    0x01,0xC7,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
> +    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x05,0x01,0x21,0x20,0x00,0x00,0x28,0x00,  /* 00000020    "..! ..(." */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "........" */
> +    0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47,  /* 00000030    "0....].G" */
> +    0xA6,0xB0,0x0A,0x2D,0xB9,0x40,0x82,0x49,  /* 00000038    "...-.@.I" */
> +    0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,  /* 00000040    "........" */
> +    0x0C,0x0B,0x0A,0x09,0x01,0x00,0x23,0x00,  /* 00000048    "......#." */
> +    0x00,0x00,0x00,0x00,0x30,0x05,0xAF,0x91,  /* 00000050    "....0..." */
> +    0x86,0x5D,0x0E,0x47,0xA6,0xB0,0x0A,0x2D,  /* 00000058    ".].G...-" */
> +    0xB9,0x40,0x82,0x49,0x00,0x00,0x00,0x00,  /* 00000060    ".@.I...." */
> +    0x61,0x73,0x64,0x66,0x00,0xFF,0x11        /* 00000068    "asdf..."  */
> +};
> +
>  const unsigned char TemplatePmtt[] =
>  {
> -    0x50,0x4D,0x54,0x54,0xB4,0x00,0x00,0x00,  /* 00000000    "PMTT...." */
> -    0x01,0x3A,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".:INTEL " */
> +    0x50,0x4D,0x54,0x54,0xBB,0x00,0x00,0x00,  /* 00000000    "PMTT...." */
> +    0x02,0x2E,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" */
> -    0x26,0x08,0x11,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "&.. ...." */
> -    0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x00,0x54,0x00,  /* 00000030    "......T." */
> -    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000048    "........" */
> -    0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
> -    0x02,0x00,0x14,0x00,0x02,0x00,0x00,0x00,  /* 00000060    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
> -    0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,  /* 00000070    "........" */
> -    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> -    0x01,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000088    ".. ....." */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "........" */
> -    0x00,0x00,0x0C,0x00,0x01,0x00,0x00,0x00,  /* 000000A8    "........" */
> -    0x00,0x00,0x00,0x00                       /* 000000B0    "...."     */
> +    0x05,0x01,0x21,0x20,0x08,0x00,0x00,0x00,  /* 00000020    "..! ...." */
> +    0x00,0x00,0x10,0x00,0x0D,0x00,0x00,0x00,  /* 00000028    "........" */
> +    0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
> +    0x01,0x00,0x10,0x00,0x04,0x00,0x00,0x00,  /* 00000038    "........" */
> +    0x02,0x00,0x00,0x00,0x44,0x44,0x00,0x00,  /* 00000040    "....DD.." */
> +    0x02,0x00,0x10,0x00,0x04,0x00,0x00,0x00,  /* 00000048    "........" */
> +    0x01,0x00,0x00,0x00,0x78,0x56,0x34,0x12,  /* 00000050    "....xV4." */
> +    0xFF,0x00,0x23,0x00,0x0D,0x00,0x00,0x00,  /* 00000058    "..#....." */
> +    0x03,0x00,0x00,0x00,0x03,0x02,0x01,0x00,  /* 00000060    "........" */
> +    0x08,0x04,0x07,0x06,0x08,0x09,0x0A,0x0B,  /* 00000068    "........" */
> +    0x0C,0x0D,0x0E,0x0F,0x55,0x66,0x77,0x88,  /* 00000070    "....Ufw." */
> +    0x11,0xAA,0xBB,0x00,0x00,0x10,0x00,0x0D,  /* 00000078    "........" */
> +    0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,  /* 00000080    "........" */
> +    0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,  /* 00000088    "........" */
> +    0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
> +    0x00,0x00,0x00,0x02,0x00,0x10,0x00,0x04,  /* 00000098    "........" */
> +    0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x78,  /* 000000A0    ".......x" */
> +    0x56,0x34,0x12,0x02,0x00,0x10,0x00,0x04,  /* 000000A8    "V4......" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,  /* 000000B0    ".......x" */
> +    0x56,0x34,0x12                            /* 000000B8    "V4."      */
>  };
>  
>  const unsigned char TemplatePptt[] =
> @@ -1205,21 +1269,24 @@ const unsigned char TemplateSdei[] =
>  
>  const unsigned char TemplateSdev[] =
>  {
> -    0x53,0x44,0x45,0x56,0x72,0x00,0x00,0x00,  /* 00000000    "SDEVr..." */
> -    0x01,0x2F,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "./INTEL " */
> +    0x53,0x44,0x45,0x56,0x89,0x00,0x00,0x00,  /* 00000000    "SDEV...." */
> +    0x01,0x6E,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".nINTEL " */
>      0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
>      0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x31,0x08,0x17,0x20,0x00,0x01,0x2A,0x00,  /* 00000020    "1.. ..*." */
> -    0x0C,0x00,0x16,0x00,0x22,0x00,0x08,0x00,  /* 00000028    "...."..." */
> -    0x5C,0x5C,0x5F,0x53,0x42,0x5F,0x2E,0x50,  /* 00000030    "\\_SB_.P" */
> -    0x43,0x49,0x30,0x2E,0x55,0x53,0x42,0x31,  /* 00000038    "CI0.USB1" */
> -    0x2E,0x53,0x55,0x42,0x31,0x00,0x00,0x11,  /* 00000040    ".SUB1..." */
> -    0x22,0x33,0x44,0x55,0x66,0x77,0x01,0x01,  /* 00000048    ""3DUfw.." */
> -    0x24,0x00,0x10,0x00,0x20,0x00,0x10,0x00,  /* 00000050    "$... ..." */
> -    0x04,0x00,0x14,0x00,0x10,0x00,0x11,0x22,  /* 00000058    "......."" */
> -    0x33,0x44,0xEE,0xDD,0xCC,0xBB,0xAA,0x55,  /* 00000060    "3D.....U" */
> -    0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,  /* 00000068    "fw......" */
> -    0xEE,0xFF                                 /* 00000070    ".."       */
> +    0x05,0x01,0x21,0x20,0x00,0x03,0x41,0x00,  /* 00000020    "..! ..A." */
> +    0x23,0x00,0x16,0x00,0x39,0x00,0x08,0x00,  /* 00000028    "#...9..." */
> +    0x10,0x00,0x13,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
> +    0x01,0x00,0x03,0x02,0x05,0x04,0x07,0x06,  /* 00000038    "........" */
> +    0x09,0x08,0x0A,0x0B,0x0C,0x0D,0x0E,0x5C,  /* 00000040    ".......\" */
> +    0x5C,0x5F,0x53,0x42,0x5F,0x2E,0x50,0x43,  /* 00000048    "\_SB_.PC" */
> +    0x49,0x30,0x2E,0x55,0x53,0x42,0x31,0x2E,  /* 00000050    "I0.USB1." */
> +    0x53,0x55,0x42,0x31,0x00,0x00,0x11,0x22,  /* 00000058    "SUB1..."" */
> +    0x33,0x44,0x55,0x66,0x77,0x01,0x01,0x24,  /* 00000060    "3DUfw..$" */
> +    0x00,0x10,0x00,0x20,0x00,0x10,0x00,0x04,  /* 00000068    "... ...." */
> +    0x00,0x14,0x00,0x10,0x00,0x11,0x22,0x33,  /* 00000070    "......"3" */
> +    0x44,0xEE,0xDD,0xCC,0xBB,0xAA,0x55,0x66,  /* 00000078    "D.....Uf" */
> +    0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,  /* 00000080    "w......." */
> +    0xFF                                      /* 00000088    "."        */
>  };
>  
>  const unsigned char TemplateSlic[] =
> @@ -1450,6 +1517,26 @@ const unsigned char TemplateUefi[] =
>      0x0C,0x0D,0x0E,0x0F,0x00,0x00             /* 00000030    "......"   */
>  };
>  
> +const unsigned char TemplateViot[] =
> +{
> +    0x56,0x49,0x4F,0x54,0x80,0x00,0x00,0x00,  /* 00000000    "VIOT...." */
> +    0x00,0x52,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".RINTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
> +    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x05,0x01,0x21,0x20,0x04,0x00,0x30,0x00,  /* 00000020    "..! ..0." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
> +    0x01,0x00,0x18,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,  /* 00000038    "........" */
> +    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "`......." */
> +    0x02,0x00,0x18,0x00,0x00,0x00,0x01,0x00,  /* 00000048    "........" */
> +    0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
> +    0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "p......." */
> +    0x03,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
> +    0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000070    "........" */
> +    0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x00   /* 00000078    "........" */
> +};
> +
>  const unsigned char TemplateWaet[] =
>  {
>      0x57,0x41,0x45,0x54,0x28,0x00,0x00,0x00,  /* 00000000    "WAET(..." */
> diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
> index a508b51c..d69ad2fb 100644
> --- a/src/acpica/source/compiler/dtutils.c
> +++ b/src/acpica/source/compiler/dtutils.c
> @@ -438,6 +438,7 @@ DtGetFieldType (
>      case ACPI_DMT_BUF16:
>      case ACPI_DMT_BUF128:
>      case ACPI_DMT_PCI_PATH:
> +    case ACPI_DMT_PMTT_VENDOR:
>  
>          Type = DT_FIELD_TYPE_BUFFER;
>          break;
> @@ -573,6 +574,7 @@ DtGetFieldLength (
>      case ACPI_DMT_CHKSUM:
>      case ACPI_DMT_SPACEID:
>      case ACPI_DMT_ACCWIDTH:
> +    case ACPI_DMT_CEDT:
>      case ACPI_DMT_IVRS:
>      case ACPI_DMT_GTDT:
>      case ACPI_DMT_MADT:
> @@ -589,6 +591,7 @@ DtGetFieldLength (
>      case ACPI_DMT_ERSTACT:
>      case ACPI_DMT_ERSTINST:
>      case ACPI_DMT_DMAR_SCOPE:
> +    case ACPI_DMT_VIOT:
>  
>          ByteLength = 1;
>          break;
> @@ -599,6 +602,7 @@ DtGetFieldLength (
>      case ACPI_DMT_HMAT:
>      case ACPI_DMT_NFIT:
>      case ACPI_DMT_PCI_PATH:
> +    case ACPI_DMT_PHAT:
>  
>          ByteLength = 2;
>          break;
> @@ -673,6 +677,7 @@ DtGetFieldLength (
>  
>      case ACPI_DMT_BUFFER:
>      case ACPI_DMT_RAW_BUFFER:
> +    case ACPI_DMT_PMTT_VENDOR:
>  
>          Value = DtGetFieldValue (Field);
>          if (Value)
> diff --git a/src/acpica/source/components/disassembler/dmresrcl2.c b/src/acpica/source/components/disassembler/dmresrcl2.c
> index e98a15db..ae15e3d8 100644
> --- a/src/acpica/source/components/disassembler/dmresrcl2.c
> +++ b/src/acpica/source/components/disassembler/dmresrcl2.c
> @@ -159,6 +159,13 @@
>  
>  /* Local prototypes */
>  
> +static void
> +AcpiDmCsi2SerialBusDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level);
> +
>  static void
>  AcpiDmI2cSerialBusDescriptor (
>      ACPI_OP_WALK_INFO       *Info,
> @@ -200,7 +207,8 @@ static ACPI_RESOURCE_HANDLER        SerialBusResourceDispatch [] =
>      NULL,
>      AcpiDmI2cSerialBusDescriptor,
>      AcpiDmSpiSerialBusDescriptor,
> -    AcpiDmUartSerialBusDescriptor
> +    AcpiDmUartSerialBusDescriptor,
> +    AcpiDmCsi2SerialBusDescriptor
>  };
>  
>  
> @@ -674,6 +682,15 @@ AcpiDmDumpSerialBusVendorData (
>              sizeof (AML_RESOURCE_UART_SERIALBUS));
>          break;
>  
> +    case AML_RESOURCE_CSI2_SERIALBUSTYPE:
> +
> +        VendorLength = Resource->CommonSerialBus.TypeDataLength -
> +            AML_RESOURCE_CSI2_MIN_DATA_LEN;
> +
> +        VendorData = ACPI_ADD_PTR (UINT8, Resource,
> +            sizeof (AML_RESOURCE_CSI2_SERIALBUS));
> +        break;
> +
>      default:
>  
>          return;
> @@ -685,6 +702,75 @@ AcpiDmDumpSerialBusVendorData (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmCsi2SerialBusDescriptor
> + *
> + * PARAMETERS:  Info                - Extra resource info
> + *              Resource            - Pointer to the resource descriptor
> + *              Length              - Length of the descriptor in bytes
> + *              Level               - Current source code indentation level
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Decode a CSI2 serial bus descriptor
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmCsi2SerialBusDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level)
> +{
> +    UINT32                  ResourceSourceOffset;
> +    char                    *DeviceName;
> +
> +
> +    /* SlaveMode, PhyType, LocalPortInstance */
> +
> +    AcpiDmIndent (Level);
> +    AcpiOsPrintf ("Csi2Bus (%s,",
> +        AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->Csi2SerialBus.Flags)]);
> +
> +    AcpiOsPrintf (" 0x%2.2X, 0x%2.2X,\n",
> +        Resource->Csi2SerialBus.TypeSpecificFlags & 0x03,
> +        Resource->Csi2SerialBus.TypeSpecificFlags & 0xFC);
> +
> +    /* ResourceSource is a required field */
> +
> +    ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
> +        Resource->CommonSerialBus.TypeDataLength;
> +
> +    AcpiDmIndent (Level + 1);
> +    DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
> +    AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
> +
> +    /* ResourceSourceIndex, ResourceUsage */
> +
> +    AcpiOsPrintf (",\n");
> +    AcpiDmIndent (Level + 1);
> +    AcpiOsPrintf ("0x%2.2X, ", Resource->Csi2SerialBus.ResSourceIndex);
> +
> +    AcpiOsPrintf ("%s, ",
> +        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->Csi2SerialBus.Flags, 1)]);
> +
> +    /* Insert a descriptor name */
> +
> +    AcpiDmDescriptorName ();
> +
> +    /* Dump the vendor data */
> +
> +    AcpiOsPrintf (",\n");
> +    AcpiDmIndent (Level + 1);
> +    AcpiDmDumpSerialBusVendorData (Resource, Level);
> +    AcpiOsPrintf (")\n");
> +
> +    MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    AcpiDmI2cSerialBusDescriptor
> @@ -939,7 +1025,7 @@ AcpiDmUartSerialBusDescriptor (
>   *
>   * RETURN:      None
>   *
> - * DESCRIPTION: Decode a I2C/SPI/UART serial bus descriptor
> + * DESCRIPTION: Decode a I2C/SPI/UART/CSI2 serial bus descriptor
>   *
>   ******************************************************************************/
>  
> diff --git a/src/acpica/source/components/events/evhandler.c b/src/acpica/source/components/events/evhandler.c
> index 9faccba3..39171014 100644
> --- a/src/acpica/source/components/events/evhandler.c
> +++ b/src/acpica/source/components/events/evhandler.c
> @@ -677,6 +677,13 @@ AcpiEvInstallSpaceHandler (
>  
>      /* Init handler obj */
>  
> +    Status = AcpiOsCreateMutex (&HandlerObj->AddressSpace.ContextMutex);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        AcpiUtRemoveReference (HandlerObj);
> +        goto UnlockAndExit;
> +    }
> +
>      HandlerObj->AddressSpace.SpaceId = (UINT8) SpaceId;
>      HandlerObj->AddressSpace.HandlerFlags = Flags;
>      HandlerObj->AddressSpace.RegionList = NULL;
> diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c
> index 4f5bb7e0..2624cd65 100644
> --- a/src/acpica/source/components/events/evregion.c
> +++ b/src/acpica/source/components/events/evregion.c
> @@ -270,6 +270,8 @@ AcpiEvAddressSpaceDispatch (
>      ACPI_OPERAND_OBJECT     *RegionObj2;
>      void                    *RegionContext = NULL;
>      ACPI_CONNECTION_INFO    *Context;
> +    ACPI_MUTEX              ContextMutex;
> +    BOOLEAN                 ContextLocked;
>      ACPI_PHYSICAL_ADDRESS   Address;
>  
>  
> @@ -296,6 +298,8 @@ AcpiEvAddressSpaceDispatch (
>      }
>  
>      Context = HandlerDesc->AddressSpace.Context;
> +    ContextMutex = HandlerDesc->AddressSpace.ContextMutex;
> +    ContextLocked = FALSE;
>  
>      /*
>       * It may be the case that the region has never been initialized.
> @@ -362,6 +366,23 @@ AcpiEvAddressSpaceDispatch (
>      Handler = HandlerDesc->AddressSpace.Handler;
>      Address = (RegionObj->Region.Address + RegionOffset);
>  
> +    ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> +        "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
> +        &RegionObj->Region.Handler->AddressSpace, Handler,
> +        ACPI_FORMAT_UINT64 (Address),
> +        AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
> +
> +    if (!(HandlerDesc->AddressSpace.HandlerFlags &
> +        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
> +    {
> +        /*
> +         * For handlers other than the default (supplied) handlers, we must
> +         * exit the interpreter because the handler *might* block -- we don't
> +         * know what it will do, so we can't hold the lock on the interpreter.
> +         */
> +        AcpiExExitInterpreter();
> +    }
> +
>      /*
>       * Special handling for GenericSerialBus and GeneralPurposeIo:
>       * There are three extra parameters that must be passed to the
> @@ -370,50 +391,42 @@ AcpiEvAddressSpaceDispatch (
>       *   2) Length of the above buffer
>       *   3) Actual access length from the AccessAs() op
>       *
> +     * Since we pass these extra parameters via the context, which is
> +     * shared between threads, we must lock the context to avoid these
> +     * parameters being changed from another thread before the handler
> +     * has completed running.
> +     *
>       * In addition, for GeneralPurposeIo, the Address and BitWidth fields
>       * are defined as follows:
>       *   1) Address is the pin number index of the field (bit offset from
>       *      the previous Connection)
>       *   2) BitWidth is the actual bit length of the field (number of pins)
>       */
> -    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS) &&
> +    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS ||
> +         RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO) &&
>          Context &&
>          FieldObj)
>      {
> -        /* Get the Connection (ResourceTemplate) buffer */
>  
> -        Context->Connection = FieldObj->Field.ResourceBuffer;
> -        Context->Length = FieldObj->Field.ResourceLength;
> -        Context->AccessLength = FieldObj->Field.AccessLength;
> -    }
> -    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO) &&
> -        Context &&
> -        FieldObj)
> -    {
> +        Status = AcpiOsAcquireMutex (ContextMutex, ACPI_WAIT_FOREVER);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            goto ReEnterInterpreter;
> +        }
> +
> +        ContextLocked = TRUE;
> +
>          /* Get the Connection (ResourceTemplate) buffer */
>  
>          Context->Connection = FieldObj->Field.ResourceBuffer;
>          Context->Length = FieldObj->Field.ResourceLength;
>          Context->AccessLength = FieldObj->Field.AccessLength;
> -        Address = FieldObj->Field.PinNumberIndex;
> -        BitWidth = FieldObj->Field.BitLength;
> -    }
>  
> -    ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> -        "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
> -        &RegionObj->Region.Handler->AddressSpace, Handler,
> -        ACPI_FORMAT_UINT64 (Address),
> -        AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
> -
> -    if (!(HandlerDesc->AddressSpace.HandlerFlags &
> -        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
> -    {
> -        /*
> -         * For handlers other than the default (supplied) handlers, we must
> -         * exit the interpreter because the handler *might* block -- we don't
> -         * know what it will do, so we can't hold the lock on the interpreter.
> -         */
> -        AcpiExExitInterpreter();
> +        if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO)
> +        {
> +            Address = FieldObj->Field.PinNumberIndex;
> +            BitWidth = FieldObj->Field.BitLength;
> +        }
>      }
>  
>      /* Call the handler */
> @@ -421,6 +434,11 @@ AcpiEvAddressSpaceDispatch (
>      Status = Handler (Function, Address, BitWidth, Value, Context,
>          RegionObj2->Extra.RegionContext);
>  
> +    if (ContextLocked)
> +    {
> +        AcpiOsReleaseMutex (ContextMutex);
> +    }
> +
>      if (ACPI_FAILURE (Status))
>      {
>          ACPI_EXCEPTION ((AE_INFO, Status, "Returned by Handler for [%s]",
> @@ -438,6 +456,7 @@ AcpiEvAddressSpaceDispatch (
>          }
>      }
>  
> +ReEnterInterpreter:
>      if (!(HandlerDesc->AddressSpace.HandlerFlags &
>          ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
>      {
> diff --git a/src/acpica/source/components/events/evxfregn.c b/src/acpica/source/components/events/evxfregn.c
> index 9113d8a2..3febc81c 100644
> --- a/src/acpica/source/components/events/evxfregn.c
> +++ b/src/acpica/source/components/events/evxfregn.c
> @@ -362,6 +362,7 @@ AcpiRemoveAddressSpaceHandler (
>  
>              /* Now we can delete the handler object */
>  
> +            AcpiOsReleaseMutex (HandlerObj->AddressSpace.ContextMutex);
>              AcpiUtRemoveReference (HandlerObj);
>              goto UnlockAndExit;
>          }
> diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
> index c332896f..4286223e 100644
> --- a/src/acpica/source/components/namespace/nsaccess.c
> +++ b/src/acpica/source/components/namespace/nsaccess.c
> @@ -251,14 +251,13 @@ AcpiNsRootInitialize (
>           * predefined names are at the root level. It is much easier to
>           * just create and link the new node(s) here.
>           */
> -        NewNode = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_NAMESPACE_NODE));
> +        NewNode = AcpiNsCreateNode (*ACPI_CAST_PTR (UINT32, InitVal->Name));
>          if (!NewNode)
>          {
>              Status = AE_NO_MEMORY;
>              goto UnlockAndExit;
>          }
>  
> -        ACPI_COPY_NAMESEG (NewNode->Name.Ascii, InitVal->Name);
>          NewNode->DescriptorType = ACPI_DESC_TYPE_NAMED;
>          NewNode->Type = InitVal->Type;
>  
> diff --git a/src/acpica/source/components/namespace/nsrepair2.c b/src/acpica/source/components/namespace/nsrepair2.c
> index 8ec425ee..d3dcd318 100644
> --- a/src/acpica/source/components/namespace/nsrepair2.c
> +++ b/src/acpica/source/components/namespace/nsrepair2.c
> @@ -690,8 +690,9 @@ AcpiNsRepair_HID (
>      ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
>  {
>      ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
> -    char                    *Dest;
> +    ACPI_OPERAND_OBJECT     *NewString;
>      char                    *Source;
> +    char                    *Dest;
>  
>  
>      ACPI_FUNCTION_NAME (NsRepair_HID);
> @@ -716,6 +717,14 @@ AcpiNsRepair_HID (
>          return_ACPI_STATUS (AE_OK);
>      }
>  
> +    /* It is simplest to always create a new string object */
> +
> +    NewString = AcpiUtCreateStringObject (ReturnObject->String.Length);
> +    if (!NewString)
> +    {
> +        return_ACPI_STATUS (AE_NO_MEMORY);
> +    }
> +
>      /*
>       * Remove a leading asterisk if present. For some unknown reason, there
>       * are many machines in the field that contains IDs like this.
> @@ -726,7 +735,7 @@ AcpiNsRepair_HID (
>      if (*Source == '*')
>      {
>          Source++;
> -        ReturnObject->String.Length--;
> +        NewString->String.Length--;
>  
>          ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
>              "%s: Removed invalid leading asterisk\n", Info->FullPathname));
> @@ -740,12 +749,13 @@ AcpiNsRepair_HID (
>       * "NNNN####" where N is an uppercase letter or decimal digit, and
>       * # is a hex digit.
>       */
> -    for (Dest = ReturnObject->String.Pointer; *Source; Dest++, Source++)
> +    for (Dest = NewString->String.Pointer; *Source; Dest++, Source++)
>      {
>          *Dest = (char) toupper ((int) *Source);
>      }
> -    ReturnObject->String.Pointer[ReturnObject->String.Length] = 0;
>  
> +    AcpiUtRemoveReference (ReturnObject);
> +    *ReturnObjectPtr = NewString;
>      return_ACPI_STATUS (AE_OK);
>  }
>  
> diff --git a/src/acpica/source/components/resources/rscalc.c b/src/acpica/source/components/resources/rscalc.c
> index d435323f..2e878e80 100644
> --- a/src/acpica/source/components/resources/rscalc.c
> +++ b/src/acpica/source/components/resources/rscalc.c
> @@ -816,9 +816,9 @@ AcpiRsGetListLength (
>          *SizeNeeded += BufferSize;
>  
>          ACPI_DEBUG_PRINT ((ACPI_DB_RESOURCES,
> -            "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
> +            "Type %.2X, AmlLength %.2X InternalLength %.2X%8X\n",
>              AcpiUtGetResourceType (AmlBuffer),
> -            AcpiUtGetDescriptorLength (AmlBuffer), BufferSize));
> +            AcpiUtGetDescriptorLength (AmlBuffer), ACPI_FORMAT_UINT64(*SizeNeeded)));
>  
>          /*
>           * Point to the next resource within the AML stream using the length
> diff --git a/src/acpica/source/components/resources/rsdump.c b/src/acpica/source/components/resources/rsdump.c
> index 7f597f16..44b552ad 100644
> --- a/src/acpica/source/components/resources/rsdump.c
> +++ b/src/acpica/source/components/resources/rsdump.c
> @@ -277,6 +277,11 @@ AcpiRsDumpResourceList (
>                  ResourceList->Type);
>              return;
>          }
> +        else if (!ResourceList->Type)
> +        {
> +            ACPI_ERROR ((AE_INFO, "Invalid Zero Resource Type"));
> +            return;
> +        }
>  
>          /* Sanity check the length. It must not be zero, or we loop forever */
>  
> @@ -460,6 +465,11 @@ AcpiRsDumpDescriptor (
>              AcpiRsOutString (Name, Table->Pointer [*Target & 0x07]);
>              break;
>  
> +        case ACPI_RSD_6BITFLAG:
> +
> +            AcpiRsOutInteger8 (Name, (ACPI_GET8 (Target) & 0x3F));
> +            break;
> +
>          case ACPI_RSD_SHORTLIST:
>              /*
>               * Short byte list (single line output) for DMA and IRQ resources
> diff --git a/src/acpica/source/components/resources/rsdumpinfo.c b/src/acpica/source/components/resources/rsdumpinfo.c
> index f1688120..26f4993d 100644
> --- a/src/acpica/source/components/resources/rsdumpinfo.c
> +++ b/src/acpica/source/components/resources/rsdumpinfo.c
> @@ -454,6 +454,21 @@ ACPI_RSDUMP_INFO        AcpiRsDumpCommonSerialBus[11] =
>      ACPI_RS_DUMP_COMMON_SERIAL_BUS
>  };
>  
> +ACPI_RSDUMP_INFO        AcpiRsDumpCsi2SerialBus[11] =
> +{
> +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpCsi2SerialBus),      "Camera Serial Bus",        NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.RevisionId),         "RevisionId",               NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.Type),               "Type",                     AcpiGbl_SbtDecode},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.ProducerConsumer),   "ProducerConsumer",         AcpiGbl_ConsumeDecode},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.SlaveMode),          "SlaveMode",                AcpiGbl_SmDecode},
> +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.PhyType),            "PhyType",                  AcpiGbl_PhyDecode},
> +    {ACPI_RSD_6BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.LocalPortInstance),  "LocalPortInstance",        NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.TypeRevisionId),     "TypeRevisionId",           NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Csi2SerialBus.VendorLength),       "VendorLength",             NULL},
> +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (Csi2SerialBus.VendorData),        "VendorData",               NULL},
> +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Csi2SerialBus.ResourceSource),     "ResourceSource",           NULL},
> +};
> +
>  ACPI_RSDUMP_INFO        AcpiRsDumpI2cSerialBus[14] =
>  {
>      {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpI2cSerialBus),       "I2C Serial Bus",           NULL},
> diff --git a/src/acpica/source/components/resources/rsinfo.c b/src/acpica/source/components/resources/rsinfo.c
> index b3a7180a..9687bfb4 100644
> --- a/src/acpica/source/components/resources/rsinfo.c
> +++ b/src/acpica/source/components/resources/rsinfo.c
> @@ -245,7 +245,7 @@ ACPI_RSCONVERT_INFO         *AcpiGbl_GetResourceDispatch[] =
>      AcpiRsConvertPinGroupConfig,    /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
>  };
>  
> -/* Subtype table for SerialBus -- I2C, SPI, and UART */
> +/* Subtype table for SerialBus -- I2C, SPI, UART, and CSI2 */
>  
>  ACPI_RSCONVERT_INFO         *AcpiGbl_ConvertResourceSerialBusDispatch[] =
>  {
> @@ -253,6 +253,7 @@ ACPI_RSCONVERT_INFO         *AcpiGbl_ConvertResourceSerialBusDispatch[] =
>      AcpiRsConvertI2cSerialBus,
>      AcpiRsConvertSpiSerialBus,
>      AcpiRsConvertUartSerialBus,
> +    AcpiRsConvertCsi2SerialBus
>  };
>  
>  
> @@ -295,6 +296,7 @@ ACPI_RSDUMP_INFO            *AcpiGbl_DumpSerialBusDispatch[] =
>      AcpiRsDumpI2cSerialBus,         /* AML_RESOURCE_I2C_BUS_TYPE */
>      AcpiRsDumpSpiSerialBus,         /* AML_RESOURCE_SPI_BUS_TYPE */
>      AcpiRsDumpUartSerialBus,        /* AML_RESOURCE_UART_BUS_TYPE */
> +    AcpiRsDumpCsi2SerialBus,        /* AML_RESOURCE_CSI2_BUS_TYPE */
>  };
>  #endif
>  
> @@ -384,6 +386,7 @@ const UINT8                 AcpiGbl_AmlResourceSerialBusSizes[] =
>      sizeof (AML_RESOURCE_I2C_SERIALBUS),
>      sizeof (AML_RESOURCE_SPI_SERIALBUS),
>      sizeof (AML_RESOURCE_UART_SERIALBUS),
> +    sizeof (AML_RESOURCE_CSI2_SERIALBUS),
>  };
>  
>  const UINT8                 AcpiGbl_ResourceStructSerialBusSizes[] =
> @@ -392,4 +395,5 @@ const UINT8                 AcpiGbl_ResourceStructSerialBusSizes[] =
>      ACPI_RS_SIZE (ACPI_RESOURCE_I2C_SERIALBUS),
>      ACPI_RS_SIZE (ACPI_RESOURCE_SPI_SERIALBUS),
>      ACPI_RS_SIZE (ACPI_RESOURCE_UART_SERIALBUS),
> +    ACPI_RS_SIZE (ACPI_RESOURCE_CSI2_SERIALBUS),
>  };
> diff --git a/src/acpica/source/components/resources/rslist.c b/src/acpica/source/components/resources/rslist.c
> index 4ee8aa63..1867c0a9 100644
> --- a/src/acpica/source/components/resources/rslist.c
> +++ b/src/acpica/source/components/resources/rslist.c
> @@ -216,7 +216,7 @@ AcpiRsConvertAmlToResources (
>          }
>          else
>          {
> -            /* This is an I2C, SPI, or UART SerialBus descriptor */
> +            /* This is an I2C, SPI, UART, or CSI2 SerialBus descriptor */
>  
>              ConversionTable = AcpiGbl_ConvertResourceSerialBusDispatch [
>                  AmlResource->CommonSerialBus.Type];
> @@ -246,6 +246,12 @@ AcpiRsConvertAmlToResources (
>          return_ACPI_STATUS (Status);
>      }
>  
> +    if (!Resource->Length)
> +    {
> +        ACPI_EXCEPTION ((AE_INFO, Status,
> +            "Zero-length resource returned from RsConvertAmlToResource"));
> +    }
> +
>      ACPI_DEBUG_PRINT ((ACPI_DB_RESOURCES,
>          "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
>          AcpiUtGetResourceType (Aml), Length,
> @@ -326,7 +332,7 @@ AcpiRsConvertResourcesToAml (
>              }
>              else
>              {
> -                /* This is an I2C, SPI, or UART SerialBus descriptor */
> +                /* This is an I2C, SPI, UART or CSI2 SerialBus descriptor */
>  
>                  ConversionTable = AcpiGbl_ConvertResourceSerialBusDispatch[
>                      Resource->Data.CommonSerialBus.Type];
> diff --git a/src/acpica/source/components/resources/rsmisc.c b/src/acpica/source/components/resources/rsmisc.c
> index 31a7d9ee..f0f186b8 100644
> --- a/src/acpica/source/components/resources/rsmisc.c
> +++ b/src/acpica/source/components/resources/rsmisc.c
> @@ -225,6 +225,8 @@ AcpiRsConvertAmlToResource (
>      Count = INIT_TABLE_LENGTH (Info);
>      while (Count)
>      {
> +        Target = NULL;
> +
>          /*
>           * Source is the external AML byte stream buffer,
>           * destination is the internal resource descriptor
> @@ -275,6 +277,14 @@ AcpiRsConvertAmlToResource (
>                  ((ACPI_GET8 (Source) >> Info->Value) & 0x07));
>              break;
>  
> +        case ACPI_RSC_6BITFLAG:
> +            /*
> +             * Mask and shift the flag bits
> +             */
> +            ACPI_SET8 (Destination,
> +                ((ACPI_GET8 (Source) >> Info->Value) & 0x3F));
> +            break;
> +
>          case ACPI_RSC_COUNT:
>  
>              ItemCount = ACPI_GET8 (Source);
> @@ -654,6 +664,14 @@ AcpiRsConvertResourceToAml (
>                  ((ACPI_GET8 (Source) & 0x07) << Info->Value));
>              break;
>  
> +        case ACPI_RSC_6BITFLAG:
> +            /*
> +             * Mask and shift the flag bits
> +             */
> +            ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
> +                ((ACPI_GET8 (Source) & 0x3F) << Info->Value));
> +            break;
> +
>          case ACPI_RSC_COUNT:
>  
>              ItemCount = ACPI_GET8 (Source);
> diff --git a/src/acpica/source/components/resources/rsserial.c b/src/acpica/source/components/resources/rsserial.c
> index 2df8eb77..d505ea94 100644
> --- a/src/acpica/source/components/resources/rsserial.c
> +++ b/src/acpica/source/components/resources/rsserial.c
> @@ -327,6 +327,76 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertPinFunction[13] =
>  };
>  
>  
> +/*******************************************************************************
> + *
> + * AcpiRsConvertCsi2SerialBus
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO     AcpiRsConvertCsi2SerialBus[14] =
> +{
> +    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_SERIAL_BUS,
> +                        ACPI_RS_SIZE (ACPI_RESOURCE_CSI2_SERIALBUS),
> +                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertCsi2SerialBus)},
> +
> +    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_SERIAL_BUS,
> +                        sizeof (AML_RESOURCE_CSI2_SERIALBUS),
> +                        0},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.CommonSerialBus.RevisionId),
> +                        AML_OFFSET (CommonSerialBus.RevisionId),
> +                        1},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.Type),
> +                        AML_OFFSET (Csi2SerialBus.Type),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.ProducerConsumer),
> +                        AML_OFFSET (Csi2SerialBus.Flags),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.SlaveMode),
> +                        AML_OFFSET (Csi2SerialBus.Flags),
> +                        0},
> +
> +    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.PhyType),
> +                        AML_OFFSET (Csi2SerialBus.TypeSpecificFlags),
> +                        0},
> +
> +    {ACPI_RSC_6BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.LocalPortInstance),
> +                        AML_OFFSET (Csi2SerialBus.TypeSpecificFlags),
> +                        2},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.TypeRevisionId),
> +                        AML_OFFSET (Csi2SerialBus.TypeRevisionId),
> +                        1},
> +
> +    /* Vendor data */
> +
> +    {ACPI_RSC_COUNT_SERIAL_VEN, ACPI_RS_OFFSET (Data.Csi2SerialBus.VendorLength),
> +                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
> +                        AML_RESOURCE_CSI2_MIN_DATA_LEN},
> +
> +    {ACPI_RSC_MOVE_SERIAL_VEN,  ACPI_RS_OFFSET (Data.Csi2SerialBus.VendorData),
> +                        0,
> +                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
> +
> +    /* Resource Source */
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.Index),
> +                        AML_OFFSET (Csi2SerialBus.ResSourceIndex),
> +                        1},
> +
> +    {ACPI_RSC_COUNT_SERIAL_RES, ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.StringLength),
> +                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
> +                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
> +
> +    {ACPI_RSC_MOVE_SERIAL_RES,  ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.StringPtr),
> +                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
> +                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
> +};
> +
> +
>  /*******************************************************************************
>   *
>   * AcpiRsConvertI2cSerialBus
> diff --git a/src/acpica/source/components/utilities/utresdecode.c b/src/acpica/source/components/utilities/utresdecode.c
> index e7c10afa..561240f0 100644
> --- a/src/acpica/source/components/utilities/utresdecode.c
> +++ b/src/acpica/source/components/utilities/utresdecode.c
> @@ -240,6 +240,14 @@ const char                      *AcpiGbl_MtpDecode[] =
>      "AddressRangeNVS"
>  };
>  
> +const char                      *AcpiGbl_PhyDecode[] =
> +{
> +    "Type C",
> +    "Type D",
> +    "Unknown Type",
> +    "Unknown Type"
> +};
> +
>  const char                      *AcpiGbl_RngDecode[] =
>  {
>      "InvalidRanges",
> @@ -331,7 +339,8 @@ const char                      *AcpiGbl_SbtDecode[] =
>      "/* UNKNOWN serial bus type */",
>      "I2C",
>      "SPI",
> -    "UART"
> +    "UART",
> +    "CSI2"
>  };
>  
>  /* I2C serial bus access mode */
> diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
> index b7c4aace..70e5119e 100644
> --- a/src/acpica/source/components/utilities/utresrc.c
> +++ b/src/acpica/source/components/utilities/utresrc.c
> @@ -212,6 +212,7 @@ const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
>      ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS),
>      ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS),
>      ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS),
> +    ACPI_AML_SIZE_LARGE (AML_RESOURCE_CSI2_SERIALBUS),
>  };
>  
>  
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index 94c002da..f02f3239 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -251,6 +251,7 @@ typedef enum
>      /* Types that are specific to particular ACPI tables */
>  
>      ACPI_DMT_ASF,
> +    ACPI_DMT_CEDT,
>      ACPI_DMT_DMAR,
>      ACPI_DMT_DMAR_SCOPE,
>      ACPI_DMT_EINJACT,
> @@ -269,13 +270,16 @@ typedef enum
>      ACPI_DMT_MADT,
>      ACPI_DMT_NFIT,
>      ACPI_DMT_PCCT,
> +    ACPI_DMT_PHAT,
>      ACPI_DMT_PMTT,
> +    ACPI_DMT_PMTT_VENDOR,
>      ACPI_DMT_PPTT,
>      ACPI_DMT_SDEI,
>      ACPI_DMT_SDEV,
>      ACPI_DMT_SLIC,
>      ACPI_DMT_SRAT,
>      ACPI_DMT_TPM2,
> +    ACPI_DMT_VIOT,
>  
>      /* Special opcodes */
>  
> @@ -364,6 +368,8 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoAsfHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBoot[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBert[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBgrt[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCedtHdr[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCedt0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCpep[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCpep0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCsrt0[];
> @@ -451,8 +457,11 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort3b[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort3c[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort4[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort5[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort6[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort6a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortAcc[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortHdr[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortHdr3[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortMap[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortPad[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs[];
> @@ -463,6 +472,8 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs4[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8b[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8c[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHid[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHid1[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt0[];
> @@ -481,6 +492,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt12[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt13[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt14[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt15[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt16[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadtHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMcfg[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMcfg0[];
> @@ -507,11 +519,17 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit7[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPdtt[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhatHdr[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat0[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat0a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1b[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt1[];
> -extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt1a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt2[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmttVendor[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmttHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcctHdr[];
> @@ -520,10 +538,12 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct1[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct2[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct3[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct4[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct5[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPdtt0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt2[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPpttHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRasf[];
> @@ -539,6 +559,10 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevHdr[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0b[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompHdr[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompId[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompMem[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1b[];
> @@ -565,6 +589,12 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm211[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm23[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm23a[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoUefi[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViotHeader[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot2[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot3[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot4[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWaet[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWdat[];
>  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWdat0[];
> @@ -640,6 +670,10 @@ void
>  AcpiDmDumpAsf (
>      ACPI_TABLE_HEADER       *Table);
>  
> +void
> +AcpiDmDumpCedt (
> +    ACPI_TABLE_HEADER       *Table);
> +
>  void
>  AcpiDmDumpCpep (
>      ACPI_TABLE_HEADER       *Table);
> @@ -728,6 +762,10 @@ void
>  AcpiDmDumpPdtt (
>      ACPI_TABLE_HEADER       *Table);
>  
> +void
> +AcpiDmDumpPhat (
> +    ACPI_TABLE_HEADER       *Table);
> +
>  void
>  AcpiDmDumpPmtt (
>      ACPI_TABLE_HEADER       *Table);
> @@ -776,6 +814,10 @@ void
>  AcpiDmDumpTpm2 (
>      ACPI_TABLE_HEADER       *Table);
>  
> +void
> +AcpiDmDumpViot (
> +    ACPI_TABLE_HEADER       *Table);
> +
>  void
>  AcpiDmDumpWdat (
>      ACPI_TABLE_HEADER       *Table);
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index f047efb8..e7d9f1c9 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -521,6 +521,7 @@ typedef struct acpi_object_addr_handler
>      ACPI_ADR_SPACE_HANDLER          Handler;
>      ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
>      void                            *Context;
> +    ACPI_MUTEX                      ContextMutex;
>      ACPI_ADR_SPACE_SETUP            Setup;
>      union acpi_operand_object       *RegionList;        /* Regions using this handler */
>      union acpi_operand_object       *Next;
> diff --git a/src/acpica/source/include/acoutput.h b/src/acpica/source/include/acoutput.h
> index 1d6aacca..46774ad0 100644
> --- a/src/acpica/source/include/acoutput.h
> +++ b/src/acpica/source/include/acoutput.h
> @@ -508,7 +508,7 @@
>   *
>   * A less-safe version of the macros is provided for optional use if the
>   * compiler uses excessive CPU stack (for example, this may happen in the
> - * debug case if code optimzation is disabled.)
> + * debug case if code optimization is disabled.)
>   */
>  
>  /* Exit trace helper macro */
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index cb24eb4e..0733ac41 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                 0x20210105
> +#define ACPI_CA_VERSION                 0x20210331
>  
>  #include "acconfig.h"
>  #include "actypes.h"
> diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h
> index 22aece65..bc55155c 100644
> --- a/src/acpica/source/include/acpredef.h
> +++ b/src/acpica/source/include/acpredef.h
> @@ -472,6 +472,17 @@ const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
>      {{"_BMS",   METHOD_1ARGS (ACPI_TYPE_INTEGER),
>                  METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
>  
> +    {{"_BPC",   METHOD_0ARGS,
> +                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (4 Int) */
> +                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 4,0,0,0),
> +
> +    {{"_BPS",   METHOD_0ARGS,
> +                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (5 Int) */
> +                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 5,0,0,0),
> +
> +    {{"_BPT",   METHOD_1ARGS (ACPI_TYPE_PACKAGE),
> +                METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
> +
>      {{"_BQC",   METHOD_0ARGS,
>                  METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
>  
> @@ -491,6 +502,10 @@ const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
>      {{"_CBA",   METHOD_0ARGS,
>                  METHOD_RETURNS (ACPI_RTYPE_INTEGER)}}, /* See PCI firmware spec 3.0 */
>  
> +    {{"_CBR",   METHOD_0ARGS,
> +                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (3 Int) */
> +                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 3,0,0,0),
> +
>      {{"_CCA",   METHOD_0ARGS,
>                  METHOD_RETURNS (ACPI_RTYPE_INTEGER)}}, /* ACPI 5.1 */
>  
> diff --git a/src/acpica/source/include/acresrc.h b/src/acpica/source/include/acresrc.h
> index 082918d7..816d4fa4 100644
> --- a/src/acpica/source/include/acresrc.h
> +++ b/src/acpica/source/include/acresrc.h
> @@ -192,6 +192,7 @@ typedef enum
>      ACPI_RSC_1BITFLAG,
>      ACPI_RSC_2BITFLAG,
>      ACPI_RSC_3BITFLAG,
> +    ACPI_RSC_6BITFLAG,
>      ACPI_RSC_ADDRESS,
>      ACPI_RSC_BITMASK,
>      ACPI_RSC_BITMASK16,
> @@ -252,6 +253,7 @@ typedef enum
>      ACPI_RSD_1BITFLAG,
>      ACPI_RSD_2BITFLAG,
>      ACPI_RSD_3BITFLAG,
> +    ACPI_RSD_6BITFLAG,
>      ACPI_RSD_ADDRESS,
>      ACPI_RSD_DWORDLIST,
>      ACPI_RSD_LITERAL,
> @@ -495,6 +497,7 @@ extern ACPI_RSCONVERT_INFO      AcpiRsConvertAddress64[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertExtAddress64[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertGpio[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertFixedDma[];
> +extern ACPI_RSCONVERT_INFO      AcpiRsConvertCsi2SerialBus[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertI2cSerialBus[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertSpiSerialBus[];
>  extern ACPI_RSCONVERT_INFO      AcpiRsConvertUartSerialBus[];
> @@ -550,6 +553,7 @@ extern ACPI_RSDUMP_INFO         AcpiRsDumpGpio[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpPinFunction[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpFixedDma[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpCommonSerialBus[];
> +extern ACPI_RSDUMP_INFO         AcpiRsDumpCsi2SerialBus[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpI2cSerialBus[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpSpiSerialBus[];
>  extern ACPI_RSDUMP_INFO         AcpiRsDumpUartSerialBus[];
> diff --git a/src/acpica/source/include/acrestyp.h b/src/acpica/source/include/acrestyp.h
> index d2cd4c4d..3c258de9 100644
> --- a/src/acpica/source/include/acrestyp.h
> +++ b/src/acpica/source/include/acrestyp.h
> @@ -593,7 +593,7 @@ typedef struct acpi_resource_gpio
>  #define ACPI_IO_RESTRICT_NONE_PRESERVE          3
>  
>  
> -/* Common structure for I2C, SPI, and UART serial descriptors */
> +/* Common structure for I2C, SPI, UART, CSI2 serial descriptors */
>  
>  #define ACPI_RESOURCE_SERIAL_COMMON \
>      UINT8                           RevisionId; \
> @@ -618,6 +618,7 @@ typedef struct acpi_resource_common_serialbus
>  #define ACPI_RESOURCE_SERIAL_TYPE_I2C           1
>  #define ACPI_RESOURCE_SERIAL_TYPE_SPI           2
>  #define ACPI_RESOURCE_SERIAL_TYPE_UART          3
> +#define ACPI_RESOURCE_SERIAL_TYPE_CSI2          4
>  
>  /* Values for SlaveMode field above */
>  
> @@ -732,6 +733,14 @@ typedef struct acpi_resource_uart_serialbus
>  #define ACPI_UART_CLEAR_TO_SEND                 (1<<6)
>  #define ACPI_UART_REQUEST_TO_SEND               (1<<7)
>  
> +typedef struct acpi_resource_csi2_serialbus
> +{
> +    ACPI_RESOURCE_SERIAL_COMMON
> +    UINT8                           LocalPortInstance;
> +    UINT8                           PhyType;
> +
> +} ACPI_RESOURCE_CSI2_SERIALBUS;
> +
>  typedef struct acpi_resource_pin_function
>  {
>      UINT8                           RevisionId;
> @@ -872,6 +881,7 @@ typedef union acpi_resource_data
>      ACPI_RESOURCE_I2C_SERIALBUS             I2cSerialBus;
>      ACPI_RESOURCE_SPI_SERIALBUS             SpiSerialBus;
>      ACPI_RESOURCE_UART_SERIALBUS            UartSerialBus;
> +    ACPI_RESOURCE_CSI2_SERIALBUS            Csi2SerialBus;
>      ACPI_RESOURCE_COMMON_SERIALBUS          CommonSerialBus;
>      ACPI_RESOURCE_PIN_FUNCTION              PinFunction;
>      ACPI_RESOURCE_PIN_CONFIG                PinConfig;
> diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h
> index b10cc9ef..af10c774 100644
> --- a/src/acpica/source/include/actbinfo.h
> +++ b/src/acpica/source/include/actbinfo.h
> @@ -196,6 +196,7 @@
>  #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)
> +#define ACPI_VIOT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_VIOT,f)
>  #define ACPI_WAET_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WAET,f)
>  #define ACPI_WDAT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDAT,f)
>  #define ACPI_WDDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDDT,f)
> @@ -213,6 +214,8 @@
>  #define ACPI_ASF2a_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_ASF_CONTROL_DATA,f)
>  #define ACPI_ASF3_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_ASF_RMCP,f)
>  #define ACPI_ASF4_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_ASF_ADDRESS,f)
> +#define ACPI_CEDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_CEDT_HEADER, f)
> +#define ACPI_CEDT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CEDT_CHBS, f)
>  #define ACPI_CPEP0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CPEP_POLLING,f)
>  #define ACPI_CSRT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CSRT_GROUP,f)
>  #define ACPI_CSRT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CSRT_SHARED_INFO,f)
> @@ -260,6 +263,8 @@
>  #define ACPI_IORT3A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IORT_SMMU_GSI,f)
>  #define ACPI_IORT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_SMMU_V3,f)
>  #define ACPI_IORT5_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_PMCG,f)
> +#define ACPI_IORT6_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_RMR,f)
> +#define ACPI_IORT6A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IORT_RMR_DESC,f)
>  #define ACPI_IORTA_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_MEMORY_ACCESS,f)
>  #define ACPI_IORTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_NODE,f)
>  #define ACPI_IORTM_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_ID_MAPPING,f)
> @@ -271,6 +276,7 @@
>  #define ACPI_IVRS8A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8A,f)
>  #define ACPI_IVRS8B_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8B,f)
>  #define ACPI_IVRS8C_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8C,f)
> +#define ACPI_IVRSHID_OFFSET(f)          (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE_HID,f)
>  #define ACPI_LPITH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_LPIT_HEADER,f)
>  #define ACPI_LPIT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_LPIT_NATIVE,f)
>  #define ACPI_MADT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MADT_LOCAL_APIC,f)
> @@ -289,6 +295,7 @@
>  #define ACPI_MADT13_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_MSI_FRAME,f)
>  #define ACPI_MADT14_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_REDISTRIBUTOR,f)
>  #define ACPI_MADT15_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_TRANSLATOR,f)
> +#define ACPI_MADT16_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_MULTIPROC_WAKEUP,f)
>  #define ACPI_MADTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
>  #define ACPI_MCFG0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MCFG_ALLOCATION,f)
>  #define ACPI_MPST0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MPST_POWER_NODE,f)
> @@ -311,21 +318,31 @@
>  #define ACPI_PCCT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f)
>  #define ACPI_PCCT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f)
>  #define ACPI_PCCT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f)
> +#define ACPI_PCCT5_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REG,f)
>  #define ACPI_PDTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PDTT_CHANNEL,f)
> +#define ACPI_PHATH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_HEADER,f)
> +#define ACPI_PHAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_VERSION_DATA,f)
> +#define ACPI_PHAT0A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PHAT_VERSION_ELEMENT,f)
> +#define ACPI_PHAT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_HEALTH_DATA,f)
>  #define ACPI_PMTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_SOCKET,f)
>  #define ACPI_PMTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_CONTROLLER,f)
> -#define ACPI_PMTT1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PMTT_DOMAIN,f)
>  #define ACPI_PMTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_PHYSICAL_COMPONENT,f)
> +#define ACPI_PMTT_VENDOR_OFFSET(f)      (UINT16) ACPI_OFFSET (ACPI_PMTT_VENDOR_SPECIFIC,f)
>  #define ACPI_PMTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_HEADER,f)
>  #define ACPI_PPTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
>  #define ACPI_PPTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_PROCESSOR,f)
>  #define ACPI_PPTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_CACHE,f)
> +#define ACPI_PPTT1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PPTT_CACHE_V1,f)
>  #define ACPI_PPTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_ID,f)
>  #define ACPI_S3PTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_FPDT_HEADER,f)
>  #define ACPI_S3PT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_RESUME,f)
>  #define ACPI_S3PT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_SUSPEND,f)
>  #define ACPI_SDEVH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_HEADER,f)
>  #define ACPI_SDEV0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_NAMESPACE,f)
> +#define ACPI_SDEV0B_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_SECURE_COMPONENT,f)
> +#define ACPI_SDEVCH_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_HEADER,f)
> +#define ACPI_SDEVC0_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_ID_COMPONENT, f)
> +#define ACPI_SDEVC1_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_MEM_COMPONENT, f)
>  #define ACPI_SDEV1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE,f)
>  #define ACPI_SDEV1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE_PATH,f)
>  #define ACPI_SLIC_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIC,f)
> @@ -341,6 +358,11 @@
>  #define ACPI_TPM2A_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f)
>  #define ACPI_TPM211_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_TPM2_ARM_SMC,f)
>  #define ACPI_TPM23A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_TPM23_TRAILER,f)
> +#define ACPI_VIOTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_HEADER,f)
> +#define ACPI_VIOT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_PCI_RANGE,f)
> +#define ACPI_VIOT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_MMIO,f)
> +#define ACPI_VIOT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_VIRTIO_IOMMU_PCI,f)
> +#define ACPI_VIOT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_VIRTIO_IOMMU_MMIO,f)
>  #define ACPI_WDAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_WDAT_ENTRY,f)
>  
>  /*
> @@ -358,6 +380,7 @@
>  #define ACPI_HPET_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_HPET,f,o)
>  #define ACPI_PPTT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_PROCESSOR,f,o)
>  #define ACPI_PPTT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_CACHE,f,o)
> +#define ACPI_PPTT1A_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_PPTT_CACHE_V1,f,o)
>  #define ACPI_SRAT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_CPU_AFFINITY,f,o)
>  #define ACPI_SRAT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_MEM_AFFINITY,f,o)
>  #define ACPI_SRAT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_X2APIC_CPU_AFFINITY,f,o)
> @@ -372,6 +395,7 @@
>  #define ACPI_IORT3_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU,f,o)
>  #define ACPI_IORT3a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_GSI,f,o)
>  #define ACPI_IORT4_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_V3,f,o)
> +#define ACPI_IORT6_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_RMR,f,o)
>  #define ACPI_IORTA_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_MEMORY_ACCESS,f,o)
>  #define ACPI_IORTM_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_ID_MAPPING,f,o)
>  #define ACPI_LPITH_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_LPIT_HEADER,f,o)
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index 5f54ecc0..437a122b 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -172,6 +172,7 @@
>  #define ACPI_SIG_BERT           "BERT"      /* Boot Error Record Table */
>  #define ACPI_SIG_BGRT           "BGRT"      /* Boot Graphics Resource Table */
>  #define ACPI_SIG_BOOT           "BOOT"      /* Simple Boot Flag Table */
> +#define ACPI_SIG_CEDT           "CEDT"      /* CXL Early Discovery Table */
>  #define ACPI_SIG_CPEP           "CPEP"      /* Corrected Platform Error Polling table */
>  #define ACPI_SIG_CSRT           "CSRT"      /* Core System Resource Table */
>  #define ACPI_SIG_DBG2           "DBG2"      /* Debug Port table type 2 */
> @@ -492,6 +493,58 @@ typedef struct acpi_table_boot
>  } ACPI_TABLE_BOOT;
>  
>  
> +/*******************************************************************************
> + *
> + * CEDT - CXL Early Discovery Table
> + *        Version 1
> + *
> + * Conforms to the "CXL Early Discovery Table" (CXL 2.0)
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_cedt
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +
> +} ACPI_TABLE_CEDT;
> +
> +/* CEDT subtable header (Performance Record Structure) */
> +
> +typedef struct acpi_cedt_header
> +{
> +    UINT8                   Type;
> +    UINT8                   Reserved;
> +    UINT16                  Length;
> +
> +} ACPI_CEDT_HEADER;
> +
> +/* Values for Type field above */
> +
> +enum AcpiCedtType
> +{
> +    ACPI_CEDT_TYPE_CHBS                 = 0,
> +    ACPI_CEDT_TYPE_RESERVED             = 1
> +};
> +
> +
> +/*
> + * CEDT subtables
> + */
> +
> +/* 0: CXL Host Bridge Structure */
> +
> +typedef struct acpi_cedt_chbs
> +{
> +    ACPI_CEDT_HEADER        Header;
> +    UINT32                  Uid;
> +    UINT32                  CxlVersion;
> +    UINT32                  Reserved;
> +    UINT64                  Base;
> +    UINT64                  Length;
> +
> +} ACPI_CEDT_CHBS;
> +
> +
>  /*******************************************************************************
>   *
>   * CPEP - Corrected Platform Error Polling table (ACPI 4.0)
> @@ -1829,7 +1882,8 @@ typedef struct acpi_hmat_locality
>      ACPI_HMAT_STRUCTURE     Header;
>      UINT8                   Flags;
>      UINT8                   DataType;
> -    UINT16                  Reserved1;
> +    UINT8                   MinTransferSize;
> +    UINT8                   Reserved1;
>      UINT32                  NumberOfInitiatorPDs;
>      UINT32                  NumberOfTargetPDs;
>      UINT32                  Reserved2;
> @@ -1839,14 +1893,17 @@ typedef struct acpi_hmat_locality
>  
>  /* Masks for Flags field above */
>  
> -#define ACPI_HMAT_MEMORY_HIERARCHY  (0x0F)
> +#define ACPI_HMAT_MEMORY_HIERARCHY  (0x0F)      /* Bits 0-3 */
>  
> -/* Values for Memory Hierarchy flag */
> +/* Values for Memory Hierarchy flags */
>  
>  #define ACPI_HMAT_MEMORY            0
>  #define ACPI_HMAT_1ST_LEVEL_CACHE   1
>  #define ACPI_HMAT_2ND_LEVEL_CACHE   2
>  #define ACPI_HMAT_3RD_LEVEL_CACHE   3
> +#define ACPI_HMAT_MINIMUM_XFER_SIZE 0x10        /* Bit 4: ACPI 6.4 */
> +#define ACPI_HMAT_NON_SEQUENTIAL_XFERS 0x20     /* Bit 5: ACPI 6.4 */
> +
>  
>  /* Values for DataType field above */
>  
> diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
> index 82096fe9..71c39e86 100644
> --- a/src/acpica/source/include/actbl2.h
> +++ b/src/acpica/source/include/actbl2.h
> @@ -180,6 +180,7 @@
>  #define ACPI_SIG_NFIT           "NFIT"      /* NVDIMM Firmware Interface Table */
>  #define ACPI_SIG_PCCT           "PCCT"      /* Platform Communications Channel Table */
>  #define ACPI_SIG_PDTT           "PDTT"      /* Platform Debug Trigger Table */
> +#define ACPI_SIG_PHAT           "PHAT"      /* Platform Health Assessment Table */
>  #define ACPI_SIG_PMTT           "PMTT"      /* Platform Memory Topology Table */
>  #define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
>  #define ACPI_SIG_RASF           "RASF"      /* RAS Feature table */
> @@ -213,7 +214,7 @@
>   * IORT - IO Remapping Table
>   *
>   * Conforms to "IO Remapping Table System Software on ARM Platforms",
> - * Document number: ARM DEN 0049D, March 2018
> + * Document number: ARM DEN 0049E.b, Feb 2021
>   *
>   ******************************************************************************/
>  
> @@ -235,7 +236,7 @@ typedef struct acpi_iort_node
>      UINT8                   Type;
>      UINT16                  Length;
>      UINT8                   Revision;
> -    UINT32                  Reserved;
> +    UINT32                  Identifier;
>      UINT32                  MappingCount;
>      UINT32                  MappingOffset;
>      char                    NodeData[1];
> @@ -251,7 +252,8 @@ enum AcpiIortNodeType
>      ACPI_IORT_NODE_PCI_ROOT_COMPLEX     = 0x02,
>      ACPI_IORT_NODE_SMMU                 = 0x03,
>      ACPI_IORT_NODE_SMMU_V3              = 0x04,
> -    ACPI_IORT_NODE_PMCG                 = 0x05
> +    ACPI_IORT_NODE_PMCG                 = 0x05,
> +    ACPI_IORT_NODE_RMR                  = 0x06,
>  };
>  
>  
> @@ -332,10 +334,11 @@ typedef struct acpi_iort_root_complex
>  
>  } ACPI_IORT_ROOT_COMPLEX;
>  
> -/* Values for AtsAttribute field above */
> +/* Masks for AtsAttribute field above */
>  
> -#define ACPI_IORT_ATS_SUPPORTED         0x00000001  /* The root complex supports ATS */
> -#define ACPI_IORT_ATS_UNSUPPORTED       0x00000000  /* The root complex doesn't support ATS */
> +#define ACPI_IORT_ATS_SUPPORTED         (1)     /* The root complex ATS support */
> +#define ACPI_IORT_PRI_SUPPORTED         (1<<1)  /* The root complex PRI support */
> +#define ACPI_IORT_PASID_FWD_SUPPORTED   (1<<2)  /* The root complex PASID forward support */
>  
>  
>  typedef struct acpi_iort_smmu
> @@ -416,6 +419,19 @@ typedef struct acpi_iort_pmcg
>  
>  } ACPI_IORT_PMCG;
>  
> +typedef struct acpi_iort_rmr {
> +    UINT32 Flags;
> +    UINT32 RmrCount;
> +    UINT32 RmrOffset;
> +
> +} ACPI_IORT_RMR;
> +
> +typedef struct acpi_iort_rmr_desc {
> +    UINT64 BaseAddress;
> +    UINT64 Length;
> +    UINT32 Reserved;
> +
> +} ACPI_IORT_RMR_DESC;
>  
>  /*******************************************************************************
>   *
> @@ -459,6 +475,7 @@ enum AcpiIvrsType
>  {
>      ACPI_IVRS_TYPE_HARDWARE1        = 0x10,
>      ACPI_IVRS_TYPE_HARDWARE2        = 0x11,
> +    ACPI_IVRS_TYPE_HARDWARE3        = 0x40,
>      ACPI_IVRS_TYPE_MEMORY1          = 0x20,
>      ACPI_IVRS_TYPE_MEMORY2          = 0x21,
>      ACPI_IVRS_TYPE_MEMORY3          = 0x22
> @@ -555,7 +572,11 @@ enum AcpiIvrsDeviceEntryType
>      ACPI_IVRS_TYPE_ALIAS_START      = 67, /* Uses ACPI_IVRS_DEVICE8A */
>      ACPI_IVRS_TYPE_EXT_SELECT       = 70, /* Uses ACPI_IVRS_DEVICE8B */
>      ACPI_IVRS_TYPE_EXT_START        = 71, /* Uses ACPI_IVRS_DEVICE8B */
> -    ACPI_IVRS_TYPE_SPECIAL          = 72  /* Uses ACPI_IVRS_DEVICE8C */
> +    ACPI_IVRS_TYPE_SPECIAL          = 72, /* Uses ACPI_IVRS_DEVICE8C */
> +
> +    /* Variable-length device entries */
> +
> +    ACPI_IVRS_TYPE_HID              = 240 /* Uses ACPI_IVRS_DEVICE_HID */
>  };
>  
>  /* Values for Data field above */
> @@ -616,6 +637,18 @@ typedef struct acpi_ivrs_device8c
>  #define ACPI_IVHD_IOAPIC            1
>  #define ACPI_IVHD_HPET              2
>  
> +/* Type 240: variable-length device entry */
> +
> +typedef struct acpi_ivrs_device_hid
> +{
> +    ACPI_IVRS_DE_HEADER     Header;
> +    UINT64                  AcpiHid;
> +    UINT64                  AcpiCid;
> +    UINT8                   UidType;
> +    UINT8                   UidLength;
> +
> +} ACPI_IVRS_DEVICE_HID;
> +
>  
>  /* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition Block (IVMD) */
>  
> @@ -733,7 +766,8 @@ enum AcpiMadtType
>      ACPI_MADT_TYPE_GENERIC_MSI_FRAME        = 13,
>      ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR    = 14,
>      ACPI_MADT_TYPE_GENERIC_TRANSLATOR       = 15,
> -    ACPI_MADT_TYPE_RESERVED                 = 16    /* 16 and greater are reserved */
> +    ACPI_MADT_TYPE_MULTIPROC_WAKEUP         = 16,
> +    ACPI_MADT_TYPE_RESERVED                 = 17    /* 17 and greater are reserved */
>  };
>  
>  
> @@ -989,6 +1023,17 @@ typedef struct acpi_madt_generic_translator
>  
>  } ACPI_MADT_GENERIC_TRANSLATOR;
>  
> +/* 16: Multiprocessor wakeup (ACPI 6.4) */
> +
> +typedef struct acpi_madt_multiproc_wakeup
> +{
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT16                  MailboxVersion;
> +    UINT32                  Reserved;           /* reserved - must be zero */
> +    UINT64                  BaseAddress;
> +
> +} ACPI_MADT_MULTIPROC_WAKEUP;
> +
>  
>  /*
>   * Common flags fields for MADT subtables
> @@ -1299,6 +1344,7 @@ typedef struct acpi_nfit_system_address
>      UINT64                  Address;
>      UINT64                  Length;
>      UINT64                  MemoryMapping;
> +    UINT64                  LocationCookie;     /* ACPI 6.4 */
>  
>  } ACPI_NFIT_SYSTEM_ADDRESS;
>  
> @@ -1306,6 +1352,7 @@ typedef struct acpi_nfit_system_address
>  
>  #define ACPI_NFIT_ADD_ONLINE_ONLY       (1)     /* 00: Add/Online Operation Only */
>  #define ACPI_NFIT_PROXIMITY_VALID       (1<<1)  /* 01: Proximity Domain Valid */
> +#define ACPI_NFIT_LOCATION_COOKIE_VALID (1<<2)  /* 02: SPA location cookie valid (ACPI 6.4) */
>  
>  /* Range Type GUIDs appear in the include/acuuid.h file */
>  
> @@ -1529,7 +1576,8 @@ enum AcpiPcctType
>      ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2    = 2,    /* ACPI 6.1 */
>      ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE      = 3,    /* ACPI 6.2 */
>      ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE       = 4,    /* ACPI 6.2 */
> -    ACPI_PCCT_TYPE_RESERVED                     = 5     /* 5 and greater are reserved */
> +    ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE         = 5,    /* ACPI 6.4 */
> +    ACPI_PCCT_TYPE_RESERVED                     = 6     /* 6 and greater are reserved */
>  };
>  
>  /*
> @@ -1658,6 +1706,26 @@ typedef struct acpi_pcct_ext_pcc_slave
>  
>  } ACPI_PCCT_EXT_PCC_SLAVE;
>  
> +/* 5: HW Registers based Communications Subspace */
> +
> +typedef struct acpi_pcct_hw_reg
> +{
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT16                  Version;
> +    UINT64                  BaseAddress;
> +    UINT64                  Length;
> +    ACPI_GENERIC_ADDRESS    DoorbellRegister;
> +    UINT64                  DoorbellPreserve;
> +    UINT64                  DoorbellWrite;
> +    ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
> +    UINT64                  CmdCompleteMask;
> +    ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
> +    UINT64                  ErrorStatusMask;
> +    UINT32                  NominalLatency;
> +    UINT32                  MinTurnaroundTime;
> +
> +} ACPI_PCCT_HW_REG;
> +
>  
>  /* Values for doorbell flags above */
>  
> @@ -1728,6 +1796,79 @@ typedef struct acpi_pdtt_channel
>  #define ACPI_PDTT_TRIGGER_ORDER             (1<<2)
>  
>  
> +/*******************************************************************************
> + *
> + * PHAT - Platform Health Assessment Table (ACPI 6.4)
> + *        Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_phat
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +
> +} ACPI_TABLE_PHAT;
> +
> +/* Common header for PHAT subtables that follow main table */
> +
> +typedef struct acpi_phat_header
> +{
> +    UINT16                  Type;
> +    UINT16                  Length;
> +    UINT8                   Revision;
> +
> +} ACPI_PHAT_HEADER;
> +
> +
> +/* Values for Type field above */
> +
> +#define ACPI_PHAT_TYPE_FW_VERSION_DATA  0
> +#define ACPI_PHAT_TYPE_FW_HEALTH_DATA   1
> +#define ACPI_PHAT_TYPE_RESERVED         2 /* 0x02-0xFFFF are reserved */
> +
> +/*
> + * PHAT subtables, correspond to Type in ACPI_PHAT_HEADER
> + */
> +
> +/* 0: Firmware Version Data Record */
> +
> +typedef struct acpi_phat_version_data
> +{
> +    ACPI_PHAT_HEADER        Header;
> +    UINT8                   Reserved[3];
> +    UINT32                  ElementCount;
> +
> +} ACPI_PHAT_VERSION_DATA;
> +
> +typedef struct acpi_phat_version_element
> +{
> +    UINT8                   Guid[16];
> +    UINT64                  VersionValue;
> +    UINT32                  ProducerId;
> +
> +} ACPI_PHAT_VERSION_ELEMENT;
> +
> +
> +/* 1: Firmware Health Data Record */
> +
> +typedef struct acpi_phat_health_data
> +{
> +    ACPI_PHAT_HEADER        Header;
> +    UINT8                   Reserved[2];
> +    UINT8                   Health;
> +    UINT8                   DeviceGuid[16];
> +    UINT32                  DeviceSpecificOffset; /* Zero if no Device-specific data */
> +
> +} ACPI_PHAT_HEALTH_DATA;
> +
> +/* Values for Health field above */
> +
> +#define ACPI_PHAT_ERRORS_FOUND          0
> +#define ACPI_PHAT_NO_ERRORS             1
> +#define ACPI_PHAT_UNKNOWN_ERRORS        2
> +#define ACPI_PHAT_ADVISORY              3
> +
> +
>  /*******************************************************************************
>   *
>   * PMTT - Platform Memory Topology Table (ACPI 5.0)
> @@ -1738,7 +1879,11 @@ typedef struct acpi_pdtt_channel
>  typedef struct acpi_table_pmtt
>  {
>      ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> -    UINT32                  Reserved;
> +    UINT32                  MemoryDeviceCount;
> +    /*
> +     * Immediately followed by:
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
>  
>  } ACPI_TABLE_PMTT;
>  
> @@ -1752,6 +1897,12 @@ typedef struct acpi_pmtt_header
>      UINT16                  Length;
>      UINT16                  Flags;
>      UINT16                  Reserved2;
> +    UINT32                  MemoryDeviceCount;  /* Zero means no memory device structs follow */
> +    /*
> +     * Immediately followed by:
> +     * UINT8 TypeSpecificData[]
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
>  
>  } ACPI_PMTT_HEADER;
>  
> @@ -1760,7 +1911,8 @@ typedef struct acpi_pmtt_header
>  #define ACPI_PMTT_TYPE_SOCKET           0
>  #define ACPI_PMTT_TYPE_CONTROLLER       1
>  #define ACPI_PMTT_TYPE_DIMM             2
> -#define ACPI_PMTT_TYPE_RESERVED         3 /* 0x03-0xFF are reserved */
> +#define ACPI_PMTT_TYPE_RESERVED         3 /* 0x03-0xFE are reserved */
> +#define ACPI_PMTT_TYPE_VENDOR           0xFF
>  
>  /* Values for Flags field above */
>  
> @@ -1783,6 +1935,10 @@ typedef struct acpi_pmtt_socket
>      UINT16                  Reserved;
>  
>  } ACPI_PMTT_SOCKET;
> +    /*
> +     * Immediately followed by:
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
>  
>  
>  /* 1: Memory Controller subtable */
> @@ -1790,24 +1946,14 @@ typedef struct acpi_pmtt_socket
>  typedef struct acpi_pmtt_controller
>  {
>      ACPI_PMTT_HEADER        Header;
> -    UINT32                  ReadLatency;
> -    UINT32                  WriteLatency;
> -    UINT32                  ReadBandwidth;
> -    UINT32                  WriteBandwidth;
> -    UINT16                  AccessWidth;
> -    UINT16                  Alignment;
> +    UINT16                  ControllerId;
>      UINT16                  Reserved;
> -    UINT16                  DomainCount;
>  
>  } ACPI_PMTT_CONTROLLER;
> -
> -/* 1a: Proximity Domain substructure */
> -
> -typedef struct acpi_pmtt_domain
> -{
> -    UINT32                  ProximityDomain;
> -
> -} ACPI_PMTT_DOMAIN;
> +    /*
> +     * Immediately followed by:
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
>  
>  
>  /* 2: Physical Component Identifier (DIMM) */
> @@ -1815,14 +1961,27 @@ typedef struct acpi_pmtt_domain
>  typedef struct acpi_pmtt_physical_component
>  {
>      ACPI_PMTT_HEADER        Header;
> -    UINT16                  ComponentId;
> -    UINT16                  Reserved;
> -    UINT32                  MemorySize;
>      UINT32                  BiosHandle;
>  
>  } ACPI_PMTT_PHYSICAL_COMPONENT;
>  
>  
> +/* 0xFF: Vendor Specific Data */
> +
> +typedef struct acpi_pmtt_vendor_specific
> +{
> +    ACPI_PMTT_HEADER        Header;
> +    UINT8                   TypeUuid[16];
> +    UINT8                   Specific[];
> +    /*
> +     * Immediately followed by:
> +     * UINT8 VendorSpecificData[];
> +     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
> +     */
> +
> +} ACPI_PMTT_VENDOR_SPECIFIC;
> +
> +
>  /*******************************************************************************
>   *
>   * PPTT - Processor Properties Topology Table (ACPI 6.2)
> @@ -1885,6 +2044,15 @@ typedef struct acpi_pptt_cache
>  
>  } ACPI_PPTT_CACHE;
>  
> +/* 1: Cache Type Structure for PPTT version 3 */
> +
> +typedef struct acpi_pptt_cache_v1
> +{
> +    UINT32                  CacheId;
> +
> +} ACPI_PPTT_CACHE_V1;
> +
> +
>  /* Flags */
>  
>  #define ACPI_PPTT_SIZE_PROPERTY_VALID       (1)     /* Physical property valid */
> @@ -1894,6 +2062,7 @@ typedef struct acpi_pptt_cache
>  #define ACPI_PPTT_CACHE_TYPE_VALID          (1<<4)  /* Cache type valid */
>  #define ACPI_PPTT_WRITE_POLICY_VALID        (1<<5)  /* Write policy valid */
>  #define ACPI_PPTT_LINE_SIZE_VALID           (1<<6)  /* Line size valid */
> +#define ACPI_PPTT_CACHE_ID_VALID            (1<<7)  /* Cache ID valid */
>  
>  /* Masks for Attributes */
>  
> @@ -2108,6 +2277,7 @@ enum AcpiSdevType
>  /* Values for flags above */
>  
>  #define ACPI_SDEV_HANDOFF_TO_UNSECURE_OS    (1)
> +#define ACPI_SDEV_SECURE_COMPONENTS_PRESENT (1<<1)
>  
>  /*
>   * SDEV subtables
> @@ -2125,6 +2295,58 @@ typedef struct acpi_sdev_namespace
>  
>  } ACPI_SDEV_NAMESPACE;
>  
> +typedef struct acpi_sdev_secure_component
> +{
> +    UINT16                  SecureComponentOffset;
> +    UINT16                  SecureComponentLength;
> +
> +} ACPI_SDEV_SECURE_COMPONENT;
> +
> +
> +/*
> + * SDEV sub-subtables ("Components") for above
> + */
> +typedef struct acpi_sdev_component
> +{
> +    ACPI_SDEV_HEADER        Header;
> +
> +} ACPI_SDEV_COMPONENT;
> +
> +
> +/* Values for sub-subtable type above */
> +
> +enum AcpiSacType
> +{
> +    ACPI_SDEV_TYPE_ID_COMPONENT     = 0,
> +    ACPI_SDEV_TYPE_MEM_COMPONENT    = 1
> +};
> +
> +typedef struct acpi_sdev_id_component
> +{
> +    ACPI_SDEV_HEADER        Header;
> +    UINT16                  HardwareIdOffset;
> +    UINT16                  HardwareIdLength;
> +    UINT16                  SubsystemIdOffset;
> +    UINT16                  SubsystemIdLength;
> +    UINT16                  HardwareRevision;
> +    UINT8                   HardwareRevPresent;
> +    UINT8                   ClassCodePresent;
> +    UINT8                   PciBaseClass;
> +    UINT8                   PciSubClass;
> +    UINT8                   PciProgrammingXface;
> +
> +} ACPI_SDEV_ID_COMPONENT;
> +
> +typedef struct acpi_sdev_mem_component
> +{
> +    ACPI_SDEV_HEADER        Header;
> +    UINT32                  Reserved;
> +    UINT64                  MemoryBaseAddress;
> +    UINT64                  MemoryLength;
> +
> +} ACPI_SDEV_MEM_COMPONENT;
> +
> +
>  /* 1: PCIe Endpoint Device Based Device Structure */
>  
>  typedef struct acpi_sdev_pcie
> diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h
> index 1c79143b..d4260a1d 100644
> --- a/src/acpica/source/include/actbl3.h
> +++ b/src/acpica/source/include/actbl3.h
> @@ -177,6 +177,7 @@
>  #define ACPI_SIG_TCPA           "TCPA"      /* Trusted Computing Platform Alliance table */
>  #define ACPI_SIG_TPM2           "TPM2"      /* Trusted Platform Module 2.0 H/W interface table */
>  #define ACPI_SIG_UEFI           "UEFI"      /* Uefi Boot Optimization Table */
> +#define ACPI_SIG_VIOT           "VIOT"      /* Virtual I/O Translation Table */
>  #define ACPI_SIG_WAET           "WAET"      /* Windows ACPI Emulated devices Table */
>  #define ACPI_SIG_WDAT           "WDAT"      /* Watchdog Action Table */
>  #define ACPI_SIG_WDDT           "WDDT"      /* Watchdog Timer Description Table */
> @@ -463,7 +464,8 @@ typedef struct acpi_srat_generic_affinity
>  
>  /* Flags for ACPI_SRAT_GENERIC_AFFINITY */
>  
> -#define ACPI_SRAT_GENERIC_AFFINITY_ENABLED (1) /* 00: Use affinity structure */
> +#define ACPI_SRAT_GENERIC_AFFINITY_ENABLED     (1)      /* 00: Use affinity structure */
> +#define ACPI_SRAT_ARCHITECTURAL_TRANSACTIONS   (1<<1)   /* ACPI 6.4 */
>  
>  /*******************************************************************************
>   *
> @@ -682,6 +684,86 @@ typedef struct acpi_table_uefi
>  } ACPI_TABLE_UEFI;
>  
>  
> +/*******************************************************************************
> + *
> + * VIOT - Virtual I/O Translation Table
> + *        Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_viot
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +    UINT16                  NodeCount;
> +    UINT16                  NodeOffset;
> +    UINT8                   Reserved[8];
> +
> +} ACPI_TABLE_VIOT;
> +
> +/* VIOT subtable header */
> +
> +typedef struct acpi_viot_header
> +{
> +    UINT8                   Type;
> +    UINT8                   Reserved;
> +    UINT16                  Length;
> +
> +} ACPI_VIOT_HEADER;
> +
> +/* Values for Type field above */
> +
> +enum AcpiViotNodeType
> +{
> +    ACPI_VIOT_NODE_PCI_RANGE            = 0x01,
> +    ACPI_VIOT_NODE_MMIO                 = 0x02,
> +    ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI     = 0x03,
> +    ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO    = 0x04,
> +    ACPI_VIOT_RESERVED                  = 0x05
> +};
> +
> +/* VIOT subtables */
> +
> +typedef struct acpi_viot_pci_range
> +{
> +    ACPI_VIOT_HEADER        Header;
> +    UINT32                  EndpointStart;
> +    UINT16                  SegmentStart;
> +    UINT16                  SegmentEnd;
> +    UINT16                  BdfStart;
> +    UINT16                  BdfEnd;
> +    UINT16                  OutputNode;
> +    UINT8                   Reserved[6];
> +
> +} ACPI_VIOT_PCI_RANGE;
> +
> +typedef struct acpi_viot_mmio
> +{
> +    ACPI_VIOT_HEADER        Header;
> +    UINT32                  Endpoint;
> +    UINT64                  BaseAddress;
> +    UINT16                  OutputNode;
> +    UINT8                   Reserved[6];
> +
> +} ACPI_VIOT_MMIO;
> +
> +typedef struct acpi_viot_virtio_iommu_pci
> +{
> +    ACPI_VIOT_HEADER        Header;
> +    UINT16                  Segment;
> +    UINT16                  Bdf;
> +    UINT8                   Reserved[8];
> +
> +} ACPI_VIOT_VIRTIO_IOMMU_PCI;
> +
> +typedef struct acpi_viot_virtio_iommu_mmio
> +{
> +    ACPI_VIOT_HEADER        Header;
> +    UINT8                   Reserved[4];
> +    UINT64                  BaseAddress;
> +
> +} ACPI_VIOT_VIRTIO_IOMMU_MMIO;
> +
> +
>  /*******************************************************************************
>   *
>   * WAET - Windows ACPI Emulated devices Table
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index b520f641..4d485422 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -171,6 +171,7 @@ extern const char                       *AcpiGbl_MaxDecode[];
>  extern const char                       *AcpiGbl_MemDecode[];
>  extern const char                       *AcpiGbl_MinDecode[];
>  extern const char                       *AcpiGbl_MtpDecode[];
> +extern const char                       *AcpiGbl_PhyDecode[];
>  extern const char                       *AcpiGbl_RngDecode[];
>  extern const char                       *AcpiGbl_RwDecode[];
>  extern const char                       *AcpiGbl_ShrDecode[];
> diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h
> index 72b253a4..48f4c9a1 100644
> --- a/src/acpica/source/include/acuuid.h
> +++ b/src/acpica/source/include/acuuid.h
> @@ -210,5 +210,6 @@
>  #define UUID_DEVICE_GRAPHS              "ab02a46b-74c7-45a2-bd68-f7d344ef2153"
>  #define UUID_HIERARCHICAL_DATA_EXTENSION "dbb8e3e6-5886-4ba6-8795-1319f52a966b"
>  #define UUID_CORESIGHT_GRAPH            "3ecbc8b6-1d0e-4fb3-8107-e627f805c6cd"
> +#define UUID_USB4_CAPABILITIES          "23a0d13a-26ab-486c-9c5f-0ffa525a575a"
>  
>  #endif /* __ACUUID_H__ */
> diff --git a/src/acpica/source/include/amlresrc.h b/src/acpica/source/include/amlresrc.h
> index 094ab1d9..a97a1c63 100644
> --- a/src/acpica/source/include/amlresrc.h
> +++ b/src/acpica/source/include/amlresrc.h
> @@ -183,6 +183,7 @@
>  #define ACPI_RESTAG_IORESTRICTION               "_IOR"
>  #define ACPI_RESTAG_LENGTH                      "_LEN"
>  #define ACPI_RESTAG_LINE                        "_LIN"
> +#define ACPI_RESTAG_LOCALPORT                   "_PRT"
>  #define ACPI_RESTAG_MEMATTRIBUTES               "_MTP"  /* Memory(0), Reserved(1), ACPI(2), NVS(3) */
>  #define ACPI_RESTAG_MEMTYPE                     "_MEM"  /* NonCache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */
>  #define ACPI_RESTAG_MAXADDR                     "_MAX"
> @@ -192,6 +193,7 @@
>  #define ACPI_RESTAG_MODE                        "_MOD"
>  #define ACPI_RESTAG_PARITY                      "_PAR"
>  #define ACPI_RESTAG_PHASE                       "_PHA"
> +#define ACPI_RESTAG_PHYTYPE                     "_PHY"
>  #define ACPI_RESTAG_PIN                         "_PIN"
>  #define ACPI_RESTAG_PINCONFIG                   "_PPI"
>  #define ACPI_RESTAG_PINCONFIG_TYPE              "_TYP"
> @@ -568,7 +570,8 @@ typedef struct aml_resource_gpio
>  #define AML_RESOURCE_I2C_SERIALBUSTYPE          1
>  #define AML_RESOURCE_SPI_SERIALBUSTYPE          2
>  #define AML_RESOURCE_UART_SERIALBUSTYPE         3
> -#define AML_RESOURCE_MAX_SERIALBUSTYPE          3
> +#define AML_RESOURCE_CSI2_SERIALBUSTYPE         4
> +#define AML_RESOURCE_MAX_SERIALBUSTYPE          4
>  #define AML_RESOURCE_VENDOR_SERIALBUSTYPE       192 /* Vendor defined is 0xC0-0xFF (NOT SUPPORTED) */
>  
>  typedef struct aml_resource_common_serialbus
> @@ -578,6 +581,24 @@ typedef struct aml_resource_common_serialbus
>  
>  } AML_RESOURCE_COMMON_SERIALBUS;
>  
> +
> +typedef struct aml_resource_csi2_serialbus
> +{
> +    AML_RESOURCE_LARGE_HEADER_COMMON
> +    AML_RESOURCE_SERIAL_COMMON
> +
> +    /*
> +     * Optional fields follow immediately:
> +     * 1) Vendor Data bytes
> +     * 2) Resource Source String
> +     */
> +
> +} AML_RESOURCE_CSI2_SERIALBUS;
> +
> +#define AML_RESOURCE_CSI2_REVISION              1       /* ACPI 6.4 */
> +#define AML_RESOURCE_CSI2_TYPE_REVISION         1       /* ACPI 6.4 */
> +#define AML_RESOURCE_CSI2_MIN_DATA_LEN          0       /* ACPI 6.4 */
> +
>  typedef struct aml_resource_i2c_serialbus
>  {
>      AML_RESOURCE_LARGE_HEADER_COMMON
> @@ -617,7 +638,6 @@ typedef struct aml_resource_spi_serialbus
>  #define AML_RESOURCE_SPI_TYPE_REVISION          1       /* ACPI 5.0 */
>  #define AML_RESOURCE_SPI_MIN_DATA_LEN           9
>  
> -
>  typedef struct aml_resource_uart_serialbus
>  {
>      AML_RESOURCE_LARGE_HEADER_COMMON
> @@ -792,6 +812,7 @@ typedef union aml_resource
>      AML_RESOURCE_I2C_SERIALBUS              I2cSerialBus;
>      AML_RESOURCE_SPI_SERIALBUS              SpiSerialBus;
>      AML_RESOURCE_UART_SERIALBUS             UartSerialBus;
> +    AML_RESOURCE_CSI2_SERIALBUS             Csi2SerialBus;
>      AML_RESOURCE_COMMON_SERIALBUS           CommonSerialBus;
>      AML_RESOURCE_PIN_FUNCTION               PinFunction;
>      AML_RESOURCE_PIN_CONFIG                 PinConfig;
> diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
> index 57c61717..148190a3 100644
> --- a/src/acpica/source/include/platform/acgcc.h
> +++ b/src/acpica/source/include/platform/acgcc.h
> @@ -203,7 +203,7 @@ typedef __builtin_va_list       va_list;
>  #endif
>  
>  /*
> - * Explictly mark intentional explicit fallthrough to silence
> + * Explicitly mark intentional explicit fallthrough to silence
>   * -Wimplicit-fallthrough in GCC 7.1+.
>   */
>  
> 

Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff mbox series

Patch

diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c
index 628cf7a4..99f89729 100644
--- a/src/acpica/source/common/acfileio.c
+++ b/src/acpica/source/common/acfileio.c
@@ -559,6 +559,9 @@  AcValidateTableHeader (
 
     if (Actual < sizeof (ACPI_TABLE_HEADER))
     {
+        fprintf (stderr,
+            "Could not read entire table header: Actual %u, Requested %u\n",
+            (UINT32) Actual, (UINT32) sizeof (ACPI_TABLE_HEADER));
         return (AE_ERROR);
     }
 
diff --git a/src/acpica/source/common/ahids.c b/src/acpica/source/common/ahids.c
index 1e6edaf7..b58bc082 100644
--- a/src/acpica/source/common/ahids.c
+++ b/src/acpica/source/common/ahids.c
@@ -188,6 +188,8 @@  const AH_DEVICE_ID  AslDeviceIds[] =
     {"ACPI0012",    "NVDIMM Root Device"},
     {"ACPI0013",    "Generic Event Device"},
     {"ACPI0014",    "Wireless Power Calibration Device"},
+    {"ACPI0015",    "USB4 host interface device"},
+    {"ACPI0016",    "Compute Express Link Host Bridge"},
     {"ADMA0F28",    "Intel Audio DMA"},
     {"AMCR0F28",    "Intel Audio Machine Driver"},
     {"ATK4001",     "Asus Radio Control Button"},
diff --git a/src/acpica/source/common/ahpredef.c b/src/acpica/source/common/ahpredef.c
index e6e2ffc7..d92417d1 100644
--- a/src/acpica/source/common/ahpredef.c
+++ b/src/acpica/source/common/ahpredef.c
@@ -200,12 +200,16 @@  const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
     AH_PREDEF ("_BMC",    "Battery Maintenance Control", "Sets battery maintenance and control features"),
     AH_PREDEF ("_BMD",    "Battery Maintenance Data", "Returns battery maintenance, control, and state data"),
     AH_PREDEF ("_BMS",    "Battery Measurement Sampling Time", "Sets the battery measurement sampling time"),
+    AH_PREDEF ("_BPC",    "Battery Power Characteristics", "Returns static values used to configure power threshold support in the platform firmware"),
+    AH_PREDEF ("_BPS",    "Battery Power State", "Returns the power delivery capabilities of the battery at the present time"),
+    AH_PREDEF ("_BPT",    "Battery Power Threshold", "Set a relative battery peak power capability change threshold"),
     AH_PREDEF ("_BQC",    "Brightness Query Current", "Returns the current display brightness level"),
     AH_PREDEF ("_BST",    "Battery Status", "Returns a Control Method Battery status block"),
     AH_PREDEF ("_BTH",    "Battery Throttle Limit", "Thermal limit for charging and discharging"),
     AH_PREDEF ("_BTM",    "Battery Time", "Returns the battery runtime"),
     AH_PREDEF ("_BTP",    "Battery Trip Point", "Sets a Control Method Battery trip point"),
     AH_PREDEF ("_CBA",    "Configuration Base Address", "Sets the base address for a PCI Express host bridge"),
+    AH_PREDEF ("_CBR",    "CXL Host Bridge Register Info", "Get the memory location of CXL Host Bridge Registers"),
     AH_PREDEF ("_CCA",    "Cache Coherency Attribute", "Returns a device's support level for cache coherency"),
     AH_PREDEF ("_CDM",    "Clock Domain", "Returns a logical processor's clock domain identifier"),
     AH_PREDEF ("_CID",    "Compatible ID", "Returns a device's Plug and Play Compatible ID list"),
diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c
index ac3c416b..e318ddf3 100644
--- a/src/acpica/source/common/ahtable.c
+++ b/src/acpica/source/common/ahtable.c
@@ -203,6 +203,7 @@  const AH_TABLE      AcpiGbl_SupportedTables[] =
     {ACPI_SIG_BERT, "Boot Error Record Table"},
     {ACPI_SIG_BGRT, "Boot Graphics Resource Table"},
     {ACPI_SIG_BOOT, "Simple Boot Flag Table"},
+    {ACPI_SIG_CEDT, "CXL Early Discovery Table"},
     {ACPI_SIG_CPEP, "Corrected Platform Error Polling table"},
     {ACPI_SIG_CSRT, "Core System Resource Table"},
     {ACPI_SIG_DBG2, "Debug Port table type 2"},
@@ -231,6 +232,7 @@  const AH_TABLE      AcpiGbl_SupportedTables[] =
     {ACPI_SIG_MSDM, "Microsoft Data Management table"},
     {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"},
     {ACPI_SIG_PCCT, "Platform Communications Channel Table"},
+    {ACPI_SIG_PHAT, "Platform Health Assessment Table"},
     {ACPI_SIG_PDTT, "Platform Debug Trigger Table"},
     {ACPI_SIG_PMTT, "Platform Memory Topology Table"},
     {ACPI_SIG_PPTT, "Processor Properties Topology Table"},
@@ -251,6 +253,7 @@  const AH_TABLE      AcpiGbl_SupportedTables[] =
     {ACPI_SIG_TCPA, "Trusted Computing Platform Alliance 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"},
     {ACPI_SIG_WAET, "Windows ACPI Emulated Devices Table"},
     {ACPI_SIG_WDAT, "Watchdog Action Table"},
     {ACPI_SIG_WDDT, "Watchdog Description Table"},
diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c
index 427f9169..eef1c568 100644
--- a/src/acpica/source/common/ahuuids.c
+++ b/src/acpica/source/common/ahuuids.c
@@ -208,6 +208,7 @@  const AH_UUID  Gbl_AcpiUuids[] =
     {"Device Graphs for _DSD",      UUID_DEVICE_GRAPHS},
     {"Hierarchical Data Extension", UUID_HIERARCHICAL_DATA_EXTENSION},
     {"ARM Coresight Graph",         UUID_CORESIGHT_GRAPH},
+    {"USB4 Capabilities",           UUID_USB4_CAPABILITIES},
     {NULL, NULL}
 };
 
diff --git a/src/acpica/source/common/cmfsize.c b/src/acpica/source/common/cmfsize.c
index e0c66e31..38ec915a 100644
--- a/src/acpica/source/common/cmfsize.c
+++ b/src/acpica/source/common/cmfsize.c
@@ -1,6 +1,6 @@ 
 /******************************************************************************
  *
- * Module Name: cfsize - Common get file size function
+ * Module Name: cmfsize - Common get file size function
  *
  *****************************************************************************/
 
diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
index d8a04406..59d5c4f4 100644
--- a/src/acpica/source/common/dmrestag.c
+++ b/src/acpica/source/common/dmrestag.c
@@ -384,6 +384,14 @@  static const ACPI_RESOURCE_TAG      AcpiDmGpioIoTags[] =
 
 /* Subtype tables for SerialBus descriptors */
 
+static const ACPI_RESOURCE_TAG      AcpiDmCsi2SerialBusTags[] =    /* ACPI 6.4 */
+{
+    {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
+    {( 7 * 8) + 0,  ACPI_RESTAG_PHYTYPE},
+    {( 7 * 8) + 2,  ACPI_RESTAG_LOCALPORT},
+    {0,             NULL}
+};
+
 static const ACPI_RESOURCE_TAG      AcpiDmI2cSerialBusTags[] =
 {
     {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
@@ -424,6 +432,7 @@  static const ACPI_RESOURCE_TAG      AcpiDmUartSerialBusTags[] =
     {0,             NULL}
 };
 
+
 /* Subtype tables for PinFunction descriptor */
 
 static const ACPI_RESOURCE_TAG      AcpiDmPinFunctionTags[] =
@@ -539,7 +548,8 @@  static const ACPI_RESOURCE_TAG      *AcpiGbl_SerialResourceTags[] =
     NULL,                           /* 0x00 Reserved */
     AcpiDmI2cSerialBusTags,         /* 0x01 I2C SerialBus */
     AcpiDmSpiSerialBusTags,         /* 0x02 SPI SerialBus */
-    AcpiDmUartSerialBusTags         /* 0x03 UART SerialBus */
+    AcpiDmUartSerialBusTags,        /* 0x03 UART SerialBus */
+    AcpiDmCsi2SerialBusTags         /* 0x04 CSI2 SerialBus */
 };
 
 /*
@@ -987,7 +997,7 @@  AcpiDmGetResourceTag (
 
     case ACPI_RESOURCE_NAME_SERIAL_BUS:
 
-        /* SerialBus has 3 subtypes: I2C, SPI, and UART */
+        /* SerialBus has 4 subtypes: I2C, SPI, UART, and CSI2 */
 
         if ((Resource->CommonSerialBus.Type == 0) ||
             (Resource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE))
diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
index 3e4c6c34..ffec889a 100644
--- a/src/acpica/source/common/dmtable.c
+++ b/src/acpica/source/common/dmtable.c
@@ -184,6 +184,12 @@  static const char           *AcpiDmAsfSubnames[] =
     "Unknown Subtable Type"         /* Reserved */
 };
 
+static const char           *AcpiDmCedtSubnames[] =
+{
+    "CXL Host Bridge Structure",
+    "Unknown Subtable Type"         /* Reserved */
+};
+
 static const char           *AcpiDmDmarSubnames[] =
 {
     "Hardware Unit Definition",
@@ -367,15 +373,24 @@  static const char           *AcpiDmPcctSubnames[] =
     "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
     "Extended PCC Master Subspace",     /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
     "Extended PCC Slave Subspace",      /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
+    "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */
     "Unknown Subtable Type"             /* Reserved */
 };
 
+static const char           *AcpiDmPhatSubnames[] =
+{
+    "Firmware Version Data",        /* ACPI_PHAT_TYPE_FW_VERSION_DATA */
+    "Firmware Health Data",         /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */
+    "Unknown Subtable Type"         /* Reserved */
+};
+
 static const char           *AcpiDmPmttSubnames[] =
 {
     "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
     "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
     "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM */
-    "Unknown Subtable Type"         /* Reserved */
+    "Unknown Subtable Type",        /* Reserved */
+    "Vendor Specific"               /* ACPI_PMTT_TYPE_VENDOR */
 };
 
 static const char           *AcpiDmPpttSubnames[] =
@@ -434,6 +449,16 @@  static const char           *AcpiDmLpitSubnames[] =
     "Unknown Subtable Type"         /* Reserved */
 };
 
+static const char           *AcpiDmViotSubnames[] =
+{
+    "Unknown Subtable Type",        /* 0 -Reserved */
+    "PCI Range",
+    "MMIO Endpoint",
+    "VirtIO-PCI IOMMU",
+    "VirtIO-MMIO IOMMU",
+    "Unknown Subtable Type"         /* Reserved */
+};
+
 #define ACPI_FADT_PM_RESERVED       9
 
 static const char           *AcpiDmFadtProfiles[] =
@@ -474,8 +499,8 @@  static const char           *AcpiDmGasAccessWidth[] =
  * handler. This table must be NULL terminated. RSDP and FACS are
  * special-cased elsewhere.
  *
- * Note: Any tables added here should be duplicated within AcpiSupportedTables
- * in the file common/ahtable.c
+ * Note: Any tables added here should be duplicated within
+ * AcpiGbl_SupportedTables in the file common/ahtable.c
  *
  ******************************************************************************/
 
@@ -485,6 +510,7 @@  const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert},
     {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt},
     {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot},
+    {ACPI_SIG_CEDT, NULL,                   AcpiDmDumpCedt, DtCompileCedt,  TemplateCedt},
     {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep},
     {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt},
     {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2,    AcpiDmDumpDbg2, DtCompileDbg2,  TemplateDbg2},
@@ -512,6 +538,7 @@  const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
     {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
     {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt,    AcpiDmDumpPdtt, DtCompilePdtt,  TemplatePdtt},
+    {ACPI_SIG_PHAT, NULL,                   AcpiDmDumpPhat, DtCompilePhat,  TemplatePhat},
     {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
     {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
     {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
@@ -529,6 +556,7 @@  const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
     {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    AcpiDmDumpTpm2, DtCompileTpm2,  TemplateTpm2},
     {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
+    {ACPI_SIG_VIOT, AcpiDmTableInfoViot,    AcpiDmDumpViot, DtCompileViot,  TemplateViot},
     {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
     {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat},
     {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
@@ -936,6 +964,7 @@  AcpiDmDumpTable (
         case ACPI_DMT_CHKSUM:
         case ACPI_DMT_SPACEID:
         case ACPI_DMT_ACCWIDTH:
+        case ACPI_DMT_CEDT:
         case ACPI_DMT_IVRS:
         case ACPI_DMT_GTDT:
         case ACPI_DMT_MADT:
@@ -952,6 +981,7 @@  AcpiDmDumpTable (
         case ACPI_DMT_ERSTACT:
         case ACPI_DMT_ERSTINST:
         case ACPI_DMT_DMAR_SCOPE:
+        case ACPI_DMT_VIOT:
 
             ByteLength = 1;
             break;
@@ -961,6 +991,7 @@  AcpiDmDumpTable (
         case ACPI_DMT_HEST:
         case ACPI_DMT_HMAT:
         case ACPI_DMT_NFIT:
+        case ACPI_DMT_PHAT:
 
             ByteLength = 2;
             break;
@@ -1030,6 +1061,17 @@  AcpiDmDumpTable (
             ByteLength = SubtableLength;
             break;
 
+        case ACPI_DMT_PMTT_VENDOR:
+            /*
+             * Calculate the length of the vendor data for the PMTT table:
+             * Length = (Current Subtable ptr + Subtable length) -
+             *          Start of the vendor data (Target)
+             */
+            ByteLength = ((ACPI_CAST_PTR (char, Table) +
+                            (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
+                            ACPI_CAST_PTR (char, Target));
+            break;
+
         case ACPI_DMT_STRING:
 
             ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
@@ -1346,6 +1388,20 @@  AcpiDmDumpTable (
             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
             break;
 
+        case ACPI_DMT_CEDT:
+
+            /* CEDT subtable types */
+
+            Temp8 = *Target;
+            if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
+            {
+                Temp8 = ACPI_CEDT_TYPE_RESERVED;
+            }
+
+            AcpiOsPrintf (UINT8_FORMAT, *Target,
+                AcpiDmCedtSubnames[Temp8]);
+            break;
+
         case ACPI_DMT_DMAR:
 
             /* DMAR subtable types */
@@ -1559,16 +1615,33 @@  AcpiDmDumpTable (
                 AcpiDmPcctSubnames[Temp8]);
             break;
 
+        case ACPI_DMT_PHAT:
+
+            /* PMTT subtable types */
+
+            Temp16 = *Target;
+            if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
+            {
+                Temp16 = ACPI_PHAT_TYPE_RESERVED;
+            }
+
+            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16(Target),
+                AcpiDmPhatSubnames[Temp16]);
+            break;
+
         case ACPI_DMT_PMTT:
 
             /* PMTT subtable types */
 
             Temp8 = *Target;
-            if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
+            if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
+            {
+                Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
+            }
+            else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
             {
                 Temp8 = ACPI_PMTT_TYPE_RESERVED;
             }
-
             AcpiOsPrintf (UINT8_FORMAT, *Target,
                 AcpiDmPmttSubnames[Temp8]);
             break;
@@ -1599,6 +1672,8 @@  AcpiDmDumpTable (
             break;
 
         case ACPI_DMT_RAW_BUFFER:
+        case ACPI_DMT_BUFFER:
+        case ACPI_DMT_PMTT_VENDOR:
 
             if (ByteLength == 0)
             {
@@ -1606,8 +1681,7 @@  AcpiDmDumpTable (
                 break;
             }
 
-            AcpiDmDumpBuffer (Table, CurrentOffset, ByteLength,
-                CurrentOffset, NULL);
+            AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL);
             break;
 
         case ACPI_DMT_SDEV:
@@ -1676,6 +1750,7 @@  AcpiDmDumpTable (
             {
             case ACPI_IVRS_TYPE_HARDWARE1:
             case ACPI_IVRS_TYPE_HARDWARE2:
+            case ACPI_IVRS_TYPE_HARDWARE3:
 
                 Name = AcpiDmIvrsSubnames[0];
                 break;
@@ -1710,6 +1785,20 @@  AcpiDmDumpTable (
                 AcpiDmLpitSubnames[Temp32]);
             break;
 
+        case ACPI_DMT_VIOT:
+
+            /* VIOT subtable types */
+
+            Temp8 = *Target;
+            if (Temp8 > ACPI_VIOT_RESERVED)
+            {
+                Temp8 = ACPI_VIOT_RESERVED;
+            }
+
+            AcpiOsPrintf (UINT8_FORMAT, *Target,
+                AcpiDmViotSubnames[Temp8]);
+            break;
+
         case ACPI_DMT_EXIT:
 
             return (AE_OK);
diff --git a/src/acpica/source/common/dmtbdump1.c b/src/acpica/source/common/dmtbdump1.c
index 72d667e9..8fc53acf 100644
--- a/src/acpica/source/common/dmtbdump1.c
+++ b/src/acpica/source/common/dmtbdump1.c
@@ -329,6 +329,82 @@  AcpiDmDumpAsf (
     }
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmDumpCedt
+ *
+ * PARAMETERS:  Table               - A CEDT table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Format the contents of a CEDT. This table type consists
+ *              of an open-ended number of subtables.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpCedt (
+    ACPI_TABLE_HEADER       *Table)
+{
+    ACPI_STATUS             Status;
+    ACPI_CEDT_HEADER        *Subtable;
+    UINT32                  Length = Table->Length;
+    UINT32                  Offset = sizeof (ACPI_TABLE_CEDT);
+    ACPI_DMTABLE_INFO       *InfoTable;
+
+
+    /* There is no main table (other than the standard ACPI header) */
+
+    Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
+    while (Offset < Table->Length)
+    {
+        /* Common subtable header */
+
+        AcpiOsPrintf ("\n");
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoCedtHdr);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+        switch (Subtable->Type)
+        {
+        case ACPI_CEDT_TYPE_CHBS:
+
+            InfoTable = AcpiDmTableInfoCedt0;
+            break;
+
+        default:
+
+            AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
+                Subtable->Type);
+
+            /* Attempt to continue */
+
+            if (!Subtable->Length)
+            {
+                AcpiOsPrintf ("Invalid zero length subtable\n");
+                return;
+            }
+            goto NextSubtable;
+        }
+
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+NextSubtable:
+        /* Point to next subtable */
+
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
+            Subtable->Length);
+    }
+}
 
 /*******************************************************************************
  *
diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c
index b8ece375..80d9d459 100644
--- a/src/acpica/source/common/dmtbdump2.c
+++ b/src/acpica/source/common/dmtbdump2.c
@@ -181,6 +181,7 @@  AcpiDmDumpIort (
     ACPI_IORT_NODE          *IortNode;
     ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
     ACPI_IORT_SMMU          *IortSmmu = NULL;
+    ACPI_IORT_RMR           *IortRmr = NULL;
     UINT32                  Offset;
     UINT32                  NodeOffset;
     UINT32                  Length;
@@ -188,6 +189,7 @@  AcpiDmDumpIort (
     char                    *String;
     UINT32                  i;
     UINT32                  MappingByteLength;
+    UINT8                   Revision;
 
 
     /* Main table */
@@ -198,6 +200,17 @@  AcpiDmDumpIort (
         return;
     }
 
+    Revision = Table->Revision;
+
+    /* Both IORT Rev E and E.a have known issues and are not supported */
+
+    if (Revision == 1 || Revision == 2)
+    {
+        AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n",
+                      Revision);
+        return;
+    }
+
     Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
     Offset = sizeof (ACPI_TABLE_IORT);
 
@@ -221,8 +234,18 @@  AcpiDmDumpIort (
         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
         AcpiOsPrintf ("\n");
         Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
-        Status = AcpiDmDumpTable (Table->Length, Offset,
-            IortNode, Length, AcpiDmTableInfoIortHdr);
+
+        if (Revision == 0)
+        {
+            Status = AcpiDmDumpTable (Table->Length, Offset,
+                IortNode, Length, AcpiDmTableInfoIortHdr);
+        }
+        else if (Revision >= 3)
+        {
+            Status = AcpiDmDumpTable (Table->Length, Offset,
+                IortNode, Length, AcpiDmTableInfoIortHdr3);
+        }
+
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -272,6 +295,13 @@  AcpiDmDumpIort (
             Length = IortNode->Length - NodeOffset;
             break;
 
+        case ACPI_IORT_NODE_RMR:
+
+            InfoTable = AcpiDmTableInfoIort6;
+            Length = IortNode->Length - NodeOffset;
+            IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset);
+            break;
+
         default:
 
             AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
@@ -391,7 +421,30 @@  AcpiDmDumpIort (
             }
             break;
 
-        default:
+        case ACPI_IORT_NODE_RMR:
+
+            /* Validate IortRmr to avoid compiler warnings */
+            if (IortRmr)
+            {
+                NodeOffset = IortRmr->RmrOffset;
+                Length = sizeof (ACPI_IORT_RMR_DESC);
+                for (i = 0; i < IortRmr->RmrCount; i++)
+                {
+                    AcpiOsPrintf ("\n");
+                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
+                        ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
+                        Length, AcpiDmTableInfoIort6a);
+                    if (ACPI_FAILURE (Status))
+                    {
+                        return;
+                    }
+
+                    NodeOffset += Length;
+                }
+            }
+            break;
+
+	default:
 
             break;
         }
@@ -434,8 +487,6 @@  NextSubtable:
  *
  ******************************************************************************/
 
-static UINT8 EntrySizes[] = {4,8,16,32};
-
 void
 AcpiDmDumpIvrs (
     ACPI_TABLE_HEADER       *Table)
@@ -445,6 +496,7 @@  AcpiDmDumpIvrs (
     UINT32                  EntryOffset;
     UINT32                  EntryLength;
     UINT32                  EntryType;
+    ACPI_IVRS_DEVICE_HID    *HidSubtable;
     ACPI_IVRS_DE_HEADER     *DeviceEntry;
     ACPI_IVRS_HEADER        *Subtable;
     ACPI_DMTABLE_INFO       *InfoTable;
@@ -481,6 +533,7 @@  AcpiDmDumpIvrs (
             break;
 
         case ACPI_IVRS_TYPE_HARDWARE2:
+        case ACPI_IVRS_TYPE_HARDWARE3:
 
             InfoTable = AcpiDmTableInfoIvrs01;
             break;
@@ -520,7 +573,8 @@  AcpiDmDumpIvrs (
         /* The hardware subtable can contain multiple device entries */
 
         if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
-            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2)
+            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||
+            Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)
         {
             if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)
             {
@@ -545,11 +599,10 @@  AcpiDmDumpIvrs (
                  *
                  * 00 = 4 byte
                  * 01 = 8 byte
-                 * 10 = 16 byte - currently no entries defined
-                 * 11 = 32 byte - currently no entries defined
+                 * 1x = variable length
                  */
                 EntryType = DeviceEntry->Type;
-                EntryLength = EntrySizes [EntryType >> 6];
+                EntryLength = EntryType >> 6 == 1 ? 8 : 4;
 
                 switch (EntryType)
                 {
@@ -588,6 +641,14 @@  AcpiDmDumpIvrs (
                     InfoTable = AcpiDmTableInfoIvrs8c;
                     break;
 
+                /* Variable-length entries */
+
+                case ACPI_IVRS_TYPE_HID:
+
+                    EntryLength = 22;
+                    InfoTable = AcpiDmTableInfoIvrsHid;
+                    break;
+
                 default:
                     InfoTable = AcpiDmTableInfoIvrs4;
                     AcpiOsPrintf (
@@ -606,9 +667,24 @@  AcpiDmDumpIvrs (
                     return;
                 }
 
+                HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);
                 EntryOffset += EntryLength;
                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
                     EntryLength);
+
+                if (EntryType == ACPI_IVRS_TYPE_HID)
+                {
+                    EntryLength = HidSubtable->UidLength;
+                    Status = AcpiDmDumpTable (Table->Length, EntryOffset,
+                        Table, EntryLength, AcpiDmTableInfoIvrsHid1);
+                    if (ACPI_FAILURE (Status))
+                    {
+                        return;
+                    }
+                    EntryOffset += EntryLength;
+                    DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,
+                        DeviceEntry, EntryLength);
+                }
             }
         }
 
@@ -825,6 +901,11 @@  AcpiDmDumpMadt (
             InfoTable = AcpiDmTableInfoMadt15;
             break;
 
+        case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
+
+            InfoTable = AcpiDmTableInfoMadt16;
+            break;
+
         default:
 
             AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
@@ -1380,6 +1461,11 @@  AcpiDmDumpPcct (
             InfoTable = AcpiDmTableInfoPcct4;
             break;
 
+        case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
+
+            InfoTable = AcpiDmTableInfoPcct5;
+            break;
+
         default:
 
             AcpiOsPrintf (
@@ -1461,201 +1547,224 @@  AcpiDmDumpPdtt (
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiDmDumpPmtt
+ * FUNCTION:    AcpiDmDumpPhat
  *
- * PARAMETERS:  Table               - A PMTT table
+ * PARAMETERS:  Table               - A PHAT table
  *
  * RETURN:      None
  *
- * DESCRIPTION: Format the contents of a PMTT. This table type consists
- *              of an open-ended number of subtables.
+ * DESCRIPTION: Format the contents of a PHAT.
  *
  ******************************************************************************/
 
 void
-AcpiDmDumpPmtt (
+AcpiDmDumpPhat (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_PMTT_HEADER        *Subtable;
-    ACPI_PMTT_HEADER        *MemSubtable;
-    ACPI_PMTT_HEADER        *DimmSubtable;
-    ACPI_PMTT_DOMAIN        *DomainArray;
+    ACPI_DMTABLE_INFO       *InfoTable;
+    ACPI_PHAT_HEADER        *Subtable;
+    ACPI_PHAT_VERSION_DATA  *VersionData;
+    UINT32                  RecordCount;
     UINT32                  Length = Table->Length;
-    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
-    UINT32                  MemOffset;
-    UINT32                  DimmOffset;
-    UINT32                  DomainOffset;
-    UINT32                  DomainCount;
-
+    UINT32                  Offset = sizeof (ACPI_TABLE_PHAT);
+    UINT32                  SubtableLength;
+    UINT32                  PathLength;
+    UINT32                  VendorLength;
 
-    /* Main table */
 
-    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
-    if (ACPI_FAILURE (Status))
-    {
-        return;
-    }
+    Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
 
-    /* Subtables */
-
-    Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, Subtable,
-            Subtable->Length, AcpiDmTableInfoPmttHdr);
+        Status = AcpiDmDumpTable (Length, 0, Subtable,
+            sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        /* Only Socket subtables are expected at this level */
-
-        if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET)
+        switch (Subtable->Type)
         {
-            AcpiOsPrintf (
-                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
+        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
+
+            InfoTable = AcpiDmTableInfoPhat0;
+            SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA);
+            break;
+
+        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
+
+            InfoTable = AcpiDmTableInfoPhat1;
+            SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA);
+            break;
+
+        default:
+
+            AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
                 Subtable->Type);
+
             return;
         }
 
-        /* Dump the fixed-length portion of the subtable */
-
-        Status = AcpiDmDumpTable (Length, Offset, Subtable,
-            Subtable->Length, AcpiDmTableInfoPmtt0);
+        Status = AcpiDmDumpTable (Length, 0, Subtable,
+            SubtableLength, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        /* Walk the memory controller subtables */
-
-        MemOffset = sizeof (ACPI_PMTT_SOCKET);
-        MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
-            sizeof (ACPI_PMTT_SOCKET));
-
-        while (((Offset + MemOffset) < Table->Length) &&
-            (MemOffset < Subtable->Length))
+        switch (Subtable->Type)
         {
-            /* Common subtable header */
+        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
 
-            AcpiOsPrintf ("\n");
-            Status = AcpiDmDumpTable (Length,
-                Offset + MemOffset, MemSubtable,
-                MemSubtable->Length, AcpiDmTableInfoPmttHdr);
-            if (ACPI_FAILURE (Status))
+            VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
+            RecordCount = VersionData->ElementCount;
+            while (RecordCount)
             {
-                return;
+                Status = AcpiDmDumpTable (Length, Offset,
+                    ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)),
+                    sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
+                if (ACPI_FAILURE (Status))
+                {
+                    return;
+                }
+
+                RecordCount--;
             }
 
-            /* Only memory controller subtables are expected at this level */
+            break;
+
+        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
 
-            if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER)
+            /* account for the null terminator */
+
+            PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1;
+            Status = AcpiDmDumpTable (Length, Offset,
+                ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
+                PathLength, AcpiDmTableInfoPhat1a);
+            if (ACPI_FAILURE (Status))
             {
-                AcpiOsPrintf (
-                    "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
-                    MemSubtable->Type);
                 return;
             }
 
-            /* Dump the fixed-length portion of the controller subtable */
+            /* Get vendor data - data length is the remaining subtable length */
 
-            Status = AcpiDmDumpTable (Length,
-                Offset + MemOffset, MemSubtable,
-                MemSubtable->Length, AcpiDmTableInfoPmtt1);
+            VendorLength =
+                Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength;
+            Status = AcpiDmDumpTable (Length, 0,
+                ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength),
+                VendorLength, AcpiDmTableInfoPhat1b);
             if (ACPI_FAILURE (Status))
             {
                 return;
             }
+            break;
 
-            /* Walk the variable count of proximity domains */
+        default:
 
-            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
-            DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
-            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
-                sizeof (ACPI_PMTT_CONTROLLER));
+            AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
+                Subtable->Type);
+            return;
+        }
 
-            while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
-                ((MemOffset + DomainOffset) < Subtable->Length) &&
-                DomainCount)
-            {
-                Status = AcpiDmDumpTable (Length,
-                    Offset + MemOffset + DomainOffset, DomainArray,
-                    sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
-                if (ACPI_FAILURE (Status))
-                {
-                    return;
-                }
+        /* Next subtable */
 
-                DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
-                DomainArray++;
-                DomainCount--;
-            }
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable,
+            Subtable->Length);
+    }
+}
 
-            if (DomainCount)
-            {
-                AcpiOsPrintf (
-                    "\n**** DomainCount exceeds subtable length\n\n");
-            }
 
-            /* Walk the physical component (DIMM) subtables */
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmDumpPmtt
+ *
+ * PARAMETERS:  Table               - A PMTT table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Format the contents of a PMTT. This table type consists
+ *              of an open-ended number of subtables.
+ *
+ ******************************************************************************/
 
-            DimmOffset = DomainOffset;
-            DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
-                DomainOffset);
+void
+AcpiDmDumpPmtt (
+    ACPI_TABLE_HEADER       *Table)
+{
+    ACPI_STATUS             Status;
+    ACPI_PMTT_HEADER        *Subtable;
+    UINT32                  Length = Table->Length;
+    UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
 
-            while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
-                (DimmOffset < MemSubtable->Length))
-            {
-                /* Common subtable header */
 
-                AcpiOsPrintf ("\n");
-                Status = AcpiDmDumpTable (Length,
-                    Offset + MemOffset + DimmOffset, DimmSubtable,
-                    DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
-                if (ACPI_FAILURE (Status))
-                {
-                    return;
-                }
+    /* Main table */
 
-                /* Only DIMM subtables are expected at this level */
+    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
+    if (ACPI_FAILURE (Status))
+    {
+        return;
+    }
 
-                if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM)
-                {
-                    AcpiOsPrintf (
-                        "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
-                        DimmSubtable->Type);
-                    return;
-                }
+    /* Subtables */
 
-                /* Dump the fixed-length DIMM subtable */
+    Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
+    while (Offset < Table->Length)
+    {
+        /* Each of the types below contain the common subtable header */
 
-                Status = AcpiDmDumpTable (Length,
-                    Offset + MemOffset + DimmOffset, DimmSubtable,
-                    DimmSubtable->Length, AcpiDmTableInfoPmtt2);
-                if (ACPI_FAILURE (Status))
-                {
-                    return;
-                }
+        AcpiOsPrintf ("\n");
+        switch (Subtable->Type)
+        {
+        case ACPI_PMTT_TYPE_SOCKET:
+
+            Status = AcpiDmDumpTable (Length, Offset, Subtable,
+                Subtable->Length, AcpiDmTableInfoPmtt0);
+            if (ACPI_FAILURE (Status))
+            {
+                return;
+            }
+            break;
 
-                /* Point to next DIMM subtable */
+        case ACPI_PMTT_TYPE_CONTROLLER:
+            Status = AcpiDmDumpTable (Length, Offset, Subtable,
+                Subtable->Length, AcpiDmTableInfoPmtt1);
+            if (ACPI_FAILURE (Status))
+            {
+                return;
+            }
+            break;
 
-                DimmOffset += DimmSubtable->Length;
-                DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
-                    DimmSubtable, DimmSubtable->Length);
+       case ACPI_PMTT_TYPE_DIMM:
+            Status = AcpiDmDumpTable (Length, Offset, Subtable,
+                Subtable->Length, AcpiDmTableInfoPmtt2);
+            if (ACPI_FAILURE (Status))
+            {
+                return;
             }
+            break;
 
-            /* Point to next Controller subtable */
+        case ACPI_PMTT_TYPE_VENDOR:
+            Status = AcpiDmDumpTable (Length, Offset, Subtable,
+                Subtable->Length, AcpiDmTableInfoPmttVendor);
+            if (ACPI_FAILURE (Status))
+            {
+                return;
+            }
+            break;
 
-            MemOffset += MemSubtable->Length;
-            MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
-                MemSubtable, MemSubtable->Length);
+        default:
+            AcpiOsPrintf (
+                "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
+                Subtable->Type);
+            return;
         }
 
-        /* Point to next Socket subtable */
+        /* Point to next subtable */
 
         Offset += Subtable->Length;
         Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
@@ -1786,6 +1895,21 @@  AcpiDmDumpPptt (
             }
             break;
 
+        case ACPI_PPTT_TYPE_CACHE:
+
+            if (Table->Revision < 3)
+            {
+                break;
+            }
+            Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
+                ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
+                sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
+            if (ACPI_FAILURE (Status))
+            {
+                return;
+            }
+            break;
+
         default:
 
             break;
@@ -1906,17 +2030,20 @@  void
 AcpiDmDumpSdev (
     ACPI_TABLE_HEADER       *Table)
 {
-    ACPI_STATUS             Status;
-    ACPI_SDEV_HEADER        *Subtable;
-    ACPI_SDEV_PCIE          *Pcie;
-    ACPI_SDEV_NAMESPACE     *Namesp;
-    ACPI_DMTABLE_INFO       *InfoTable;
-    UINT32                  Length = Table->Length;
-    UINT32                  Offset = sizeof (ACPI_TABLE_SDEV);
-    UINT16                  PathOffset;
-    UINT16                  PathLength;
-    UINT16                  VendorDataOffset;
-    UINT16                  VendorDataLength;
+    ACPI_STATUS                 Status;
+    ACPI_SDEV_HEADER            *Subtable;
+    ACPI_SDEV_PCIE              *Pcie;
+    ACPI_SDEV_NAMESPACE         *Namesp;
+    ACPI_DMTABLE_INFO           *InfoTable;
+    ACPI_DMTABLE_INFO           *SecureComponentInfoTable;
+    UINT32                      Length = Table->Length;
+    UINT32                      Offset = sizeof (ACPI_TABLE_SDEV);
+    UINT16                      PathOffset;
+    UINT16                      PathLength;
+    UINT16                      VendorDataOffset;
+    UINT16                      VendorDataLength;
+    ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
+    UINT32                      CurrentOffset = 0;
 
 
     /* Main table */
@@ -1959,7 +2086,7 @@  AcpiDmDumpSdev (
         }
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+        Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
             Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
@@ -1970,6 +2097,52 @@  AcpiDmDumpSdev (
         {
         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
 
+            CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
+            if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
+            {
+                SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
+                    ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
+
+                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
+                    ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
+                    sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
+                if (ACPI_FAILURE (Status))
+                {
+                    return;
+                }
+                CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
+
+                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
+                    ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
+                    sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
+                if (ACPI_FAILURE (Status))
+                {
+                    return;
+                }
+                CurrentOffset += sizeof (ACPI_SDEV_HEADER);
+
+                switch (Subtable->Type)
+                {
+                case ACPI_SDEV_TYPE_ID_COMPONENT:
+
+                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
+                    break;
+
+                case ACPI_SDEV_TYPE_MEM_COMPONENT:
+
+                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
+                    break;
+
+                default:
+                    goto NextSubtable;
+                }
+
+                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
+                    ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
+                    SecureComponent->SecureComponentLength, SecureComponentInfoTable);
+                CurrentOffset += SecureComponent->SecureComponentLength;
+            }
+
             /* Dump the PCIe device ID(s) */
 
             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
@@ -1978,13 +2151,14 @@  AcpiDmDumpSdev (
 
             if (PathLength)
             {
-                Status = AcpiDmDumpTable (Table->Length, 0,
+                Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
                     ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
                     PathLength, AcpiDmTableInfoSdev0a);
                 if (ACPI_FAILURE (Status))
                 {
                     return;
                 }
+                CurrentOffset += PathLength;
             }
 
             /* Dump the vendor-specific data */
diff --git a/src/acpica/source/common/dmtbdump3.c b/src/acpica/source/common/dmtbdump3.c
index fde8f7a8..7f559eee 100644
--- a/src/acpica/source/common/dmtbdump3.c
+++ b/src/acpica/source/common/dmtbdump3.c
@@ -601,6 +601,106 @@  AcpiDmDumpTpm2 (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmDumpViot
+ *
+ * PARAMETERS:  Table               - A VIOT table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Format the contents of a VIOT
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpViot (
+    ACPI_TABLE_HEADER       *Table)
+{
+    ACPI_STATUS             Status;
+    ACPI_TABLE_VIOT         *Viot;
+    ACPI_VIOT_HEADER        *ViotHeader;
+    UINT16                  Length;
+    UINT16                  Offset;
+    ACPI_DMTABLE_INFO       *InfoTable;
+
+    /* Main table */
+
+    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoViot);
+    if (ACPI_FAILURE (Status))
+    {
+        return;
+    }
+
+    Viot = ACPI_CAST_PTR (ACPI_TABLE_VIOT, Table);
+
+    Offset = Viot->NodeOffset;
+    while (Offset < Table->Length)
+    {
+        /* Common subtable header */
+        ViotHeader = ACPI_ADD_PTR (ACPI_VIOT_HEADER, Table, Offset);
+        AcpiOsPrintf ("\n");
+
+        Length = sizeof (ACPI_VIOT_HEADER);
+        Status = AcpiDmDumpTable (Table->Length, Offset, ViotHeader, Length,
+            AcpiDmTableInfoViotHeader);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+        Length = ViotHeader->Length;
+        switch (ViotHeader->Type)
+        {
+        case ACPI_VIOT_NODE_PCI_RANGE:
+
+            InfoTable = AcpiDmTableInfoViot1;
+            break;
+
+        case ACPI_VIOT_NODE_MMIO:
+
+            InfoTable = AcpiDmTableInfoViot2;
+            break;
+
+        case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
+
+            InfoTable = AcpiDmTableInfoViot3;
+            break;
+
+        case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
+
+            InfoTable = AcpiDmTableInfoViot4;
+            break;
+
+        default:
+
+            AcpiOsPrintf ("\n*** Unknown VIOT node type 0x%X\n",
+                ViotHeader->Type);
+
+            /* Attempt to continue */
+
+            if (!Length)
+            {
+                AcpiOsPrintf ("Invalid zero length VIOT node\n");
+                return;
+            }
+            goto NextSubtable;
+        }
+
+        AcpiOsPrintf ("\n");
+        Status = AcpiDmDumpTable (Table->Length, Offset, ViotHeader, Length,
+            InfoTable);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+NextSubtable:
+        Offset += Length;
+    }
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDmDumpWdat
diff --git a/src/acpica/source/common/dmtbinfo1.c b/src/acpica/source/common/dmtbinfo1.c
index 5931c01e..ea545f53 100644
--- a/src/acpica/source/common/dmtbinfo1.c
+++ b/src/acpica/source/common/dmtbinfo1.c
@@ -344,6 +344,33 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoBoot[] =
 };
 
 
+/*******************************************************************************
+ *
+ * CEDT - CXL Early Discovery Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoCedtHdr[] =
+{
+    {ACPI_DMT_CEDT,     ACPI_CEDT_OFFSET (Type),               "Subtable Type", 0},
+    {ACPI_DMT_UINT8,    ACPI_CEDT_OFFSET (Reserved),           "Reserved", 0},
+    {ACPI_DMT_UINT16,   ACPI_CEDT_OFFSET (Length),             "Length", DT_LENGTH},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 0: CXL Host Bridge Structure */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoCedt0[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (Uid),               "Associated host bridge", 0},
+    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (CxlVersion),        "Specification version", 0},
+    {ACPI_DMT_UINT32,   ACPI_CEDT0_OFFSET (Reserved),          "Reserved", 0},
+    {ACPI_DMT_UINT64,   ACPI_CEDT0_OFFSET (Base),              "Register base", 0},
+    {ACPI_DMT_UINT64,   ACPI_CEDT0_OFFSET (Length),            "Register length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+
 /*******************************************************************************
  *
  * CPEP - Corrected Platform Error Polling table
@@ -1134,9 +1161,12 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat0[] =
 ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1[] =
 {
     {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (Flags),                  "Flags (decoded below)", 0},
-    {ACPI_DMT_FLAGS4_0, ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Memory Hierarchy", 0},
+    {ACPI_DMT_FLAGS4_0, ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Memory Hierarchy", 0},         /* First 4 bits */
+    {ACPI_DMT_FLAG4,    ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Use Minimum Transfer Size", 0},
+    {ACPI_DMT_FLAG5,    ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Non-sequential Transfers", 0},
     {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (DataType),               "Data Type", 0},
-    {ACPI_DMT_UINT16,   ACPI_HMAT1_OFFSET (Reserved1),              "Reserved1", 0},
+    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (MinTransferSize),        "Minimum Transfer Size", 0},
+    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (Reserved1),              "Reserved1", 0},
     {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfInitiatorPDs),   "Initiator Proximity Domains #", 0},
     {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfTargetPDs),      "Target Proximity Domains #", 0},
     {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (Reserved2),              "Reserved2", 0},
diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c
index 0d61cb7a..9bb4b48c 100644
--- a/src/acpica/source/common/dmtbinfo2.c
+++ b/src/acpica/source/common/dmtbinfo2.c
@@ -218,7 +218,20 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoIortHdr[] =
     {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Type),                   "Type", 0},
     {ACPI_DMT_UINT16,   ACPI_IORTH_OFFSET (Length),                 "Length", DT_LENGTH},
     {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Revision),               "Revision", 0},
-    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Reserved),               "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Identifier),             "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingCount),           "Mapping Count", 0},
+    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingOffset),          "Mapping Offset", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* Common Subtable header (one per Subtable)- Revision 3 */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoIortHdr3[] =
+{
+    {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Type),                   "Type", 0},
+    {ACPI_DMT_UINT16,   ACPI_IORTH_OFFSET (Length),                 "Length", DT_LENGTH},
+    {ACPI_DMT_UINT8,    ACPI_IORTH_OFFSET (Revision),               "Revision", 0},
+    {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (Identifier),             "Identifier", 0},
     {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingCount),           "Mapping Count", 0},
     {ACPI_DMT_UINT32,   ACPI_IORTH_OFFSET (MappingOffset),          "Mapping Offset", 0},
     ACPI_DMT_TERMINATOR
@@ -369,6 +382,25 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoIort5[] =
 };
 
 
+/* 0x06: RMR */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoIort6[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (Flags),                  "Flags (decoded below)", 0},
+    {ACPI_DMT_FLAG0,    ACPI_IORT6_FLAG_OFFSET (Flags, 0),          "Remapping Permitted", 0},
+    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (RmrCount),               "Number of RMR Descriptors", 0},
+    {ACPI_DMT_UINT32,   ACPI_IORT6_OFFSET (RmrOffset),              "RMR Descriptor Offset", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoIort6a[] =
+{
+    {ACPI_DMT_UINT64,   ACPI_IORT6A_OFFSET (BaseAddress),           "Base Address of RMR", DT_OPTIONAL},
+    {ACPI_DMT_UINT64,   ACPI_IORT6A_OFFSET (Length),                "Length of RMR", 0},
+    {ACPI_DMT_UINT32,   ACPI_IORT6A_OFFSET (Reserved),              "Reserved", 0},
+    ACPI_DMT_TERMINATOR
+};
+
 /*******************************************************************************
  *
  * IVRS - I/O Virtualization Reporting Structure
@@ -478,6 +510,24 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrs8c[] =
     ACPI_DMT_TERMINATOR
 };
 
+/* Variable-length device entry */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrsHid[] =
+{
+    ACPI_DMT_IVRS_DE_HEADER,
+    {ACPI_DMT_NAME8,    ACPI_IVRSHID_OFFSET (AcpiHid),              "ACPI HID", 0},
+    {ACPI_DMT_NAME8,    ACPI_IVRSHID_OFFSET (AcpiCid),              "ACPI CID", 0},
+    {ACPI_DMT_UINT8,    ACPI_IVRSHID_OFFSET (UidType),              "UID Format", DT_DESCRIBES_OPTIONAL},
+    {ACPI_DMT_UINT8,    ACPI_IVRSHID_OFFSET (UidLength),            "UID Length", DT_DESCRIBES_OPTIONAL},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoIvrsHid1[] =
+{
+    {ACPI_DMT_RAW_BUFFER, 0,                                        "UID", DT_OPTIONAL},
+    ACPI_DMT_TERMINATOR
+};
+
 
 /*******************************************************************************
  *
@@ -751,6 +801,16 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoMadt15[] =
    ACPI_DMT_TERMINATOR
 };
 
+/* 16: Multiprocessor wakeup structure (ACPI 6.4) */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoMadt16[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_MADT16_OFFSET (MailboxVersion),        "Mailbox Version", 0},
+    {ACPI_DMT_UINT32,   ACPI_MADT16_OFFSET (Reserved),              "Reserved", 0},
+    {ACPI_DMT_UINT64,   ACPI_MADT16_OFFSET (BaseAddress),           "Mailbox Address", 0},
+   ACPI_DMT_TERMINATOR
+};
+
 
 /*******************************************************************************
  *
@@ -938,12 +998,14 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoNfit0[] =
     {ACPI_DMT_UINT16,   ACPI_NFIT0_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
     {ACPI_DMT_FLAG0,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Add/Online Operation Only", 0},
     {ACPI_DMT_FLAG1,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Proximity Domain Valid", 0},
+    {ACPI_DMT_FLAG2,    ACPI_NFIT0_FLAG_OFFSET (Flags,0),           "Location Cookie Valid", 0},
     {ACPI_DMT_UINT32,   ACPI_NFIT0_OFFSET (Reserved),               "Reserved", 0},
     {ACPI_DMT_UINT32,   ACPI_NFIT0_OFFSET (ProximityDomain),        "Proximity Domain", 0},
     {ACPI_DMT_UUID,     ACPI_NFIT0_OFFSET (RangeGuid[0]),           "Region Type GUID", 0},
     {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (Address),                "Address Range Base", 0},
     {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (Length),                 "Address Range Length", 0},
     {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (MemoryMapping),          "Memory Map Attribute", 0},
+    {ACPI_DMT_UINT64,   ACPI_NFIT0_OFFSET (LocationCookie),         "Location Cookie", 0},      /* ACPI 6.4 */
     ACPI_DMT_TERMINATOR
 };
 
@@ -1219,6 +1281,25 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct4[] =
     ACPI_DMT_TERMINATOR
 };
 
+/* 5: HW Registers based Communications Subspace */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct5[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_PCCT5_OFFSET (Version),                "Version", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (BaseAddress),            "Base Address", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (Length),                 "Length", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (DoorbellRegister),       "Doorbell Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (DoorbellPreserve),       "Preserve Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (DoorbellWrite),          "Write Mask", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (CmdCompleteRegister),    "Command Complete Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (CmdCompleteMask),        "Command Complete Check Mask", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT5_OFFSET (ErrorStatusRegister),    "Error Status Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT5_OFFSET (ErrorStatusMask),        "Error Status Mask", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT5_OFFSET (NominalLatency),         "Nominal Latency", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT5_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
+    ACPI_DMT_TERMINATOR
+};
+
 
 /*******************************************************************************
  *
@@ -1247,37 +1328,91 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPdtt0[] =
 
 /*******************************************************************************
  *
- * PMTT - Platform Memory Topology Table
+ * PHAT - Platform Health Assessment Table (ACPI 6.4)
  *
  ******************************************************************************/
 
-ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt[] =
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPhatHdr[] =
 {
-    {ACPI_DMT_UINT32,   ACPI_PMTT_OFFSET (Reserved),                "Reserved", 0},
+    {ACPI_DMT_PHAT,     ACPI_PHATH_OFFSET (Type),                 "Subtable Type", 0},
+    {ACPI_DMT_UINT16,   ACPI_PHATH_OFFSET (Length),               "Length", 0},
+    {ACPI_DMT_UINT8,    ACPI_PHATH_OFFSET (Revision),             "Revision", 0},
     ACPI_DMT_TERMINATOR
 };
 
-/* Common Subtable header (one per Subtable) */
+/* 0: Firmware version table */
 
-ACPI_DMTABLE_INFO           AcpiDmTableInfoPmttHdr[] =
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat0[] =
 {
-    {ACPI_DMT_PMTT,     ACPI_PMTTH_OFFSET (Type),                   "Subtable Type", 0},
-    {ACPI_DMT_UINT8,    ACPI_PMTTH_OFFSET (Reserved1),              "Reserved", 0},
-    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Length),                 "Length", DT_LENGTH},
-    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
-    {ACPI_DMT_FLAG0,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Top-level Device", 0},
-    {ACPI_DMT_FLAG1,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Physical Element", 0},
-    {ACPI_DMT_FLAGS2,   ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Memory Type", 0},
-    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Reserved2),              "Reserved", 0},
+    {ACPI_DMT_UINT24,   ACPI_PHAT0_OFFSET (Reserved),             "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_PHAT0_OFFSET (ElementCount),         "Element Count", 0},
     ACPI_DMT_TERMINATOR
 };
 
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat0a[] =
+{
+    {ACPI_DMT_UUID,     ACPI_PHAT0A_OFFSET (Guid),                "GUID", 0},
+    {ACPI_DMT_UINT64,   ACPI_PHAT0A_OFFSET (VersionValue),        "Version Value", 0},
+    {ACPI_DMT_UINT32,   ACPI_PHAT0A_OFFSET (ProducerId),          "Producer ID", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 1: Firmware Health Data Record */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_PHAT1_OFFSET (Reserved),             "Reserved", 0},
+    {ACPI_DMT_UINT8,    ACPI_PHAT1_OFFSET (Health),               "Health", 0},
+    {ACPI_DMT_UUID,     ACPI_PHAT1_OFFSET (DeviceGuid),           "Device GUID", 0},
+    {ACPI_DMT_UINT32,   ACPI_PHAT1_OFFSET (DeviceSpecificOffset), "Device specific offset", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1a[] =
+{
+    {ACPI_DMT_STRING,   0,                                          "Namepath", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPhat1b[] =
+{
+    {ACPI_DMT_RAW_BUFFER, 0,                                        "Vendor Data", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+
+/*******************************************************************************
+ *
+ * PMTT - Platform Memory Topology Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_PMTT_OFFSET (MemoryDeviceCount),       "Memory Device Count", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* Common Subtable header (one per Subtable) */
+
+#define ACPI_DM_PMTT_HEADER \
+    {ACPI_DMT_PMTT,     ACPI_PMTTH_OFFSET (Type),                   "Subtable Type", 0}, \
+    {ACPI_DMT_UINT8,    ACPI_PMTTH_OFFSET (Reserved1),              "Reserved", 0}, \
+    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Length),                 "Length", DT_LENGTH}, \
+    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG}, \
+    {ACPI_DMT_FLAG0,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Top-level Device", 0}, \
+    {ACPI_DMT_FLAG1,    ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Physical Element", 0}, \
+    {ACPI_DMT_FLAGS2,   ACPI_PMTTH_FLAG_OFFSET (Flags,0),           "Memory Type", 0}, \
+    {ACPI_DMT_UINT16,   ACPI_PMTTH_OFFSET (Reserved2),              "Reserved", 0}, \
+    {ACPI_DMT_UINT32,   ACPI_PMTTH_OFFSET (MemoryDeviceCount),      "Memory Device Count", 0}
+
 /* PMTT Subtables */
 
 /* 0: Socket */
 
 ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt0[] =
 {
+    ACPI_DM_PMTT_HEADER,
     {ACPI_DMT_UINT16,   ACPI_PMTT0_OFFSET (SocketId),               "Socket ID", 0},
     {ACPI_DMT_UINT16,   ACPI_PMTT0_OFFSET (Reserved),               "Reserved", 0},
     ACPI_DMT_TERMINATOR
@@ -1287,33 +1422,28 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt0[] =
 
 ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt1[] =
 {
-    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (ReadLatency),            "Read Latency", 0},
-    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (WriteLatency),           "Write Latency", 0},
-    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (ReadBandwidth),          "Read Bandwidth", 0},
-    {ACPI_DMT_UINT32,   ACPI_PMTT1_OFFSET (WriteBandwidth),         "Write Bandwidth", 0},
-    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (AccessWidth),            "Access Width", 0},
-    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (Alignment),              "Alignment", 0},
+    ACPI_DM_PMTT_HEADER,
+    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (ControllerId),           "Controller ID", 0},
     {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (Reserved),               "Reserved", 0},
-    {ACPI_DMT_UINT16,   ACPI_PMTT1_OFFSET (DomainCount),            "Domain Count", 0},
     ACPI_DMT_TERMINATOR
 };
 
-/* 1a: Proximity Domain */
+/* 2: Physical Component */
 
-ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt1a[] =
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
 {
-    {ACPI_DMT_UINT32,   ACPI_PMTT1A_OFFSET (ProximityDomain),       "Proximity Domain", 0},
+    ACPI_DM_PMTT_HEADER,
+    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (BiosHandle),             "Bios Handle", 0},
     ACPI_DMT_TERMINATOR
 };
 
-/* 2: Physical Component */
+/* 0xFF: Vendor Specific */
 
-ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPmttVendor[] =
 {
-    {ACPI_DMT_UINT16,   ACPI_PMTT2_OFFSET (ComponentId),            "Component ID", 0},
-    {ACPI_DMT_UINT16,   ACPI_PMTT2_OFFSET (Reserved),               "Reserved", 0},
-    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (MemorySize),             "Memory Size", 0},
-    {ACPI_DMT_UINT32,   ACPI_PMTT2_OFFSET (BiosHandle),             "Bios Handle", 0},
+    ACPI_DM_PMTT_HEADER,
+    {ACPI_DMT_UUID,         ACPI_PMTT_VENDOR_OFFSET (TypeUuid),     "Type Uuid", 0},
+    {ACPI_DMT_PMTT_VENDOR,  ACPI_PMTT_VENDOR_OFFSET (Specific),     "Vendor Data", 0},
     ACPI_DMT_TERMINATOR
 };
 
@@ -1371,6 +1501,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
     {ACPI_DMT_FLAG4,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache Type valid", 0},
     {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Write Policy valid", 0},
     {ACPI_DMT_FLAG6,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
+    {ACPI_DMT_FLAG7,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache ID valid", 0},
     {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NextLevelOfCache),       "Next Level of Cache", 0},
     {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Size),                   "Size", 0},
     {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NumberOfSets),           "Number of Sets", 0},
@@ -1383,6 +1514,14 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
     ACPI_DMT_TERMINATOR
 };
 
+/* 1: cache type v1 */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1a[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_PPTT1A_OFFSET (CacheId),               "Cache ID", 0},
+    ACPI_DMT_TERMINATOR
+};
+
 /* 2: ID */
 
 ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt2[] =
@@ -1499,6 +1638,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevHdr[] =
     {ACPI_DMT_SDEV,     ACPI_SDEVH_OFFSET (Type),                   "Subtable Type", 0},
     {ACPI_DMT_UINT8,    ACPI_SDEVH_OFFSET (Flags),                  "Flags (decoded below)", 0},
     {ACPI_DMT_FLAG0,    ACPI_SDEVH_FLAG_OFFSET (Flags,0),           "Allow handoff to unsecure OS", 0},
+    {ACPI_DMT_FLAG1,    ACPI_SDEVH_FLAG_OFFSET (Flags,0),           "Secure access components present", 0},
     {ACPI_DMT_UINT16,   ACPI_SDEVH_OFFSET (Length),                 "Length", 0},
     ACPI_DMT_TERMINATOR
 };
@@ -1522,6 +1662,53 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev0a[] =
     ACPI_DMT_TERMINATOR
 };
 
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev0b[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_SDEV0B_OFFSET (SecureComponentOffset), "Secure Access Components Offset", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV0B_OFFSET (SecureComponentLength), "Secure Access Components Length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* Secure access components */
+
+/* Common secure access components header secure access component */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompHdr[] =
+{
+    {ACPI_DMT_UINT8,    ACPI_SDEVCH_OFFSET (Type),                   "Secure Component Type", 0},
+    {ACPI_DMT_UINT8,    ACPI_SDEVCH_OFFSET (Flags),                  "Flags (decoded below)", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEVCH_OFFSET (Length),                 "Length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 0: Identification Based Secure Access Component */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompId[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareIdOffset),      "Hardware ID Offset", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareIdLength),      "Hardware ID Length", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (SubsystemIdOffset),     "Subsystem ID Offset", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (SubsystemIdLength),     "Subsystem ID Length", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEVC0_OFFSET (HardwareRevision),      "Hardware Revision", 0},
+    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (HardwareRevPresent),    "Hardware Rev Present", 0},
+    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (ClassCodePresent),      "Class Code Present", 0},
+    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciBaseClass),          "PCI Base Class", 0},
+    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciSubClass),           "PCI SubClass", 0},
+    {ACPI_DMT_UINT8,    ACPI_SDEVC0_OFFSET (PciProgrammingXface),   "PCI Programming Xface", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 1: Memory Based Secure Access Component */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevSecCompMem[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_SDEVC1_OFFSET (Reserved),              "Reserved", 0},
+    {ACPI_DMT_UINT64,   ACPI_SDEVC1_OFFSET (MemoryBaseAddress),     "Memory Base Address", 0},
+    {ACPI_DMT_UINT64,   ACPI_SDEVC1_OFFSET (MemoryLength),          "Memory Length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+
 /* 1: PCIe Endpoint Device Based Device Structure */
 
 ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev1[] =
diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c
index 99661d06..773ba16e 100644
--- a/src/acpica/source/common/dmtbinfo3.c
+++ b/src/acpica/source/common/dmtbinfo3.c
@@ -378,6 +378,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat5[] =
     {ACPI_DMT_BUF16,    ACPI_SRAT5_OFFSET (DeviceHandle),           "Device Handle", 0},
     {ACPI_DMT_UINT32,   ACPI_SRAT5_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
     {ACPI_DMT_FLAG0,    ACPI_SRAT5_FLAG_OFFSET (Flags,0),           "Enabled", 0},
+    {ACPI_DMT_FLAG1,    ACPI_SRAT5_FLAG_OFFSET (Flags,0),           "Architectural Transactions", 0},
     {ACPI_DMT_UINT32,   ACPI_SRAT5_OFFSET (Reserved1),              "Reserved2", 0},
     ACPI_DMT_TERMINATOR
 };
@@ -526,6 +527,77 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoUefi[] =
 };
 
 
+/*******************************************************************************
+ *
+ * VIOT - Virtual I/O Translation Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoViot[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_VIOT_OFFSET (NodeCount),               "Node count", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOT_OFFSET (NodeOffset),              "Node offset", 0},
+    {ACPI_DMT_UINT64,   ACPI_VIOT_OFFSET (Reserved),                "Reserved", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* Common VIOT subtable header */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoViotHeader[] =
+{
+    {ACPI_DMT_VIOT,     ACPI_VIOTH_OFFSET (Type),                   "Type", 0},
+    {ACPI_DMT_UINT8,    ACPI_VIOTH_OFFSET (Reserved),               "Reserved", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOTH_OFFSET (Length),                 "Length", DT_LENGTH},
+    ACPI_DMT_TERMINATOR
+};
+
+/* VIOT Subtables */
+
+/* 0x01: PCI Range Node */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoViot1[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_VIOT1_OFFSET (EndpointStart),          "Endpoint start", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (SegmentStart),           "PCI Segment start", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (SegmentEnd),             "PCI Segment end", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (BdfStart),               "PCI BDF start", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (BdfEnd),                 "PCI BDF end", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOT1_OFFSET (OutputNode),             "Output node", 0},
+    {ACPI_DMT_UINT48,   ACPI_VIOT1_OFFSET (Reserved),               "Reserved", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 0x02: MMIO Endpoint Node */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoViot2[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_VIOT2_OFFSET (Endpoint),               "Endpoint", 0},
+    {ACPI_DMT_UINT64,   ACPI_VIOT2_OFFSET (BaseAddress),            "Base address", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOT2_OFFSET (OutputNode),             "Output node", 0},
+    {ACPI_DMT_UINT48,   ACPI_VIOT2_OFFSET (Reserved),               "Reserved", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 0x03: PCI Virtio-IOMMU Node */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoViot3[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_VIOT3_OFFSET (Segment),                "PCI Segment", 0},
+    {ACPI_DMT_UINT16,   ACPI_VIOT3_OFFSET (Bdf),                    "PCI BDF number", 0},
+    {ACPI_DMT_UINT64,   ACPI_VIOT3_OFFSET (Reserved),               "Reserved", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 0x04: MMIO Virtio-IOMMU Node */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoViot4[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_VIOT4_OFFSET (Reserved),               "Reserved", 0},
+    {ACPI_DMT_UINT64,   ACPI_VIOT4_OFFSET (BaseAddress),            "Base address", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+
 /*******************************************************************************
  *
  * WAET - Windows ACPI Emulated devices Table
diff --git a/src/acpica/source/compiler/aslallocate.c b/src/acpica/source/compiler/aslallocate.c
index 4007687b..8be711b2 100644
--- a/src/acpica/source/compiler/aslallocate.c
+++ b/src/acpica/source/compiler/aslallocate.c
@@ -153,7 +153,7 @@ 
 
 /*
  * Local heap allocation wrappers. See aslcache.c for allocation from local
- * cache alloctions
+ * cache allocations
  */
 
 
diff --git a/src/acpica/source/compiler/aslascii.c b/src/acpica/source/compiler/aslascii.c
index d02ca80c..0e8c4d4e 100644
--- a/src/acpica/source/compiler/aslascii.c
+++ b/src/acpica/source/compiler/aslascii.c
@@ -184,7 +184,7 @@  FlConsumeNewComment (
  *              not handle comment delimiters within string literals. However,
  *              on the rare chance this happens and an invalid character is
  *              missed, the parser will catch the error by failing in some
- *              spectactular manner.
+ *              spectacular manner.
  *
  ******************************************************************************/
 
@@ -216,7 +216,7 @@  FlIsFileAsciiSource (
 
     while (fread (&Byte, 1, 1, Handle) == 1)
     {
-        /* Ignore comment fields (allow non-ascii within) */
+        /* Ignore comment fields (allow non-ASCII within) */
 
         if (OpeningComment)
         {
diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
index 3cd56d1f..e48e4674 100644
--- a/src/acpica/source/compiler/aslcompiler.h
+++ b/src/acpica/source/compiler/aslcompiler.h
@@ -1538,6 +1538,10 @@  ASL_RESOURCE_NODE *
 RsDoUartSerialBusDescriptor (
     ASL_RESOURCE_INFO       *Info);
 
+ASL_RESOURCE_NODE *
+RsDoCsi2SerialBusDescriptor (
+    ASL_RESOURCE_INFO       *Info);
+
 ASL_RESOURCE_NODE *
 RsDoPinFunctionDescriptor (
     ASL_RESOURCE_INFO       *Info);
diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
index 629b9972..e0985362 100644
--- a/src/acpica/source/compiler/aslcompiler.l
+++ b/src/acpica/source/compiler/aslcompiler.l
@@ -434,6 +434,7 @@  NamePathTail                [.]{NameSeg}
 "ResourceTemplate"          { count (1); return (PARSEOP_RESOURCETEMPLATE); }
 "RawDataBuffer"             { count (1); return (PARSEOP_DATABUFFER); }
 
+"Csi2Bus"                   { count (1); return (PARSEOP_CSI2_SERIALBUS); }
 "DMA"                       { count (1); return (PARSEOP_DMA); }
 "DWordIO"                   { count (1); return (PARSEOP_DWORDIO); }
 "DWordMemory"               { count (1); return (PARSEOP_DWORDMEMORY); }
diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
index 6c684f2f..d73d7de9 100644
--- a/src/acpica/source/compiler/aslerror.c
+++ b/src/acpica/source/compiler/aslerror.c
@@ -1125,7 +1125,7 @@  void
 AslCheckExpectedExceptions (
     void)
 {
-    UINT8                   i;
+    UINT32                  i;
     ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
     ASL_LOCATION_NODE       *LocationNode;
 
@@ -1188,7 +1188,7 @@  AslLogExpectedException (
 
     if (MessageId > 6999)
     {
-        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
+        printf ("\"%s\" is not a valid warning/remark/error ID\n",
             MessageIdString);
         return (AE_BAD_PARAMETER);
     }
@@ -1336,7 +1336,7 @@  AslElevateException (
 
     if (MessageId > 6999)
     {
-        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
+        printf ("\"%s\" is not a valid warning/remark/error ID\n",
             MessageIdString);
         return (AE_BAD_PARAMETER);
     }
diff --git a/src/acpica/source/compiler/aslhelpers.y b/src/acpica/source/compiler/aslhelpers.y
index 0b302904..abb729c3 100644
--- a/src/acpica/source/compiler/aslhelpers.y
+++ b/src/acpica/source/compiler/aslhelpers.y
@@ -360,6 +360,11 @@  OptionalSlaveMode
     | ',' SlaveModeKeyword          {$$ = $2;}
     ;
 
+OptionalSlaveMode_First
+    :                               {$$ = NULL;}
+    | SlaveModeKeyword              {$$ = $1;}
+    ;
+
 OptionalShareType
     :                               {$$ = NULL;}
     | ','                           {$$ = NULL;}
diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
index ed27a155..7b591bc6 100644
--- a/src/acpica/source/compiler/aslmap.c
+++ b/src/acpica/source/compiler/aslmap.c
@@ -346,6 +346,7 @@  const ASL_MAPPING_ENTRY     AslKeywordMapping [] =
 /* FUNCTION */                  OP_TABLE_ENTRY (AML_METHOD_OP,              0,                              OP_AML_PACKAGE,     0),
 /* GPIOINT */                   OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
 /* GPIOIO */                    OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
+/* CSI2SERIALBUS */             OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
 /* I2CSERIALBUS */              OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
 /* I2CSERIALBUSV2 */            OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
 /* IF */                        OP_TABLE_ENTRY (AML_IF_OP,                  0,                              OP_AML_PACKAGE,     0),
diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
index 87ebc48e..c9697645 100644
--- a/src/acpica/source/compiler/aslmessages.c
+++ b/src/acpica/source/compiler/aslmessages.c
@@ -384,7 +384,8 @@  const char                      *AslCompilerMsgs [] =
 /*    ASL_MSG_EXTERNAL_FOUND_HERE */        "External declaration below ",
 /*    ASL_MSG_LOWER_CASE_NAMESEG */         "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case",
 /*    ASL_MSG_LOWER_CASE_NAMEPATH */        "At least one lower case letter found in NamePath, ASL is case insensitive - converting to upper case",
-/*    ASL_MSG_UUID_NOT_FOUND */             "Unknown UUID string"
+/*    ASL_MSG_UUID_NOT_FOUND */             "Unknown UUID string",
+/*    ASL_MSG_LEGACY_DDB_TYPE */            "DDBHandleObj has been deprecated along with the Unload operator. DDBHandlObj objects are only used in Unload"
 };
 
 /* Table compiler */
diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
index a4842cdf..1d9f7bec 100644
--- a/src/acpica/source/compiler/aslmessages.h
+++ b/src/acpica/source/compiler/aslmessages.h
@@ -389,6 +389,7 @@  typedef enum
     ASL_MSG_LOWER_CASE_NAMESEG,
     ASL_MSG_LOWER_CASE_NAMEPATH,
     ASL_MSG_UUID_NOT_FOUND,
+    ASL_MSG_LEGACY_DDB_TYPE,
 
 
     /* These messages are used by the Data Table compiler only */
diff --git a/src/acpica/source/compiler/aslnamesp.c b/src/acpica/source/compiler/aslnamesp.c
index 7dc9ed7e..6f9bb65a 100644
--- a/src/acpica/source/compiler/aslnamesp.c
+++ b/src/acpica/source/compiler/aslnamesp.c
@@ -519,7 +519,8 @@  NsDoOneNamespaceObject (
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Print the full pathname and addtional info for a namespace node.
+ * DESCRIPTION: Print the full pathname and additional info for a namespace
+ * node.
  *
  ******************************************************************************/
 
diff --git a/src/acpica/source/compiler/aslopcodes.c b/src/acpica/source/compiler/aslopcodes.c
index f5cb0214..2f2c7744 100644
--- a/src/acpica/source/compiler/aslopcodes.c
+++ b/src/acpica/source/compiler/aslopcodes.c
@@ -676,7 +676,7 @@  OpcDoUnicode (
  *                      Bits 4-0    - 3rd character of mfg code
  *              Byte 2: Bits 7-4    - 1st hex digit of product number
  *                      Bits 3-0    - 2nd hex digit of product number
- *              Byte 3: Bits 7-4    - 3st hex digit of product number
+ *              Byte 3: Bits 7-4    - 3rd hex digit of product number
  *                      Bits 3-0    - Hex digit of the revision number
  *
  ******************************************************************************/
diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c
index bd4a4d85..ae3b918d 100644
--- a/src/acpica/source/compiler/asloperands.c
+++ b/src/acpica/source/compiler/asloperands.c
@@ -1090,7 +1090,7 @@  OpnDoDefinitionBlock (
          * Use the definition block file parameter instead of the input
          * filename. Since all files were opened previously, remove the
          * existing file and open a new file with the name of this
-         * definiton block parameter. Since AML code generation has yet
+         * definition block parameter. Since AML code generation has yet
          * to happen, the previous file can be removed without any impacts.
          */
         FlCloseFile (ASL_FILE_AML_OUTPUT);
diff --git a/src/acpica/source/compiler/aslparser.y b/src/acpica/source/compiler/aslparser.y
index c91acedf..0a6fb64d 100644
--- a/src/acpica/source/compiler/aslparser.y
+++ b/src/acpica/source/compiler/aslparser.y
@@ -208,7 +208,7 @@  AslLocalAllocate (
  * These shift/reduce conflicts are expected. There should be zero
  * reduce/reduce conflicts.
  */
-%expect 124
+%expect 127
 
 /*! [Begin] no source code translation */
 
diff --git a/src/acpica/source/compiler/aslprintf.c b/src/acpica/source/compiler/aslprintf.c
index 62d411e1..04f2d31e 100644
--- a/src/acpica/source/compiler/aslprintf.c
+++ b/src/acpica/source/compiler/aslprintf.c
@@ -352,7 +352,7 @@  OpcParsePrintf (
 
             /*
              * Append an empty string if the first argument is
-             * not a string. This will implicitly conver the 2nd
+             * not a string. This will implicitly convert the 2nd
              * concat source to a string per the ACPI specification.
              */
             if (!Op->Asl.Child)
diff --git a/src/acpica/source/compiler/aslresource.c b/src/acpica/source/compiler/aslresource.c
index 434a74c6..a2d85568 100644
--- a/src/acpica/source/compiler/aslresource.c
+++ b/src/acpica/source/compiler/aslresource.c
@@ -990,6 +990,11 @@  RsDoOneResourceDescriptor (
         Rnode = RsDoUartSerialBusDescriptor (Info);
         break;
 
+    case PARSEOP_CSI2_SERIALBUS:
+
+        Rnode = RsDoCsi2SerialBusDescriptor (Info);
+        break;
+
     case PARSEOP_PINCONFIG:
 
         Rnode = RsDoPinConfigDescriptor (Info);
diff --git a/src/acpica/source/compiler/aslresources.y b/src/acpica/source/compiler/aslresources.y
index 00a0958b..86c8981f 100644
--- a/src/acpica/source/compiler/aslresources.y
+++ b/src/acpica/source/compiler/aslresources.y
@@ -190,7 +190,8 @@  ResourceMacroList
     ;
 
 ResourceMacroTerm
-    : DMATerm                       {}
+    : Csi2SerialBusTerm             {}
+    | DMATerm                       {}
     | DWordIOTerm                   {}
     | DWordMemoryTerm               {}
     | DWordSpaceTerm                {}
@@ -233,6 +234,23 @@  ResourceMacroTerm
     | WordSpaceTerm                 {}
     ;
 
+Csi2SerialBusTerm
+    : PARSEOP_CSI2_SERIALBUS
+        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafOp (PARSEOP_CSI2_SERIALBUS);}
+        OptionalSlaveMode_First     {UtCheckIntegerRange ($4, 0x00, 0x01);} /* 04: SlaveMode */
+        ',' ByteConstExpr           {UtCheckIntegerRange ($7, 0x00, 0x03);} /* 07: PhyType */
+        OptionalByteConstExpr       {UtCheckIntegerRange ($9, 0x00, 0xFC);} /* 09: LocalPortInstance */
+        ',' StringData              /* 12: ResourceSource */
+        ',' ByteConstExpr           /* 14: ResourceSourceIndex */
+        OptionalResourceType        /* 15; ResourceType (ResourceUsage) */
+        OptionalNameString          /* 16: DescriptorName */
+        OptionalBuffer_Last         /* 17: VendorData */
+        PARSEOP_CLOSE_PAREN         {$$ = TrLinkOpChildren ($<n>3,8,
+                                        $4,$7,$9,$12,$14,$15,$16,$17);}
+    | PARSEOP_CSI2_SERIALBUS
+        PARSEOP_OPEN_PAREN
+        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
+
 DMATerm
     : PARSEOP_DMA
         PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafOp (PARSEOP_DMA);}
diff --git a/src/acpica/source/compiler/aslrestype2s.c b/src/acpica/source/compiler/aslrestype2s.c
index 8539edea..607aca8b 100644
--- a/src/acpica/source/compiler/aslrestype2s.c
+++ b/src/acpica/source/compiler/aslrestype2s.c
@@ -1387,6 +1387,142 @@  RsDoUartSerialBusDescriptor (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    RsDoCsi2SerialBusDescriptor
+ *
+ * PARAMETERS:  Info                - Parse Op and resource template offset
+ *
+ * RETURN:      Completed resource node
+ *
+ * DESCRIPTION: Construct a long "Csi2SerialBus" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoCsi2SerialBusDescriptor (
+    ASL_RESOURCE_INFO       *Info)
+{
+    AML_RESOURCE            *Descriptor;
+    ACPI_PARSE_OBJECT       *InitializerOp;
+    ASL_RESOURCE_NODE       *Rnode;
+    char                    *ResourceSource = NULL;
+    UINT8                   *VendorData = NULL;
+    UINT16                  ResSourceLength;
+    UINT16                  VendorLength;
+    UINT16                  DescriptorSize;
+    UINT32                  CurrentByteOffset;
+    UINT32                  i;
+
+
+    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+    CurrentByteOffset = Info->CurrentByteOffset;
+
+    /*
+     * Calculate lengths for fields that have variable length:
+     * 1) Resource Source string
+     * 2) Vendor Data buffer
+     */
+    ResSourceLength = RsGetStringDataLength (InitializerOp);
+    VendorLength = RsGetBufferDataLength (InitializerOp);
+
+    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_CSI2_SERIALBUS) +
+        ResSourceLength + VendorLength;
+
+    /* Allocate the local resource node and initialize */
+
+    Rnode = RsAllocateResourceNode (DescriptorSize +
+        sizeof (AML_RESOURCE_LARGE_HEADER));
+
+    Descriptor = Rnode->Buffer;
+    Descriptor->Csi2SerialBus.ResourceLength = DescriptorSize;
+    Descriptor->Csi2SerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS;
+    Descriptor->Csi2SerialBus.RevisionId = AML_RESOURCE_CSI2_REVISION;
+    Descriptor->Csi2SerialBus.TypeRevisionId = AML_RESOURCE_CSI2_TYPE_REVISION;
+    Descriptor->Csi2SerialBus.Type = AML_RESOURCE_CSI2_SERIALBUSTYPE;
+    Descriptor->Csi2SerialBus.TypeDataLength = AML_RESOURCE_CSI2_MIN_DATA_LEN + VendorLength;
+
+    /* Build pointers to optional areas */
+
+    VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_CSI2_SERIALBUS));
+    ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength);
+
+    /* Process all child initialization nodes */
+
+    for (i = 0; InitializerOp; i++)
+    {
+        switch (i)
+        {
+        case 0: /* Slave Mode [Flag] (_SLV) */
+
+            RsSetFlagBits (&Descriptor->Csi2SerialBus.Flags, InitializerOp, 0, 0);
+            RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.Flags), 0);
+            break;
+
+        case 1: /* Phy Type [Flag] (_PHY) */
+
+            RsSetFlagBits16 ((UINT16 *) &Descriptor->Csi2SerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
+            RsCreateBitField (InitializerOp, ACPI_RESTAG_PHYTYPE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (Csi2SerialBus.TypeSpecificFlags), 0);
+            break;
+
+        case 2: /* Local Port Instance [Integer] (_PRT) */
+
+            RsSetFlagBits16 ((UINT16 *) &Descriptor->Csi2SerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
+            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_LOCALPORT,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (Csi2SerialBus.TypeSpecificFlags), 2, 6);
+            break;
+
+        case 3: /* ResSource [Optional Field - STRING] */
+
+            if (ResSourceLength)
+            {
+                /* Copy string to the descriptor */
+
+                strcpy (ResourceSource,
+                    InitializerOp->Asl.Value.String);
+            }
+            break;
+
+        case 4: /* Resource Index */
+
+            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+            {
+                Descriptor->Csi2SerialBus.ResSourceIndex =
+                    (UINT8) InitializerOp->Asl.Value.Integer;
+            }
+            break;
+
+        case 5: /* Resource Usage (consumer/producer) */
+
+            RsSetFlagBits (&Descriptor->Csi2SerialBus.Flags, InitializerOp, 1, 1);
+            break;
+
+        case 6: /* Resource Tag (Descriptor Name) */
+
+            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
+            break;
+
+        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
+
+            RsGetVendorData (InitializerOp, VendorData,
+                CurrentByteOffset + sizeof (AML_RESOURCE_CSI2_SERIALBUS));
+            break;
+
+        default:    /* Ignore any extra nodes */
+
+            break;
+        }
+
+        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+    }
+
+    MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource);
+    return (Rnode);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    RsDoPinFunctionDescriptor
diff --git a/src/acpica/source/compiler/asltokens.y b/src/acpica/source/compiler/asltokens.y
index 788f4b8c..5e205e01 100644
--- a/src/acpica/source/compiler/asltokens.y
+++ b/src/acpica/source/compiler/asltokens.y
@@ -283,6 +283,7 @@  NoEcho('
 %token <i> PARSEOP_FUNCTION
 %token <i> PARSEOP_GPIO_INT
 %token <i> PARSEOP_GPIO_IO
+%token <i> PARSEOP_CSI2_SERIALBUS
 %token <i> PARSEOP_I2C_SERIALBUS
 %token <i> PARSEOP_I2C_SERIALBUS_V2
 %token <i> PARSEOP_IF
diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
index dcab8b39..91655420 100644
--- a/src/acpica/source/compiler/asltransform.c
+++ b/src/acpica/source/compiler/asltransform.c
@@ -541,6 +541,11 @@  TrTransformSubtree (
         AslError (ASL_WARNING, ASL_MSG_LEGACY_PROCESSOR_OP, Op, Op->Asl.ExternalName);
         break;
 
+    case PARSEOP_OBJECTTYPE_DDB:
+
+        AslError (ASL_WARNING, ASL_MSG_LEGACY_DDB_TYPE, Op, Op->Asl.ExternalName);
+        break;
+
     default:
 
         /* Nothing to do here for other opcodes */
diff --git a/src/acpica/source/compiler/asltypes.y b/src/acpica/source/compiler/asltypes.y
index b68ca665..aaa732f4 100644
--- a/src/acpica/source/compiler/asltypes.y
+++ b/src/acpica/source/compiler/asltypes.y
@@ -410,6 +410,7 @@  NoEcho('
 /* Resource Descriptors */
 
 %type <n> ConnectionTerm
+%type <n> Csi2SerialBusTerm
 %type <n> DMATerm
 %type <n> DWordIOTerm
 %type <n> DWordMemoryTerm
@@ -501,6 +502,7 @@  NoEcho('
 %type <n> OptionalShareType
 %type <n> OptionalShareType_First
 %type <n> OptionalSlaveMode
+%type <n> OptionalSlaveMode_First
 %type <n> OptionalStopBits
 %type <n> OptionalStringData
 %type <n> OptionalSyncLevel
diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
index 7bc403eb..f2d00644 100644
--- a/src/acpica/source/compiler/dtcompiler.h
+++ b/src/acpica/source/compiler/dtcompiler.h
@@ -573,6 +573,10 @@  ACPI_STATUS
 DtCompileCpep (
     void                    **PFieldList);
 
+ACPI_STATUS
+DtCompileCedt (
+    void                    **PFieldList);
+
 ACPI_STATUS
 DtCompileCsrt (
     void                    **PFieldList);
@@ -657,6 +661,10 @@  ACPI_STATUS
 DtCompilePdtt (
     void                    **PFieldList);
 
+ACPI_STATUS
+DtCompilePhat (
+    void                    **PFieldList);
+
 ACPI_STATUS
 DtCompilePmtt (
     void                    **PFieldList);
@@ -705,6 +713,10 @@  ACPI_STATUS
 DtCompileUefi (
     void                    **PFieldList);
 
+ACPI_STATUS
+DtCompileViot (
+    void                    **PFieldList);
+
 ACPI_STATUS
 DtCompileWdat (
     void                    **PFieldList);
@@ -733,6 +745,7 @@  extern const unsigned char  TemplateAsf[];
 extern const unsigned char  TemplateBoot[];
 extern const unsigned char  TemplateBert[];
 extern const unsigned char  TemplateBgrt[];
+extern const unsigned char  TemplateCedt[];
 extern const unsigned char  TemplateCpep[];
 extern const unsigned char  TemplateCsrt[];
 extern const unsigned char  TemplateDbg2[];
@@ -760,6 +773,7 @@  extern const unsigned char  TemplateMsdm[];
 extern const unsigned char  TemplateNfit[];
 extern const unsigned char  TemplatePcct[];
 extern const unsigned char  TemplatePdtt[];
+extern const unsigned char  TemplatePhat[];
 extern const unsigned char  TemplatePmtt[];
 extern const unsigned char  TemplatePptt[];
 extern const unsigned char  TemplateRasf[];
@@ -777,6 +791,7 @@  extern const unsigned char  TemplateStao[];
 extern const unsigned char  TemplateTcpa[];
 extern const unsigned char  TemplateTpm2[];
 extern const unsigned char  TemplateUefi[];
+extern const unsigned char  TemplateViot[];
 extern const unsigned char  TemplateWaet[];
 extern const unsigned char  TemplateWdat[];
 extern const unsigned char  TemplateWddt[];
diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c
index 286ecaa7..458a7174 100644
--- a/src/acpica/source/compiler/dttable1.c
+++ b/src/acpica/source/compiler/dttable1.c
@@ -342,6 +342,80 @@  DtCompileAsf (
 }
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    DtCompileCedt
+ *
+ * PARAMETERS:  List                - Current field list pointer
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Compile CEDT.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompileCedt (
+    void                    **List)
+{
+    ACPI_STATUS             Status;
+    DT_SUBTABLE             *Subtable;
+    DT_SUBTABLE             *ParentTable;
+    DT_FIELD                **PFieldList = (DT_FIELD **) List;
+    ACPI_CEDT_HEADER        *CedtHeader;
+    DT_FIELD                *SubtableStart;
+
+
+    /* Walk the parse tree */
+
+    while (*PFieldList)
+    {
+        SubtableStart = *PFieldList;
+
+        /* CEDT Header */
+
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedtHdr,
+            &Subtable);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+        DtPushSubtable (Subtable);
+
+        CedtHeader = ACPI_CAST_PTR (ACPI_CEDT_HEADER, Subtable->Buffer);
+
+        switch (CedtHeader->Type)
+        {
+        case ACPI_CEDT_TYPE_CHBS:
+
+            break;
+
+        default:
+
+            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CEDT");
+            return (AE_ERROR);
+        }
+
+        /* CEDT Subtable */
+
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoCedt0, &Subtable);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+        DtPopSubtable ();
+    }
+
+    return (AE_OK);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    DtCompileCpep
@@ -1582,10 +1656,12 @@  DtCompileIort (
     DT_SUBTABLE             *ParentTable;
     DT_FIELD                **PFieldList = (DT_FIELD **) List;
     DT_FIELD                *SubtableStart;
+    ACPI_TABLE_HEADER       *Table;
     ACPI_TABLE_IORT         *Iort;
     ACPI_IORT_NODE          *IortNode;
     ACPI_IORT_ITS_GROUP     *IortItsGroup;
     ACPI_IORT_SMMU          *IortSmmu;
+    ACPI_IORT_RMR           *IortRmr;
     UINT32                  NodeNumber;
     UINT32                  NodeLength;
     UINT32                  IdMappingNumber;
@@ -1593,6 +1669,8 @@  DtCompileIort (
     UINT32                  ContextIrptNumber;
     UINT32                  PmuIrptNumber;
     UINT32                  PaddingLength;
+    UINT8                   Revision;
+    UINT32                  RmrCount;
 
 
     ParentTable = DtPeekSubtable ();
@@ -1605,6 +1683,17 @@  DtCompileIort (
     }
     DtInsertSubtable (ParentTable, Subtable);
 
+    Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
+    Revision = Table->Revision;
+
+    /* Both IORT Rev E and E.a have known issues and are not supported */
+
+    if (Revision == 1 || Revision == 2)
+    {
+        DtError (ASL_ERROR, ASL_MSG_UNSUPPORTED, NULL, "IORT table revision");
+        return (AE_ERROR);
+    }
+
     /*
      * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
      * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
@@ -1645,8 +1734,17 @@  DtCompileIort (
     while (*PFieldList)
     {
         SubtableStart = *PFieldList;
-        Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
-            &Subtable);
+        if (Revision == 0)
+        {
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
+                &Subtable);
+        }
+        else if (Revision >= 3)
+        {
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr3,
+                &Subtable);
+        }
+
         if (ACPI_FAILURE (Status))
         {
             return (Status);
@@ -1864,7 +1962,46 @@  DtCompileIort (
             NodeLength += Subtable->Length;
             break;
 
-        default:
+        case ACPI_IORT_NODE_RMR:
+
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6,
+                &Subtable);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
+            }
+
+            DtInsertSubtable (ParentTable, Subtable);
+            IortRmr = ACPI_CAST_PTR (ACPI_IORT_RMR, Subtable->Buffer);
+            NodeLength += Subtable->Length;
+
+            /* Compile RMR Descriptors */
+
+            RmrCount = 0;
+            IortRmr->RmrOffset = NodeLength;
+            while (*PFieldList)
+            {
+                Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort6a,
+                    &Subtable);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+
+                if (!Subtable)
+                {
+                    break;
+                }
+
+                DtInsertSubtable (ParentTable, Subtable);
+                NodeLength += sizeof (ACPI_IORT_RMR_DESC);
+                RmrCount++;
+            }
+
+            IortRmr->RmrCount = RmrCount;
+            break;
+
+	default:
 
             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
             return (AE_ERROR);
diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c
index 732635bf..f6efcf3d 100644
--- a/src/acpica/source/compiler/dttable2.c
+++ b/src/acpica/source/compiler/dttable2.c
@@ -366,6 +366,11 @@  DtCompileMadt (
             InfoTable = AcpiDmTableInfoMadt15;
             break;
 
+        case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
+
+            InfoTable = AcpiDmTableInfoMadt16;
+            break;
+
         default:
 
             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
@@ -858,6 +863,11 @@  DtCompilePcct (
             InfoTable = AcpiDmTableInfoPcct4;
             break;
 
+        case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
+
+            InfoTable = AcpiDmTableInfoPcct5;
+            break;
+
         default:
 
             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
@@ -939,6 +949,142 @@  DtCompilePdtt (
 }
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    DtCompilePhat
+ *
+ * PARAMETERS:  List                - Current field list pointer
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Compile Phat.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompilePhat (
+    void                    **List)
+{
+    ACPI_STATUS             Status = AE_OK;
+    DT_SUBTABLE             *Subtable;
+    DT_SUBTABLE             *ParentTable;
+    DT_FIELD                **PFieldList = (DT_FIELD **) List;
+    ACPI_PHAT_HEADER        *PhatHeader;
+    ACPI_DMTABLE_INFO       *Info;
+    ACPI_PHAT_VERSION_DATA  *VersionData;
+    UINT32                  RecordCount;
+
+
+    /* The table consist of subtables */
+
+    while (*PFieldList)
+    {
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+        DtPushSubtable (Subtable);
+
+        PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer);
+
+        switch (PhatHeader->Type)
+        {
+        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
+
+            Info = AcpiDmTableInfoPhat0;
+            PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA);
+            break;
+
+        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
+
+            Info = AcpiDmTableInfoPhat1;
+            PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA);
+            break;
+
+        default:
+
+            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
+            return (AE_ERROR);
+
+            break;
+        }
+
+        Status = DtCompileTable (PFieldList, Info, &Subtable);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+
+        switch (PhatHeader->Type)
+        {
+        case ACPI_PHAT_TYPE_FW_VERSION_DATA:
+
+            VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA,
+                (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER)));
+            RecordCount = VersionData->ElementCount;
+
+            while (RecordCount)
+            {
+                Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a,
+                    &Subtable);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+                ParentTable = DtPeekSubtable ();
+                DtInsertSubtable (ParentTable, Subtable);
+
+                RecordCount--;
+                PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT);
+            }
+            break;
+
+        case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
+
+            /* Compile device path */
+
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
+            }
+            ParentTable = DtPeekSubtable ();
+            DtInsertSubtable (ParentTable, Subtable);
+
+            PhatHeader->Length += (UINT16) Subtable->Length;
+
+            /* Compile vendor specific data */
+
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
+            }
+            ParentTable = DtPeekSubtable ();
+            DtInsertSubtable (ParentTable, Subtable);
+
+            PhatHeader->Length += (UINT16) Subtable->Length;
+
+            break;
+
+        default:
+
+            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT");
+            return (AE_ERROR);
+        }
+    }
+
+    return (Status);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    DtCompilePmtt
@@ -960,10 +1106,7 @@  DtCompilePmtt (
     DT_SUBTABLE             *ParentTable;
     DT_FIELD                **PFieldList = (DT_FIELD **) List;
     DT_FIELD                *SubtableStart;
-    ACPI_PMTT_HEADER        *PmttHeader;
-    ACPI_PMTT_CONTROLLER    *PmttController;
-    UINT16                  DomainCount;
-    UINT8                   PrevType = ACPI_PMTT_TYPE_SOCKET;
+    UINT16                  Type;
 
 
     /* Main table */
@@ -978,41 +1121,21 @@  DtCompilePmtt (
     DtInsertSubtable (ParentTable, Subtable);
     DtPushSubtable (Subtable);
 
+    /* Subtables */
+
     while (*PFieldList)
     {
         SubtableStart = *PFieldList;
-        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
-            &Subtable);
-        if (ACPI_FAILURE (Status))
-        {
-            return (Status);
-        }
-
-        PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
-        while (PrevType >= PmttHeader->Type)
-        {
-            DtPopSubtable ();
-
-            if (PrevType == ACPI_PMTT_TYPE_SOCKET)
-            {
-                break;
-            }
-
-            PrevType--;
-        }
+        DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
 
-        PrevType = PmttHeader->Type;
-
-        ParentTable = DtPeekSubtable ();
-        DtInsertSubtable (ParentTable, Subtable);
-        DtPushSubtable (Subtable);
-
-        switch (PmttHeader->Type)
+        switch (Type)
         {
         case ACPI_PMTT_TYPE_SOCKET:
 
             /* Subtable: Socket Structure */
 
+            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_SOCKET (0)\n");
+
             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
                 &Subtable);
             if (ACPI_FAILURE (Status))
@@ -1020,14 +1143,14 @@  DtCompilePmtt (
                 return (Status);
             }
 
-            ParentTable = DtPeekSubtable ();
-            DtInsertSubtable (ParentTable, Subtable);
             break;
 
         case ACPI_PMTT_TYPE_CONTROLLER:
 
             /* Subtable: Memory Controller Structure */
 
+            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_CONTROLLER (1)\n");
+
             Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
                 &Subtable);
             if (ACPI_FAILURE (Status))
@@ -1035,40 +1158,34 @@  DtCompilePmtt (
                 return (Status);
             }
 
-            ParentTable = DtPeekSubtable ();
-            DtInsertSubtable (ParentTable, Subtable);
+            break;
 
-            PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
-                (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
-            DomainCount = PmttController->DomainCount;
+        case ACPI_PMTT_TYPE_DIMM:
 
-            while (DomainCount)
-            {
-                Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
-                    &Subtable);
-                if (ACPI_FAILURE (Status))
-                {
-                    return (Status);
-                }
+            /* Subtable: Physical Component (DIMM) Structure */
 
-                DtInsertSubtable (ParentTable, Subtable);
-                DomainCount--;
+            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_DIMM (2)\n");
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
+                &Subtable);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
             }
+
             break;
 
-        case ACPI_PMTT_TYPE_DIMM:
+        case ACPI_PMTT_TYPE_VENDOR:
 
-            /* Subtable: Physical Component Structure */
+            /* Subtable: Vendor-specific Structure */
 
-            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
+            DbgPrint (ASL_DEBUG_OUTPUT, "Compile PMTT_TYPE_VENDOR(FF)\n");
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttVendor,
                 &Subtable);
             if (ACPI_FAILURE (Status))
             {
                 return (Status);
             }
 
-            ParentTable = DtPeekSubtable ();
-            DtInsertSubtable (ParentTable, Subtable);
             break;
 
         default:
@@ -1076,6 +1193,8 @@  DtCompilePmtt (
             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
             return (AE_ERROR);
         }
+
+        DtInsertSubtable (ParentTable, Subtable);
     }
 
     return (Status);
@@ -1106,6 +1225,7 @@  DtCompilePptt (
     ACPI_DMTABLE_INFO       *InfoTable;
     DT_FIELD                **PFieldList = (DT_FIELD **) List;
     DT_FIELD                *SubtableStart;
+    ACPI_TABLE_HEADER       *PpttAcpiHeader;
 
 
     ParentTable = DtPeekSubtable ();
@@ -1191,6 +1311,20 @@  DtCompilePptt (
             }
             break;
 
+        case ACPI_PPTT_TYPE_CACHE:
+
+            PpttAcpiHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
+                AslGbl_RootTable->Buffer);
+            if (PpttAcpiHeader->Revision < 3)
+            {
+                break;
+            }
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoPptt1a,
+                &Subtable);
+            DtInsertSubtable (ParentTable, Subtable);
+            PpttHeader->Length += (UINT8)(Subtable->Length);
+            break;
+
         default:
 
             break;
@@ -1336,16 +1470,20 @@  ACPI_STATUS
 DtCompileSdev (
     void                    **List)
 {
-    ACPI_STATUS             Status;
-    ACPI_SDEV_HEADER        *SdevHeader;
-    DT_SUBTABLE             *Subtable;
-    DT_SUBTABLE             *ParentTable;
-    ACPI_DMTABLE_INFO       *InfoTable;
-    DT_FIELD                **PFieldList = (DT_FIELD **) List;
-    DT_FIELD                *SubtableStart;
-    ACPI_SDEV_PCIE          *Pcie = NULL;
-    ACPI_SDEV_NAMESPACE     *Namesp = NULL;
-    UINT32                  EntryCount;
+    ACPI_STATUS                 Status;
+    ACPI_SDEV_HEADER            *SdevHeader;
+    ACPI_SDEV_HEADER            *SecureComponentHeader;
+    DT_SUBTABLE                 *Subtable;
+    DT_SUBTABLE                 *ParentTable;
+    ACPI_DMTABLE_INFO           *InfoTable;
+    ACPI_DMTABLE_INFO           *SecureComponentInfoTable = NULL;
+    DT_FIELD                    **PFieldList = (DT_FIELD **) List;
+    DT_FIELD                    *SubtableStart;
+    ACPI_SDEV_PCIE              *Pcie = NULL;
+    ACPI_SDEV_NAMESPACE         *Namesp = NULL;
+    UINT32                      EntryCount;
+    ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
+    UINT16                      ComponentLength = 0;
 
 
     /* Subtables */
@@ -1375,6 +1513,8 @@  DtCompileSdev (
 
             InfoTable = AcpiDmTableInfoSdev0;
             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
+            SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
+                ACPI_ADD_PTR (UINT8, Subtable->Buffer, sizeof(ACPI_SDEV_NAMESPACE)));
             break;
 
         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
@@ -1406,6 +1546,86 @@  DtCompileSdev (
         {
         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
 
+            /*
+             * Device Id Offset will be be calculated differently depending on
+             * the presence of secure access components.
+             */
+            Namesp->DeviceIdOffset = 0;
+            ComponentLength = 0;
+
+            /* If the secure access component exists, get the structures */
+
+            if (SdevHeader->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
+            {
+                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0b,
+                    &Subtable);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+                ParentTable = DtPeekSubtable ();
+                DtInsertSubtable (ParentTable, Subtable);
+
+                Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
+
+                /* Compile a secure access component header */
+
+                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevSecCompHdr,
+                    &Subtable);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+                ParentTable = DtPeekSubtable ();
+                DtInsertSubtable (ParentTable, Subtable);
+
+                /* Compile the secure access component */
+
+                SecureComponentHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
+                switch (SecureComponentHeader->Type)
+                {
+                case ACPI_SDEV_TYPE_ID_COMPONENT:
+
+                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
+                    Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_ID_COMPONENT);
+                    ComponentLength = sizeof (ACPI_SDEV_ID_COMPONENT);
+                    break;
+
+                case ACPI_SDEV_TYPE_MEM_COMPONENT:
+
+                    SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
+                    Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_MEM_COMPONENT);
+                    ComponentLength = sizeof (ACPI_SDEV_MEM_COMPONENT);
+                    break;
+
+                default:
+
+                    /* Any other secure component types are undefined */
+
+                    return (AE_ERROR);
+                }
+
+                Status = DtCompileTable (PFieldList, SecureComponentInfoTable,
+                    &Subtable);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+                ParentTable = DtPeekSubtable ();
+                DtInsertSubtable (ParentTable, Subtable);
+
+                SecureComponent->SecureComponentOffset =
+                    sizeof (ACPI_SDEV_NAMESPACE) + sizeof (ACPI_SDEV_SECURE_COMPONENT);
+                SecureComponent->SecureComponentLength = ComponentLength;
+
+
+                /*
+                 * Add the secure component to the subtable to be added for the
+                 * the namespace subtable's length
+                 */
+                ComponentLength += sizeof (ACPI_SDEV_SECURE_COMPONENT);
+            }
+
             /* Append DeviceId namespace string */
 
             Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
@@ -1423,7 +1643,8 @@  DtCompileSdev (
             ParentTable = DtPeekSubtable ();
             DtInsertSubtable (ParentTable, Subtable);
 
-            Namesp->DeviceIdOffset = sizeof (ACPI_SDEV_NAMESPACE);
+            Namesp->DeviceIdOffset += sizeof (ACPI_SDEV_NAMESPACE);
+
             Namesp->DeviceIdLength = (UINT16) Subtable->Length;
 
             /* Append Vendor data */
@@ -1453,7 +1674,7 @@  DtCompileSdev (
                     /* Final size of entire namespace structure */
 
                     SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
-                        Subtable->Length + Namesp->DeviceIdLength);
+                        Subtable->Length + Namesp->DeviceIdLength) + ComponentLength;
                 }
             }
 
@@ -2137,6 +2358,111 @@  DtCompileUefi (
 }
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    DtCompileViot
+ *
+ * PARAMETERS:  List                - Current field list pointer
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Compile VIOT.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompileViot (
+    void                    **List)
+{
+    ACPI_STATUS             Status;
+    DT_SUBTABLE             *Subtable;
+    DT_SUBTABLE             *ParentTable;
+    DT_FIELD                **PFieldList = (DT_FIELD **) List;
+    DT_FIELD                *SubtableStart;
+    ACPI_TABLE_VIOT         *Viot;
+    ACPI_VIOT_HEADER        *ViotHeader;
+    ACPI_DMTABLE_INFO       *InfoTable;
+    UINT16                  NodeCount;
+
+    ParentTable = DtPeekSubtable ();
+
+    Status = DtCompileTable (PFieldList, AcpiDmTableInfoViot, &Subtable);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+    DtInsertSubtable (ParentTable, Subtable);
+
+    /*
+     * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
+     * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
+     */
+    Viot = ACPI_SUB_PTR (ACPI_TABLE_VIOT, Subtable->Buffer,
+        sizeof (ACPI_TABLE_HEADER));
+
+    Viot->NodeOffset = sizeof (ACPI_TABLE_VIOT);
+
+    NodeCount = 0;
+    while (*PFieldList) {
+        SubtableStart = *PFieldList;
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoViotHeader,
+            &Subtable);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+        DtPushSubtable (Subtable);
+
+        ViotHeader = ACPI_CAST_PTR (ACPI_VIOT_HEADER, Subtable->Buffer);
+
+        switch (ViotHeader->Type)
+        {
+        case ACPI_VIOT_NODE_PCI_RANGE:
+
+            InfoTable = AcpiDmTableInfoViot1;
+            break;
+
+        case ACPI_VIOT_NODE_MMIO:
+
+            InfoTable = AcpiDmTableInfoViot2;
+            break;
+
+        case ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI:
+
+            InfoTable = AcpiDmTableInfoViot3;
+            break;
+
+        case ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO:
+
+            InfoTable = AcpiDmTableInfoViot4;
+            break;
+
+        default:
+
+            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "VIOT");
+            return (AE_ERROR);
+        }
+
+        Status = DtCompileTable (PFieldList, InfoTable, &Subtable);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+        DtPopSubtable ();
+        NodeCount++;
+    }
+
+    Viot->NodeCount = NodeCount;
+    return (AE_OK);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    DtCompileWdat
diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
index ddbcce8a..fbe68ec9 100644
--- a/src/acpica/source/compiler/dttemplate.h
+++ b/src/acpica/source/compiler/dttemplate.h
@@ -204,6 +204,27 @@  const unsigned char TemplateBoot[] =
     0x28,0x05,0x10,0x20,0x00,0x00,0x00,0x00   /* 00000020    "(.. ...." */
 };
 
+const unsigned char TemplateCedt[] =
+{
+    0x43,0x45,0x44,0x54,0x84,0x00,0x00,0x00,  /* 00000000    "CEDT...." */
+    0x01,0x8B,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" */
+    0x05,0x01,0x21,0x20,0x00,0x00,0x20,0x00,  /* 00000020    "..! .. ." */
+    0x33,0x33,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000028    "33......" */
+    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xD5,  /* 00000030    ".....!C." */
+    0x00,0x00,0x00,0x00,0x45,0x23,0x01,0x00,  /* 00000038    "....E#.." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,  /* 00000040    "...... ." */
+    0x44,0x44,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000048    "DD......" */
+    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xA5,  /* 00000050    ".....!C." */
+    0x00,0x00,0x00,0x00,0x45,0x23,0xB1,0x00,  /* 00000058    "....E#.." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,  /* 00000060    "...... ." */
+    0x55,0x55,0xCD,0xAB,0x01,0x00,0x00,0x00,  /* 00000068    "UU......" */
+    0x00,0x00,0x00,0x00,0x00,0x21,0x43,0xB5,  /* 00000070    ".....!C." */
+    0x00,0x00,0x00,0x00,0x45,0x23,0xB1,0x00,  /* 00000078    "....E#.." */
+    0x00,0x00,0x00,0x00                       /* 00000080    "...."     */
+};
+
 const unsigned char TemplateCpep[] =
 {
     0x43,0x50,0x45,0x50,0x34,0x00,0x00,0x00,  /* 00000000    "CPEP4..." */
@@ -697,39 +718,39 @@  const unsigned char TemplateHpet[] =
 
 const unsigned char TemplateIort[] =
 {
-    0x49,0x4F,0x52,0x54,0xF8,0x01,0x00,0x00,  /* 00000000    "IORT...." */
-    0x00,0x72,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".rINTEL " */
+    0x49,0x4F,0x52,0x54,0x3C,0x02,0x00,0x00,  /* 00000000    "IORT<..." */
+    0x03,0xF1,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" */
-    0x13,0x03,0x18,0x20,0x06,0x00,0x00,0x00,  /* 00000020    "... ...." */
+    0x05,0x01,0x21,0x20,0x07,0x00,0x00,0x00,  /* 00000020    "..! ...." */
     0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "4......." */
-    0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,  /* 00000030    "........" */
+    0x49,0x4F,0x52,0x54,0x00,0x18,0x00,0x01,  /* 00000030    "IORT...." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
     0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000040    "........" */
-    0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,  /* 00000048    "........" */
+    0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x04,  /* 00000048    "........" */
     0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000050    "........" */
     0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "l......." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
     0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,  /* 00000068    ".\_SB.PC" */
     0x49,0x30,0x2E,0x44,0x45,0x56,0x30,0x00,  /* 00000070    "I0.DEV0." */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A8    "........" */
+    0x49,0x4F,0x52,0x54,0x3C,0x02,0x00,0x00,  /* 00000078    "IORT<..." */
+    0x03,0xF2,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000080    "..INTEL " */
+    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000088    "Template" */
+    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000090    "....INTL" */
+    0x05,0x01,0x21,0x20,0x07,0x00,0x00,0x00,  /* 00000098    "..! ...." */
+    0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "4......." */
+    0x49,0x4F,0x52,0x54,0x00,0x18,0x00,0x01,  /* 000000A8    "IORT...." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000C0    "........" */
-    0x00,0x00,0x00,0x00,0x02,0x38,0x00,0x00,  /* 000000C8    ".....8.." */
+    0x00,0x00,0x00,0x00,0x02,0x38,0x00,0x03,  /* 000000C8    ".....8.." */
     0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000000D0    "........" */
     0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000D8    "$......." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E8    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F8    "........" */
-    0x00,0x00,0x00,0x00,0x03,0x60,0x00,0x01,  /* 00000100    ".....`.." */
+    0x00,0x00,0x00,0x00,0x03,0x60,0x00,0x03,  /* 00000100    ".....`.." */
     0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000108    "........" */
     0x4C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "L......." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
@@ -741,7 +762,7 @@  const unsigned char TemplateIort[] =
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
-    0x00,0x00,0x00,0x00,0x04,0x58,0x00,0x01,  /* 00000160    ".....X.." */
+    0x00,0x00,0x00,0x00,0x04,0x58,0x00,0x04,  /* 00000160    ".....X.." */
     0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000168    "........" */
     0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000170    "D......." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000178    "........" */
@@ -752,14 +773,23 @@  const unsigned char TemplateIort[] =
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001A0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001A8    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B0    "........" */
-    0x00,0x00,0x00,0x00,0x05,0x3C,0x00,0x01,  /* 000001B8    ".....<.." */
+    0x00,0x00,0x00,0x00,0x05,0x3C,0x00,0x02,  /* 000001B8    ".....<.." */
     0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000001C0    "........" */
     0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C8    "(......." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001D0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001D8    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001E0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001E8    "........" */
-    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00   /* 000001F0    "........" */
+    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 000001F0    "........" */
+    0x06,0x44,0x00,0x01,0x00,0x00,0x00,0x00,  /* 000001F8    ".D......" */
+    0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,  /* 00000200    "....0..." */
+    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000208    "........" */
+    0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000210    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000218    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000220    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000228    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000230    "........" */
+    0x01,0x00,0x00,0x00                       /* 00000238    "...."     */
 };
 
 const unsigned char TemplateIvrs[] =
@@ -817,11 +847,11 @@  const unsigned char TemplateLpit[] =
 
 const unsigned char TemplateMadt[] =
 {
-    0x41,0x50,0x49,0x43,0x5A,0x01,0x00,0x00,  /* 00000000    "APICZ..." */
-    0x05,0xEF,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
+    0x41,0x50,0x49,0x43,0x6A,0x01,0x00,0x00,  /* 00000000    "APICj..." */
+    0x05,0x9D,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
     0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
-    0x08,0x01,0x19,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "... ...." */
+    0x13,0x11,0x20,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "..  ...." */
     0x01,0x00,0x00,0x00,0x00,0x08,0x00,0x00,  /* 00000028    "........" */
     0x01,0x00,0x00,0x00,0x01,0x0C,0x01,0x00,  /* 00000030    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
@@ -860,7 +890,9 @@  const unsigned char TemplateMadt[] =
     0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x14,  /* 00000140    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
-    0x00,0x00                                 /* 00000158    ".."       */
+    0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000160    "........" */
+    0x00,0x00                                 /* 00000168    ".."       */
 };
 
 const unsigned char TemplateMcfg[] =
@@ -956,91 +988,92 @@  const unsigned char TemplateMsct[] =
 
 const unsigned char TemplateNfit[] =
 {
-    0x4E,0x46,0x49,0x54,0x80,0x01,0x00,0x00,  /* 00000000    "NFIT...." */
-    0x01,0x07,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
+    0x4E,0x46,0x49,0x54,0x88,0x01,0x00,0x00,  /* 00000000    "NFIT...." */
+    0x01,0x81,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
     0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
-    0x29,0x09,0x17,0x20,0x00,0x00,0x00,0x00,  /* 00000020    ").. ...." */
-    0x00,0x00,0x38,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "..8....." */
+    0x13,0x11,0x20,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "..  ...." */
+    0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "..@....." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
     0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47,  /* 00000038    "0....].G" */
     0xA6,0xB0,0x0A,0x2D,0xB9,0x40,0x82,0x49,  /* 00000040    "...-.@.I" */
     0x00,0x00,0x00,0x7C,0x03,0x00,0x00,0x00,  /* 00000048    "...|...." */
     0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
     0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
-    0x01,0x00,0x30,0x00,0x01,0x00,0x00,0x00,  /* 00000060    "..0....." */
-    0x04,0x00,0x00,0x00,0x01,0x00,0x01,0x00,  /* 00000068    "........" */
-    0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,  /* 00000070    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
-    0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
-    0x01,0x00,0x03,0x00,0x2A,0x00,0x00,0x00,  /* 00000088    "....*..." */
-    0x02,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000090    ".. ....." */
-    0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,  /* 00000098    "........" */
-    0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,  /* 000000A0    "........" */
-    0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,  /* 000000A8    "........" */
-    0x03,0x00,0x28,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "..(....." */
-    0xB4,0x13,0x5D,0x40,0x91,0x0B,0x29,0x93,  /* 000000B8    "..]@..)." */
-    0x67,0xE8,0x23,0x4C,0x00,0x00,0x00,0x88,  /* 000000C0    "g.#L...." */
-    0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,  /* 000000C8    ".."3DUfw" */
-    0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,  /* 000000D0    "........" */
-    0x04,0x00,0x50,0x00,0x01,0x00,0x86,0x80,  /* 000000D8    "..P....." */
-    0x17,0x20,0x01,0x00,0x86,0x80,0x17,0x20,  /* 000000E0    ". ..... " */
-    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E8    "........" */
-    0x89,0x00,0x54,0x76,0x01,0x03,0x00,0x01,  /* 000000F0    "..Tv...." */
-    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F8    ". ......" */
-    0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000100    "........" */
-    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000108    "........" */
-    0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
-    0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000120    "........" */
-    0x05,0x00,0x28,0x00,0x01,0x00,0x00,0x01,  /* 00000128    "..(....." */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000130    "........" */
-    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000138    ". ......" */
-    0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,  /* 00000140    "........" */
-    0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,  /* 00000148    "........" */
-    0x06,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000150    ".. ....." */
-    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
-    0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,  /* 00000160    "........" */
-    0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,  /* 00000168    "........" */
-    0x07,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000170    "........" */
-    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000178    "........" */
+    0x00,0xEF,0xCD,0xAB,0x78,0x56,0x34,0x12,  /* 00000060    "....xV4." */
+    0x01,0x00,0x30,0x00,0x01,0x00,0x00,0x00,  /* 00000068    "..0....." */
+    0x04,0x00,0x00,0x00,0x01,0x00,0x01,0x00,  /* 00000070    "........" */
+    0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
+    0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
+    0x01,0x00,0x03,0x00,0x2A,0x00,0x00,0x00,  /* 00000090    "....*..." */
+    0x02,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000098    ".. ....." */
+    0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,  /* 000000A0    "........" */
+    0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,  /* 000000A8    "........" */
+    0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,  /* 000000B0    "........" */
+    0x03,0x00,0x28,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "..(....." */
+    0xB4,0x13,0x5D,0x40,0x91,0x0B,0x29,0x93,  /* 000000C0    "..]@..)." */
+    0x67,0xE8,0x23,0x4C,0x00,0x00,0x00,0x88,  /* 000000C8    "g.#L...." */
+    0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,  /* 000000D0    ".."3DUfw" */
+    0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,  /* 000000D8    "........" */
+    0x04,0x00,0x50,0x00,0x01,0x00,0x86,0x80,  /* 000000E0    "..P....." */
+    0x17,0x20,0x01,0x00,0x86,0x80,0x17,0x20,  /* 000000E8    ". ..... " */
+    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F0    "........" */
+    0x89,0x00,0x54,0x76,0x01,0x03,0x00,0x01,  /* 000000F8    "..Tv...." */
+    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000100    ". ......" */
+    0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000108    "........" */
+    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
+    0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,  /* 00000118    "........" */
+    0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000120    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000128    "........" */
+    0x05,0x00,0x28,0x00,0x01,0x00,0x00,0x01,  /* 00000130    "..(....." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000138    "........" */
+    0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000140    ". ......" */
+    0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,  /* 00000148    "........" */
+    0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,  /* 00000150    "........" */
+    0x06,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000158    ".. ....." */
+    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000160    "........" */
+    0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,  /* 00000168    "........" */
+    0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,  /* 00000170    "........" */
+    0x07,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000178    "........" */
+    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000180    "........" */
 };
 
 const unsigned char TemplatePcct[] =
 {
-    0x50,0x43,0x43,0x54,0x4e,0x02,0x00,0x00,  /* 00000000    "PCCTN..." */
-    0x01,0x47,0x49,0x4e,0x54,0x45,0x4c,0x20,  /* 00000008    ".GINTEL " */
-    0x54,0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,  /* 00000010    "Template" */
-    0x01,0x00,0x00,0x00,0x49,0x4e,0x54,0x4c,  /* 00000018    "....INTL" */
-    0x03,0x03,0x17,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
+    0x50,0x43,0x43,0x54,0xAE,0x02,0x00,0x00,  /* 00000000    "PCCT...." */
+    0x01,0xE6,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
+    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
+    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
+    0x25,0x09,0x20,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "%.  ...." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
-    0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
+    0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,  /* 00000038    "........" */
     0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,  /* 00000040    """""""""" */
     0x01,0x32,0x00,0x03,0x33,0x33,0x33,0x33,  /* 00000048    ".2..3333" */
     0x33,0x33,0x33,0x33,0x44,0x44,0x44,0x44,  /* 00000050    "3333DDDD" */
     0x44,0x44,0x44,0x44,0x55,0x55,0x55,0x55,  /* 00000058    "DDDDUUUU" */
     0x55,0x55,0x55,0x55,0x66,0x66,0x66,0x66,  /* 00000060    "UUUUffff" */
-    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3e,  /* 00000068    "wwww...>" */
+    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3E,  /* 00000068    "wwww...>" */
     0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000070    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 00000080    ".......2" */
     0x00,0x03,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000088    "..DDDDDD" */
     0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000090    "DDDDDDDD" */
     0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 00000098    "DDUUUUUU" */
-    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000a0    "UUffffww" */
-    0x77,0x77,0x88,0x88,0x02,0x5a,0x01,0x00,  /* 000000a8    "ww...Z.." */
-    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000b0    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000b8    "........" */
-    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000c0    ".....2.." */
-    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000c8    "DDDDDDDD" */
-    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000d0    "DDDDDDDD" */
-    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000d8    "UUUUUUUU" */
-    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000e0    "ffffwwww" */
-    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000e8    "...2..33" */
-    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000f0    "333333DD" */
-    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000f8    "DDDDDDUU" */
-    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0xa4,  /* 00000100    "UUUUUU.." */
+    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000A0    "UUffffww" */
+    0x77,0x77,0x88,0x88,0x02,0x5A,0x01,0x00,  /* 000000A8    "ww...Z.." */
+    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "........" */
+    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000C0    ".....2.." */
+    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000C8    "DDDDDDDD" */
+    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000D0    "DDDDDDDD" */
+    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000D8    "UUUUUUUU" */
+    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000E0    "ffffwwww" */
+    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000E8    "...2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000F0    "333333DD" */
+    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000F8    "DDDDDDUU" */
+    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0xA4,  /* 00000100    "UUUUUU.." */
     0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000108    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
     0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000118    "...2..33" */
@@ -1060,18 +1093,18 @@  const unsigned char TemplatePcct[] =
     0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 00000188    "333333DD" */
     0x44,0x44,0x44,0x44,0x44,0x44,0x01,0x32,  /* 00000190    "DDDDDD.2" */
     0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000198    "..333333" */
-    0x33,0x33,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001a0    "33UUUUUU" */
-    0x55,0x55,0x04,0xa4,0x01,0x00,0x00,0x00,  /* 000001a8    "UU......" */
-    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001b0    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 000001b8    ".......2" */
-    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001c0    "..333333" */
-    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000001c8    "33DDDDDD" */
-    0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001d0    "DDUUUUUU" */
-    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000001d8    "UUffffww" */
-    0x77,0x77,0x88,0x88,0x88,0x88,0x01,0x32,  /* 000001e0    "ww.....2" */
-    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001e8    "..333333" */
-    0x33,0x33,0x99,0x99,0x99,0x99,0x99,0x99,  /* 000001f0    "33......" */
-    0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001f8    "........" */
+    0x33,0x33,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001A0    "33UUUUUU" */
+    0x55,0x55,0x04,0xA4,0x01,0x00,0x00,0x00,  /* 000001A8    "UU......" */
+    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B0    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 000001B8    ".......2" */
+    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001C0    "..333333" */
+    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000001C8    "33DDDDDD" */
+    0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001D0    "DDUUUUUU" */
+    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000001D8    "UUffffww" */
+    0x77,0x77,0x88,0x88,0x88,0x88,0x01,0x32,  /* 000001E0    "ww.....2" */
+    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001E8    "..333333" */
+    0x33,0x33,0x99,0x99,0x99,0x99,0x99,0x99,  /* 000001F0    "33......" */
+    0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001F8    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000200    "........" */
     0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000208    "...2..33" */
     0x33,0x33,0x33,0x33,0x33,0x33,0x22,0x22,  /* 00000210    "333333""" */
@@ -1081,7 +1114,19 @@  const unsigned char TemplatePcct[] =
     0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000230    "33DDDDDD" */
     0x44,0x44,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000238    "DD.2..33" */
     0x33,0x33,0x33,0x33,0x33,0x33,0x55,0x55,  /* 00000240    "333333UU" */
-    0x55,0x55,0x55,0x55,0x55,0x55             /* 00000248    "UUUUUU|   */
+    0x55,0x55,0x55,0x55,0x55,0x55,0x05,0x60,  /* 00000248    "UUUUUU.`" */
+    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000250    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000258    "........" */
+    0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000260    "...2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000268    "33333333" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000270    "33333333" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x01,0x32,  /* 00000278    "333333.2" */
+    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000280    "..333333" */
+    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000288    "33DDDDDD" */
+    0x44,0x44,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000290    "DD.2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x55,0x55,  /* 00000298    "333333UU" */
+    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0x00,  /* 000002A0    "UUUUUU.." */
+    0x00,0x00,0x05,0x00,0x00,0x00             /* 000002A8    "......"   */
 };
 
 const unsigned char TemplatePdtt[] =
@@ -1095,31 +1140,50 @@  const unsigned char TemplatePdtt[] =
     0xCC,0x01,0xDD,0x00                       /* 00000030    "...."     */
 };
 
+const unsigned char TemplatePhat [] =
+{
+    0x50,0x48,0x41,0x54,0x6F,0x00,0x00,0x00,  /* 00000000    "PHATo..." */
+    0x01,0xC7,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
+    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
+    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
+    0x05,0x01,0x21,0x20,0x00,0x00,0x28,0x00,  /* 00000020    "..! ..(." */
+    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "........" */
+    0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47,  /* 00000030    "0....].G" */
+    0xA6,0xB0,0x0A,0x2D,0xB9,0x40,0x82,0x49,  /* 00000038    "...-.@.I" */
+    0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,  /* 00000040    "........" */
+    0x0C,0x0B,0x0A,0x09,0x01,0x00,0x23,0x00,  /* 00000048    "......#." */
+    0x00,0x00,0x00,0x00,0x30,0x05,0xAF,0x91,  /* 00000050    "....0..." */
+    0x86,0x5D,0x0E,0x47,0xA6,0xB0,0x0A,0x2D,  /* 00000058    ".].G...-" */
+    0xB9,0x40,0x82,0x49,0x00,0x00,0x00,0x00,  /* 00000060    ".@.I...." */
+    0x61,0x73,0x64,0x66,0x00,0xFF,0x11        /* 00000068    "asdf..."  */
+};
+
 const unsigned char TemplatePmtt[] =
 {
-    0x50,0x4D,0x54,0x54,0xB4,0x00,0x00,0x00,  /* 00000000    "PMTT...." */
-    0x01,0x3A,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".:INTEL " */
+    0x50,0x4D,0x54,0x54,0xBB,0x00,0x00,0x00,  /* 00000000    "PMTT...." */
+    0x02,0x2E,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" */
-    0x26,0x08,0x11,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "&.. ...." */
-    0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,  /* 00000028    "........" */
-    0x00,0x00,0x00,0x00,0x01,0x00,0x54,0x00,  /* 00000030    "......T." */
-    0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000048    "........" */
-    0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
-    0x02,0x00,0x14,0x00,0x02,0x00,0x00,0x00,  /* 00000060    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
-    0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,  /* 00000070    "........" */
-    0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
-    0x01,0x00,0x20,0x00,0x01,0x00,0x00,0x00,  /* 00000088    ".. ....." */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "........" */
-    0x00,0x00,0x0C,0x00,0x01,0x00,0x00,0x00,  /* 000000A8    "........" */
-    0x00,0x00,0x00,0x00                       /* 000000B0    "...."     */
+    0x05,0x01,0x21,0x20,0x08,0x00,0x00,0x00,  /* 00000020    "..! ...." */
+    0x00,0x00,0x10,0x00,0x0D,0x00,0x00,0x00,  /* 00000028    "........" */
+    0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
+    0x01,0x00,0x10,0x00,0x04,0x00,0x00,0x00,  /* 00000038    "........" */
+    0x02,0x00,0x00,0x00,0x44,0x44,0x00,0x00,  /* 00000040    "....DD.." */
+    0x02,0x00,0x10,0x00,0x04,0x00,0x00,0x00,  /* 00000048    "........" */
+    0x01,0x00,0x00,0x00,0x78,0x56,0x34,0x12,  /* 00000050    "....xV4." */
+    0xFF,0x00,0x23,0x00,0x0D,0x00,0x00,0x00,  /* 00000058    "..#....." */
+    0x03,0x00,0x00,0x00,0x03,0x02,0x01,0x00,  /* 00000060    "........" */
+    0x08,0x04,0x07,0x06,0x08,0x09,0x0A,0x0B,  /* 00000068    "........" */
+    0x0C,0x0D,0x0E,0x0F,0x55,0x66,0x77,0x88,  /* 00000070    "....Ufw." */
+    0x11,0xAA,0xBB,0x00,0x00,0x10,0x00,0x0D,  /* 00000078    "........" */
+    0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,  /* 00000080    "........" */
+    0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,  /* 00000088    "........" */
+    0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
+    0x00,0x00,0x00,0x02,0x00,0x10,0x00,0x04,  /* 00000098    "........" */
+    0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x78,  /* 000000A0    ".......x" */
+    0x56,0x34,0x12,0x02,0x00,0x10,0x00,0x04,  /* 000000A8    "V4......" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,  /* 000000B0    ".......x" */
+    0x56,0x34,0x12                            /* 000000B8    "V4."      */
 };
 
 const unsigned char TemplatePptt[] =
@@ -1205,21 +1269,24 @@  const unsigned char TemplateSdei[] =
 
 const unsigned char TemplateSdev[] =
 {
-    0x53,0x44,0x45,0x56,0x72,0x00,0x00,0x00,  /* 00000000    "SDEVr..." */
-    0x01,0x2F,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "./INTEL " */
+    0x53,0x44,0x45,0x56,0x89,0x00,0x00,0x00,  /* 00000000    "SDEV...." */
+    0x01,0x6E,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".nINTEL " */
     0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
-    0x31,0x08,0x17,0x20,0x00,0x01,0x2A,0x00,  /* 00000020    "1.. ..*." */
-    0x0C,0x00,0x16,0x00,0x22,0x00,0x08,0x00,  /* 00000028    "...."..." */
-    0x5C,0x5C,0x5F,0x53,0x42,0x5F,0x2E,0x50,  /* 00000030    "\\_SB_.P" */
-    0x43,0x49,0x30,0x2E,0x55,0x53,0x42,0x31,  /* 00000038    "CI0.USB1" */
-    0x2E,0x53,0x55,0x42,0x31,0x00,0x00,0x11,  /* 00000040    ".SUB1..." */
-    0x22,0x33,0x44,0x55,0x66,0x77,0x01,0x01,  /* 00000048    ""3DUfw.." */
-    0x24,0x00,0x10,0x00,0x20,0x00,0x10,0x00,  /* 00000050    "$... ..." */
-    0x04,0x00,0x14,0x00,0x10,0x00,0x11,0x22,  /* 00000058    "......."" */
-    0x33,0x44,0xEE,0xDD,0xCC,0xBB,0xAA,0x55,  /* 00000060    "3D.....U" */
-    0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,  /* 00000068    "fw......" */
-    0xEE,0xFF                                 /* 00000070    ".."       */
+    0x05,0x01,0x21,0x20,0x00,0x03,0x41,0x00,  /* 00000020    "..! ..A." */
+    0x23,0x00,0x16,0x00,0x39,0x00,0x08,0x00,  /* 00000028    "#...9..." */
+    0x10,0x00,0x13,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
+    0x01,0x00,0x03,0x02,0x05,0x04,0x07,0x06,  /* 00000038    "........" */
+    0x09,0x08,0x0A,0x0B,0x0C,0x0D,0x0E,0x5C,  /* 00000040    ".......\" */
+    0x5C,0x5F,0x53,0x42,0x5F,0x2E,0x50,0x43,  /* 00000048    "\_SB_.PC" */
+    0x49,0x30,0x2E,0x55,0x53,0x42,0x31,0x2E,  /* 00000050    "I0.USB1." */
+    0x53,0x55,0x42,0x31,0x00,0x00,0x11,0x22,  /* 00000058    "SUB1..."" */
+    0x33,0x44,0x55,0x66,0x77,0x01,0x01,0x24,  /* 00000060    "3DUfw..$" */
+    0x00,0x10,0x00,0x20,0x00,0x10,0x00,0x04,  /* 00000068    "... ...." */
+    0x00,0x14,0x00,0x10,0x00,0x11,0x22,0x33,  /* 00000070    "......"3" */
+    0x44,0xEE,0xDD,0xCC,0xBB,0xAA,0x55,0x66,  /* 00000078    "D.....Uf" */
+    0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,  /* 00000080    "w......." */
+    0xFF                                      /* 00000088    "."        */
 };
 
 const unsigned char TemplateSlic[] =
@@ -1450,6 +1517,26 @@  const unsigned char TemplateUefi[] =
     0x0C,0x0D,0x0E,0x0F,0x00,0x00             /* 00000030    "......"   */
 };
 
+const unsigned char TemplateViot[] =
+{
+    0x56,0x49,0x4F,0x54,0x80,0x00,0x00,0x00,  /* 00000000    "VIOT...." */
+    0x00,0x52,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".RINTEL " */
+    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
+    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
+    0x05,0x01,0x21,0x20,0x04,0x00,0x30,0x00,  /* 00000020    "..! ..0." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
+    0x01,0x00,0x18,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,  /* 00000038    "........" */
+    0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "`......." */
+    0x02,0x00,0x18,0x00,0x00,0x00,0x01,0x00,  /* 00000048    "........" */
+    0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
+    0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "p......." */
+    0x03,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
+    0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000070    "........" */
+    0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x00   /* 00000078    "........" */
+};
+
 const unsigned char TemplateWaet[] =
 {
     0x57,0x41,0x45,0x54,0x28,0x00,0x00,0x00,  /* 00000000    "WAET(..." */
diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
index a508b51c..d69ad2fb 100644
--- a/src/acpica/source/compiler/dtutils.c
+++ b/src/acpica/source/compiler/dtutils.c
@@ -438,6 +438,7 @@  DtGetFieldType (
     case ACPI_DMT_BUF16:
     case ACPI_DMT_BUF128:
     case ACPI_DMT_PCI_PATH:
+    case ACPI_DMT_PMTT_VENDOR:
 
         Type = DT_FIELD_TYPE_BUFFER;
         break;
@@ -573,6 +574,7 @@  DtGetFieldLength (
     case ACPI_DMT_CHKSUM:
     case ACPI_DMT_SPACEID:
     case ACPI_DMT_ACCWIDTH:
+    case ACPI_DMT_CEDT:
     case ACPI_DMT_IVRS:
     case ACPI_DMT_GTDT:
     case ACPI_DMT_MADT:
@@ -589,6 +591,7 @@  DtGetFieldLength (
     case ACPI_DMT_ERSTACT:
     case ACPI_DMT_ERSTINST:
     case ACPI_DMT_DMAR_SCOPE:
+    case ACPI_DMT_VIOT:
 
         ByteLength = 1;
         break;
@@ -599,6 +602,7 @@  DtGetFieldLength (
     case ACPI_DMT_HMAT:
     case ACPI_DMT_NFIT:
     case ACPI_DMT_PCI_PATH:
+    case ACPI_DMT_PHAT:
 
         ByteLength = 2;
         break;
@@ -673,6 +677,7 @@  DtGetFieldLength (
 
     case ACPI_DMT_BUFFER:
     case ACPI_DMT_RAW_BUFFER:
+    case ACPI_DMT_PMTT_VENDOR:
 
         Value = DtGetFieldValue (Field);
         if (Value)
diff --git a/src/acpica/source/components/disassembler/dmresrcl2.c b/src/acpica/source/components/disassembler/dmresrcl2.c
index e98a15db..ae15e3d8 100644
--- a/src/acpica/source/components/disassembler/dmresrcl2.c
+++ b/src/acpica/source/components/disassembler/dmresrcl2.c
@@ -159,6 +159,13 @@ 
 
 /* Local prototypes */
 
+static void
+AcpiDmCsi2SerialBusDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level);
+
 static void
 AcpiDmI2cSerialBusDescriptor (
     ACPI_OP_WALK_INFO       *Info,
@@ -200,7 +207,8 @@  static ACPI_RESOURCE_HANDLER        SerialBusResourceDispatch [] =
     NULL,
     AcpiDmI2cSerialBusDescriptor,
     AcpiDmSpiSerialBusDescriptor,
-    AcpiDmUartSerialBusDescriptor
+    AcpiDmUartSerialBusDescriptor,
+    AcpiDmCsi2SerialBusDescriptor
 };
 
 
@@ -674,6 +682,15 @@  AcpiDmDumpSerialBusVendorData (
             sizeof (AML_RESOURCE_UART_SERIALBUS));
         break;
 
+    case AML_RESOURCE_CSI2_SERIALBUSTYPE:
+
+        VendorLength = Resource->CommonSerialBus.TypeDataLength -
+            AML_RESOURCE_CSI2_MIN_DATA_LEN;
+
+        VendorData = ACPI_ADD_PTR (UINT8, Resource,
+            sizeof (AML_RESOURCE_CSI2_SERIALBUS));
+        break;
+
     default:
 
         return;
@@ -685,6 +702,75 @@  AcpiDmDumpSerialBusVendorData (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmCsi2SerialBusDescriptor
+ *
+ * PARAMETERS:  Info                - Extra resource info
+ *              Resource            - Pointer to the resource descriptor
+ *              Length              - Length of the descriptor in bytes
+ *              Level               - Current source code indentation level
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Decode a CSI2 serial bus descriptor
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmCsi2SerialBusDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level)
+{
+    UINT32                  ResourceSourceOffset;
+    char                    *DeviceName;
+
+
+    /* SlaveMode, PhyType, LocalPortInstance */
+
+    AcpiDmIndent (Level);
+    AcpiOsPrintf ("Csi2Bus (%s,",
+        AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->Csi2SerialBus.Flags)]);
+
+    AcpiOsPrintf (" 0x%2.2X, 0x%2.2X,\n",
+        Resource->Csi2SerialBus.TypeSpecificFlags & 0x03,
+        Resource->Csi2SerialBus.TypeSpecificFlags & 0xFC);
+
+    /* ResourceSource is a required field */
+
+    ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
+        Resource->CommonSerialBus.TypeDataLength;
+
+    AcpiDmIndent (Level + 1);
+    DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
+    AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
+
+    /* ResourceSourceIndex, ResourceUsage */
+
+    AcpiOsPrintf (",\n");
+    AcpiDmIndent (Level + 1);
+    AcpiOsPrintf ("0x%2.2X, ", Resource->Csi2SerialBus.ResSourceIndex);
+
+    AcpiOsPrintf ("%s, ",
+        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->Csi2SerialBus.Flags, 1)]);
+
+    /* Insert a descriptor name */
+
+    AcpiDmDescriptorName ();
+
+    /* Dump the vendor data */
+
+    AcpiOsPrintf (",\n");
+    AcpiDmIndent (Level + 1);
+    AcpiDmDumpSerialBusVendorData (Resource, Level);
+    AcpiOsPrintf (")\n");
+
+    MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDmI2cSerialBusDescriptor
@@ -939,7 +1025,7 @@  AcpiDmUartSerialBusDescriptor (
  *
  * RETURN:      None
  *
- * DESCRIPTION: Decode a I2C/SPI/UART serial bus descriptor
+ * DESCRIPTION: Decode a I2C/SPI/UART/CSI2 serial bus descriptor
  *
  ******************************************************************************/
 
diff --git a/src/acpica/source/components/events/evhandler.c b/src/acpica/source/components/events/evhandler.c
index 9faccba3..39171014 100644
--- a/src/acpica/source/components/events/evhandler.c
+++ b/src/acpica/source/components/events/evhandler.c
@@ -677,6 +677,13 @@  AcpiEvInstallSpaceHandler (
 
     /* Init handler obj */
 
+    Status = AcpiOsCreateMutex (&HandlerObj->AddressSpace.ContextMutex);
+    if (ACPI_FAILURE (Status))
+    {
+        AcpiUtRemoveReference (HandlerObj);
+        goto UnlockAndExit;
+    }
+
     HandlerObj->AddressSpace.SpaceId = (UINT8) SpaceId;
     HandlerObj->AddressSpace.HandlerFlags = Flags;
     HandlerObj->AddressSpace.RegionList = NULL;
diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c
index 4f5bb7e0..2624cd65 100644
--- a/src/acpica/source/components/events/evregion.c
+++ b/src/acpica/source/components/events/evregion.c
@@ -270,6 +270,8 @@  AcpiEvAddressSpaceDispatch (
     ACPI_OPERAND_OBJECT     *RegionObj2;
     void                    *RegionContext = NULL;
     ACPI_CONNECTION_INFO    *Context;
+    ACPI_MUTEX              ContextMutex;
+    BOOLEAN                 ContextLocked;
     ACPI_PHYSICAL_ADDRESS   Address;
 
 
@@ -296,6 +298,8 @@  AcpiEvAddressSpaceDispatch (
     }
 
     Context = HandlerDesc->AddressSpace.Context;
+    ContextMutex = HandlerDesc->AddressSpace.ContextMutex;
+    ContextLocked = FALSE;
 
     /*
      * It may be the case that the region has never been initialized.
@@ -362,6 +366,23 @@  AcpiEvAddressSpaceDispatch (
     Handler = HandlerDesc->AddressSpace.Handler;
     Address = (RegionObj->Region.Address + RegionOffset);
 
+    ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+        "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
+        &RegionObj->Region.Handler->AddressSpace, Handler,
+        ACPI_FORMAT_UINT64 (Address),
+        AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+
+    if (!(HandlerDesc->AddressSpace.HandlerFlags &
+        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
+    {
+        /*
+         * For handlers other than the default (supplied) handlers, we must
+         * exit the interpreter because the handler *might* block -- we don't
+         * know what it will do, so we can't hold the lock on the interpreter.
+         */
+        AcpiExExitInterpreter();
+    }
+
     /*
      * Special handling for GenericSerialBus and GeneralPurposeIo:
      * There are three extra parameters that must be passed to the
@@ -370,50 +391,42 @@  AcpiEvAddressSpaceDispatch (
      *   2) Length of the above buffer
      *   3) Actual access length from the AccessAs() op
      *
+     * Since we pass these extra parameters via the context, which is
+     * shared between threads, we must lock the context to avoid these
+     * parameters being changed from another thread before the handler
+     * has completed running.
+     *
      * In addition, for GeneralPurposeIo, the Address and BitWidth fields
      * are defined as follows:
      *   1) Address is the pin number index of the field (bit offset from
      *      the previous Connection)
      *   2) BitWidth is the actual bit length of the field (number of pins)
      */
-    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS) &&
+    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS ||
+         RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO) &&
         Context &&
         FieldObj)
     {
-        /* Get the Connection (ResourceTemplate) buffer */
 
-        Context->Connection = FieldObj->Field.ResourceBuffer;
-        Context->Length = FieldObj->Field.ResourceLength;
-        Context->AccessLength = FieldObj->Field.AccessLength;
-    }
-    if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO) &&
-        Context &&
-        FieldObj)
-    {
+        Status = AcpiOsAcquireMutex (ContextMutex, ACPI_WAIT_FOREVER);
+        if (ACPI_FAILURE (Status))
+        {
+            goto ReEnterInterpreter;
+        }
+
+        ContextLocked = TRUE;
+
         /* Get the Connection (ResourceTemplate) buffer */
 
         Context->Connection = FieldObj->Field.ResourceBuffer;
         Context->Length = FieldObj->Field.ResourceLength;
         Context->AccessLength = FieldObj->Field.AccessLength;
-        Address = FieldObj->Field.PinNumberIndex;
-        BitWidth = FieldObj->Field.BitLength;
-    }
 
-    ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
-        "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
-        &RegionObj->Region.Handler->AddressSpace, Handler,
-        ACPI_FORMAT_UINT64 (Address),
-        AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
-
-    if (!(HandlerDesc->AddressSpace.HandlerFlags &
-        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
-    {
-        /*
-         * For handlers other than the default (supplied) handlers, we must
-         * exit the interpreter because the handler *might* block -- we don't
-         * know what it will do, so we can't hold the lock on the interpreter.
-         */
-        AcpiExExitInterpreter();
+        if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO)
+        {
+            Address = FieldObj->Field.PinNumberIndex;
+            BitWidth = FieldObj->Field.BitLength;
+        }
     }
 
     /* Call the handler */
@@ -421,6 +434,11 @@  AcpiEvAddressSpaceDispatch (
     Status = Handler (Function, Address, BitWidth, Value, Context,
         RegionObj2->Extra.RegionContext);
 
+    if (ContextLocked)
+    {
+        AcpiOsReleaseMutex (ContextMutex);
+    }
+
     if (ACPI_FAILURE (Status))
     {
         ACPI_EXCEPTION ((AE_INFO, Status, "Returned by Handler for [%s]",
@@ -438,6 +456,7 @@  AcpiEvAddressSpaceDispatch (
         }
     }
 
+ReEnterInterpreter:
     if (!(HandlerDesc->AddressSpace.HandlerFlags &
         ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
     {
diff --git a/src/acpica/source/components/events/evxfregn.c b/src/acpica/source/components/events/evxfregn.c
index 9113d8a2..3febc81c 100644
--- a/src/acpica/source/components/events/evxfregn.c
+++ b/src/acpica/source/components/events/evxfregn.c
@@ -362,6 +362,7 @@  AcpiRemoveAddressSpaceHandler (
 
             /* Now we can delete the handler object */
 
+            AcpiOsReleaseMutex (HandlerObj->AddressSpace.ContextMutex);
             AcpiUtRemoveReference (HandlerObj);
             goto UnlockAndExit;
         }
diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
index c332896f..4286223e 100644
--- a/src/acpica/source/components/namespace/nsaccess.c
+++ b/src/acpica/source/components/namespace/nsaccess.c
@@ -251,14 +251,13 @@  AcpiNsRootInitialize (
          * predefined names are at the root level. It is much easier to
          * just create and link the new node(s) here.
          */
-        NewNode = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_NAMESPACE_NODE));
+        NewNode = AcpiNsCreateNode (*ACPI_CAST_PTR (UINT32, InitVal->Name));
         if (!NewNode)
         {
             Status = AE_NO_MEMORY;
             goto UnlockAndExit;
         }
 
-        ACPI_COPY_NAMESEG (NewNode->Name.Ascii, InitVal->Name);
         NewNode->DescriptorType = ACPI_DESC_TYPE_NAMED;
         NewNode->Type = InitVal->Type;
 
diff --git a/src/acpica/source/components/namespace/nsrepair2.c b/src/acpica/source/components/namespace/nsrepair2.c
index 8ec425ee..d3dcd318 100644
--- a/src/acpica/source/components/namespace/nsrepair2.c
+++ b/src/acpica/source/components/namespace/nsrepair2.c
@@ -690,8 +690,9 @@  AcpiNsRepair_HID (
     ACPI_OPERAND_OBJECT     **ReturnObjectPtr)
 {
     ACPI_OPERAND_OBJECT     *ReturnObject = *ReturnObjectPtr;
-    char                    *Dest;
+    ACPI_OPERAND_OBJECT     *NewString;
     char                    *Source;
+    char                    *Dest;
 
 
     ACPI_FUNCTION_NAME (NsRepair_HID);
@@ -716,6 +717,14 @@  AcpiNsRepair_HID (
         return_ACPI_STATUS (AE_OK);
     }
 
+    /* It is simplest to always create a new string object */
+
+    NewString = AcpiUtCreateStringObject (ReturnObject->String.Length);
+    if (!NewString)
+    {
+        return_ACPI_STATUS (AE_NO_MEMORY);
+    }
+
     /*
      * Remove a leading asterisk if present. For some unknown reason, there
      * are many machines in the field that contains IDs like this.
@@ -726,7 +735,7 @@  AcpiNsRepair_HID (
     if (*Source == '*')
     {
         Source++;
-        ReturnObject->String.Length--;
+        NewString->String.Length--;
 
         ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
             "%s: Removed invalid leading asterisk\n", Info->FullPathname));
@@ -740,12 +749,13 @@  AcpiNsRepair_HID (
      * "NNNN####" where N is an uppercase letter or decimal digit, and
      * # is a hex digit.
      */
-    for (Dest = ReturnObject->String.Pointer; *Source; Dest++, Source++)
+    for (Dest = NewString->String.Pointer; *Source; Dest++, Source++)
     {
         *Dest = (char) toupper ((int) *Source);
     }
-    ReturnObject->String.Pointer[ReturnObject->String.Length] = 0;
 
+    AcpiUtRemoveReference (ReturnObject);
+    *ReturnObjectPtr = NewString;
     return_ACPI_STATUS (AE_OK);
 }
 
diff --git a/src/acpica/source/components/resources/rscalc.c b/src/acpica/source/components/resources/rscalc.c
index d435323f..2e878e80 100644
--- a/src/acpica/source/components/resources/rscalc.c
+++ b/src/acpica/source/components/resources/rscalc.c
@@ -816,9 +816,9 @@  AcpiRsGetListLength (
         *SizeNeeded += BufferSize;
 
         ACPI_DEBUG_PRINT ((ACPI_DB_RESOURCES,
-            "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
+            "Type %.2X, AmlLength %.2X InternalLength %.2X%8X\n",
             AcpiUtGetResourceType (AmlBuffer),
-            AcpiUtGetDescriptorLength (AmlBuffer), BufferSize));
+            AcpiUtGetDescriptorLength (AmlBuffer), ACPI_FORMAT_UINT64(*SizeNeeded)));
 
         /*
          * Point to the next resource within the AML stream using the length
diff --git a/src/acpica/source/components/resources/rsdump.c b/src/acpica/source/components/resources/rsdump.c
index 7f597f16..44b552ad 100644
--- a/src/acpica/source/components/resources/rsdump.c
+++ b/src/acpica/source/components/resources/rsdump.c
@@ -277,6 +277,11 @@  AcpiRsDumpResourceList (
                 ResourceList->Type);
             return;
         }
+        else if (!ResourceList->Type)
+        {
+            ACPI_ERROR ((AE_INFO, "Invalid Zero Resource Type"));
+            return;
+        }
 
         /* Sanity check the length. It must not be zero, or we loop forever */
 
@@ -460,6 +465,11 @@  AcpiRsDumpDescriptor (
             AcpiRsOutString (Name, Table->Pointer [*Target & 0x07]);
             break;
 
+        case ACPI_RSD_6BITFLAG:
+
+            AcpiRsOutInteger8 (Name, (ACPI_GET8 (Target) & 0x3F));
+            break;
+
         case ACPI_RSD_SHORTLIST:
             /*
              * Short byte list (single line output) for DMA and IRQ resources
diff --git a/src/acpica/source/components/resources/rsdumpinfo.c b/src/acpica/source/components/resources/rsdumpinfo.c
index f1688120..26f4993d 100644
--- a/src/acpica/source/components/resources/rsdumpinfo.c
+++ b/src/acpica/source/components/resources/rsdumpinfo.c
@@ -454,6 +454,21 @@  ACPI_RSDUMP_INFO        AcpiRsDumpCommonSerialBus[11] =
     ACPI_RS_DUMP_COMMON_SERIAL_BUS
 };
 
+ACPI_RSDUMP_INFO        AcpiRsDumpCsi2SerialBus[11] =
+{
+    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpCsi2SerialBus),      "Camera Serial Bus",        NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.RevisionId),         "RevisionId",               NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.Type),               "Type",                     AcpiGbl_SbtDecode},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.ProducerConsumer),   "ProducerConsumer",         AcpiGbl_ConsumeDecode},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.SlaveMode),          "SlaveMode",                AcpiGbl_SmDecode},
+    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.PhyType),            "PhyType",                  AcpiGbl_PhyDecode},
+    {ACPI_RSD_6BITFLAG, ACPI_RSD_OFFSET (Csi2SerialBus.LocalPortInstance),  "LocalPortInstance",        NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Csi2SerialBus.TypeRevisionId),     "TypeRevisionId",           NULL},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Csi2SerialBus.VendorLength),       "VendorLength",             NULL},
+    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (Csi2SerialBus.VendorData),        "VendorData",               NULL},
+    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Csi2SerialBus.ResourceSource),     "ResourceSource",           NULL},
+};
+
 ACPI_RSDUMP_INFO        AcpiRsDumpI2cSerialBus[14] =
 {
     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpI2cSerialBus),       "I2C Serial Bus",           NULL},
diff --git a/src/acpica/source/components/resources/rsinfo.c b/src/acpica/source/components/resources/rsinfo.c
index b3a7180a..9687bfb4 100644
--- a/src/acpica/source/components/resources/rsinfo.c
+++ b/src/acpica/source/components/resources/rsinfo.c
@@ -245,7 +245,7 @@  ACPI_RSCONVERT_INFO         *AcpiGbl_GetResourceDispatch[] =
     AcpiRsConvertPinGroupConfig,    /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
 };
 
-/* Subtype table for SerialBus -- I2C, SPI, and UART */
+/* Subtype table for SerialBus -- I2C, SPI, UART, and CSI2 */
 
 ACPI_RSCONVERT_INFO         *AcpiGbl_ConvertResourceSerialBusDispatch[] =
 {
@@ -253,6 +253,7 @@  ACPI_RSCONVERT_INFO         *AcpiGbl_ConvertResourceSerialBusDispatch[] =
     AcpiRsConvertI2cSerialBus,
     AcpiRsConvertSpiSerialBus,
     AcpiRsConvertUartSerialBus,
+    AcpiRsConvertCsi2SerialBus
 };
 
 
@@ -295,6 +296,7 @@  ACPI_RSDUMP_INFO            *AcpiGbl_DumpSerialBusDispatch[] =
     AcpiRsDumpI2cSerialBus,         /* AML_RESOURCE_I2C_BUS_TYPE */
     AcpiRsDumpSpiSerialBus,         /* AML_RESOURCE_SPI_BUS_TYPE */
     AcpiRsDumpUartSerialBus,        /* AML_RESOURCE_UART_BUS_TYPE */
+    AcpiRsDumpCsi2SerialBus,        /* AML_RESOURCE_CSI2_BUS_TYPE */
 };
 #endif
 
@@ -384,6 +386,7 @@  const UINT8                 AcpiGbl_AmlResourceSerialBusSizes[] =
     sizeof (AML_RESOURCE_I2C_SERIALBUS),
     sizeof (AML_RESOURCE_SPI_SERIALBUS),
     sizeof (AML_RESOURCE_UART_SERIALBUS),
+    sizeof (AML_RESOURCE_CSI2_SERIALBUS),
 };
 
 const UINT8                 AcpiGbl_ResourceStructSerialBusSizes[] =
@@ -392,4 +395,5 @@  const UINT8                 AcpiGbl_ResourceStructSerialBusSizes[] =
     ACPI_RS_SIZE (ACPI_RESOURCE_I2C_SERIALBUS),
     ACPI_RS_SIZE (ACPI_RESOURCE_SPI_SERIALBUS),
     ACPI_RS_SIZE (ACPI_RESOURCE_UART_SERIALBUS),
+    ACPI_RS_SIZE (ACPI_RESOURCE_CSI2_SERIALBUS),
 };
diff --git a/src/acpica/source/components/resources/rslist.c b/src/acpica/source/components/resources/rslist.c
index 4ee8aa63..1867c0a9 100644
--- a/src/acpica/source/components/resources/rslist.c
+++ b/src/acpica/source/components/resources/rslist.c
@@ -216,7 +216,7 @@  AcpiRsConvertAmlToResources (
         }
         else
         {
-            /* This is an I2C, SPI, or UART SerialBus descriptor */
+            /* This is an I2C, SPI, UART, or CSI2 SerialBus descriptor */
 
             ConversionTable = AcpiGbl_ConvertResourceSerialBusDispatch [
                 AmlResource->CommonSerialBus.Type];
@@ -246,6 +246,12 @@  AcpiRsConvertAmlToResources (
         return_ACPI_STATUS (Status);
     }
 
+    if (!Resource->Length)
+    {
+        ACPI_EXCEPTION ((AE_INFO, Status,
+            "Zero-length resource returned from RsConvertAmlToResource"));
+    }
+
     ACPI_DEBUG_PRINT ((ACPI_DB_RESOURCES,
         "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
         AcpiUtGetResourceType (Aml), Length,
@@ -326,7 +332,7 @@  AcpiRsConvertResourcesToAml (
             }
             else
             {
-                /* This is an I2C, SPI, or UART SerialBus descriptor */
+                /* This is an I2C, SPI, UART or CSI2 SerialBus descriptor */
 
                 ConversionTable = AcpiGbl_ConvertResourceSerialBusDispatch[
                     Resource->Data.CommonSerialBus.Type];
diff --git a/src/acpica/source/components/resources/rsmisc.c b/src/acpica/source/components/resources/rsmisc.c
index 31a7d9ee..f0f186b8 100644
--- a/src/acpica/source/components/resources/rsmisc.c
+++ b/src/acpica/source/components/resources/rsmisc.c
@@ -225,6 +225,8 @@  AcpiRsConvertAmlToResource (
     Count = INIT_TABLE_LENGTH (Info);
     while (Count)
     {
+        Target = NULL;
+
         /*
          * Source is the external AML byte stream buffer,
          * destination is the internal resource descriptor
@@ -275,6 +277,14 @@  AcpiRsConvertAmlToResource (
                 ((ACPI_GET8 (Source) >> Info->Value) & 0x07));
             break;
 
+        case ACPI_RSC_6BITFLAG:
+            /*
+             * Mask and shift the flag bits
+             */
+            ACPI_SET8 (Destination,
+                ((ACPI_GET8 (Source) >> Info->Value) & 0x3F));
+            break;
+
         case ACPI_RSC_COUNT:
 
             ItemCount = ACPI_GET8 (Source);
@@ -654,6 +664,14 @@  AcpiRsConvertResourceToAml (
                 ((ACPI_GET8 (Source) & 0x07) << Info->Value));
             break;
 
+        case ACPI_RSC_6BITFLAG:
+            /*
+             * Mask and shift the flag bits
+             */
+            ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
+                ((ACPI_GET8 (Source) & 0x3F) << Info->Value));
+            break;
+
         case ACPI_RSC_COUNT:
 
             ItemCount = ACPI_GET8 (Source);
diff --git a/src/acpica/source/components/resources/rsserial.c b/src/acpica/source/components/resources/rsserial.c
index 2df8eb77..d505ea94 100644
--- a/src/acpica/source/components/resources/rsserial.c
+++ b/src/acpica/source/components/resources/rsserial.c
@@ -327,6 +327,76 @@  ACPI_RSCONVERT_INFO     AcpiRsConvertPinFunction[13] =
 };
 
 
+/*******************************************************************************
+ *
+ * AcpiRsConvertCsi2SerialBus
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO     AcpiRsConvertCsi2SerialBus[14] =
+{
+    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_SERIAL_BUS,
+                        ACPI_RS_SIZE (ACPI_RESOURCE_CSI2_SERIALBUS),
+                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertCsi2SerialBus)},
+
+    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_SERIAL_BUS,
+                        sizeof (AML_RESOURCE_CSI2_SERIALBUS),
+                        0},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.CommonSerialBus.RevisionId),
+                        AML_OFFSET (CommonSerialBus.RevisionId),
+                        1},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.Type),
+                        AML_OFFSET (Csi2SerialBus.Type),
+                        1},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.ProducerConsumer),
+                        AML_OFFSET (Csi2SerialBus.Flags),
+                        1},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.SlaveMode),
+                        AML_OFFSET (Csi2SerialBus.Flags),
+                        0},
+
+    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.PhyType),
+                        AML_OFFSET (Csi2SerialBus.TypeSpecificFlags),
+                        0},
+
+    {ACPI_RSC_6BITFLAG, ACPI_RS_OFFSET (Data.Csi2SerialBus.LocalPortInstance),
+                        AML_OFFSET (Csi2SerialBus.TypeSpecificFlags),
+                        2},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.TypeRevisionId),
+                        AML_OFFSET (Csi2SerialBus.TypeRevisionId),
+                        1},
+
+    /* Vendor data */
+
+    {ACPI_RSC_COUNT_SERIAL_VEN, ACPI_RS_OFFSET (Data.Csi2SerialBus.VendorLength),
+                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
+                        AML_RESOURCE_CSI2_MIN_DATA_LEN},
+
+    {ACPI_RSC_MOVE_SERIAL_VEN,  ACPI_RS_OFFSET (Data.Csi2SerialBus.VendorData),
+                        0,
+                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
+
+    /* Resource Source */
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.Index),
+                        AML_OFFSET (Csi2SerialBus.ResSourceIndex),
+                        1},
+
+    {ACPI_RSC_COUNT_SERIAL_RES, ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.StringLength),
+                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
+                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
+
+    {ACPI_RSC_MOVE_SERIAL_RES,  ACPI_RS_OFFSET (Data.Csi2SerialBus.ResourceSource.StringPtr),
+                        AML_OFFSET (Csi2SerialBus.TypeDataLength),
+                        sizeof (AML_RESOURCE_CSI2_SERIALBUS)},
+};
+
+
 /*******************************************************************************
  *
  * AcpiRsConvertI2cSerialBus
diff --git a/src/acpica/source/components/utilities/utresdecode.c b/src/acpica/source/components/utilities/utresdecode.c
index e7c10afa..561240f0 100644
--- a/src/acpica/source/components/utilities/utresdecode.c
+++ b/src/acpica/source/components/utilities/utresdecode.c
@@ -240,6 +240,14 @@  const char                      *AcpiGbl_MtpDecode[] =
     "AddressRangeNVS"
 };
 
+const char                      *AcpiGbl_PhyDecode[] =
+{
+    "Type C",
+    "Type D",
+    "Unknown Type",
+    "Unknown Type"
+};
+
 const char                      *AcpiGbl_RngDecode[] =
 {
     "InvalidRanges",
@@ -331,7 +339,8 @@  const char                      *AcpiGbl_SbtDecode[] =
     "/* UNKNOWN serial bus type */",
     "I2C",
     "SPI",
-    "UART"
+    "UART",
+    "CSI2"
 };
 
 /* I2C serial bus access mode */
diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
index b7c4aace..70e5119e 100644
--- a/src/acpica/source/components/utilities/utresrc.c
+++ b/src/acpica/source/components/utilities/utresrc.c
@@ -212,6 +212,7 @@  const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
     ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS),
     ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS),
     ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS),
+    ACPI_AML_SIZE_LARGE (AML_RESOURCE_CSI2_SERIALBUS),
 };
 
 
diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
index 94c002da..f02f3239 100644
--- a/src/acpica/source/include/acdisasm.h
+++ b/src/acpica/source/include/acdisasm.h
@@ -251,6 +251,7 @@  typedef enum
     /* Types that are specific to particular ACPI tables */
 
     ACPI_DMT_ASF,
+    ACPI_DMT_CEDT,
     ACPI_DMT_DMAR,
     ACPI_DMT_DMAR_SCOPE,
     ACPI_DMT_EINJACT,
@@ -269,13 +270,16 @@  typedef enum
     ACPI_DMT_MADT,
     ACPI_DMT_NFIT,
     ACPI_DMT_PCCT,
+    ACPI_DMT_PHAT,
     ACPI_DMT_PMTT,
+    ACPI_DMT_PMTT_VENDOR,
     ACPI_DMT_PPTT,
     ACPI_DMT_SDEI,
     ACPI_DMT_SDEV,
     ACPI_DMT_SLIC,
     ACPI_DMT_SRAT,
     ACPI_DMT_TPM2,
+    ACPI_DMT_VIOT,
 
     /* Special opcodes */
 
@@ -364,6 +368,8 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoAsfHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBoot[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBert[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoBgrt[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCedtHdr[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCedt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCpep[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCpep0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoCsrt0[];
@@ -451,8 +457,11 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort3b[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort3c[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort4[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort5[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort6[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort6a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortAcc[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortHdr[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortHdr3[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortMap[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIortPad[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs[];
@@ -463,6 +472,8 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs4[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8b[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrs8c[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHid[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHid1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIvrsHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt0[];
@@ -481,6 +492,7 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt12[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt13[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt14[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt15[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadt16[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMadtHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMcfg[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoMcfg0[];
@@ -507,11 +519,17 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit7[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPdtt[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhatHdr[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat0[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat0a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPhat1b[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt1[];
-extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt1a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt2[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmttVendor[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmttHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcctHdr[];
@@ -520,10 +538,12 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct2[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct3[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct4[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct5[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPdtt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt2[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPpttHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRasf[];
@@ -539,6 +559,10 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0b[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompHdr[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompId[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevSecCompMem[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1b[];
@@ -565,6 +589,12 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm211[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm23[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm23a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoUefi[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViotHeader[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot1[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot2[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot3[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoViot4[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWaet[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWdat[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWdat0[];
@@ -640,6 +670,10 @@  void
 AcpiDmDumpAsf (
     ACPI_TABLE_HEADER       *Table);
 
+void
+AcpiDmDumpCedt (
+    ACPI_TABLE_HEADER       *Table);
+
 void
 AcpiDmDumpCpep (
     ACPI_TABLE_HEADER       *Table);
@@ -728,6 +762,10 @@  void
 AcpiDmDumpPdtt (
     ACPI_TABLE_HEADER       *Table);
 
+void
+AcpiDmDumpPhat (
+    ACPI_TABLE_HEADER       *Table);
+
 void
 AcpiDmDumpPmtt (
     ACPI_TABLE_HEADER       *Table);
@@ -776,6 +814,10 @@  void
 AcpiDmDumpTpm2 (
     ACPI_TABLE_HEADER       *Table);
 
+void
+AcpiDmDumpViot (
+    ACPI_TABLE_HEADER       *Table);
+
 void
 AcpiDmDumpWdat (
     ACPI_TABLE_HEADER       *Table);
diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
index f047efb8..e7d9f1c9 100644
--- a/src/acpica/source/include/acobject.h
+++ b/src/acpica/source/include/acobject.h
@@ -521,6 +521,7 @@  typedef struct acpi_object_addr_handler
     ACPI_ADR_SPACE_HANDLER          Handler;
     ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
     void                            *Context;
+    ACPI_MUTEX                      ContextMutex;
     ACPI_ADR_SPACE_SETUP            Setup;
     union acpi_operand_object       *RegionList;        /* Regions using this handler */
     union acpi_operand_object       *Next;
diff --git a/src/acpica/source/include/acoutput.h b/src/acpica/source/include/acoutput.h
index 1d6aacca..46774ad0 100644
--- a/src/acpica/source/include/acoutput.h
+++ b/src/acpica/source/include/acoutput.h
@@ -508,7 +508,7 @@ 
  *
  * A less-safe version of the macros is provided for optional use if the
  * compiler uses excessive CPU stack (for example, this may happen in the
- * debug case if code optimzation is disabled.)
+ * debug case if code optimization is disabled.)
  */
 
 /* Exit trace helper macro */
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index cb24eb4e..0733ac41 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                 0x20210105
+#define ACPI_CA_VERSION                 0x20210331
 
 #include "acconfig.h"
 #include "actypes.h"
diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h
index 22aece65..bc55155c 100644
--- a/src/acpica/source/include/acpredef.h
+++ b/src/acpica/source/include/acpredef.h
@@ -472,6 +472,17 @@  const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
     {{"_BMS",   METHOD_1ARGS (ACPI_TYPE_INTEGER),
                 METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
 
+    {{"_BPC",   METHOD_0ARGS,
+                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (4 Int) */
+                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 4,0,0,0),
+
+    {{"_BPS",   METHOD_0ARGS,
+                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (5 Int) */
+                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 5,0,0,0),
+
+    {{"_BPT",   METHOD_1ARGS (ACPI_TYPE_PACKAGE),
+                METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
+
     {{"_BQC",   METHOD_0ARGS,
                 METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
 
@@ -491,6 +502,10 @@  const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
     {{"_CBA",   METHOD_0ARGS,
                 METHOD_RETURNS (ACPI_RTYPE_INTEGER)}}, /* See PCI firmware spec 3.0 */
 
+    {{"_CBR",   METHOD_0ARGS,
+                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (3 Int) */
+                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 3,0,0,0),
+
     {{"_CCA",   METHOD_0ARGS,
                 METHOD_RETURNS (ACPI_RTYPE_INTEGER)}}, /* ACPI 5.1 */
 
diff --git a/src/acpica/source/include/acresrc.h b/src/acpica/source/include/acresrc.h
index 082918d7..816d4fa4 100644
--- a/src/acpica/source/include/acresrc.h
+++ b/src/acpica/source/include/acresrc.h
@@ -192,6 +192,7 @@  typedef enum
     ACPI_RSC_1BITFLAG,
     ACPI_RSC_2BITFLAG,
     ACPI_RSC_3BITFLAG,
+    ACPI_RSC_6BITFLAG,
     ACPI_RSC_ADDRESS,
     ACPI_RSC_BITMASK,
     ACPI_RSC_BITMASK16,
@@ -252,6 +253,7 @@  typedef enum
     ACPI_RSD_1BITFLAG,
     ACPI_RSD_2BITFLAG,
     ACPI_RSD_3BITFLAG,
+    ACPI_RSD_6BITFLAG,
     ACPI_RSD_ADDRESS,
     ACPI_RSD_DWORDLIST,
     ACPI_RSD_LITERAL,
@@ -495,6 +497,7 @@  extern ACPI_RSCONVERT_INFO      AcpiRsConvertAddress64[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertExtAddress64[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertGpio[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertFixedDma[];
+extern ACPI_RSCONVERT_INFO      AcpiRsConvertCsi2SerialBus[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertI2cSerialBus[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertSpiSerialBus[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertUartSerialBus[];
@@ -550,6 +553,7 @@  extern ACPI_RSDUMP_INFO         AcpiRsDumpGpio[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpPinFunction[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpFixedDma[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpCommonSerialBus[];
+extern ACPI_RSDUMP_INFO         AcpiRsDumpCsi2SerialBus[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpI2cSerialBus[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpSpiSerialBus[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpUartSerialBus[];
diff --git a/src/acpica/source/include/acrestyp.h b/src/acpica/source/include/acrestyp.h
index d2cd4c4d..3c258de9 100644
--- a/src/acpica/source/include/acrestyp.h
+++ b/src/acpica/source/include/acrestyp.h
@@ -593,7 +593,7 @@  typedef struct acpi_resource_gpio
 #define ACPI_IO_RESTRICT_NONE_PRESERVE          3
 
 
-/* Common structure for I2C, SPI, and UART serial descriptors */
+/* Common structure for I2C, SPI, UART, CSI2 serial descriptors */
 
 #define ACPI_RESOURCE_SERIAL_COMMON \
     UINT8                           RevisionId; \
@@ -618,6 +618,7 @@  typedef struct acpi_resource_common_serialbus
 #define ACPI_RESOURCE_SERIAL_TYPE_I2C           1
 #define ACPI_RESOURCE_SERIAL_TYPE_SPI           2
 #define ACPI_RESOURCE_SERIAL_TYPE_UART          3
+#define ACPI_RESOURCE_SERIAL_TYPE_CSI2          4
 
 /* Values for SlaveMode field above */
 
@@ -732,6 +733,14 @@  typedef struct acpi_resource_uart_serialbus
 #define ACPI_UART_CLEAR_TO_SEND                 (1<<6)
 #define ACPI_UART_REQUEST_TO_SEND               (1<<7)
 
+typedef struct acpi_resource_csi2_serialbus
+{
+    ACPI_RESOURCE_SERIAL_COMMON
+    UINT8                           LocalPortInstance;
+    UINT8                           PhyType;
+
+} ACPI_RESOURCE_CSI2_SERIALBUS;
+
 typedef struct acpi_resource_pin_function
 {
     UINT8                           RevisionId;
@@ -872,6 +881,7 @@  typedef union acpi_resource_data
     ACPI_RESOURCE_I2C_SERIALBUS             I2cSerialBus;
     ACPI_RESOURCE_SPI_SERIALBUS             SpiSerialBus;
     ACPI_RESOURCE_UART_SERIALBUS            UartSerialBus;
+    ACPI_RESOURCE_CSI2_SERIALBUS            Csi2SerialBus;
     ACPI_RESOURCE_COMMON_SERIALBUS          CommonSerialBus;
     ACPI_RESOURCE_PIN_FUNCTION              PinFunction;
     ACPI_RESOURCE_PIN_CONFIG                PinConfig;
diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h
index b10cc9ef..af10c774 100644
--- a/src/acpica/source/include/actbinfo.h
+++ b/src/acpica/source/include/actbinfo.h
@@ -196,6 +196,7 @@ 
 #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)
+#define ACPI_VIOT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_VIOT,f)
 #define ACPI_WAET_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WAET,f)
 #define ACPI_WDAT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDAT,f)
 #define ACPI_WDDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDDT,f)
@@ -213,6 +214,8 @@ 
 #define ACPI_ASF2a_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_ASF_CONTROL_DATA,f)
 #define ACPI_ASF3_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_ASF_RMCP,f)
 #define ACPI_ASF4_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_ASF_ADDRESS,f)
+#define ACPI_CEDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_CEDT_HEADER, f)
+#define ACPI_CEDT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CEDT_CHBS, f)
 #define ACPI_CPEP0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CPEP_POLLING,f)
 #define ACPI_CSRT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CSRT_GROUP,f)
 #define ACPI_CSRT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_CSRT_SHARED_INFO,f)
@@ -260,6 +263,8 @@ 
 #define ACPI_IORT3A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IORT_SMMU_GSI,f)
 #define ACPI_IORT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_SMMU_V3,f)
 #define ACPI_IORT5_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_PMCG,f)
+#define ACPI_IORT6_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_RMR,f)
+#define ACPI_IORT6A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IORT_RMR_DESC,f)
 #define ACPI_IORTA_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_MEMORY_ACCESS,f)
 #define ACPI_IORTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_NODE,f)
 #define ACPI_IORTM_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_ID_MAPPING,f)
@@ -271,6 +276,7 @@ 
 #define ACPI_IVRS8A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8A,f)
 #define ACPI_IVRS8B_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8B,f)
 #define ACPI_IVRS8C_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8C,f)
+#define ACPI_IVRSHID_OFFSET(f)          (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE_HID,f)
 #define ACPI_LPITH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_LPIT_HEADER,f)
 #define ACPI_LPIT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_LPIT_NATIVE,f)
 #define ACPI_MADT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MADT_LOCAL_APIC,f)
@@ -289,6 +295,7 @@ 
 #define ACPI_MADT13_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_MSI_FRAME,f)
 #define ACPI_MADT14_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_REDISTRIBUTOR,f)
 #define ACPI_MADT15_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_GENERIC_TRANSLATOR,f)
+#define ACPI_MADT16_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_MADT_MULTIPROC_WAKEUP,f)
 #define ACPI_MADTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
 #define ACPI_MCFG0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MCFG_ALLOCATION,f)
 #define ACPI_MPST0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_MPST_POWER_NODE,f)
@@ -311,21 +318,31 @@ 
 #define ACPI_PCCT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f)
 #define ACPI_PCCT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f)
 #define ACPI_PCCT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f)
+#define ACPI_PCCT5_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REG,f)
 #define ACPI_PDTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PDTT_CHANNEL,f)
+#define ACPI_PHATH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_HEADER,f)
+#define ACPI_PHAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_VERSION_DATA,f)
+#define ACPI_PHAT0A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PHAT_VERSION_ELEMENT,f)
+#define ACPI_PHAT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PHAT_HEALTH_DATA,f)
 #define ACPI_PMTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_SOCKET,f)
 #define ACPI_PMTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_CONTROLLER,f)
-#define ACPI_PMTT1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PMTT_DOMAIN,f)
 #define ACPI_PMTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_PHYSICAL_COMPONENT,f)
+#define ACPI_PMTT_VENDOR_OFFSET(f)      (UINT16) ACPI_OFFSET (ACPI_PMTT_VENDOR_SPECIFIC,f)
 #define ACPI_PMTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_HEADER,f)
 #define ACPI_PPTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
 #define ACPI_PPTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_PROCESSOR,f)
 #define ACPI_PPTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_CACHE,f)
+#define ACPI_PPTT1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PPTT_CACHE_V1,f)
 #define ACPI_PPTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_ID,f)
 #define ACPI_S3PTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_FPDT_HEADER,f)
 #define ACPI_S3PT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_RESUME,f)
 #define ACPI_S3PT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_SUSPEND,f)
 #define ACPI_SDEVH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_HEADER,f)
 #define ACPI_SDEV0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_NAMESPACE,f)
+#define ACPI_SDEV0B_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_SECURE_COMPONENT,f)
+#define ACPI_SDEVCH_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_HEADER,f)
+#define ACPI_SDEVC0_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_ID_COMPONENT, f)
+#define ACPI_SDEVC1_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_MEM_COMPONENT, f)
 #define ACPI_SDEV1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE,f)
 #define ACPI_SDEV1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE_PATH,f)
 #define ACPI_SLIC_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIC,f)
@@ -341,6 +358,11 @@ 
 #define ACPI_TPM2A_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f)
 #define ACPI_TPM211_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_TPM2_ARM_SMC,f)
 #define ACPI_TPM23A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_TPM23_TRAILER,f)
+#define ACPI_VIOTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_HEADER,f)
+#define ACPI_VIOT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_PCI_RANGE,f)
+#define ACPI_VIOT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_MMIO,f)
+#define ACPI_VIOT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_VIRTIO_IOMMU_PCI,f)
+#define ACPI_VIOT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VIOT_VIRTIO_IOMMU_MMIO,f)
 #define ACPI_WDAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_WDAT_ENTRY,f)
 
 /*
@@ -358,6 +380,7 @@ 
 #define ACPI_HPET_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_HPET,f,o)
 #define ACPI_PPTT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_PROCESSOR,f,o)
 #define ACPI_PPTT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_CACHE,f,o)
+#define ACPI_PPTT1A_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_PPTT_CACHE_V1,f,o)
 #define ACPI_SRAT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_CPU_AFFINITY,f,o)
 #define ACPI_SRAT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_MEM_AFFINITY,f,o)
 #define ACPI_SRAT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_X2APIC_CPU_AFFINITY,f,o)
@@ -372,6 +395,7 @@ 
 #define ACPI_IORT3_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU,f,o)
 #define ACPI_IORT3a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_GSI,f,o)
 #define ACPI_IORT4_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_V3,f,o)
+#define ACPI_IORT6_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_RMR,f,o)
 #define ACPI_IORTA_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_MEMORY_ACCESS,f,o)
 #define ACPI_IORTM_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_ID_MAPPING,f,o)
 #define ACPI_LPITH_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_LPIT_HEADER,f,o)
diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
index 5f54ecc0..437a122b 100644
--- a/src/acpica/source/include/actbl1.h
+++ b/src/acpica/source/include/actbl1.h
@@ -172,6 +172,7 @@ 
 #define ACPI_SIG_BERT           "BERT"      /* Boot Error Record Table */
 #define ACPI_SIG_BGRT           "BGRT"      /* Boot Graphics Resource Table */
 #define ACPI_SIG_BOOT           "BOOT"      /* Simple Boot Flag Table */
+#define ACPI_SIG_CEDT           "CEDT"      /* CXL Early Discovery Table */
 #define ACPI_SIG_CPEP           "CPEP"      /* Corrected Platform Error Polling table */
 #define ACPI_SIG_CSRT           "CSRT"      /* Core System Resource Table */
 #define ACPI_SIG_DBG2           "DBG2"      /* Debug Port table type 2 */
@@ -492,6 +493,58 @@  typedef struct acpi_table_boot
 } ACPI_TABLE_BOOT;
 
 
+/*******************************************************************************
+ *
+ * CEDT - CXL Early Discovery Table
+ *        Version 1
+ *
+ * Conforms to the "CXL Early Discovery Table" (CXL 2.0)
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_cedt
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+
+} ACPI_TABLE_CEDT;
+
+/* CEDT subtable header (Performance Record Structure) */
+
+typedef struct acpi_cedt_header
+{
+    UINT8                   Type;
+    UINT8                   Reserved;
+    UINT16                  Length;
+
+} ACPI_CEDT_HEADER;
+
+/* Values for Type field above */
+
+enum AcpiCedtType
+{
+    ACPI_CEDT_TYPE_CHBS                 = 0,
+    ACPI_CEDT_TYPE_RESERVED             = 1
+};
+
+
+/*
+ * CEDT subtables
+ */
+
+/* 0: CXL Host Bridge Structure */
+
+typedef struct acpi_cedt_chbs
+{
+    ACPI_CEDT_HEADER        Header;
+    UINT32                  Uid;
+    UINT32                  CxlVersion;
+    UINT32                  Reserved;
+    UINT64                  Base;
+    UINT64                  Length;
+
+} ACPI_CEDT_CHBS;
+
+
 /*******************************************************************************
  *
  * CPEP - Corrected Platform Error Polling table (ACPI 4.0)
@@ -1829,7 +1882,8 @@  typedef struct acpi_hmat_locality
     ACPI_HMAT_STRUCTURE     Header;
     UINT8                   Flags;
     UINT8                   DataType;
-    UINT16                  Reserved1;
+    UINT8                   MinTransferSize;
+    UINT8                   Reserved1;
     UINT32                  NumberOfInitiatorPDs;
     UINT32                  NumberOfTargetPDs;
     UINT32                  Reserved2;
@@ -1839,14 +1893,17 @@  typedef struct acpi_hmat_locality
 
 /* Masks for Flags field above */
 
-#define ACPI_HMAT_MEMORY_HIERARCHY  (0x0F)
+#define ACPI_HMAT_MEMORY_HIERARCHY  (0x0F)      /* Bits 0-3 */
 
-/* Values for Memory Hierarchy flag */
+/* Values for Memory Hierarchy flags */
 
 #define ACPI_HMAT_MEMORY            0
 #define ACPI_HMAT_1ST_LEVEL_CACHE   1
 #define ACPI_HMAT_2ND_LEVEL_CACHE   2
 #define ACPI_HMAT_3RD_LEVEL_CACHE   3
+#define ACPI_HMAT_MINIMUM_XFER_SIZE 0x10        /* Bit 4: ACPI 6.4 */
+#define ACPI_HMAT_NON_SEQUENTIAL_XFERS 0x20     /* Bit 5: ACPI 6.4 */
+
 
 /* Values for DataType field above */
 
diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
index 82096fe9..71c39e86 100644
--- a/src/acpica/source/include/actbl2.h
+++ b/src/acpica/source/include/actbl2.h
@@ -180,6 +180,7 @@ 
 #define ACPI_SIG_NFIT           "NFIT"      /* NVDIMM Firmware Interface Table */
 #define ACPI_SIG_PCCT           "PCCT"      /* Platform Communications Channel Table */
 #define ACPI_SIG_PDTT           "PDTT"      /* Platform Debug Trigger Table */
+#define ACPI_SIG_PHAT           "PHAT"      /* Platform Health Assessment Table */
 #define ACPI_SIG_PMTT           "PMTT"      /* Platform Memory Topology Table */
 #define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
 #define ACPI_SIG_RASF           "RASF"      /* RAS Feature table */
@@ -213,7 +214,7 @@ 
  * IORT - IO Remapping Table
  *
  * Conforms to "IO Remapping Table System Software on ARM Platforms",
- * Document number: ARM DEN 0049D, March 2018
+ * Document number: ARM DEN 0049E.b, Feb 2021
  *
  ******************************************************************************/
 
@@ -235,7 +236,7 @@  typedef struct acpi_iort_node
     UINT8                   Type;
     UINT16                  Length;
     UINT8                   Revision;
-    UINT32                  Reserved;
+    UINT32                  Identifier;
     UINT32                  MappingCount;
     UINT32                  MappingOffset;
     char                    NodeData[1];
@@ -251,7 +252,8 @@  enum AcpiIortNodeType
     ACPI_IORT_NODE_PCI_ROOT_COMPLEX     = 0x02,
     ACPI_IORT_NODE_SMMU                 = 0x03,
     ACPI_IORT_NODE_SMMU_V3              = 0x04,
-    ACPI_IORT_NODE_PMCG                 = 0x05
+    ACPI_IORT_NODE_PMCG                 = 0x05,
+    ACPI_IORT_NODE_RMR                  = 0x06,
 };
 
 
@@ -332,10 +334,11 @@  typedef struct acpi_iort_root_complex
 
 } ACPI_IORT_ROOT_COMPLEX;
 
-/* Values for AtsAttribute field above */
+/* Masks for AtsAttribute field above */
 
-#define ACPI_IORT_ATS_SUPPORTED         0x00000001  /* The root complex supports ATS */
-#define ACPI_IORT_ATS_UNSUPPORTED       0x00000000  /* The root complex doesn't support ATS */
+#define ACPI_IORT_ATS_SUPPORTED         (1)     /* The root complex ATS support */
+#define ACPI_IORT_PRI_SUPPORTED         (1<<1)  /* The root complex PRI support */
+#define ACPI_IORT_PASID_FWD_SUPPORTED   (1<<2)  /* The root complex PASID forward support */
 
 
 typedef struct acpi_iort_smmu
@@ -416,6 +419,19 @@  typedef struct acpi_iort_pmcg
 
 } ACPI_IORT_PMCG;
 
+typedef struct acpi_iort_rmr {
+    UINT32 Flags;
+    UINT32 RmrCount;
+    UINT32 RmrOffset;
+
+} ACPI_IORT_RMR;
+
+typedef struct acpi_iort_rmr_desc {
+    UINT64 BaseAddress;
+    UINT64 Length;
+    UINT32 Reserved;
+
+} ACPI_IORT_RMR_DESC;
 
 /*******************************************************************************
  *
@@ -459,6 +475,7 @@  enum AcpiIvrsType
 {
     ACPI_IVRS_TYPE_HARDWARE1        = 0x10,
     ACPI_IVRS_TYPE_HARDWARE2        = 0x11,
+    ACPI_IVRS_TYPE_HARDWARE3        = 0x40,
     ACPI_IVRS_TYPE_MEMORY1          = 0x20,
     ACPI_IVRS_TYPE_MEMORY2          = 0x21,
     ACPI_IVRS_TYPE_MEMORY3          = 0x22
@@ -555,7 +572,11 @@  enum AcpiIvrsDeviceEntryType
     ACPI_IVRS_TYPE_ALIAS_START      = 67, /* Uses ACPI_IVRS_DEVICE8A */
     ACPI_IVRS_TYPE_EXT_SELECT       = 70, /* Uses ACPI_IVRS_DEVICE8B */
     ACPI_IVRS_TYPE_EXT_START        = 71, /* Uses ACPI_IVRS_DEVICE8B */
-    ACPI_IVRS_TYPE_SPECIAL          = 72  /* Uses ACPI_IVRS_DEVICE8C */
+    ACPI_IVRS_TYPE_SPECIAL          = 72, /* Uses ACPI_IVRS_DEVICE8C */
+
+    /* Variable-length device entries */
+
+    ACPI_IVRS_TYPE_HID              = 240 /* Uses ACPI_IVRS_DEVICE_HID */
 };
 
 /* Values for Data field above */
@@ -616,6 +637,18 @@  typedef struct acpi_ivrs_device8c
 #define ACPI_IVHD_IOAPIC            1
 #define ACPI_IVHD_HPET              2
 
+/* Type 240: variable-length device entry */
+
+typedef struct acpi_ivrs_device_hid
+{
+    ACPI_IVRS_DE_HEADER     Header;
+    UINT64                  AcpiHid;
+    UINT64                  AcpiCid;
+    UINT8                   UidType;
+    UINT8                   UidLength;
+
+} ACPI_IVRS_DEVICE_HID;
+
 
 /* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition Block (IVMD) */
 
@@ -733,7 +766,8 @@  enum AcpiMadtType
     ACPI_MADT_TYPE_GENERIC_MSI_FRAME        = 13,
     ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR    = 14,
     ACPI_MADT_TYPE_GENERIC_TRANSLATOR       = 15,
-    ACPI_MADT_TYPE_RESERVED                 = 16    /* 16 and greater are reserved */
+    ACPI_MADT_TYPE_MULTIPROC_WAKEUP         = 16,
+    ACPI_MADT_TYPE_RESERVED                 = 17    /* 17 and greater are reserved */
 };
 
 
@@ -989,6 +1023,17 @@  typedef struct acpi_madt_generic_translator
 
 } ACPI_MADT_GENERIC_TRANSLATOR;
 
+/* 16: Multiprocessor wakeup (ACPI 6.4) */
+
+typedef struct acpi_madt_multiproc_wakeup
+{
+    ACPI_SUBTABLE_HEADER    Header;
+    UINT16                  MailboxVersion;
+    UINT32                  Reserved;           /* reserved - must be zero */
+    UINT64                  BaseAddress;
+
+} ACPI_MADT_MULTIPROC_WAKEUP;
+
 
 /*
  * Common flags fields for MADT subtables
@@ -1299,6 +1344,7 @@  typedef struct acpi_nfit_system_address
     UINT64                  Address;
     UINT64                  Length;
     UINT64                  MemoryMapping;
+    UINT64                  LocationCookie;     /* ACPI 6.4 */
 
 } ACPI_NFIT_SYSTEM_ADDRESS;
 
@@ -1306,6 +1352,7 @@  typedef struct acpi_nfit_system_address
 
 #define ACPI_NFIT_ADD_ONLINE_ONLY       (1)     /* 00: Add/Online Operation Only */
 #define ACPI_NFIT_PROXIMITY_VALID       (1<<1)  /* 01: Proximity Domain Valid */
+#define ACPI_NFIT_LOCATION_COOKIE_VALID (1<<2)  /* 02: SPA location cookie valid (ACPI 6.4) */
 
 /* Range Type GUIDs appear in the include/acuuid.h file */
 
@@ -1529,7 +1576,8 @@  enum AcpiPcctType
     ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2    = 2,    /* ACPI 6.1 */
     ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE      = 3,    /* ACPI 6.2 */
     ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE       = 4,    /* ACPI 6.2 */
-    ACPI_PCCT_TYPE_RESERVED                     = 5     /* 5 and greater are reserved */
+    ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE         = 5,    /* ACPI 6.4 */
+    ACPI_PCCT_TYPE_RESERVED                     = 6     /* 6 and greater are reserved */
 };
 
 /*
@@ -1658,6 +1706,26 @@  typedef struct acpi_pcct_ext_pcc_slave
 
 } ACPI_PCCT_EXT_PCC_SLAVE;
 
+/* 5: HW Registers based Communications Subspace */
+
+typedef struct acpi_pcct_hw_reg
+{
+    ACPI_SUBTABLE_HEADER    Header;
+    UINT16                  Version;
+    UINT64                  BaseAddress;
+    UINT64                  Length;
+    ACPI_GENERIC_ADDRESS    DoorbellRegister;
+    UINT64                  DoorbellPreserve;
+    UINT64                  DoorbellWrite;
+    ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
+    UINT64                  CmdCompleteMask;
+    ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
+    UINT64                  ErrorStatusMask;
+    UINT32                  NominalLatency;
+    UINT32                  MinTurnaroundTime;
+
+} ACPI_PCCT_HW_REG;
+
 
 /* Values for doorbell flags above */
 
@@ -1728,6 +1796,79 @@  typedef struct acpi_pdtt_channel
 #define ACPI_PDTT_TRIGGER_ORDER             (1<<2)
 
 
+/*******************************************************************************
+ *
+ * PHAT - Platform Health Assessment Table (ACPI 6.4)
+ *        Version 1
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_phat
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+
+} ACPI_TABLE_PHAT;
+
+/* Common header for PHAT subtables that follow main table */
+
+typedef struct acpi_phat_header
+{
+    UINT16                  Type;
+    UINT16                  Length;
+    UINT8                   Revision;
+
+} ACPI_PHAT_HEADER;
+
+
+/* Values for Type field above */
+
+#define ACPI_PHAT_TYPE_FW_VERSION_DATA  0
+#define ACPI_PHAT_TYPE_FW_HEALTH_DATA   1
+#define ACPI_PHAT_TYPE_RESERVED         2 /* 0x02-0xFFFF are reserved */
+
+/*
+ * PHAT subtables, correspond to Type in ACPI_PHAT_HEADER
+ */
+
+/* 0: Firmware Version Data Record */
+
+typedef struct acpi_phat_version_data
+{
+    ACPI_PHAT_HEADER        Header;
+    UINT8                   Reserved[3];
+    UINT32                  ElementCount;
+
+} ACPI_PHAT_VERSION_DATA;
+
+typedef struct acpi_phat_version_element
+{
+    UINT8                   Guid[16];
+    UINT64                  VersionValue;
+    UINT32                  ProducerId;
+
+} ACPI_PHAT_VERSION_ELEMENT;
+
+
+/* 1: Firmware Health Data Record */
+
+typedef struct acpi_phat_health_data
+{
+    ACPI_PHAT_HEADER        Header;
+    UINT8                   Reserved[2];
+    UINT8                   Health;
+    UINT8                   DeviceGuid[16];
+    UINT32                  DeviceSpecificOffset; /* Zero if no Device-specific data */
+
+} ACPI_PHAT_HEALTH_DATA;
+
+/* Values for Health field above */
+
+#define ACPI_PHAT_ERRORS_FOUND          0
+#define ACPI_PHAT_NO_ERRORS             1
+#define ACPI_PHAT_UNKNOWN_ERRORS        2
+#define ACPI_PHAT_ADVISORY              3
+
+
 /*******************************************************************************
  *
  * PMTT - Platform Memory Topology Table (ACPI 5.0)
@@ -1738,7 +1879,11 @@  typedef struct acpi_pdtt_channel
 typedef struct acpi_table_pmtt
 {
     ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
-    UINT32                  Reserved;
+    UINT32                  MemoryDeviceCount;
+    /*
+     * Immediately followed by:
+     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
+     */
 
 } ACPI_TABLE_PMTT;
 
@@ -1752,6 +1897,12 @@  typedef struct acpi_pmtt_header
     UINT16                  Length;
     UINT16                  Flags;
     UINT16                  Reserved2;
+    UINT32                  MemoryDeviceCount;  /* Zero means no memory device structs follow */
+    /*
+     * Immediately followed by:
+     * UINT8 TypeSpecificData[]
+     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
+     */
 
 } ACPI_PMTT_HEADER;
 
@@ -1760,7 +1911,8 @@  typedef struct acpi_pmtt_header
 #define ACPI_PMTT_TYPE_SOCKET           0
 #define ACPI_PMTT_TYPE_CONTROLLER       1
 #define ACPI_PMTT_TYPE_DIMM             2
-#define ACPI_PMTT_TYPE_RESERVED         3 /* 0x03-0xFF are reserved */
+#define ACPI_PMTT_TYPE_RESERVED         3 /* 0x03-0xFE are reserved */
+#define ACPI_PMTT_TYPE_VENDOR           0xFF
 
 /* Values for Flags field above */
 
@@ -1783,6 +1935,10 @@  typedef struct acpi_pmtt_socket
     UINT16                  Reserved;
 
 } ACPI_PMTT_SOCKET;
+    /*
+     * Immediately followed by:
+     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
+     */
 
 
 /* 1: Memory Controller subtable */
@@ -1790,24 +1946,14 @@  typedef struct acpi_pmtt_socket
 typedef struct acpi_pmtt_controller
 {
     ACPI_PMTT_HEADER        Header;
-    UINT32                  ReadLatency;
-    UINT32                  WriteLatency;
-    UINT32                  ReadBandwidth;
-    UINT32                  WriteBandwidth;
-    UINT16                  AccessWidth;
-    UINT16                  Alignment;
+    UINT16                  ControllerId;
     UINT16                  Reserved;
-    UINT16                  DomainCount;
 
 } ACPI_PMTT_CONTROLLER;
-
-/* 1a: Proximity Domain substructure */
-
-typedef struct acpi_pmtt_domain
-{
-    UINT32                  ProximityDomain;
-
-} ACPI_PMTT_DOMAIN;
+    /*
+     * Immediately followed by:
+     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
+     */
 
 
 /* 2: Physical Component Identifier (DIMM) */
@@ -1815,14 +1961,27 @@  typedef struct acpi_pmtt_domain
 typedef struct acpi_pmtt_physical_component
 {
     ACPI_PMTT_HEADER        Header;
-    UINT16                  ComponentId;
-    UINT16                  Reserved;
-    UINT32                  MemorySize;
     UINT32                  BiosHandle;
 
 } ACPI_PMTT_PHYSICAL_COMPONENT;
 
 
+/* 0xFF: Vendor Specific Data */
+
+typedef struct acpi_pmtt_vendor_specific
+{
+    ACPI_PMTT_HEADER        Header;
+    UINT8                   TypeUuid[16];
+    UINT8                   Specific[];
+    /*
+     * Immediately followed by:
+     * UINT8 VendorSpecificData[];
+     * MEMORY_DEVICE MemoryDeviceStruct[MemoryDeviceCount];
+     */
+
+} ACPI_PMTT_VENDOR_SPECIFIC;
+
+
 /*******************************************************************************
  *
  * PPTT - Processor Properties Topology Table (ACPI 6.2)
@@ -1885,6 +2044,15 @@  typedef struct acpi_pptt_cache
 
 } ACPI_PPTT_CACHE;
 
+/* 1: Cache Type Structure for PPTT version 3 */
+
+typedef struct acpi_pptt_cache_v1
+{
+    UINT32                  CacheId;
+
+} ACPI_PPTT_CACHE_V1;
+
+
 /* Flags */
 
 #define ACPI_PPTT_SIZE_PROPERTY_VALID       (1)     /* Physical property valid */
@@ -1894,6 +2062,7 @@  typedef struct acpi_pptt_cache
 #define ACPI_PPTT_CACHE_TYPE_VALID          (1<<4)  /* Cache type valid */
 #define ACPI_PPTT_WRITE_POLICY_VALID        (1<<5)  /* Write policy valid */
 #define ACPI_PPTT_LINE_SIZE_VALID           (1<<6)  /* Line size valid */
+#define ACPI_PPTT_CACHE_ID_VALID            (1<<7)  /* Cache ID valid */
 
 /* Masks for Attributes */
 
@@ -2108,6 +2277,7 @@  enum AcpiSdevType
 /* Values for flags above */
 
 #define ACPI_SDEV_HANDOFF_TO_UNSECURE_OS    (1)
+#define ACPI_SDEV_SECURE_COMPONENTS_PRESENT (1<<1)
 
 /*
  * SDEV subtables
@@ -2125,6 +2295,58 @@  typedef struct acpi_sdev_namespace
 
 } ACPI_SDEV_NAMESPACE;
 
+typedef struct acpi_sdev_secure_component
+{
+    UINT16                  SecureComponentOffset;
+    UINT16                  SecureComponentLength;
+
+} ACPI_SDEV_SECURE_COMPONENT;
+
+
+/*
+ * SDEV sub-subtables ("Components") for above
+ */
+typedef struct acpi_sdev_component
+{
+    ACPI_SDEV_HEADER        Header;
+
+} ACPI_SDEV_COMPONENT;
+
+
+/* Values for sub-subtable type above */
+
+enum AcpiSacType
+{
+    ACPI_SDEV_TYPE_ID_COMPONENT     = 0,
+    ACPI_SDEV_TYPE_MEM_COMPONENT    = 1
+};
+
+typedef struct acpi_sdev_id_component
+{
+    ACPI_SDEV_HEADER        Header;
+    UINT16                  HardwareIdOffset;
+    UINT16                  HardwareIdLength;
+    UINT16                  SubsystemIdOffset;
+    UINT16                  SubsystemIdLength;
+    UINT16                  HardwareRevision;
+    UINT8                   HardwareRevPresent;
+    UINT8                   ClassCodePresent;
+    UINT8                   PciBaseClass;
+    UINT8                   PciSubClass;
+    UINT8                   PciProgrammingXface;
+
+} ACPI_SDEV_ID_COMPONENT;
+
+typedef struct acpi_sdev_mem_component
+{
+    ACPI_SDEV_HEADER        Header;
+    UINT32                  Reserved;
+    UINT64                  MemoryBaseAddress;
+    UINT64                  MemoryLength;
+
+} ACPI_SDEV_MEM_COMPONENT;
+
+
 /* 1: PCIe Endpoint Device Based Device Structure */
 
 typedef struct acpi_sdev_pcie
diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h
index 1c79143b..d4260a1d 100644
--- a/src/acpica/source/include/actbl3.h
+++ b/src/acpica/source/include/actbl3.h
@@ -177,6 +177,7 @@ 
 #define ACPI_SIG_TCPA           "TCPA"      /* Trusted Computing Platform Alliance table */
 #define ACPI_SIG_TPM2           "TPM2"      /* Trusted Platform Module 2.0 H/W interface table */
 #define ACPI_SIG_UEFI           "UEFI"      /* Uefi Boot Optimization Table */
+#define ACPI_SIG_VIOT           "VIOT"      /* Virtual I/O Translation Table */
 #define ACPI_SIG_WAET           "WAET"      /* Windows ACPI Emulated devices Table */
 #define ACPI_SIG_WDAT           "WDAT"      /* Watchdog Action Table */
 #define ACPI_SIG_WDDT           "WDDT"      /* Watchdog Timer Description Table */
@@ -463,7 +464,8 @@  typedef struct acpi_srat_generic_affinity
 
 /* Flags for ACPI_SRAT_GENERIC_AFFINITY */
 
-#define ACPI_SRAT_GENERIC_AFFINITY_ENABLED (1) /* 00: Use affinity structure */
+#define ACPI_SRAT_GENERIC_AFFINITY_ENABLED     (1)      /* 00: Use affinity structure */
+#define ACPI_SRAT_ARCHITECTURAL_TRANSACTIONS   (1<<1)   /* ACPI 6.4 */
 
 /*******************************************************************************
  *
@@ -682,6 +684,86 @@  typedef struct acpi_table_uefi
 } ACPI_TABLE_UEFI;
 
 
+/*******************************************************************************
+ *
+ * VIOT - Virtual I/O Translation Table
+ *        Version 1
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_viot
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+    UINT16                  NodeCount;
+    UINT16                  NodeOffset;
+    UINT8                   Reserved[8];
+
+} ACPI_TABLE_VIOT;
+
+/* VIOT subtable header */
+
+typedef struct acpi_viot_header
+{
+    UINT8                   Type;
+    UINT8                   Reserved;
+    UINT16                  Length;
+
+} ACPI_VIOT_HEADER;
+
+/* Values for Type field above */
+
+enum AcpiViotNodeType
+{
+    ACPI_VIOT_NODE_PCI_RANGE            = 0x01,
+    ACPI_VIOT_NODE_MMIO                 = 0x02,
+    ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI     = 0x03,
+    ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO    = 0x04,
+    ACPI_VIOT_RESERVED                  = 0x05
+};
+
+/* VIOT subtables */
+
+typedef struct acpi_viot_pci_range
+{
+    ACPI_VIOT_HEADER        Header;
+    UINT32                  EndpointStart;
+    UINT16                  SegmentStart;
+    UINT16                  SegmentEnd;
+    UINT16                  BdfStart;
+    UINT16                  BdfEnd;
+    UINT16                  OutputNode;
+    UINT8                   Reserved[6];
+
+} ACPI_VIOT_PCI_RANGE;
+
+typedef struct acpi_viot_mmio
+{
+    ACPI_VIOT_HEADER        Header;
+    UINT32                  Endpoint;
+    UINT64                  BaseAddress;
+    UINT16                  OutputNode;
+    UINT8                   Reserved[6];
+
+} ACPI_VIOT_MMIO;
+
+typedef struct acpi_viot_virtio_iommu_pci
+{
+    ACPI_VIOT_HEADER        Header;
+    UINT16                  Segment;
+    UINT16                  Bdf;
+    UINT8                   Reserved[8];
+
+} ACPI_VIOT_VIRTIO_IOMMU_PCI;
+
+typedef struct acpi_viot_virtio_iommu_mmio
+{
+    ACPI_VIOT_HEADER        Header;
+    UINT8                   Reserved[4];
+    UINT64                  BaseAddress;
+
+} ACPI_VIOT_VIRTIO_IOMMU_MMIO;
+
+
 /*******************************************************************************
  *
  * WAET - Windows ACPI Emulated devices Table
diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
index b520f641..4d485422 100644
--- a/src/acpica/source/include/acutils.h
+++ b/src/acpica/source/include/acutils.h
@@ -171,6 +171,7 @@  extern const char                       *AcpiGbl_MaxDecode[];
 extern const char                       *AcpiGbl_MemDecode[];
 extern const char                       *AcpiGbl_MinDecode[];
 extern const char                       *AcpiGbl_MtpDecode[];
+extern const char                       *AcpiGbl_PhyDecode[];
 extern const char                       *AcpiGbl_RngDecode[];
 extern const char                       *AcpiGbl_RwDecode[];
 extern const char                       *AcpiGbl_ShrDecode[];
diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h
index 72b253a4..48f4c9a1 100644
--- a/src/acpica/source/include/acuuid.h
+++ b/src/acpica/source/include/acuuid.h
@@ -210,5 +210,6 @@ 
 #define UUID_DEVICE_GRAPHS              "ab02a46b-74c7-45a2-bd68-f7d344ef2153"
 #define UUID_HIERARCHICAL_DATA_EXTENSION "dbb8e3e6-5886-4ba6-8795-1319f52a966b"
 #define UUID_CORESIGHT_GRAPH            "3ecbc8b6-1d0e-4fb3-8107-e627f805c6cd"
+#define UUID_USB4_CAPABILITIES          "23a0d13a-26ab-486c-9c5f-0ffa525a575a"
 
 #endif /* __ACUUID_H__ */
diff --git a/src/acpica/source/include/amlresrc.h b/src/acpica/source/include/amlresrc.h
index 094ab1d9..a97a1c63 100644
--- a/src/acpica/source/include/amlresrc.h
+++ b/src/acpica/source/include/amlresrc.h
@@ -183,6 +183,7 @@ 
 #define ACPI_RESTAG_IORESTRICTION               "_IOR"
 #define ACPI_RESTAG_LENGTH                      "_LEN"
 #define ACPI_RESTAG_LINE                        "_LIN"
+#define ACPI_RESTAG_LOCALPORT                   "_PRT"
 #define ACPI_RESTAG_MEMATTRIBUTES               "_MTP"  /* Memory(0), Reserved(1), ACPI(2), NVS(3) */
 #define ACPI_RESTAG_MEMTYPE                     "_MEM"  /* NonCache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */
 #define ACPI_RESTAG_MAXADDR                     "_MAX"
@@ -192,6 +193,7 @@ 
 #define ACPI_RESTAG_MODE                        "_MOD"
 #define ACPI_RESTAG_PARITY                      "_PAR"
 #define ACPI_RESTAG_PHASE                       "_PHA"
+#define ACPI_RESTAG_PHYTYPE                     "_PHY"
 #define ACPI_RESTAG_PIN                         "_PIN"
 #define ACPI_RESTAG_PINCONFIG                   "_PPI"
 #define ACPI_RESTAG_PINCONFIG_TYPE              "_TYP"
@@ -568,7 +570,8 @@  typedef struct aml_resource_gpio
 #define AML_RESOURCE_I2C_SERIALBUSTYPE          1
 #define AML_RESOURCE_SPI_SERIALBUSTYPE          2
 #define AML_RESOURCE_UART_SERIALBUSTYPE         3
-#define AML_RESOURCE_MAX_SERIALBUSTYPE          3
+#define AML_RESOURCE_CSI2_SERIALBUSTYPE         4
+#define AML_RESOURCE_MAX_SERIALBUSTYPE          4
 #define AML_RESOURCE_VENDOR_SERIALBUSTYPE       192 /* Vendor defined is 0xC0-0xFF (NOT SUPPORTED) */
 
 typedef struct aml_resource_common_serialbus
@@ -578,6 +581,24 @@  typedef struct aml_resource_common_serialbus
 
 } AML_RESOURCE_COMMON_SERIALBUS;
 
+
+typedef struct aml_resource_csi2_serialbus
+{
+    AML_RESOURCE_LARGE_HEADER_COMMON
+    AML_RESOURCE_SERIAL_COMMON
+
+    /*
+     * Optional fields follow immediately:
+     * 1) Vendor Data bytes
+     * 2) Resource Source String
+     */
+
+} AML_RESOURCE_CSI2_SERIALBUS;
+
+#define AML_RESOURCE_CSI2_REVISION              1       /* ACPI 6.4 */
+#define AML_RESOURCE_CSI2_TYPE_REVISION         1       /* ACPI 6.4 */
+#define AML_RESOURCE_CSI2_MIN_DATA_LEN          0       /* ACPI 6.4 */
+
 typedef struct aml_resource_i2c_serialbus
 {
     AML_RESOURCE_LARGE_HEADER_COMMON
@@ -617,7 +638,6 @@  typedef struct aml_resource_spi_serialbus
 #define AML_RESOURCE_SPI_TYPE_REVISION          1       /* ACPI 5.0 */
 #define AML_RESOURCE_SPI_MIN_DATA_LEN           9
 
-
 typedef struct aml_resource_uart_serialbus
 {
     AML_RESOURCE_LARGE_HEADER_COMMON
@@ -792,6 +812,7 @@  typedef union aml_resource
     AML_RESOURCE_I2C_SERIALBUS              I2cSerialBus;
     AML_RESOURCE_SPI_SERIALBUS              SpiSerialBus;
     AML_RESOURCE_UART_SERIALBUS             UartSerialBus;
+    AML_RESOURCE_CSI2_SERIALBUS             Csi2SerialBus;
     AML_RESOURCE_COMMON_SERIALBUS           CommonSerialBus;
     AML_RESOURCE_PIN_FUNCTION               PinFunction;
     AML_RESOURCE_PIN_CONFIG                 PinConfig;
diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
index 57c61717..148190a3 100644
--- a/src/acpica/source/include/platform/acgcc.h
+++ b/src/acpica/source/include/platform/acgcc.h
@@ -203,7 +203,7 @@  typedef __builtin_va_list       va_list;
 #endif
 
 /*
- * Explictly mark intentional explicit fallthrough to silence
+ * Explicitly mark intentional explicit fallthrough to silence
  * -Wimplicit-fallthrough in GCC 7.1+.
  */