summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Moore <Robert.Moore@intel.com>2021-09-30 08:31:57 -0700
committerRobert Moore <Robert.Moore@intel.com>2021-09-30 08:31:57 -0700
commit94abe858583de24a425b37cb8e62d56c65c4f3cf (patch)
tree5d38527f06d5ff048cab27f34e3f5ef0e98f8a8e
parentc15089b9ea6caa5b26d1a6bb66d25ed9b0bad871 (diff)
downloadacpica-94abe858583de24a425b37cb8e62d56c65c4f3cf.tar.gz
iASL table disassembler: Added disassembly support for the NHLT ACPI table.
Note: support for Vendor-defined microphone arrays and SNR extensions are not supported at this time -- mostly due to a lack of example tables. Actual compiler support for NHLT is forthcoming.
-rw-r--r--source/common/dmtable.c57
-rw-r--r--source/common/dmtbdump2.c300
-rw-r--r--source/common/dmtbinfo2.c183
-rw-r--r--source/compiler/dtcompiler.h4
-rw-r--r--source/compiler/dtutils.c2
-rw-r--r--source/include/acdisasm.h24
-rw-r--r--source/include/actbinfo.h14
-rw-r--r--source/include/actbl2.h288
-rw-r--r--source/tools/acpisrc/astable.c30
9 files changed, 894 insertions, 8 deletions
diff --git a/source/common/dmtable.c b/source/common/dmtable.c
index b0e08ae4f..dff1c6139 100644
--- a/source/common/dmtable.c
+++ b/source/common/dmtable.c
@@ -417,6 +417,26 @@ static const char *AcpiDmNfitSubnames[] =
"Unknown Subtable Type" /* Reserved */
};
+static const char *AcpiDmNhltLinkTypeNames[] =
+{
+ "Reserved for HD-Audio", /* ACPI_NHLT_RESERVED_HD_AUDIO */
+ "Reserved for DSP", /* ACPI_NHLT_RESERVED_DSP */
+ "Type PDM", /* ACPI_NHLT_PDM */
+ "Type SSP", /* ACPI_NHLT_SSP */
+ "Reserved for SlimBus", /* ACPI_NHLT_RESERVED_SLIMBUS */
+ "Reserved for SoundWire", /* ACPI_NHLT_RESERVED_SOUNDWIRE */
+ "Unknown Link Type" /* Reserved */
+};
+
+static const char *AcpiDmNhltDirectionNames[] =
+{
+ "Render", /* ACPI_NHLT_DIR_RENDER */
+ "Capture", /* ACPI_NHLT_DIR_CAPTURE */
+ "Render with Loopback", /* ACPI_NHLT_DIR_RENDER_LOOPBACK */
+ "Feedback for Render", /* ACPI_NHLT_DIR_RENDER_FEEDBACK */
+ "Unknown Direction" /* Reserved */
+};
+
static const char *AcpiDmPcctSubnames[] =
{
"Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
@@ -615,6 +635,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] =
{ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct},
{ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm},
{ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit},
+ {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, NULL, NULL},
{ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct},
{ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt},
{ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat},
@@ -1051,6 +1072,8 @@ AcpiDmDumpTable (
case ACPI_DMT_IVRS_DE:
case ACPI_DMT_GTDT:
case ACPI_DMT_MADT:
+ case ACPI_DMT_NHLT1:
+ case ACPI_DMT_NHLT1a:
case ACPI_DMT_PCCT:
case ACPI_DMT_PMTT:
case ACPI_DMT_PPTT:
@@ -1139,6 +1162,11 @@ AcpiDmDumpTable (
ByteLength = 16;
break;
+ case ACPI_DMT_BUF18:
+
+ ByteLength = 18;
+ break;
+
case ACPI_DMT_BUF128:
ByteLength = 128;
@@ -1344,6 +1372,7 @@ AcpiDmDumpTable (
case ACPI_DMT_BUF10:
case ACPI_DMT_BUF12:
case ACPI_DMT_BUF16:
+ case ACPI_DMT_BUF18:
case ACPI_DMT_BUF128:
/*
* Buffer: Size depends on the opcode and was set above.
@@ -1791,6 +1820,34 @@ AcpiDmDumpTable (
AcpiDmNfitSubnames[Temp16]);
break;
+ case ACPI_DMT_NHLT1:
+
+ /* NHLT link types */
+
+ Temp8 = *Target;
+ if (Temp8 > ACPI_NHLT_TYPE_RESERVED)
+ {
+ Temp8 = ACPI_NHLT_TYPE_RESERVED;
+ }
+
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmNhltLinkTypeNames[Temp8]);
+ break;
+
+ case ACPI_DMT_NHLT1a:
+
+ /* NHLT direction */
+
+ Temp8 = *Target;
+ if (Temp8 > ACPI_NHLT_DIR_RESERVED)
+ {
+ Temp8 = ACPI_NHLT_DIR_RESERVED;
+ }
+
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmNhltDirectionNames[Temp8]);
+ break;
+
case ACPI_DMT_PCCT:
/* PCCT subtable types */
diff --git a/source/common/dmtbdump2.c b/source/common/dmtbdump2.c
index 1b3cdf769..118b96eea 100644
--- a/source/common/dmtbdump2.c
+++ b/source/common/dmtbdump2.c
@@ -1469,6 +1469,306 @@ NextSubtable:
/*******************************************************************************
*
+ * FUNCTION: AcpiDmDumpNhlt
+ *
+ * PARAMETERS: Table - A NHLT table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of an NHLT.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpNhlt (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_STATUS Status;
+ UINT32 Offset;
+ UINT32 TableLength = Table->Length;
+ UINT32 EndpointCount;
+ UINT8 FormatsCount;
+ ACPI_NHLT_ENDPOINT *Subtable;
+ ACPI_NHLT_FORMAT_CONFIG *FormatSubtable;
+ ACPI_TABLE_NHLT *InfoTable;
+ UINT32 CapabilitiesSize;
+ UINT32 i;
+ UINT32 j;
+ UINT32 k;
+ UINT32 EndpointEndOffset;
+ UINT8 ConfigType = 0;
+ UINT8 ArrayType;
+ ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A *DevSpecific;
+ ACPI_NHLT_FORMATS_CONFIG *FormatsConfig;
+ ACPI_NHLT_LINUX_SPECIFIC_COUNT *Count;
+ ACPI_NHLT_LINUX_SPECIFIC_DATA *LinuxData;
+
+
+ /* Main table */
+
+ AcpiOsPrintf ("/* Main table */\n");
+
+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ /* Get the Endpoint Descriptor Count */
+
+ InfoTable = ACPI_ADD_PTR (ACPI_TABLE_NHLT, Table, 0);
+ EndpointCount = InfoTable->EndpointCount;
+
+ /* Subtables */
+
+ Offset = sizeof (ACPI_TABLE_NHLT);
+
+ while (Offset < TableLength)
+ {
+ /* A variable number of Endpoint Descriptors - process each */
+
+ for (i = 0; i < EndpointCount; i++)
+ {
+ /* Do the Endpoint Descriptor table */
+
+ Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
+ if (Subtable->DescriptorLength > TableLength)
+ {
+ Offset += 1;
+ AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than"
+ " table size: %X, table %X, adjusting table offset (+1) */\n",
+ Subtable->DescriptorLength, TableLength);
+
+ Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
+ }
+
+ AcpiOsPrintf ("\n/* Endpoint Descriptor #%u */\n", i+1);
+ Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
+ Subtable->DescriptorLength, AcpiDmTableInfoNhlt0);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ EndpointEndOffset = Subtable->DescriptorLength + Offset;
+
+ /* Check for endpoint descriptor beyond end-of-table */
+
+ if (Subtable->DescriptorLength > TableLength)
+ {
+ AcpiOsPrintf ("\n/* Endpoint Descriptor Length larger than table size: %X, table %X */\n",
+ Subtable->DescriptorLength, TableLength);
+ }
+ Offset += sizeof (ACPI_NHLT_ENDPOINT);
+ Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
+
+ /* Do the Device Specific table */
+
+ AcpiOsPrintf ("\n/* Endpoint Device_Specific_Config table */\n");
+ DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
+ CapabilitiesSize = DevSpecific->CapabilitiesSize;
+
+ /* Different subtables based upon capabilities_size */
+
+ switch (CapabilitiesSize)
+ {
+ case 0:
+ Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
+ sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
+ break;
+
+ case 1:
+ Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
+ sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C), AcpiDmTableInfoNhlt5c);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C);
+ break;
+
+ case 2:
+ Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
+ sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
+ break;
+
+ case 3:
+ ConfigType = DevSpecific->ConfigType;
+ ArrayType = DevSpecific->ArrayType;
+
+ Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
+ sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A), AcpiDmTableInfoNhlt5a);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ /* Capabilities Size == 3 */
+ Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A);
+
+ /* Check for a vendor-defined mic array */
+
+ if ((ConfigType == ACPI_NHLT_TYPE_MIC_ARRAY) && ((ArrayType & ARRAY_TYPE_MASK) == VENDOR_DEFINED))
+ {
+ /* Vendor-defined microphone array */
+
+ AcpiOsPrintf ("\n/* Vendor-defined microphone array */\n");
+
+ Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
+ sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG);
+ }
+ break;
+
+ default:
+ Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
+ sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
+ Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
+ CapabilitiesSize, AcpiDmTableInfoNhlt3a);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += CapabilitiesSize;
+ break;
+ }
+
+ /* Do the Formats_Config table */
+
+ FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset);
+ FormatsCount = FormatsConfig->FormatsCount;
+
+ AcpiOsPrintf ("\n/* Formats_Config table */\n");
+
+ Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig,
+ sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG);
+
+ /* A variable number of Format_Config Descriptors - process each */
+
+ for (j = 0; j < FormatsCount; j++)
+ {
+ FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
+ CapabilitiesSize = FormatSubtable->CapabilitySize;
+
+ /* Do the Wave_extensible struct */
+
+ AcpiOsPrintf ("\n/* Wave_Format_Extensible table #%u */\n", j+1);
+ Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
+ sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += sizeof (ACPI_NHLT_WAVE_EXTENSIBLE);
+
+ /* Do the Capabilities array */
+
+ Offset += sizeof (UINT32);
+ AcpiOsPrintf ("\n/* Specific_Config table #%u */\n", j+1);
+ FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
+ Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
+ CapabilitiesSize, AcpiDmTableInfoNhlt3a);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += CapabilitiesSize;
+ }
+
+ /*
+ * If we are not done with the Endpoint(s) yet, then there must be
+ * some Linux-specific structure(s) yet to be processed.
+ */
+ if (Offset < EndpointEndOffset)
+ {
+ AcpiOsPrintf ("\n");
+ Count = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_COUNT, Table, Offset);
+ Status = AcpiDmDumpTable (TableLength, Offset, Count,
+ sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT), AcpiDmTableInfoNhlt7);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_COUNT);
+
+ /* Variable number of linux-specific structures */
+
+ for (k = 0; k < Count->StructureCount; k++)
+ {
+ LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset);
+
+ AcpiOsPrintf ("\n/* Linux-specific structure #%u */\n", k+1);
+
+ Status = AcpiDmDumpTable (TableLength, Offset, LinuxData,
+ sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA), AcpiDmTableInfoNhlt7a);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ Offset += sizeof (ACPI_NHLT_LINUX_SPECIFIC_DATA);
+ }
+
+ /* Should be at the end of the Endpoint structure. Skip any extra bytes */
+
+ if (Offset < EndpointEndOffset)
+ {
+ AcpiOsPrintf ("\n/* Endpoint descriptor ended before endpoint size was reached. "
+ "skipped %X input bytes, current offset: %X, Endpoint End Offset: %X */\n",
+ EndpointEndOffset - Offset, Offset, EndpointEndOffset);
+ AcpiUtDumpBuffer (((UINT8 *)Table)+Offset,
+ EndpointEndOffset - Offset, DB_BYTE_DISPLAY, Offset);
+ Offset = EndpointEndOffset;
+ }
+ }
+ }
+
+ /* Emit the table terminator (if present) */
+
+ if (Offset == TableLength - sizeof (ACPI_NHLT_TABLE_TERMINATOR))
+ {
+ LinuxData = ACPI_ADD_PTR (ACPI_NHLT_LINUX_SPECIFIC_DATA, Table, Offset);
+ AcpiOsPrintf ("\n/* Table terminator structure */\n");
+
+ Status = AcpiDmDumpTable (TableLength, Offset, LinuxData,
+ sizeof (ACPI_NHLT_TABLE_TERMINATOR), AcpiDmTableInfoNhlt8);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ }
+
+ return;
+ }
+}
+
+
+/*******************************************************************************
+ *
* FUNCTION: AcpiDmDumpPcct
*
* PARAMETERS: Table - A PCCT table
diff --git a/source/common/dmtbinfo2.c b/source/common/dmtbinfo2.c
index 00cf2e4d3..4cbe112eb 100644
--- a/source/common/dmtbinfo2.c
+++ b/source/common/dmtbinfo2.c
@@ -1196,6 +1196,189 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoNfit7[] =
/*******************************************************************************
*
+ * NHLT - Non HD Audio Link Table. Conforms to Intel Smart Sound Technology
+ * NHLT Specification, January 2020 Revision 0.8.1
+ *
+ ******************************************************************************/
+
+/* Main table */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt[] =
+{
+ {ACPI_DMT_UINT8, ACPI_NHLT_OFFSET (EndpointCount), "Endpoint Count", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Endpoint config */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt0[] =
+{
+ {ACPI_DMT_UINT32, ACPI_NHLT0_OFFSET (DescriptorLength), "Descriptor Length", DT_LENGTH},
+ {ACPI_DMT_NHLT1, ACPI_NHLT0_OFFSET (LinkType), "Link Type", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (InstanceId), "Instance Id", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (VendorId), "Vendor Id", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (DeviceId), "Device Id", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT0_OFFSET (RevisionId), "Revision Id", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT0_OFFSET (SubsystemId), "Subsystem Id", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (DeviceType), "Device Type", 0},
+ {ACPI_DMT_NHLT1a, ACPI_NHLT0_OFFSET (Direction), "Direction", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT0_OFFSET (VirtualBusId), "Virtual Bus Id", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Device_Specific config */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt1[] =
+{
+ {ACPI_DMT_UINT32, ACPI_NHLT1_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH},
+ {ACPI_DMT_UINT8, ACPI_NHLT1_OFFSET (VirtualSlot), "Virtual Slot", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT1_OFFSET (ConfigType), "Config Type", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Wave Format Extensible */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt2[] =
+{
+ {ACPI_DMT_UINT16, ACPI_NHLT2_OFFSET (FormatTag), "Format Tag", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT2_OFFSET (ChannelCount), "Channel Count", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT2_OFFSET (SamplesPerSec), "Samples Per Second", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT2_OFFSET (AvgBytesPerSec), "Average Bytes Per Second", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT2_OFFSET (BlockAlign), "Block Alignment", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT2_OFFSET (BitsPerSample), "Bits Per Sample", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT2_OFFSET (ExtraFormatSize), "Extra Format Size", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT2_OFFSET (ValidBitsPerSample), "Valid Bits Per Sample", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT2_OFFSET (ChannelMask), "Channel Mask", 0},
+ {ACPI_DMT_UUID, ACPI_NHLT2_OFFSET (SubFormatGuid), "SubFormat GUID", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Format Config */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3[] =
+{
+ {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.FormatTag), "Format Tag", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.ChannelCount), "Channel Count", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (Format.SamplesPerSec), "Samples Per Second", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (Format.AvgBytesPerSec), "Average Bytes Per Second", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.BlockAlign), "Block Alignment", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.BitsPerSample), "Bits Per Sample", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.ExtraFormatSize), "Extra Format Size", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT3_OFFSET (Format.ValidBitsPerSample), "Valid Bits Per Sample", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (Format.ChannelMask), "Channel Mask", 0},
+ {ACPI_DMT_UUID, ACPI_NHLT3_OFFSET (Format.SubFormatGuid), "SubFormat GUID", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT3_OFFSET (CapabilitySize), "Capabilities Length", DT_LENGTH},
+ ACPI_DMT_TERMINATOR
+};
+
+/*
+ * We treat the binary Capabilities field as its own subtable (to make
+ * ACPI_DMT_RAW_BUFFER work properly).
+ */
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3a[] =
+{
+ {ACPI_DMT_RAW_BUFFER, 0, "Capabilities", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+
+/* Formats Config */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt4[] =
+{
+ {ACPI_DMT_UINT8, ACPI_NHLT4_OFFSET (FormatsCount), "Formats Count", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Specific Config, CapabilitiesSize == 2 */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5[] =
+{
+ {ACPI_DMT_UINT32, ACPI_NHLT5_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH},
+ {ACPI_DMT_UINT8, ACPI_NHLT5_OFFSET (VirtualSlot), "Virtual Slot", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT5_OFFSET (ConfigType), "Config Type", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Specific Config, CapabilitiesSize == 3 */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[] =
+{
+ {ACPI_DMT_UINT32, ACPI_NHLT5A_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH},
+ {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (VirtualSlot), "Virtual Slot", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (ConfigType), "Config Type", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT5A_OFFSET (ArrayType), "Array Type", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Specific Config, CapabilitiesSize == 0 */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[] =
+{
+ {ACPI_DMT_UINT32, ACPI_NHLT5B_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Specific Config, CapabilitiesSize == 1 */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5c[] =
+{
+ {ACPI_DMT_UINT32, ACPI_NHLT5C_OFFSET (CapabilitiesSize), "Capabilities Size", DT_LENGTH},
+ {ACPI_DMT_UINT8, ACPI_NHLT5C_OFFSET (VirtualSlot), "Virtual Slot", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Microphone array Config */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[] =
+{
+ {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (Type), "Type", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (Panel), "Panel", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (SpeakerPositionDistance), "Speaker Position Distance", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (HorizontalOffset), "Horizontal Offset", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (VerticalOffset), "Vertical Offset", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (FrequencyLowBand), "Frequency Low Band", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT6_OFFSET (FrequencyHighBand), "Frequency High Band", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (DirectionAngle), "Direction Angle", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (ElevationAngle), "Elevation Angle", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (WorkVerticalAngleBegin), "Work Vertical Angle Begin", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (WorkVerticalAngleEnd), "Work Vertical Angle End", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (WorkHorizontalAngleBegin), "Work Horizontal Angle Begin", 0},
+ {ACPI_DMT_UINT16, ACPI_NHLT6_OFFSET (WorkHorizontalAngleEnd), "Work Horizontal Angle End", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Number of Linux-specific structures */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7[] =
+{
+ {ACPI_DMT_UINT8, ACPI_NHLT7_OFFSET (StructureCount), "Linux-specific struct count", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* The Linux-specific structure */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7a[] =
+{
+ {ACPI_DMT_BUF16, ACPI_NHLT7A_OFFSET (DeviceId), "Device ID", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT7A_OFFSET (DeviceInstanceId), "Device Instance ID", 0},
+ {ACPI_DMT_UINT8, ACPI_NHLT7A_OFFSET (DevicePortId), "Device Port ID", 0},
+ {ACPI_DMT_BUF18, ACPI_NHLT7A_OFFSET (Filler), "Specific Data", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Table terminator (may or may not be present) */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt8[] =
+{
+ {ACPI_DMT_UINT32, ACPI_NHLT8_OFFSET (TerminatorValue), "Terminator Value", 0},
+ {ACPI_DMT_UINT32, ACPI_NHLT8_OFFSET (TerminatorSignature), "Terminator Signature", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+
+/*******************************************************************************
+ *
* PCCT - Platform Communications Channel Table (ACPI 5.0)
*
******************************************************************************/
diff --git a/source/compiler/dtcompiler.h b/source/compiler/dtcompiler.h
index 6d3dbefaa..614a686f1 100644
--- a/source/compiler/dtcompiler.h
+++ b/source/compiler/dtcompiler.h
@@ -658,6 +658,10 @@ DtCompileNfit (
void **PFieldList);
ACPI_STATUS
+DtCompileNhlt (
+ void **PFieldList);
+
+ACPI_STATUS
DtCompilePcct (
void **PFieldList);
diff --git a/source/compiler/dtutils.c b/source/compiler/dtutils.c
index 7d706da6f..52180fb3f 100644
--- a/source/compiler/dtutils.c
+++ b/source/compiler/dtutils.c
@@ -581,6 +581,8 @@ DtGetFieldLength (
case ACPI_DMT_IVRS_DE:
case ACPI_DMT_GTDT:
case ACPI_DMT_MADT:
+ case ACPI_DMT_NHLT1:
+ case ACPI_DMT_NHLT1a:
case ACPI_DMT_PCCT:
case ACPI_DMT_PMTT:
case ACPI_DMT_PPTT:
diff --git a/source/include/acdisasm.h b/source/include/acdisasm.h
index 281883800..6e162d6a4 100644
--- a/source/include/acdisasm.h
+++ b/source/include/acdisasm.h
@@ -224,6 +224,7 @@ typedef enum
ACPI_DMT_BUF10,
ACPI_DMT_BUF12,
ACPI_DMT_BUF16,
+ ACPI_DMT_BUF18,
ACPI_DMT_BUF128,
ACPI_DMT_SIG,
ACPI_DMT_STRING,
@@ -277,6 +278,8 @@ typedef enum
ACPI_DMT_LPIT,
ACPI_DMT_MADT,
ACPI_DMT_NFIT,
+ ACPI_DMT_NHLT1,
+ ACPI_DMT_NHLT1a,
ACPI_DMT_PCCT,
ACPI_DMT_PHAT,
ACPI_DMT_PMTT,
@@ -544,7 +547,21 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoNfit5[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoNfit6[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoNfit6a[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoNfit7[];
-extern ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt0[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt2[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt3a[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt4[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5a[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5b[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt5c[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt6[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt7a[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoNhlt8[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhatHdr[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0a[];
@@ -565,6 +582,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoPcct2[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPcct3[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPcct4[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPcct5[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt0[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPptt0[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoPptt0a[];
@@ -793,6 +811,10 @@ AcpiDmDumpNfit (
ACPI_TABLE_HEADER *Table);
void
+AcpiDmDumpNhlt (
+ ACPI_TABLE_HEADER *Table);
+
+void
AcpiDmDumpPcct (
ACPI_TABLE_HEADER *Table);
diff --git a/source/include/actbinfo.h b/source/include/actbinfo.h
index f2a1a48cd..8a9ff736c 100644
--- a/source/include/actbinfo.h
+++ b/source/include/actbinfo.h
@@ -180,6 +180,7 @@
#define ACPI_MPST_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_MPST,f)
#define ACPI_MSCT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_MSCT,f)
#define ACPI_NFIT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_NFIT,f)
+#define ACPI_NHLT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_NHLT,f)
#define ACPI_PCCT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_PCCT,f)
#define ACPI_PDTT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_PDTT,f)
#define ACPI_PMTT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_PMTT,f)
@@ -328,6 +329,19 @@
#define ACPI_NFIT5_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NFIT_DATA_REGION,f)
#define ACPI_NFIT6_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NFIT_FLUSH_ADDRESS,f)
#define ACPI_NFIT7_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NFIT_CAPABILITIES,f)
+#define ACPI_NHLT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_ENDPOINT,f)
+#define ACPI_NHLT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG,f)
+#define ACPI_NHLT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_WAVE_EXTENSIBLE,f)
+#define ACPI_NHLT3_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_FORMAT_CONFIG,f)
+#define ACPI_NHLT4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_FORMATS_CONFIG,f)
+#define ACPI_NHLT5_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG,f)
+#define ACPI_NHLT5A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A,f)
+#define ACPI_NHLT5B_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B,f)
+#define ACPI_NHLT5C_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C,f)
+#define ACPI_NHLT6_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_VENDOR_MIC_CONFIG,f)
+#define ACPI_NHLT7_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_COUNT,f)
+#define ACPI_NHLT7A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_LINUX_SPECIFIC_DATA,f)
+#define ACPI_NHLT8_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_NHLT_TABLE_TERMINATOR,f)
#define ACPI_PCCT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_SUBSPACE,f)
#define ACPI_PCCT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED,f)
#define ACPI_PCCT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f)
diff --git a/source/include/actbl2.h b/source/include/actbl2.h
index c93ead301..281b89afb 100644
--- a/source/include/actbl2.h
+++ b/source/include/actbl2.h
@@ -179,6 +179,7 @@
#define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table */
#define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */
#define ACPI_SIG_NFIT "NFIT" /* NVDIMM Firmware Interface Table */
+#define ACPI_SIG_NHLT "NHLT" /* Non HD Audio Link 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 */
@@ -190,7 +191,6 @@
#define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */
#define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */
#define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */
-#define ACPI_SIG_NHLT "NHLT" /* Non-HDAudio Link Table */
#define ACPI_SIG_SVKL "SVKL" /* Storage Volume Key Location Table */
@@ -1780,6 +1780,292 @@ typedef struct nfit_device_handle
/*******************************************************************************
*
+ * NHLT - Non HD Audio Link Table
+ *
+ * Conforms to: Intel Smart Sound Technology NHLT Specification
+ * Version 0.8.1, January 2020.
+ *
+ ******************************************************************************/
+
+/* Main table */
+
+typedef struct acpi_table_nhlt
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT8 EndpointCount;
+
+} ACPI_TABLE_NHLT;
+
+typedef struct acpi_nhlt_endpoint
+{
+ UINT32 DescriptorLength;
+ UINT8 LinkType;
+ UINT8 InstanceId;
+ UINT16 VendorId;
+ UINT16 DeviceId;
+ UINT16 RevisionId;
+ UINT32 SubsystemId;
+ UINT8 DeviceType;
+ UINT8 Direction;
+ UINT8 VirtualBusId;
+
+} ACPI_NHLT_ENDPOINT;
+
+/* Types for LinkType field above */
+
+#define ACPI_NHLT_RESERVED_HD_AUDIO 0
+#define ACPI_NHLT_RESERVED_DSP 1
+#define ACPI_NHLT_PDM 2
+#define ACPI_NHLT_SSP 3
+#define ACPI_NHLT_RESERVED_SLIMBUS 4
+#define ACPI_NHLT_RESERVED_SOUNDWIRE 5
+#define ACPI_NHLT_TYPE_RESERVED 6 /* 6 and above are reserved */
+
+/* All other values above are reserved */
+
+/* Values for DeviceId field above */
+
+#define ACPI_NHLT_PDM_DMIC 0xAE20
+#define ACPI_NHLT_BT_SIDEBAND 0xAE30
+#define ACPI_NHLT_I2S_TDM_CODECS 0xAE23
+
+/* Values for DeviceType field above */
+
+/* SSP Link */
+
+#define ACPI_NHLT_LINK_BT_SIDEBAND 0
+#define ACPI_NHLT_LINK_FM 1
+#define ACPI_NHLT_LINK_MODEM 2
+/* 3 is reserved */
+#define ACPI_NHLT_LINK_SSP_ANALOG_CODEC 4
+
+/* PDM Link */
+
+#define ACPI_NHLT_PDM_ON_CAVS_1P8 0
+#define ACPI_NHLT_PDM_ON_CAVS_1P5 1
+
+/* Values for Direction field above */
+
+#define ACPI_NHLT_DIR_RENDER 0
+#define ACPI_NHLT_DIR_CAPTURE 1
+#define ACPI_NHLT_DIR_RENDER_LOOPBACK 2
+#define ACPI_NHLT_DIR_RENDER_FEEDBACK 3
+#define ACPI_NHLT_DIR_RESERVED 4 /* 4 and above are reserved */
+
+typedef struct acpi_nhlt_device_specific_config
+{
+ UINT32 CapabilitiesSize;
+ UINT8 VirtualSlot;
+ UINT8 ConfigType;
+
+} ACPI_NHLT_DEVICE_SPECIFIC_CONFIG;
+
+typedef struct acpi_nhlt_device_specific_config_a
+{
+ UINT32 CapabilitiesSize;
+ UINT8 VirtualSlot;
+ UINT8 ConfigType;
+ UINT8 ArrayType;
+
+} ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A;
+
+/* Values for Config Type above */
+
+#define ACPI_NHLT_TYPE_MIC_ARRAY 0x01
+#define ACPI_NHLT_TYPE_GENERIC 0x00
+
+/* Mask for Extension field of ArrayType */
+
+#define ACPI_NHLT_ARRAY_TYPE_MASK 0x10
+
+typedef struct acpi_nhlt_device_specific_config_b
+{
+ UINT32 CapabilitiesSize;
+
+} ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B;
+
+typedef struct acpi_nhlt_device_specific_config_c
+{
+ UINT32 CapabilitiesSize;
+ UINT8 VirtualSlot;
+
+} ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C;
+
+typedef struct acpi_nhlt_wave_extensible
+{
+ UINT16 FormatTag;
+ UINT16 ChannelCount;
+ UINT32 SamplesPerSec;
+ UINT32 AvgBytesPerSec;
+ UINT16 BlockAlign;
+ UINT16 BitsPerSample;
+ UINT16 ExtraFormatSize;
+ UINT16 ValidBitsPerSample;
+ UINT32 ChannelMask;
+ UINT8 SubFormatGuid[16];
+
+} ACPI_NHLT_WAVE_EXTENSIBLE;
+
+/* Values for ChannelMask above */
+
+#define ACPI_NHLT_SPKR_FRONT_LEFT 0x1
+#define ACPI_NHLT_SPKR_FRONT_RIGHT 0x2
+#define ACPI_NHLT_SPKR_FRONT_CENTER 0x4
+#define ACPI_NHLT_SPKR_LOW_FREQ 0x8
+#define ACPI_NHLT_SPKR_BACK_LEFT 0x10
+#define ACPI_NHLT_SPKR_BACK_RIGHT 0x20
+#define ACPI_NHLT_SPKR_FRONT_LEFT_OF_CENTER 0x40
+#define ACPI_NHLT_SPKR_FRONT_RIGHT_OF_CENTER 0x80
+#define ACPI_NHLT_SPKR_BACK_CENTER 0x100
+#define ACPI_NHLT_SPKR_SIDE_LEFT 0x200
+#define ACPI_NHLT_SPKR_SIDE_RIGHT 0x400
+#define ACPI_NHLT_SPKR_TOP_CENTER 0x800
+#define ACPI_NHLT_SPKR_TOP_FRONT_LEFT 0x1000
+#define ACPI_NHLT_SPKR_TOP_FRONT_CENTER 0x2000
+#define ACPI_NHLT_SPKR_TOP_FRONT_RIGHT 0x4000
+#define ACPI_NHLT_SPKR_TOP_BACK_LEFT 0x8000
+#define ACPI_NHLT_SPKR_TOP_BACK_CENTER 0x10000
+#define ACPI_NHLT_SPKR_TOP_BACK_RIGHT 0x20000
+
+typedef struct acpi_nhlt_format_config
+{
+ ACPI_NHLT_WAVE_EXTENSIBLE Format;
+ UINT32 CapabilitySize;
+ UINT8 Capabilities[];
+
+} ACPI_NHLT_FORMAT_CONFIG;
+
+typedef struct acpi_nhlt_formats_config
+{
+ UINT8 FormatsCount;
+
+} ACPI_NHLT_FORMATS_CONFIG;
+
+typedef struct acpi_nhlt_device_specific_hdr
+{
+ UINT8 VirtualSlot;
+ UINT8 ConfigType;
+
+} ACPI_NHLT_DEVICE_SPECIFIC_HDR;
+
+/* Types for ConfigType above */
+
+#define ACPI_NHLT_GENERIC 0
+#define ACPI_NHLT_MIC 1
+#define ACPI_NHLT_RENDER 3
+
+typedef struct acpi_nhlt_mic_device_specific_config
+{
+ ACPI_NHLT_DEVICE_SPECIFIC_HDR DeviceConfig;
+ UINT8 ArrayTypeExt;
+
+} ACPI_NHLT_MIC_DEVICE_SPECIFIC_CONFIG;
+
+/* Values for ArrayTypeExt above */
+
+#define SMALL_LINEAR_2ELEMENT 0x0A
+#define BIG_LINEAR_2ELEMENT 0x0B
+#define FIRST_GEOMETRY_LINEAR_4ELEMENT 0x0C
+#define PLANAR_LSHAPED_4ELEMENT 0x0D
+#define SECOND_GEOMETRY_LINEAR_4ELEMENT 0x0E
+#define VENDOR_DEFINED 0x0F
+#define ARRAY_TYPE_MASK 0x0F
+#define ARRAY_TYPE_EXT_MASK 0x10
+
+#define NO_EXTENSION 0x0
+#define MIC_SNR_SENSITIVITY_EXT 0x1
+
+
+typedef struct acpi_nhlt_vendor_mic_config
+{
+ UINT8 Type;
+ UINT8 Panel;
+ UINT16 SpeakerPositionDistance; // mm
+ UINT16 HorizontalOffset; // mm
+ UINT16 VerticalOffset; // mm
+ UINT8 FrequencyLowBand; // 5*Hz
+ UINT8 FrequencyHighBand; // 500*Hz
+ UINT16 DirectionAngle; // -180 - + 180
+ UINT16 ElevationAngle; // -180 - + 180
+ UINT16 WorkVerticalAngleBegin; // -180 - + 180 with 2 deg step
+ UINT16 WorkVerticalAngleEnd; // -180 - + 180 with 2 deg step
+ UINT16 WorkHorizontalAngleBegin; // -180 - + 180 with 2 deg step
+ UINT16 WorkHorizontalAngleEnd; // -180 - + 180 with 2 deg step
+
+} ACPI_NHLT_VENDOR_MIC_CONFIG;
+
+/* Values for Type field above */
+
+#define MIC_OMNIDIRECTIONAL 0
+#define MIC_SUBCARDIOID 1
+#define MIC_CARDIOID 2
+#define MIC_SUPER_CARDIOID 3
+#define MIC_HYPER_CARDIOID 4
+#define MIC_8_SHAPED 5
+#define MIC_VENDOR_DEFINED 7
+
+/* Values for Panel field above */
+
+#define MIC_TOP 0
+#define MIC_BOTTOM 1
+#define MIC_LEFT 2
+#define MIC_RIGHT 3
+#define MIC_FRONT 4
+#define MIC_REAR 5
+
+typedef struct acpi_nhlt_vendor_mic_device_specific_config
+{
+ ACPI_NHLT_MIC_DEVICE_SPECIFIC_CONFIG MicArrayDeviceConfig;
+ UINT8 NumberOfMicrophones;
+ ACPI_NHLT_VENDOR_MIC_CONFIG MicConfig[]; // Indexed by NumberOfMicrophones
+
+} ACPI_NHLT_VENDOR_MIC_DEVICE_SPECIFIC_CONFIG;
+
+/* Microphone SNR and Sensitivity extension */
+
+typedef struct acpi_nhlt_mic_snr_sensitivity_extension
+{
+ UINT32 SNR;
+ UINT32 Sensitivity;
+
+} ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION;
+
+typedef struct acpi_nhlt_render_feedback_device_specific_config
+{
+ ACPI_NHLT_DEVICE_SPECIFIC_CONFIG DeviceConfig;
+ UINT8 FeedbackVirtualSlot; // Render slot in case of capture
+ UINT16 FeedbackChannels; // Informative only
+ UINT16 FeedbackValidBitsPerSample;
+
+} ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG;
+
+/* Linux-specific structures */
+
+typedef struct acpi_nhlt_linux_specific_count
+{
+ UINT8 StructureCount;
+
+} ACPI_NHLT_LINUX_SPECIFIC_COUNT;
+
+typedef struct acpi_nhlt_linux_specific_data
+{
+ UINT8 DeviceId[16];
+ UINT8 DeviceInstanceId;
+ UINT8 DevicePortId;
+ UINT8 Filler[18];
+
+} ACPI_NHLT_LINUX_SPECIFIC_DATA;
+
+typedef struct acpi_nhlt_table_terminator
+{
+ UINT32 TerminatorValue;
+ UINT32 TerminatorSignature;
+
+} ACPI_NHLT_TABLE_TERMINATOR;
+
+
+/*******************************************************************************
+ *
* PCCT - Platform Communications Channel Table (ACPI 5.0)
* Version 2 (ACPI 6.2)
*
diff --git a/source/tools/acpisrc/astable.c b/source/tools/acpisrc/astable.c
index 5cf240bbe..59f1ab8bd 100644
--- a/source/tools/acpisrc/astable.c
+++ b/source/tools/acpisrc/astable.c
@@ -673,6 +673,7 @@ ACPI_TYPED_IDENTIFIER_TABLE AcpiIdentifiers[] = {
{"ACPI_TABLE_MSCT", SRC_TYPE_STRUCT},
{"ACPI_TABLE_MSDM", SRC_TYPE_STRUCT},
{"ACPI_TABLE_NFIT", SRC_TYPE_STRUCT},
+ {"ACPI_TABLE_NHLT", SRC_TYPE_STRUCT},
{"ACPI_TABLE_PCCT", SRC_TYPE_STRUCT},
{"ACPI_TABLE_PDTT", SRC_TYPE_STRUCT},
{"ACPI_TABLE_PHAT", SRC_TYPE_STRUCT},
@@ -824,23 +825,40 @@ ACPI_TYPED_IDENTIFIER_TABLE AcpiIdentifiers[] = {
{"ACPI_MADT_MULTIPROC_WAKEUP", SRC_TYPE_STRUCT},
{"ACPI_MADT_MULTIPROC_WAKEUP_MAILBOX", SRC_TYPE_STRUCT},
{"ACPI_MADT_PROCESSOR_APIC", SRC_TYPE_STRUCT},
+ {"ACPI_MCFG_ALLOCATION", SRC_TYPE_STRUCT},
{"ACPI_MPST_COMPONENT", SRC_TYPE_STRUCT},
{"ACPI_MPST_DATA_HDR", SRC_TYPE_STRUCT},
{"ACPI_MPST_POWER_DATA", SRC_TYPE_STRUCT},
{"ACPI_MPST_POWER_NODE", SRC_TYPE_STRUCT},
{"ACPI_MPST_POWER_STATE", SRC_TYPE_STRUCT},
- {"ACPI_MCFG_ALLOCATION", SRC_TYPE_STRUCT},
{"ACPI_MSCT_PROXIMITY", SRC_TYPE_STRUCT},
{"ACPI_NFIT_CAPABILITIES", SRC_TYPE_STRUCT},
+ {"ACPI_NFIT_CONTROL_REGION", SRC_TYPE_STRUCT},
+ {"ACPI_NFIT_DATA_REGION", SRC_TYPE_STRUCT},
{"ACPI_NFIT_DEVICE_HANDLE", SRC_TYPE_STRUCT},
+ {"ACPI_NFIT_FLUSH_ADDRESS", SRC_TYPE_STRUCT},
{"ACPI_NFIT_HEADER", SRC_TYPE_STRUCT},
- {"ACPI_NFIT_SYSTEM_ADDRESS", SRC_TYPE_STRUCT},
- {"ACPI_NFIT_MEMORY_MAP", SRC_TYPE_STRUCT},
{"ACPI_NFIT_INTERLEAVE", SRC_TYPE_STRUCT},
+ {"ACPI_NFIT_MEMORY_MAP", SRC_TYPE_STRUCT},
{"ACPI_NFIT_SMBIOS", SRC_TYPE_STRUCT},
- {"ACPI_NFIT_CONTROL_REGION", SRC_TYPE_STRUCT},
- {"ACPI_NFIT_DATA_REGION", SRC_TYPE_STRUCT},
- {"ACPI_NFIT_FLUSH_ADDRESS", SRC_TYPE_STRUCT},
+ {"ACPI_NFIT_SYSTEM_ADDRESS", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_DEVICE_SPECIFIC_CONFIG", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_DEVICE_SPECIFIC_HDR", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_ENDPOINT", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_FORMAT_CONFIG", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_FORMATS_CONFIG", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_LINUX_SPECIFIC_COUNT", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_LINUX_SPECIFIC_DATA", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_MIC_DEVICE_SPECIFIC_CONFIG", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG",SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_TABLE_TERMINATOR", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_VENDOR_MIC_CONFIG", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_VENDOR_MIC_DEVICE_SPECIFIC_CONFIG", SRC_TYPE_STRUCT},
+ {"ACPI_NHLT_WAVE_EXTENSIBLE", SRC_TYPE_STRUCT},
{"ACPI_PCCT_EXT_PCC_SHARED_MEMORY", SRC_TYPE_STRUCT},
{"ACPI_PCCT_HW_REDUCED", SRC_TYPE_STRUCT},
{"ACPI_PCCT_HW_REDUCED_TYPE2", SRC_TYPE_STRUCT},