All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 0/4] ACPI: NHLT: Access and query helpers
@ 2024-03-11 10:16 Cezary Rojewski
  2024-03-11 10:16 ` [PATCH v7 1/4] ACPI: NHLT: Reintroduce types the table consists of Cezary Rojewski
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Cezary Rojewski @ 2024-03-11 10:16 UTC (permalink / raw)
  To: rafael
  Cc: linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart, andriy.shevchenko, Cezary Rojewski

The goal of this patchset is to refactor existing interface of
Non HDAudio Link Table (NHLT) table so it becomes useful for the Intel
AudioDSP sound-drivers. Right now the useful duplicate resides in
sound/hda/intel-nhlt.c.

The API takes form of query functions that help access device or
audio-format configuration space. This information can be then utilized
by a sound-driver to perform necessary programming and facilitate
streaming over I2S/PDM interfaces. Once the series is merged, existing
sound-drivers can move from utilizing sound/hda/intel-nhlt.c to this
very code and ultimately the former file can be removed.

Paired with equivalent change on ACPICA [1].

-

Non HDAudio Link Table (NHLT) is designed to separate hardware-related
description (registers) from AudioDSP firmware-related one i.e.:
pipelines and modules that together make up the audio stream on Intel
DSPs. This task is important as same set of hardware registers can be
used with different topologies and vice versa, same topology could be
utilized with different set of hardware. As the hardware registers
description is directly tied to specific platform, intention is to have
such description part of low-level firmware e.g.: BIOS.

The initial design has been provided in early Sky Lake (SKL) days. The
audio architecture goes by the name cAVS. SKL is a representative of
cAVS 1.5. The table helps describe endpoint capabilities ever since.
While Raptor Lake (RPL) is the last of cAVS architecture - cAVS 2.5 to
be precise - its successor, the ACE architecture which begun with
Meteor Lake (MTL) inherited the design for all I2S and PDM
configurations. These two configurations are the primary targets for
NHLT table.

Due to naming conflicts with existing code, several structs are named
'nhlt2' rather than 'nhlt'. Last patch cleans the situation up.


Changes in v7:
- added missing headers to nhlt.c/nhlt.h as suggested by Andy

Changes in v6:
- added comments explaining usage of LINKTYPE and DEVICETYPE constants

Changes in v5:
- split find_endpoint/fmtcfg() into tb-less and tb-aware variants.
  This is to make API scale with 2+ NHLTs and removes the need for
  acpi_gbl_nhlt to be accessible globally.
- acpi_nhlt_device_config now a union that encompasses all device_config
  types.

Changes in v4:
- relocated ACPI_NHLT kconfig in the drivers/acpi/Kconfig to a more
  relevant area within the file

Changes in v3:
- uncapitalized acpi_gbl_NHLT
- fixed compilation problems when CONFIG_ACPI_NHLT is disabled
- dropped Reviewed-by tags in the 2/4 patch due to above, those were not
  one-line changes

Changes in v2:
- minor wording improvements in kernel-doc for patch 3/4
- dropped parentheses around loop cursors in for_each_nhlt_*() macros
- readability improvements in compound if-statements within query
  functions
- dropped NULL-checks in query functions

[1]: https://github.com/acpica/acpica/pull/912


Cezary Rojewski (4):
  ACPI: NHLT: Reintroduce types the table consists of
  ACPI: NHLT: Introduce API for the table
  ACPI: NHLT: Drop redundant types
  ACPI: NHLT: Streamline struct naming

 drivers/acpi/Kconfig  |   3 +
 drivers/acpi/Makefile |   1 +
 drivers/acpi/nhlt.c   | 289 ++++++++++++++++++++++++++++++++++++++++
 include/acpi/actbl2.h | 299 +++++++++++++++++-------------------------
 include/acpi/nhlt.h   | 181 +++++++++++++++++++++++++
 5 files changed, 591 insertions(+), 182 deletions(-)
 create mode 100644 drivers/acpi/nhlt.c
 create mode 100644 include/acpi/nhlt.h

-- 
2.25.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v7 1/4] ACPI: NHLT: Reintroduce types the table consists of
  2024-03-11 10:16 [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Cezary Rojewski
@ 2024-03-11 10:16 ` Cezary Rojewski
  2024-03-12 20:14   ` Rafael J. Wysocki
  2024-03-11 10:16 ` [PATCH v7 2/4] ACPI: NHLT: Introduce API for the table Cezary Rojewski
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Cezary Rojewski @ 2024-03-11 10:16 UTC (permalink / raw)
  To: rafael
  Cc: linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart, andriy.shevchenko, Cezary Rojewski

Non HDAudio Link Table (NHLT) is designed to separate hardware-related
description (registers) from AudioDSP firmware-related one i.e.:
pipelines and modules that together make up the audio stream on Intel
DSPs. This task is important as same set of hardware registers can be
used with different topologies and vice versa, same topology could be
utilized with different set of hardware. As the hardware registers
description is directly tied to specific platform, intention is to have
such description part of low-level firmware e.g.: BIOS.

The initial design has been provided in early Sky Lake (SKL) days. The
audio architecture goes by the name cAVS. SKL is a representative of
cAVS 1.5. The table helps describe endpoint capabilities ever since.
While Raptor Lake (RPL) is the last of cAVS architecture - cAVS 2.5 to
be precise - its successor, the ACE architecture which begun with
Meteor Lake (MTL) inherited the design for all I2S and PDM
configurations. These two configurations are the primary targets for
NHLT table.

Due to naming conflicts with existing code, several structs are named
'nhlt2' rather than 'nhlt'. Follow up changes clean this up once
existing code has no users and is removed.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
---
 include/acpi/actbl2.h | 189 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 189 insertions(+)

diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
index 9775384d61c6..8030a1743100 100644
--- a/include/acpi/actbl2.h
+++ b/include/acpi/actbl2.h
@@ -2141,6 +2141,195 @@ struct acpi_nhlt_device_info {
 	u8 device_port_id;
 };
 
+/*******************************************************************************
+ *
+ * NHLT - Non HDAudio Link Table
+ *        Version 1
+ *
+ ******************************************************************************/
+
+struct acpi_table_nhlt2 {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 endpoints_count;
+	/*
+	 * struct acpi_nhlt_endpoint endpoints[];
+	 * struct acpi_nhlt_config oed_config;
+	 */
+};
+
+struct acpi_nhlt2_endpoint {
+	u32 length;
+	u8 link_type;
+	u8 instance_id;
+	u16 vendor_id;
+	u16 device_id;
+	u16 revision_id;
+	u32 subsystem_id;
+	u8 device_type;
+	u8 direction;
+	u8 virtual_bus_id;
+	/*
+	 * struct acpi_nhlt_config device_config;
+	 * struct acpi_nhlt_formats_config formats_config;
+	 * struct acpi_nhlt_devices_info devices_info;
+	 */
+};
+
+/*
+ * Values for link_type field above
+ *
+ * Only types PDM and SSP are used
+ */
+#define ACPI_NHLT_LINKTYPE_HDA			0
+#define ACPI_NHLT_LINKTYPE_DSP			1
+#define ACPI_NHLT_LINKTYPE_PDM			2
+#define ACPI_NHLT_LINKTYPE_SSP			3
+#define ACPI_NHLT_LINKTYPE_SLIMBUS		4
+#define ACPI_NHLT_LINKTYPE_SDW			5
+#define ACPI_NHLT_LINKTYPE_UAOL			6
+
+/* Values for device_id field above */
+
+#define ACPI_NHLT_DEVICEID_DMIC			0xAE20
+#define ACPI_NHLT_DEVICEID_BT			0xAE30
+#define ACPI_NHLT_DEVICEID_I2S			0xAE34
+
+/* Values for device_type field above */
+
+/*
+ * Device types unique to endpoint of link_type=PDM
+ *
+ * Type PDM used for all SKL+ platforms
+ */
+#define ACPI_NHLT_DEVICETYPE_PDM		0
+#define ACPI_NHLT_DEVICETYPE_PDM_SKL		1
+/* Device types unique to endpoint of link_type=SSP */
+#define ACPI_NHLT_DEVICETYPE_BT			0
+#define ACPI_NHLT_DEVICETYPE_FM			1
+#define ACPI_NHLT_DEVICETYPE_MODEM		2
+#define ACPI_NHLT_DEVICETYPE_CODEC		4
+
+/* Values for Direction field above */
+
+#define ACPI_NHLT_DIR_RENDER			0
+#define ACPI_NHLT_DIR_CAPTURE			1
+
+struct acpi_nhlt_config {
+	u32 capabilities_size;
+	u8 capabilities[];
+};
+
+struct acpi_nhlt_gendevice_config {
+	u8 virtual_slot;
+	u8 config_type;
+};
+
+/* Values for config_type field above */
+
+#define ACPI_NHLT_CONFIGTYPE_GENERIC		0
+#define ACPI_NHLT_CONFIGTYPE_MICARRAY		1
+
+struct acpi_nhlt_micdevice_config {
+	u8 virtual_slot;
+	u8 config_type;
+	u8 array_type;
+};
+
+/* Values for array_type field above */
+
+#define ACPI_NHLT_ARRAYTYPE_LINEAR2_SMALL	0xA
+#define ACPI_NHLT_ARRAYTYPE_LINEAR2_BIG		0xB
+#define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO1	0xC
+#define ACPI_NHLT_ARRAYTYPE_PLANAR4_LSHAPED	0xD
+#define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO2	0xE
+#define ACPI_NHLT_ARRAYTYPE_VENDOR		0xF
+
+struct acpi_nhlt2_vendor_mic_config {
+	u8 type;
+	u8 panel;
+	u16 speaker_position_distance;		/* mm */
+	u16 horizontal_offset;			/* mm */
+	u16 vertical_offset;			/* mm */
+	u8 frequency_low_band;			/* 5*Hz */
+	u8 frequency_high_band;			/* 500*Hz */
+	u16 direction_angle;			/* -180 - +180 */
+	u16 elevation_angle;			/* -180 - +180 */
+	u16 work_vertical_angle_begin;		/* -180 - +180 with 2 deg step */
+	u16 work_vertical_angle_end;		/* -180 - +180 with 2 deg step */
+	u16 work_horizontal_angle_begin;	/* -180 - +180 with 2 deg step */
+	u16 work_horizontal_angle_end;		/* -180 - +180 with 2 deg step */
+};
+
+/* Values for Type field above */
+
+#define ACPI_NHLT_MICTYPE_OMNIDIRECTIONAL	0
+#define ACPI_NHLT_MICTYPE_SUBCARDIOID		1
+#define ACPI_NHLT_MICTYPE_CARDIOID		2
+#define ACPI_NHLT_MICTYPE_SUPERCARDIOID		3
+#define ACPI_NHLT_MICTYPE_HYPERCARDIOID		4
+#define ACPI_NHLT_MICTYPE_8SHAPED		5
+#define ACPI_NHLT_MICTYPE_RESERVED		6
+#define ACPI_NHLT_MICTYPE_VENDORDEFINED		7
+
+/* Values for Panel field above */
+
+#define ACPI_NHLT_MICLOCATION_TOP		0
+#define ACPI_NHLT_MICLOCATION_BOTTOM		1
+#define ACPI_NHLT_MICLOCATION_LEFT		2
+#define ACPI_NHLT_MICLOCATION_RIGHT		3
+#define ACPI_NHLT_MICLOCATION_FRONT		4
+#define ACPI_NHLT_MICLOCATION_REAR		5
+
+struct acpi_nhlt_vendor_micdevice_config {
+	u8 virtual_slot;
+	u8 config_type;
+	u8 array_type;
+	u8 mics_count;
+	struct acpi_nhlt2_vendor_mic_config mics[];
+};
+
+union acpi_nhlt_device_config {
+	u8 virtual_slot;
+	struct acpi_nhlt_gendevice_config gen;
+	struct acpi_nhlt_micdevice_config mic;
+	struct acpi_nhlt_vendor_micdevice_config vendor_mic;
+};
+
+/* Inherited from Microsoft's WAVEFORMATEXTENSIBLE. */
+struct acpi_nhlt2_wave_formatext {
+	u16 format_tag;
+	u16 channel_count;
+	u32 samples_per_sec;
+	u32 avg_bytes_per_sec;
+	u16 block_align;
+	u16 bits_per_sample;
+	u16 extra_format_size;
+	u16 valid_bits_per_sample;
+	u32 channel_mask;
+	u8 subformat[16];
+};
+
+struct acpi_nhlt2_format_config {
+	struct acpi_nhlt2_wave_formatext format;
+	struct acpi_nhlt_config config;
+};
+
+struct acpi_nhlt2_formats_config {
+	u8 formats_count;
+	struct acpi_nhlt2_format_config formats[];
+};
+
+struct acpi_nhlt2_device_info {
+	u8 id[16];
+	u8 instance_id;
+	u8 port_id;
+};
+
+struct acpi_nhlt_devices_info {
+	u8 devices_count;
+	struct acpi_nhlt2_device_info devices[];
+};
+
 /*******************************************************************************
  *
  * PCCT - Platform Communications Channel Table (ACPI 5.0)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v7 2/4] ACPI: NHLT: Introduce API for the table
  2024-03-11 10:16 [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Cezary Rojewski
  2024-03-11 10:16 ` [PATCH v7 1/4] ACPI: NHLT: Reintroduce types the table consists of Cezary Rojewski
@ 2024-03-11 10:16 ` Cezary Rojewski
  2024-03-12 20:23   ` Rafael J. Wysocki
  2024-03-11 10:16 ` [PATCH v7 3/4] ACPI: NHLT: Drop redundant types Cezary Rojewski
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Cezary Rojewski @ 2024-03-11 10:16 UTC (permalink / raw)
  To: rafael
  Cc: linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart, andriy.shevchenko, Cezary Rojewski

The table is composed of a range of endpoints with each describing
audio formats they support. Most of the operations involve iterating
over elements of the table and filtering them. Simplify the process by
implementing range of getters.

While the acpi_nhlt_endpoint_mic_count() stands out a bit, it is a
critical component for any AudioDSP driver to know how many digital
microphones it is dealing with.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
---
 drivers/acpi/Kconfig  |   3 +
 drivers/acpi/Makefile |   1 +
 drivers/acpi/nhlt.c   | 289 ++++++++++++++++++++++++++++++++++++++++++
 include/acpi/nhlt.h   | 181 ++++++++++++++++++++++++++
 4 files changed, 474 insertions(+)
 create mode 100644 drivers/acpi/nhlt.c
 create mode 100644 include/acpi/nhlt.h

diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index 3c3f8037ebed..c45a4238c5fd 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -484,6 +484,9 @@ config ACPI_REDUCED_HARDWARE_ONLY
 
 	  If you are unsure what to do, do not enable this option.
 
+config ACPI_NHLT
+	bool
+
 source "drivers/acpi/nfit/Kconfig"
 source "drivers/acpi/numa/Kconfig"
 source "drivers/acpi/apei/Kconfig"
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 12ef8180d272..197e1e7154cb 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -93,6 +93,7 @@ obj-$(CONFIG_ACPI_THERMAL_LIB)	+= thermal_lib.o
 obj-$(CONFIG_ACPI_THERMAL)	+= thermal.o
 obj-$(CONFIG_ACPI_PLATFORM_PROFILE) 	+= platform_profile.o
 obj-$(CONFIG_ACPI_NFIT)		+= nfit/
+obj-$(CONFIG_ACPI_NHLT)		+= nhlt.o
 obj-$(CONFIG_ACPI_NUMA)		+= numa/
 obj-$(CONFIG_ACPI)		+= acpi_memhotplug.o
 obj-$(CONFIG_ACPI_HOTPLUG_IOAPIC) += ioapic.o
diff --git a/drivers/acpi/nhlt.c b/drivers/acpi/nhlt.c
new file mode 100644
index 000000000000..599dce778334
--- /dev/null
+++ b/drivers/acpi/nhlt.c
@@ -0,0 +1,289 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright(c) 2023-2024 Intel Corporation. All rights reserved.
+//
+// Authors: Cezary Rojewski <cezary.rojewski@intel.com>
+//          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
+//
+
+#define pr_fmt(fmt) "ACPI: NHLT: " fmt
+
+#include <linux/acpi.h>
+#include <linux/errno.h>
+#include <linux/export.h>
+#include <linux/minmax.h>
+#include <linux/printk.h>
+#include <linux/types.h>
+#include <acpi/nhlt.h>
+
+static struct acpi_table_nhlt2 *acpi_gbl_nhlt;
+
+static struct acpi_table_nhlt2 empty_nhlt = {
+	.header = {
+		.signature = ACPI_SIG_NHLT,
+	},
+};
+
+/**
+ * acpi_nhlt_get_gbl_table - Retrieve a pointer to the first NHLT table.
+ *
+ * If there is no NHLT in the system, acpi_gbl_nhlt will instead point to an
+ * empty table.
+ *
+ * Return: ACPI status code of the operation.
+ */
+acpi_status acpi_nhlt_get_gbl_table(void)
+{
+	acpi_status status;
+
+	status = acpi_get_table(ACPI_SIG_NHLT, 0, (struct acpi_table_header **)(&acpi_gbl_nhlt));
+	if (!acpi_gbl_nhlt)
+		acpi_gbl_nhlt = &empty_nhlt;
+	return status;
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_get_gbl_table);
+
+/**
+ * acpi_nhlt_put_gbl_table - Release the global NHLT table.
+ */
+void acpi_nhlt_put_gbl_table(void)
+{
+	acpi_put_table((struct acpi_table_header *)acpi_gbl_nhlt);
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_put_gbl_table);
+
+/**
+ * acpi_nhlt_endpoint_match - Verify if an endpoint matches criteria.
+ * @ep:			the endpoint to check.
+ * @link_type:		the hardware link type, e.g.: PDM or SSP.
+ * @dev_type:		the device type.
+ * @dir:		stream direction.
+ * @bus_id:		the ID of virtual bus hosting the endpoint.
+ *
+ * Either of @link_type, @dev_type, @dir or @bus_id may be set to a negative
+ * value to ignore the parameter when matching.
+ *
+ * Return: %true if endpoint matches specified criteria or %false otherwise.
+ */
+bool acpi_nhlt_endpoint_match(const struct acpi_nhlt2_endpoint *ep,
+			      int link_type, int dev_type, int dir, int bus_id)
+{
+	return ep &&
+	       (link_type < 0 || ep->link_type == link_type) &&
+	       (dev_type < 0 || ep->device_type == dev_type) &&
+	       (bus_id < 0 || ep->virtual_bus_id == bus_id) &&
+	       (dir < 0 || ep->direction == dir);
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_endpoint_match);
+
+/**
+ * acpi_nhlt_tb_find_endpoint - Search a NHLT table for an endpoint.
+ * @tb:			the table to search.
+ * @link_type:		the hardware link type, e.g.: PDM or SSP.
+ * @dev_type:		the device type.
+ * @dir:		stream direction.
+ * @bus_id:		the ID of virtual bus hosting the endpoint.
+ *
+ * Either of @link_type, @dev_type, @dir or @bus_id may be set to a negative
+ * value to ignore the parameter during the search.
+ *
+ * Return: A pointer to endpoint matching the criteria, %NULL if not found or
+ * an ERR_PTR() otherwise.
+ */
+struct acpi_nhlt2_endpoint *
+acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt2 *tb,
+			   int link_type, int dev_type, int dir, int bus_id)
+{
+	struct acpi_nhlt2_endpoint *ep;
+
+	for_each_nhlt_endpoint(tb, ep)
+		if (acpi_nhlt_endpoint_match(ep, link_type, dev_type, dir, bus_id))
+			return ep;
+	return NULL;
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_tb_find_endpoint);
+
+/**
+ * acpi_nhlt_find_endpoint - Search all NHLT tables for an endpoint.
+ * @link_type:		the hardware link type, e.g.: PDM or SSP.
+ * @dev_type:		the device type.
+ * @dir:		stream direction.
+ * @bus_id:		the ID of virtual bus hosting the endpoint.
+ *
+ * Either of @link_type, @dev_type, @dir or @bus_id may be set to a negative
+ * value to ignore the parameter during the search.
+ *
+ * Return: A pointer to endpoint matching the criteria, %NULL if not found or
+ * an ERR_PTR() otherwise.
+ */
+struct acpi_nhlt2_endpoint *
+acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id)
+{
+	/* TODO: Currently limited to table of index 0. */
+	return acpi_nhlt_tb_find_endpoint(acpi_gbl_nhlt, link_type, dev_type, dir, bus_id);
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_find_endpoint);
+
+/**
+ * acpi_nhlt_endpoint_find_fmtcfg - Search endpoint's formats configuration space
+ *                                  for a specific format.
+ * @ep:			the endpoint to search.
+ * @ch:			number of channels.
+ * @rate:		samples per second.
+ * @vbps:		valid bits per sample.
+ * @bps:		bits per sample.
+ *
+ * Return: A pointer to format matching the criteria, %NULL if not found or
+ * an ERR_PTR() otherwise.
+ */
+struct acpi_nhlt2_format_config *
+acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt2_endpoint *ep,
+			       u16 ch, u32 rate, u16 vbps, u16 bps)
+{
+	struct acpi_nhlt2_wave_formatext *wav;
+	struct acpi_nhlt2_format_config *fmt;
+
+	for_each_nhlt_endpoint_fmtcfg(ep, fmt) {
+		wav = &fmt->format;
+
+		if (wav->valid_bits_per_sample == vbps &&
+		    wav->samples_per_sec == rate &&
+		    wav->bits_per_sample == bps &&
+		    wav->channel_count == ch)
+			return fmt;
+	}
+
+	return NULL;
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_endpoint_find_fmtcfg);
+
+/**
+ * acpi_nhlt_tb_find_fmtcfg - Search a NHLT table for a specific format.
+ * @tb:			the table to search.
+ * @link_type:		the hardware link type, e.g.: PDM or SSP.
+ * @dev_type:		the device type.
+ * @dir:		stream direction.
+ * @bus_id:		the ID of virtual bus hosting the endpoint.
+ *
+ * @ch:			number of channels.
+ * @rate:		samples per second.
+ * @vbps:		valid bits per sample.
+ * @bps:		bits per sample.
+ *
+ * Either of @link_type, @dev_type, @dir or @bus_id may be set to a negative
+ * value to ignore the parameter during the search.
+ *
+ * Return: A pointer to format matching the criteria, %NULL if not found or
+ * an ERR_PTR() otherwise.
+ */
+struct acpi_nhlt2_format_config *
+acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt2 *tb,
+			 int link_type, int dev_type, int dir, int bus_id,
+			 u16 ch, u32 rate, u16 vbps, u16 bps)
+{
+	struct acpi_nhlt2_format_config *fmt;
+	struct acpi_nhlt2_endpoint *ep;
+
+	for_each_nhlt_endpoint(tb, ep) {
+		if (!acpi_nhlt_endpoint_match(ep, link_type, dev_type, dir, bus_id))
+			continue;
+
+		fmt = acpi_nhlt_endpoint_find_fmtcfg(ep, ch, rate, vbps, bps);
+		if (fmt)
+			return fmt;
+	}
+
+	return NULL;
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_tb_find_fmtcfg);
+
+/**
+ * acpi_nhlt_find_fmtcfg - Search all NHLT tables for a specific format.
+ * @link_type:		the hardware link type, e.g.: PDM or SSP.
+ * @dev_type:		the device type.
+ * @dir:		stream direction.
+ * @bus_id:		the ID of virtual bus hosting the endpoint.
+ *
+ * @ch:			number of channels.
+ * @rate:		samples per second.
+ * @vbps:		valid bits per sample.
+ * @bps:		bits per sample.
+ *
+ * Either of @link_type, @dev_type, @dir or @bus_id may be set to a negative
+ * value to ignore the parameter during the search.
+ *
+ * Return: A pointer to format matching the criteria, %NULL if not found or
+ * an ERR_PTR() otherwise.
+ */
+struct acpi_nhlt2_format_config *
+acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id,
+		      u16 ch, u32 rate, u16 vbps, u16 bps)
+{
+	/* TODO: Currently limited to table of index 0. */
+	return acpi_nhlt_tb_find_fmtcfg(acpi_gbl_nhlt, link_type, dev_type, dir, bus_id,
+					ch, rate, vbps, bps);
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_find_fmtcfg);
+
+static bool acpi_nhlt_config_is_micdevice(struct acpi_nhlt_config *cfg)
+{
+	return cfg->capabilities_size >= sizeof(struct acpi_nhlt_micdevice_config);
+}
+
+static bool acpi_nhlt_config_is_vendor_micdevice(struct acpi_nhlt_config *cfg)
+{
+	struct acpi_nhlt_vendor_micdevice_config *devcfg = __acpi_nhlt_config_caps(cfg);
+
+	return cfg->capabilities_size >= sizeof(*devcfg) &&
+	       cfg->capabilities_size == struct_size(devcfg, mics, devcfg->mics_count);
+}
+
+/**
+ * acpi_nhlt_endpoint_mic_count - Retrieve number of digital microphones for a PDM endpoint.
+ * @ep:			the endpoint to return microphones count for.
+ *
+ * Return: A number of microphones or an error code if an invalid endpoint is provided.
+ */
+int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt2_endpoint *ep)
+{
+	union acpi_nhlt_device_config *devcfg;
+	struct acpi_nhlt2_format_config *fmt;
+	struct acpi_nhlt_config *cfg;
+	u16 max_ch = 0;
+
+	if (!ep || ep->link_type != ACPI_NHLT_LINKTYPE_PDM)
+		return -EINVAL;
+
+	/* Find max number of channels based on formats configuration. */
+	for_each_nhlt_endpoint_fmtcfg(ep, fmt)
+		max_ch = max(fmt->format.channel_count, max_ch);
+
+	cfg = __acpi_nhlt_endpoint_config(ep);
+	devcfg = __acpi_nhlt_config_caps(cfg);
+
+	/* If @ep is not a mic array, fallback to channels count. */
+	if (!acpi_nhlt_config_is_micdevice(cfg) ||
+	    devcfg->gen.config_type != ACPI_NHLT_CONFIGTYPE_MICARRAY)
+		return max_ch;
+
+	switch (devcfg->mic.array_type) {
+	case ACPI_NHLT_ARRAYTYPE_LINEAR2_SMALL:
+	case ACPI_NHLT_ARRAYTYPE_LINEAR2_BIG:
+		return 2;
+
+	case ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO1:
+	case ACPI_NHLT_ARRAYTYPE_PLANAR4_LSHAPED:
+	case ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO2:
+		return 4;
+
+	case ACPI_NHLT_ARRAYTYPE_VENDOR:
+		if (!acpi_nhlt_config_is_vendor_micdevice(cfg))
+			return -EINVAL;
+		return devcfg->vendor_mic.mics_count;
+
+	default:
+		pr_warn("undefined mic array type: %#x\n", devcfg->mic.array_type);
+		return max_ch;
+	}
+}
+EXPORT_SYMBOL_GPL(acpi_nhlt_endpoint_mic_count);
diff --git a/include/acpi/nhlt.h b/include/acpi/nhlt.h
new file mode 100644
index 000000000000..bd66c15e7336
--- /dev/null
+++ b/include/acpi/nhlt.h
@@ -0,0 +1,181 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright(c) 2023-2024 Intel Corporation. All rights reserved.
+ *
+ * Authors: Cezary Rojewski <cezary.rojewski@intel.com>
+ *          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
+ */
+
+#ifndef __ACPI_NHLT_H__
+#define __ACPI_NHLT_H__
+
+#include <linux/acpi.h>
+#include <linux/kconfig.h>
+#include <linux/overflow.h>
+#include <linux/types.h>
+
+#define __acpi_nhlt_endpoint_config(ep)		((void *)((ep) + 1))
+#define __acpi_nhlt_config_caps(cfg)		((void *)((cfg) + 1))
+
+/**
+ * acpi_nhlt_endpoint_fmtscfg - Get the formats configuration space.
+ * @ep:		the endpoint to retrieve the space for.
+ *
+ * Return: A pointer to the formats configuration space.
+ */
+static inline struct acpi_nhlt2_formats_config *
+acpi_nhlt_endpoint_fmtscfg(const struct acpi_nhlt2_endpoint *ep)
+{
+	struct acpi_nhlt_config *cfg = __acpi_nhlt_endpoint_config(ep);
+
+	return (struct acpi_nhlt2_formats_config *)((u8 *)(cfg + 1) + cfg->capabilities_size);
+}
+
+#define __acpi_nhlt_first_endpoint(tb) \
+	((void *)(tb + 1))
+
+#define __acpi_nhlt_next_endpoint(ep) \
+	((void *)((u8 *)(ep) + (ep)->length))
+
+#define __acpi_nhlt_get_endpoint(tb, ep, i) \
+	((i) ? __acpi_nhlt_next_endpoint(ep) : __acpi_nhlt_first_endpoint(tb))
+
+#define __acpi_nhlt_first_fmtcfg(fmts) \
+	((void *)(fmts + 1))
+
+#define __acpi_nhlt_next_fmtcfg(fmt) \
+	((void *)((u8 *)((fmt) + 1) + (fmt)->config.capabilities_size))
+
+#define __acpi_nhlt_get_fmtcfg(fmts, fmt, i) \
+	((i) ? __acpi_nhlt_next_fmtcfg(fmt) : __acpi_nhlt_first_fmtcfg(fmts))
+
+/*
+ * The for_each_nhlt_*() macros rely on an iterator to deal with the
+ * variable length of each endpoint structure and the possible presence
+ * of an OED-Config used by Windows only.
+ */
+
+/**
+ * for_each_nhlt_endpoint - Iterate over endpoints in a NHLT table.
+ * @tb:		the pointer to a NHLT table.
+ * @ep:		the pointer to endpoint to use as loop cursor.
+ */
+#define for_each_nhlt_endpoint(tb, ep)					\
+	for (unsigned int __i = 0;					\
+	     __i < (tb)->endpoints_count &&				\
+		(ep = __acpi_nhlt_get_endpoint(tb, ep, __i));		\
+	     __i++)
+
+/**
+ * for_each_nhlt_fmtcfg - Iterate over format configurations.
+ * @fmts:	the pointer to formats configuration space.
+ * @fmt:	the pointer to format to use as loop cursor.
+ */
+#define for_each_nhlt_fmtcfg(fmts, fmt)					\
+	for (unsigned int __i = 0;					\
+	     __i < (fmts)->formats_count &&				\
+		(fmt = __acpi_nhlt_get_fmtcfg(fmts, fmt, __i));	\
+	     __i++)
+
+/**
+ * for_each_nhlt_endpoint_fmtcfg - Iterate over format configurations in an endpoint.
+ * @ep:		the pointer to an endpoint.
+ * @fmt:	the pointer to format to use as loop cursor.
+ */
+#define for_each_nhlt_endpoint_fmtcfg(ep, fmt) \
+	for_each_nhlt_fmtcfg(acpi_nhlt_endpoint_fmtscfg(ep), fmt)
+
+#if IS_ENABLED(CONFIG_ACPI_NHLT)
+
+/*
+ * System-wide pointer to the first NHLT table.
+ *
+ * A sound driver may utilize acpi_nhlt_get/put_gbl_table() on its
+ * initialization and removal respectively to avoid excessive mapping
+ * and unmapping of the memory occupied by the table between streaming
+ * operations.
+ */
+
+acpi_status acpi_nhlt_get_gbl_table(void);
+void acpi_nhlt_put_gbl_table(void);
+
+bool acpi_nhlt_endpoint_match(const struct acpi_nhlt2_endpoint *ep,
+			      int link_type, int dev_type, int dir, int bus_id);
+struct acpi_nhlt2_endpoint *
+acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt2 *tb,
+			   int link_type, int dev_type, int dir, int bus_id);
+struct acpi_nhlt2_endpoint *
+acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id);
+struct acpi_nhlt2_format_config *
+acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt2_endpoint *ep,
+			       u16 ch, u32 rate, u16 vbps, u16 bps);
+struct acpi_nhlt2_format_config *
+acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt2 *tb,
+			 int link_type, int dev_type, int dir, int bus_id,
+			 u16 ch, u32 rate, u16 vpbs, u16 bps);
+struct acpi_nhlt2_format_config *
+acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id,
+		      u16 ch, u32 rate, u16 vpbs, u16 bps);
+int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt2_endpoint *ep);
+
+#else /* !CONFIG_ACPI_NHLT */
+
+static inline acpi_status acpi_nhlt_get_gbl_table(void)
+{
+	return AE_NOT_FOUND;
+}
+
+static inline void acpi_nhlt_put_gbl_table(void)
+{
+}
+
+static inline bool
+acpi_nhlt_endpoint_match(const struct acpi_nhlt2_endpoint *ep,
+			 int link_type, int dev_type, int dir, int bus_id)
+{
+	return false;
+}
+
+static inline struct acpi_nhlt2_endpoint *
+acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt2 *tb,
+			   int link_type, int dev_type, int dir, int bus_id)
+{
+	return NULL;
+}
+
+static inline struct acpi_nhlt2_format_config *
+acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt2_endpoint *ep,
+			       u16 ch, u32 rate, u16 vbps, u16 bps)
+{
+	return NULL;
+}
+
+static inline struct acpi_nhlt2_format_config *
+acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt2 *tb,
+			 int link_type, int dev_type, int dir, int bus_id,
+			 u16 ch, u32 rate, u16 vpbs, u16 bps)
+{
+	return NULL;
+}
+
+static inline int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt2_endpoint *ep)
+{
+	return 0;
+}
+
+static inline struct acpi_nhlt2_endpoint *
+acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id)
+{
+	return NULL;
+}
+
+static inline struct acpi_nhlt2_format_config *
+acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id,
+		      u16 ch, u32 rate, u16 vpbs, u16 bps)
+{
+	return NULL;
+}
+
+#endif /* CONFIG_ACPI_NHLT */
+
+#endif /* __ACPI_NHLT_H__ */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v7 3/4] ACPI: NHLT: Drop redundant types
  2024-03-11 10:16 [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Cezary Rojewski
  2024-03-11 10:16 ` [PATCH v7 1/4] ACPI: NHLT: Reintroduce types the table consists of Cezary Rojewski
  2024-03-11 10:16 ` [PATCH v7 2/4] ACPI: NHLT: Introduce API for the table Cezary Rojewski
@ 2024-03-11 10:16 ` Cezary Rojewski
  2024-03-12 20:23   ` Rafael J. Wysocki
  2024-03-11 10:16 ` [PATCH v7 4/4] ACPI: NHLT: Streamline struct naming Cezary Rojewski
  2024-03-11 10:34 ` [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Andy Shevchenko
  4 siblings, 1 reply; 9+ messages in thread
From: Cezary Rojewski @ 2024-03-11 10:16 UTC (permalink / raw)
  To: rafael
  Cc: linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart, andriy.shevchenko, Cezary Rojewski

There are no users for the duplicated NHLT table components.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
---
 include/acpi/actbl2.h | 254 ------------------------------------------
 1 file changed, 254 deletions(-)

diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
index 8030a1743100..31a716a74340 100644
--- a/include/acpi/actbl2.h
+++ b/include/acpi/actbl2.h
@@ -1887,260 +1887,6 @@ struct nfit_device_handle {
 #define ACPI_NFIT_GET_NODE_ID(handle) \
 	(((handle) & ACPI_NFIT_NODE_ID_MASK)        >> ACPI_NFIT_NODE_ID_OFFSET)
 
-/*******************************************************************************
- *
- * NHLT - Non HD Audio Link Table
- *
- * Conforms to: Intel Smart Sound Technology NHLT Specification
- * Version 0.8.1, January 2020.
- *
- ******************************************************************************/
-
-/* Main table */
-
-struct acpi_table_nhlt {
-	struct acpi_table_header header;	/* Common ACPI table header */
-	u8 endpoint_count;
-};
-
-struct acpi_nhlt_endpoint {
-	u32 descriptor_length;
-	u8 link_type;
-	u8 instance_id;
-	u16 vendor_id;
-	u16 device_id;
-	u16 revision_id;
-	u32 subsystem_id;
-	u8 device_type;
-	u8 direction;
-	u8 virtual_bus_id;
-};
-
-/* Types for link_type 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 device_id field above */
-
-#define ACPI_NHLT_PDM_DMIC                  0xAE20
-#define ACPI_NHLT_BT_SIDEBAND               0xAE30
-#define ACPI_NHLT_I2S_TDM_CODECS            0xAE23
-
-/* Values for device_type 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 */
-
-struct acpi_nhlt_device_specific_config {
-	u32 capabilities_size;
-	u8 virtual_slot;
-	u8 config_type;
-};
-
-struct acpi_nhlt_device_specific_config_a {
-	u32 capabilities_size;
-	u8 virtual_slot;
-	u8 config_type;
-	u8 array_type;
-};
-
-/* Values for Config Type above */
-
-#define ACPI_NHLT_CONFIG_TYPE_GENERIC              0x00
-#define ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY            0x01
-#define ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK      0x03
-#define ACPI_NHLT_CONFIG_TYPE_RESERVED             0x04	/* 4 and above are reserved */
-
-struct acpi_nhlt_device_specific_config_b {
-	u32 capabilities_size;
-};
-
-struct acpi_nhlt_device_specific_config_c {
-	u32 capabilities_size;
-	u8 virtual_slot;
-};
-
-struct acpi_nhlt_render_device_specific_config {
-	u32 capabilities_size;
-	u8 virtual_slot;
-};
-
-struct acpi_nhlt_wave_extensible {
-	u16 format_tag;
-	u16 channel_count;
-	u32 samples_per_sec;
-	u32 avg_bytes_per_sec;
-	u16 block_align;
-	u16 bits_per_sample;
-	u16 extra_format_size;
-	u16 valid_bits_per_sample;
-	u32 channel_mask;
-	u8 sub_format_guid[16];
-};
-
-/* Values for channel_mask 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
-
-struct acpi_nhlt_format_config {
-	struct acpi_nhlt_wave_extensible format;
-	u32 capability_size;
-	u8 capabilities[];
-};
-
-struct acpi_nhlt_formats_config {
-	u8 formats_count;
-};
-
-struct acpi_nhlt_device_specific_hdr {
-	u8 virtual_slot;
-	u8 config_type;
-};
-
-/* Types for config_type above */
-
-#define ACPI_NHLT_GENERIC                   0
-#define ACPI_NHLT_MIC                       1
-#define ACPI_NHLT_RENDER                    3
-
-struct acpi_nhlt_mic_device_specific_config {
-	struct acpi_nhlt_device_specific_hdr device_config;
-	u8 array_type_ext;
-};
-
-/* Values for array_type_ext above */
-
-#define ACPI_NHLT_ARRAY_TYPE_RESERVED               0x09	/* 9 and below are reserved */
-#define ACPI_NHLT_SMALL_LINEAR_2ELEMENT             0x0A
-#define ACPI_NHLT_BIG_LINEAR_2ELEMENT               0x0B
-#define ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT    0x0C
-#define ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT           0x0D
-#define ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT   0x0E
-#define ACPI_NHLT_VENDOR_DEFINED                    0x0F
-#define ACPI_NHLT_ARRAY_TYPE_MASK                   0x0F
-#define ACPI_NHLT_ARRAY_TYPE_EXT_MASK               0x10
-
-#define ACPI_NHLT_NO_EXTENSION                      0x0
-#define ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT           (1<<4)
-
-struct acpi_nhlt_vendor_mic_count {
-	u8 microphone_count;
-};
-
-struct acpi_nhlt_vendor_mic_config {
-	u8 type;
-	u8 panel;
-	u16 speaker_position_distance;	/* mm */
-	u16 horizontal_offset;	/* mm */
-	u16 vertical_offset;	/* mm */
-	u8 frequency_low_band;	/* 5*Hz */
-	u8 frequency_high_band;	/* 500*Hz */
-	u16 direction_angle;	/* -180 - + 180 */
-	u16 elevation_angle;	/* -180 - + 180 */
-	u16 work_vertical_angle_begin;	/* -180 - + 180 with 2 deg step */
-	u16 work_vertical_angle_end;	/* -180 - + 180 with 2 deg step */
-	u16 work_horizontal_angle_begin;	/* -180 - + 180 with 2 deg step */
-	u16 work_horizontal_angle_end;	/* -180 - + 180 with 2 deg step */
-};
-
-/* Values for Type field above */
-
-#define ACPI_NHLT_MIC_OMNIDIRECTIONAL       0
-#define ACPI_NHLT_MIC_SUBCARDIOID           1
-#define ACPI_NHLT_MIC_CARDIOID              2
-#define ACPI_NHLT_MIC_SUPER_CARDIOID        3
-#define ACPI_NHLT_MIC_HYPER_CARDIOID        4
-#define ACPI_NHLT_MIC_8_SHAPED              5
-#define ACPI_NHLT_MIC_RESERVED6             6	/* 6 is reserved */
-#define ACPI_NHLT_MIC_VENDOR_DEFINED        7
-#define ACPI_NHLT_MIC_RESERVED              8	/* 8 and above are reserved */
-
-/* Values for Panel field above */
-
-#define ACPI_NHLT_MIC_POSITION_TOP          0
-#define ACPI_NHLT_MIC_POSITION_BOTTOM       1
-#define ACPI_NHLT_MIC_POSITION_LEFT         2
-#define ACPI_NHLT_MIC_POSITION_RIGHT        3
-#define ACPI_NHLT_MIC_POSITION_FRONT        4
-#define ACPI_NHLT_MIC_POSITION_BACK         5
-#define ACPI_NHLT_MIC_POSITION_RESERVED     6	/* 6 and above are reserved */
-
-struct acpi_nhlt_vendor_mic_device_specific_config {
-	struct acpi_nhlt_mic_device_specific_config mic_array_device_config;
-	u8 number_of_microphones;
-	struct acpi_nhlt_vendor_mic_config mic_config[];	/* Indexed by number_of_microphones */
-};
-
-/* Microphone SNR and Sensitivity extension */
-
-struct acpi_nhlt_mic_snr_sensitivity_extension {
-	u32 SNR;
-	u32 sensitivity;
-};
-
-/* Render device with feedback */
-
-struct acpi_nhlt_render_feedback_device_specific_config {
-	u8 feedback_virtual_slot;	/* Render slot in case of capture */
-	u16 feedback_channels;	/* Informative only */
-	u16 feedback_valid_bits_per_sample;
-};
-
-/* Non documented structures */
-
-struct acpi_nhlt_device_info_count {
-	u8 structure_count;
-};
-
-struct acpi_nhlt_device_info {
-	u8 device_id[16];
-	u8 device_instance_id;
-	u8 device_port_id;
-};
-
 /*******************************************************************************
  *
  * NHLT - Non HDAudio Link Table
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v7 4/4] ACPI: NHLT: Streamline struct naming
  2024-03-11 10:16 [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Cezary Rojewski
                   ` (2 preceding siblings ...)
  2024-03-11 10:16 ` [PATCH v7 3/4] ACPI: NHLT: Drop redundant types Cezary Rojewski
@ 2024-03-11 10:16 ` Cezary Rojewski
  2024-03-11 10:34 ` [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Andy Shevchenko
  4 siblings, 0 replies; 9+ messages in thread
From: Cezary Rojewski @ 2024-03-11 10:16 UTC (permalink / raw)
  To: rafael
  Cc: linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart, andriy.shevchenko, Cezary Rojewski

Few recently introduced structs are named 'nhlt2' instead of 'nhlt' to
avoid naming conflicts. With duplicate types gone, the conflicts are no
more.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
---
 drivers/acpi/nhlt.c   | 36 ++++++++++++++++-----------------
 include/acpi/actbl2.h | 22 ++++++++++-----------
 include/acpi/nhlt.h   | 46 +++++++++++++++++++++----------------------
 3 files changed, 52 insertions(+), 52 deletions(-)

diff --git a/drivers/acpi/nhlt.c b/drivers/acpi/nhlt.c
index 599dce778334..b75c780951e0 100644
--- a/drivers/acpi/nhlt.c
+++ b/drivers/acpi/nhlt.c
@@ -16,9 +16,9 @@
 #include <linux/types.h>
 #include <acpi/nhlt.h>
 
-static struct acpi_table_nhlt2 *acpi_gbl_nhlt;
+static struct acpi_table_nhlt *acpi_gbl_nhlt;
 
-static struct acpi_table_nhlt2 empty_nhlt = {
+static struct acpi_table_nhlt empty_nhlt = {
 	.header = {
 		.signature = ACPI_SIG_NHLT,
 	},
@@ -65,7 +65,7 @@ EXPORT_SYMBOL_GPL(acpi_nhlt_put_gbl_table);
  *
  * Return: %true if endpoint matches specified criteria or %false otherwise.
  */
-bool acpi_nhlt_endpoint_match(const struct acpi_nhlt2_endpoint *ep,
+bool acpi_nhlt_endpoint_match(const struct acpi_nhlt_endpoint *ep,
 			      int link_type, int dev_type, int dir, int bus_id)
 {
 	return ep &&
@@ -90,11 +90,11 @@ EXPORT_SYMBOL_GPL(acpi_nhlt_endpoint_match);
  * Return: A pointer to endpoint matching the criteria, %NULL if not found or
  * an ERR_PTR() otherwise.
  */
-struct acpi_nhlt2_endpoint *
-acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt2 *tb,
+struct acpi_nhlt_endpoint *
+acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt *tb,
 			   int link_type, int dev_type, int dir, int bus_id)
 {
-	struct acpi_nhlt2_endpoint *ep;
+	struct acpi_nhlt_endpoint *ep;
 
 	for_each_nhlt_endpoint(tb, ep)
 		if (acpi_nhlt_endpoint_match(ep, link_type, dev_type, dir, bus_id))
@@ -116,7 +116,7 @@ EXPORT_SYMBOL_GPL(acpi_nhlt_tb_find_endpoint);
  * Return: A pointer to endpoint matching the criteria, %NULL if not found or
  * an ERR_PTR() otherwise.
  */
-struct acpi_nhlt2_endpoint *
+struct acpi_nhlt_endpoint *
 acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id)
 {
 	/* TODO: Currently limited to table of index 0. */
@@ -136,12 +136,12 @@ EXPORT_SYMBOL_GPL(acpi_nhlt_find_endpoint);
  * Return: A pointer to format matching the criteria, %NULL if not found or
  * an ERR_PTR() otherwise.
  */
-struct acpi_nhlt2_format_config *
-acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt2_endpoint *ep,
+struct acpi_nhlt_format_config *
+acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt_endpoint *ep,
 			       u16 ch, u32 rate, u16 vbps, u16 bps)
 {
-	struct acpi_nhlt2_wave_formatext *wav;
-	struct acpi_nhlt2_format_config *fmt;
+	struct acpi_nhlt_wave_formatext *wav;
+	struct acpi_nhlt_format_config *fmt;
 
 	for_each_nhlt_endpoint_fmtcfg(ep, fmt) {
 		wav = &fmt->format;
@@ -176,13 +176,13 @@ EXPORT_SYMBOL_GPL(acpi_nhlt_endpoint_find_fmtcfg);
  * Return: A pointer to format matching the criteria, %NULL if not found or
  * an ERR_PTR() otherwise.
  */
-struct acpi_nhlt2_format_config *
-acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt2 *tb,
+struct acpi_nhlt_format_config *
+acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt *tb,
 			 int link_type, int dev_type, int dir, int bus_id,
 			 u16 ch, u32 rate, u16 vbps, u16 bps)
 {
-	struct acpi_nhlt2_format_config *fmt;
-	struct acpi_nhlt2_endpoint *ep;
+	struct acpi_nhlt_format_config *fmt;
+	struct acpi_nhlt_endpoint *ep;
 
 	for_each_nhlt_endpoint(tb, ep) {
 		if (!acpi_nhlt_endpoint_match(ep, link_type, dev_type, dir, bus_id))
@@ -215,7 +215,7 @@ EXPORT_SYMBOL_GPL(acpi_nhlt_tb_find_fmtcfg);
  * Return: A pointer to format matching the criteria, %NULL if not found or
  * an ERR_PTR() otherwise.
  */
-struct acpi_nhlt2_format_config *
+struct acpi_nhlt_format_config *
 acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id,
 		      u16 ch, u32 rate, u16 vbps, u16 bps)
 {
@@ -244,10 +244,10 @@ static bool acpi_nhlt_config_is_vendor_micdevice(struct acpi_nhlt_config *cfg)
  *
  * Return: A number of microphones or an error code if an invalid endpoint is provided.
  */
-int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt2_endpoint *ep)
+int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt_endpoint *ep)
 {
 	union acpi_nhlt_device_config *devcfg;
-	struct acpi_nhlt2_format_config *fmt;
+	struct acpi_nhlt_format_config *fmt;
 	struct acpi_nhlt_config *cfg;
 	u16 max_ch = 0;
 
diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
index 31a716a74340..f237269bd1cb 100644
--- a/include/acpi/actbl2.h
+++ b/include/acpi/actbl2.h
@@ -1894,7 +1894,7 @@ struct nfit_device_handle {
  *
  ******************************************************************************/
 
-struct acpi_table_nhlt2 {
+struct acpi_table_nhlt {
 	struct acpi_table_header header;	/* Common ACPI table header */
 	u8 endpoints_count;
 	/*
@@ -1903,7 +1903,7 @@ struct acpi_table_nhlt2 {
 	 */
 };
 
-struct acpi_nhlt2_endpoint {
+struct acpi_nhlt_endpoint {
 	u32 length;
 	u8 link_type;
 	u8 instance_id;
@@ -1990,7 +1990,7 @@ struct acpi_nhlt_micdevice_config {
 #define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO2	0xE
 #define ACPI_NHLT_ARRAYTYPE_VENDOR		0xF
 
-struct acpi_nhlt2_vendor_mic_config {
+struct acpi_nhlt_vendor_mic_config {
 	u8 type;
 	u8 panel;
 	u16 speaker_position_distance;		/* mm */
@@ -2031,7 +2031,7 @@ struct acpi_nhlt_vendor_micdevice_config {
 	u8 config_type;
 	u8 array_type;
 	u8 mics_count;
-	struct acpi_nhlt2_vendor_mic_config mics[];
+	struct acpi_nhlt_vendor_mic_config mics[];
 };
 
 union acpi_nhlt_device_config {
@@ -2042,7 +2042,7 @@ union acpi_nhlt_device_config {
 };
 
 /* Inherited from Microsoft's WAVEFORMATEXTENSIBLE. */
-struct acpi_nhlt2_wave_formatext {
+struct acpi_nhlt_wave_formatext {
 	u16 format_tag;
 	u16 channel_count;
 	u32 samples_per_sec;
@@ -2055,17 +2055,17 @@ struct acpi_nhlt2_wave_formatext {
 	u8 subformat[16];
 };
 
-struct acpi_nhlt2_format_config {
-	struct acpi_nhlt2_wave_formatext format;
+struct acpi_nhlt_format_config {
+	struct acpi_nhlt_wave_formatext format;
 	struct acpi_nhlt_config config;
 };
 
-struct acpi_nhlt2_formats_config {
+struct acpi_nhlt_formats_config {
 	u8 formats_count;
-	struct acpi_nhlt2_format_config formats[];
+	struct acpi_nhlt_format_config formats[];
 };
 
-struct acpi_nhlt2_device_info {
+struct acpi_nhlt_device_info {
 	u8 id[16];
 	u8 instance_id;
 	u8 port_id;
@@ -2073,7 +2073,7 @@ struct acpi_nhlt2_device_info {
 
 struct acpi_nhlt_devices_info {
 	u8 devices_count;
-	struct acpi_nhlt2_device_info devices[];
+	struct acpi_nhlt_device_info devices[];
 };
 
 /*******************************************************************************
diff --git a/include/acpi/nhlt.h b/include/acpi/nhlt.h
index bd66c15e7336..3d6e8a5ef693 100644
--- a/include/acpi/nhlt.h
+++ b/include/acpi/nhlt.h
@@ -23,12 +23,12 @@
  *
  * Return: A pointer to the formats configuration space.
  */
-static inline struct acpi_nhlt2_formats_config *
-acpi_nhlt_endpoint_fmtscfg(const struct acpi_nhlt2_endpoint *ep)
+static inline struct acpi_nhlt_formats_config *
+acpi_nhlt_endpoint_fmtscfg(const struct acpi_nhlt_endpoint *ep)
 {
 	struct acpi_nhlt_config *cfg = __acpi_nhlt_endpoint_config(ep);
 
-	return (struct acpi_nhlt2_formats_config *)((u8 *)(cfg + 1) + cfg->capabilities_size);
+	return (struct acpi_nhlt_formats_config *)((u8 *)(cfg + 1) + cfg->capabilities_size);
 }
 
 #define __acpi_nhlt_first_endpoint(tb) \
@@ -99,24 +99,24 @@ acpi_nhlt_endpoint_fmtscfg(const struct acpi_nhlt2_endpoint *ep)
 acpi_status acpi_nhlt_get_gbl_table(void);
 void acpi_nhlt_put_gbl_table(void);
 
-bool acpi_nhlt_endpoint_match(const struct acpi_nhlt2_endpoint *ep,
+bool acpi_nhlt_endpoint_match(const struct acpi_nhlt_endpoint *ep,
 			      int link_type, int dev_type, int dir, int bus_id);
-struct acpi_nhlt2_endpoint *
-acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt2 *tb,
+struct acpi_nhlt_endpoint *
+acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt *tb,
 			   int link_type, int dev_type, int dir, int bus_id);
-struct acpi_nhlt2_endpoint *
+struct acpi_nhlt_endpoint *
 acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id);
-struct acpi_nhlt2_format_config *
-acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt2_endpoint *ep,
+struct acpi_nhlt_format_config *
+acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt_endpoint *ep,
 			       u16 ch, u32 rate, u16 vbps, u16 bps);
-struct acpi_nhlt2_format_config *
-acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt2 *tb,
+struct acpi_nhlt_format_config *
+acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt *tb,
 			 int link_type, int dev_type, int dir, int bus_id,
 			 u16 ch, u32 rate, u16 vpbs, u16 bps);
-struct acpi_nhlt2_format_config *
+struct acpi_nhlt_format_config *
 acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id,
 		      u16 ch, u32 rate, u16 vpbs, u16 bps);
-int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt2_endpoint *ep);
+int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt_endpoint *ep);
 
 #else /* !CONFIG_ACPI_NHLT */
 
@@ -130,46 +130,46 @@ static inline void acpi_nhlt_put_gbl_table(void)
 }
 
 static inline bool
-acpi_nhlt_endpoint_match(const struct acpi_nhlt2_endpoint *ep,
+acpi_nhlt_endpoint_match(const struct acpi_nhlt_endpoint *ep,
 			 int link_type, int dev_type, int dir, int bus_id)
 {
 	return false;
 }
 
-static inline struct acpi_nhlt2_endpoint *
-acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt2 *tb,
+static inline struct acpi_nhlt_endpoint *
+acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt *tb,
 			   int link_type, int dev_type, int dir, int bus_id)
 {
 	return NULL;
 }
 
-static inline struct acpi_nhlt2_format_config *
-acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt2_endpoint *ep,
+static inline struct acpi_nhlt_format_config *
+acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt_endpoint *ep,
 			       u16 ch, u32 rate, u16 vbps, u16 bps)
 {
 	return NULL;
 }
 
-static inline struct acpi_nhlt2_format_config *
-acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt2 *tb,
+static inline struct acpi_nhlt_format_config *
+acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt *tb,
 			 int link_type, int dev_type, int dir, int bus_id,
 			 u16 ch, u32 rate, u16 vpbs, u16 bps)
 {
 	return NULL;
 }
 
-static inline int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt2_endpoint *ep)
+static inline int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt_endpoint *ep)
 {
 	return 0;
 }
 
-static inline struct acpi_nhlt2_endpoint *
+static inline struct acpi_nhlt_endpoint *
 acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id)
 {
 	return NULL;
 }
 
-static inline struct acpi_nhlt2_format_config *
+static inline struct acpi_nhlt_format_config *
 acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id,
 		      u16 ch, u32 rate, u16 vpbs, u16 bps)
 {
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 0/4] ACPI: NHLT: Access and query helpers
  2024-03-11 10:16 [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Cezary Rojewski
                   ` (3 preceding siblings ...)
  2024-03-11 10:16 ` [PATCH v7 4/4] ACPI: NHLT: Streamline struct naming Cezary Rojewski
@ 2024-03-11 10:34 ` Andy Shevchenko
  4 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2024-03-11 10:34 UTC (permalink / raw)
  To: Cezary Rojewski
  Cc: rafael, linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart

On Mon, Mar 11, 2024 at 11:16:54AM +0100, Cezary Rojewski wrote:
> The goal of this patchset is to refactor existing interface of
> Non HDAudio Link Table (NHLT) table so it becomes useful for the Intel
> AudioDSP sound-drivers. Right now the useful duplicate resides in
> sound/hda/intel-nhlt.c.
> 
> The API takes form of query functions that help access device or
> audio-format configuration space. This information can be then utilized
> by a sound-driver to perform necessary programming and facilitate
> streaming over I2S/PDM interfaces. Once the series is merged, existing
> sound-drivers can move from utilizing sound/hda/intel-nhlt.c to this
> very code and ultimately the former file can be removed.
> 
> Paired with equivalent change on ACPICA [1].
> 
> -
> 
> Non HDAudio Link Table (NHLT) is designed to separate hardware-related
> description (registers) from AudioDSP firmware-related one i.e.:
> pipelines and modules that together make up the audio stream on Intel
> DSPs. This task is important as same set of hardware registers can be
> used with different topologies and vice versa, same topology could be
> utilized with different set of hardware. As the hardware registers
> description is directly tied to specific platform, intention is to have
> such description part of low-level firmware e.g.: BIOS.
> 
> The initial design has been provided in early Sky Lake (SKL) days. The
> audio architecture goes by the name cAVS. SKL is a representative of
> cAVS 1.5. The table helps describe endpoint capabilities ever since.
> While Raptor Lake (RPL) is the last of cAVS architecture - cAVS 2.5 to
> be precise - its successor, the ACE architecture which begun with
> Meteor Lake (MTL) inherited the design for all I2S and PDM
> configurations. These two configurations are the primary targets for
> NHLT table.
> 
> Due to naming conflicts with existing code, several structs are named
> 'nhlt2' rather than 'nhlt'. Last patch cleans the situation up.

FWIW, I am fine with this version esp. taking into account the specification
and ACPICA work,

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 1/4] ACPI: NHLT: Reintroduce types the table consists of
  2024-03-11 10:16 ` [PATCH v7 1/4] ACPI: NHLT: Reintroduce types the table consists of Cezary Rojewski
@ 2024-03-12 20:14   ` Rafael J. Wysocki
  0 siblings, 0 replies; 9+ messages in thread
From: Rafael J. Wysocki @ 2024-03-12 20:14 UTC (permalink / raw)
  To: Cezary Rojewski
  Cc: rafael, linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart, andriy.shevchenko

On Mon, Mar 11, 2024 at 11:15 AM Cezary Rojewski
<cezary.rojewski@intel.com> wrote:
>
> Non HDAudio Link Table (NHLT) is designed to separate hardware-related
> description (registers) from AudioDSP firmware-related one i.e.:
> pipelines and modules that together make up the audio stream on Intel
> DSPs. This task is important as same set of hardware registers can be
> used with different topologies and vice versa, same topology could be
> utilized with different set of hardware. As the hardware registers
> description is directly tied to specific platform, intention is to have
> such description part of low-level firmware e.g.: BIOS.
>
> The initial design has been provided in early Sky Lake (SKL) days. The
> audio architecture goes by the name cAVS. SKL is a representative of
> cAVS 1.5. The table helps describe endpoint capabilities ever since.
> While Raptor Lake (RPL) is the last of cAVS architecture - cAVS 2.5 to
> be precise - its successor, the ACE architecture which begun with
> Meteor Lake (MTL) inherited the design for all I2S and PDM
> configurations. These two configurations are the primary targets for
> NHLT table.
>
> Due to naming conflicts with existing code, several structs are named
> 'nhlt2' rather than 'nhlt'. Follow up changes clean this up once
> existing code has no users and is removed.
>
> Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>

I suppose that this is based on an upstream ACPICA pull request that
has been merged?

If so, it should carry a Link: tag pointing to that pull request.  The
ID of the upstream ACPICA commit corresponding to this should be
included into the changelog too.

> ---
>  include/acpi/actbl2.h | 189 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 189 insertions(+)
>
> diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
> index 9775384d61c6..8030a1743100 100644
> --- a/include/acpi/actbl2.h
> +++ b/include/acpi/actbl2.h
> @@ -2141,6 +2141,195 @@ struct acpi_nhlt_device_info {
>         u8 device_port_id;
>  };
>
> +/*******************************************************************************
> + *
> + * NHLT - Non HDAudio Link Table
> + *        Version 1
> + *
> + ******************************************************************************/
> +
> +struct acpi_table_nhlt2 {
> +       struct acpi_table_header header;        /* Common ACPI table header */
> +       u8 endpoints_count;
> +       /*
> +        * struct acpi_nhlt_endpoint endpoints[];
> +        * struct acpi_nhlt_config oed_config;
> +        */
> +};
> +
> +struct acpi_nhlt2_endpoint {
> +       u32 length;
> +       u8 link_type;
> +       u8 instance_id;
> +       u16 vendor_id;
> +       u16 device_id;
> +       u16 revision_id;
> +       u32 subsystem_id;
> +       u8 device_type;
> +       u8 direction;
> +       u8 virtual_bus_id;
> +       /*
> +        * struct acpi_nhlt_config device_config;
> +        * struct acpi_nhlt_formats_config formats_config;
> +        * struct acpi_nhlt_devices_info devices_info;
> +        */
> +};
> +
> +/*
> + * Values for link_type field above
> + *
> + * Only types PDM and SSP are used
> + */
> +#define ACPI_NHLT_LINKTYPE_HDA                 0
> +#define ACPI_NHLT_LINKTYPE_DSP                 1
> +#define ACPI_NHLT_LINKTYPE_PDM                 2
> +#define ACPI_NHLT_LINKTYPE_SSP                 3
> +#define ACPI_NHLT_LINKTYPE_SLIMBUS             4
> +#define ACPI_NHLT_LINKTYPE_SDW                 5
> +#define ACPI_NHLT_LINKTYPE_UAOL                        6
> +
> +/* Values for device_id field above */
> +
> +#define ACPI_NHLT_DEVICEID_DMIC                        0xAE20
> +#define ACPI_NHLT_DEVICEID_BT                  0xAE30
> +#define ACPI_NHLT_DEVICEID_I2S                 0xAE34
> +
> +/* Values for device_type field above */
> +
> +/*
> + * Device types unique to endpoint of link_type=PDM
> + *
> + * Type PDM used for all SKL+ platforms
> + */
> +#define ACPI_NHLT_DEVICETYPE_PDM               0
> +#define ACPI_NHLT_DEVICETYPE_PDM_SKL           1
> +/* Device types unique to endpoint of link_type=SSP */
> +#define ACPI_NHLT_DEVICETYPE_BT                        0
> +#define ACPI_NHLT_DEVICETYPE_FM                        1
> +#define ACPI_NHLT_DEVICETYPE_MODEM             2
> +#define ACPI_NHLT_DEVICETYPE_CODEC             4
> +
> +/* Values for Direction field above */
> +
> +#define ACPI_NHLT_DIR_RENDER                   0
> +#define ACPI_NHLT_DIR_CAPTURE                  1
> +
> +struct acpi_nhlt_config {
> +       u32 capabilities_size;
> +       u8 capabilities[];
> +};
> +
> +struct acpi_nhlt_gendevice_config {
> +       u8 virtual_slot;
> +       u8 config_type;
> +};
> +
> +/* Values for config_type field above */
> +
> +#define ACPI_NHLT_CONFIGTYPE_GENERIC           0
> +#define ACPI_NHLT_CONFIGTYPE_MICARRAY          1
> +
> +struct acpi_nhlt_micdevice_config {
> +       u8 virtual_slot;
> +       u8 config_type;
> +       u8 array_type;
> +};
> +
> +/* Values for array_type field above */
> +
> +#define ACPI_NHLT_ARRAYTYPE_LINEAR2_SMALL      0xA
> +#define ACPI_NHLT_ARRAYTYPE_LINEAR2_BIG                0xB
> +#define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO1       0xC
> +#define ACPI_NHLT_ARRAYTYPE_PLANAR4_LSHAPED    0xD
> +#define ACPI_NHLT_ARRAYTYPE_LINEAR4_GEO2       0xE
> +#define ACPI_NHLT_ARRAYTYPE_VENDOR             0xF
> +
> +struct acpi_nhlt2_vendor_mic_config {
> +       u8 type;
> +       u8 panel;
> +       u16 speaker_position_distance;          /* mm */
> +       u16 horizontal_offset;                  /* mm */
> +       u16 vertical_offset;                    /* mm */
> +       u8 frequency_low_band;                  /* 5*Hz */
> +       u8 frequency_high_band;                 /* 500*Hz */
> +       u16 direction_angle;                    /* -180 - +180 */
> +       u16 elevation_angle;                    /* -180 - +180 */
> +       u16 work_vertical_angle_begin;          /* -180 - +180 with 2 deg step */
> +       u16 work_vertical_angle_end;            /* -180 - +180 with 2 deg step */
> +       u16 work_horizontal_angle_begin;        /* -180 - +180 with 2 deg step */
> +       u16 work_horizontal_angle_end;          /* -180 - +180 with 2 deg step */
> +};
> +
> +/* Values for Type field above */
> +
> +#define ACPI_NHLT_MICTYPE_OMNIDIRECTIONAL      0
> +#define ACPI_NHLT_MICTYPE_SUBCARDIOID          1
> +#define ACPI_NHLT_MICTYPE_CARDIOID             2
> +#define ACPI_NHLT_MICTYPE_SUPERCARDIOID                3
> +#define ACPI_NHLT_MICTYPE_HYPERCARDIOID                4
> +#define ACPI_NHLT_MICTYPE_8SHAPED              5
> +#define ACPI_NHLT_MICTYPE_RESERVED             6
> +#define ACPI_NHLT_MICTYPE_VENDORDEFINED                7
> +
> +/* Values for Panel field above */
> +
> +#define ACPI_NHLT_MICLOCATION_TOP              0
> +#define ACPI_NHLT_MICLOCATION_BOTTOM           1
> +#define ACPI_NHLT_MICLOCATION_LEFT             2
> +#define ACPI_NHLT_MICLOCATION_RIGHT            3
> +#define ACPI_NHLT_MICLOCATION_FRONT            4
> +#define ACPI_NHLT_MICLOCATION_REAR             5
> +
> +struct acpi_nhlt_vendor_micdevice_config {
> +       u8 virtual_slot;
> +       u8 config_type;
> +       u8 array_type;
> +       u8 mics_count;
> +       struct acpi_nhlt2_vendor_mic_config mics[];
> +};
> +
> +union acpi_nhlt_device_config {
> +       u8 virtual_slot;
> +       struct acpi_nhlt_gendevice_config gen;
> +       struct acpi_nhlt_micdevice_config mic;
> +       struct acpi_nhlt_vendor_micdevice_config vendor_mic;
> +};
> +
> +/* Inherited from Microsoft's WAVEFORMATEXTENSIBLE. */
> +struct acpi_nhlt2_wave_formatext {
> +       u16 format_tag;
> +       u16 channel_count;
> +       u32 samples_per_sec;
> +       u32 avg_bytes_per_sec;
> +       u16 block_align;
> +       u16 bits_per_sample;
> +       u16 extra_format_size;
> +       u16 valid_bits_per_sample;
> +       u32 channel_mask;
> +       u8 subformat[16];
> +};
> +
> +struct acpi_nhlt2_format_config {
> +       struct acpi_nhlt2_wave_formatext format;
> +       struct acpi_nhlt_config config;
> +};
> +
> +struct acpi_nhlt2_formats_config {
> +       u8 formats_count;
> +       struct acpi_nhlt2_format_config formats[];
> +};
> +
> +struct acpi_nhlt2_device_info {
> +       u8 id[16];
> +       u8 instance_id;
> +       u8 port_id;
> +};
> +
> +struct acpi_nhlt_devices_info {
> +       u8 devices_count;
> +       struct acpi_nhlt2_device_info devices[];
> +};
> +
>  /*******************************************************************************
>   *
>   * PCCT - Platform Communications Channel Table (ACPI 5.0)
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 2/4] ACPI: NHLT: Introduce API for the table
  2024-03-11 10:16 ` [PATCH v7 2/4] ACPI: NHLT: Introduce API for the table Cezary Rojewski
@ 2024-03-12 20:23   ` Rafael J. Wysocki
  0 siblings, 0 replies; 9+ messages in thread
From: Rafael J. Wysocki @ 2024-03-12 20:23 UTC (permalink / raw)
  To: Cezary Rojewski
  Cc: rafael, linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart, andriy.shevchenko

On Mon, Mar 11, 2024 at 11:15 AM Cezary Rojewski
<cezary.rojewski@intel.com> wrote:
>
> The table is composed of a range of endpoints with each describing
> audio formats they support. Most of the operations involve iterating
> over elements of the table and filtering them. Simplify the process by
> implementing range of getters.
>
> While the acpi_nhlt_endpoint_mic_count() stands out a bit, it is a
> critical component for any AudioDSP driver to know how many digital
> microphones it is dealing with.
>
> Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
> ---
>  drivers/acpi/Kconfig  |   3 +
>  drivers/acpi/Makefile |   1 +
>  drivers/acpi/nhlt.c   | 289 ++++++++++++++++++++++++++++++++++++++++++
>  include/acpi/nhlt.h   | 181 ++++++++++++++++++++++++++
>  4 files changed, 474 insertions(+)
>  create mode 100644 drivers/acpi/nhlt.c
>  create mode 100644 include/acpi/nhlt.h
>
> diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
> index 3c3f8037ebed..c45a4238c5fd 100644
> --- a/drivers/acpi/Kconfig
> +++ b/drivers/acpi/Kconfig
> @@ -484,6 +484,9 @@ config ACPI_REDUCED_HARDWARE_ONLY
>
>           If you are unsure what to do, do not enable this option.
>
> +config ACPI_NHLT
> +       bool
> +
>  source "drivers/acpi/nfit/Kconfig"
>  source "drivers/acpi/numa/Kconfig"
>  source "drivers/acpi/apei/Kconfig"
> diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
> index 12ef8180d272..197e1e7154cb 100644
> --- a/drivers/acpi/Makefile
> +++ b/drivers/acpi/Makefile
> @@ -93,6 +93,7 @@ obj-$(CONFIG_ACPI_THERMAL_LIB)        += thermal_lib.o
>  obj-$(CONFIG_ACPI_THERMAL)     += thermal.o
>  obj-$(CONFIG_ACPI_PLATFORM_PROFILE)    += platform_profile.o
>  obj-$(CONFIG_ACPI_NFIT)                += nfit/
> +obj-$(CONFIG_ACPI_NHLT)                += nhlt.o
>  obj-$(CONFIG_ACPI_NUMA)                += numa/
>  obj-$(CONFIG_ACPI)             += acpi_memhotplug.o
>  obj-$(CONFIG_ACPI_HOTPLUG_IOAPIC) += ioapic.o
> diff --git a/drivers/acpi/nhlt.c b/drivers/acpi/nhlt.c
> new file mode 100644
> index 000000000000..599dce778334
> --- /dev/null
> +++ b/drivers/acpi/nhlt.c
> @@ -0,0 +1,289 @@
> +// SPDX-License-Identifier: GPL-2.0-only

The part below should be a C-style comment as per the kernel coding style.

> +//
> +// Copyright(c) 2023-2024 Intel Corporation. All rights reserved.

And please drop the "All rights reserved" part.  The license is GPL
(v2), so some rights are in fact not reserved.

> +//
> +// Authors: Cezary Rojewski <cezary.rojewski@intel.com>
> +//          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
> +//
> +

The rest of the patch LGTM.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v7 3/4] ACPI: NHLT: Drop redundant types
  2024-03-11 10:16 ` [PATCH v7 3/4] ACPI: NHLT: Drop redundant types Cezary Rojewski
@ 2024-03-12 20:23   ` Rafael J. Wysocki
  0 siblings, 0 replies; 9+ messages in thread
From: Rafael J. Wysocki @ 2024-03-12 20:23 UTC (permalink / raw)
  To: Cezary Rojewski
  Cc: rafael, linux-acpi, robert.moore, amadeuszx.slawinski,
	pierre-louis.bossart, andriy.shevchenko

On Mon, Mar 11, 2024 at 11:15 AM Cezary Rojewski
<cezary.rojewski@intel.com> wrote:
>
> There are no users for the duplicated NHLT table components.
>
> Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>

This also needs to point to the upstream ACPICA pull request and
commit corresponding to it.

> ---
>  include/acpi/actbl2.h | 254 ------------------------------------------
>  1 file changed, 254 deletions(-)
>
> diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
> index 8030a1743100..31a716a74340 100644
> --- a/include/acpi/actbl2.h
> +++ b/include/acpi/actbl2.h
> @@ -1887,260 +1887,6 @@ struct nfit_device_handle {
>  #define ACPI_NFIT_GET_NODE_ID(handle) \
>         (((handle) & ACPI_NFIT_NODE_ID_MASK)        >> ACPI_NFIT_NODE_ID_OFFSET)
>
> -/*******************************************************************************
> - *
> - * NHLT - Non HD Audio Link Table
> - *
> - * Conforms to: Intel Smart Sound Technology NHLT Specification
> - * Version 0.8.1, January 2020.
> - *
> - ******************************************************************************/
> -
> -/* Main table */
> -
> -struct acpi_table_nhlt {
> -       struct acpi_table_header header;        /* Common ACPI table header */
> -       u8 endpoint_count;
> -};
> -
> -struct acpi_nhlt_endpoint {
> -       u32 descriptor_length;
> -       u8 link_type;
> -       u8 instance_id;
> -       u16 vendor_id;
> -       u16 device_id;
> -       u16 revision_id;
> -       u32 subsystem_id;
> -       u8 device_type;
> -       u8 direction;
> -       u8 virtual_bus_id;
> -};
> -
> -/* Types for link_type 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 device_id field above */
> -
> -#define ACPI_NHLT_PDM_DMIC                  0xAE20
> -#define ACPI_NHLT_BT_SIDEBAND               0xAE30
> -#define ACPI_NHLT_I2S_TDM_CODECS            0xAE23
> -
> -/* Values for device_type 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 */
> -
> -struct acpi_nhlt_device_specific_config {
> -       u32 capabilities_size;
> -       u8 virtual_slot;
> -       u8 config_type;
> -};
> -
> -struct acpi_nhlt_device_specific_config_a {
> -       u32 capabilities_size;
> -       u8 virtual_slot;
> -       u8 config_type;
> -       u8 array_type;
> -};
> -
> -/* Values for Config Type above */
> -
> -#define ACPI_NHLT_CONFIG_TYPE_GENERIC              0x00
> -#define ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY            0x01
> -#define ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK      0x03
> -#define ACPI_NHLT_CONFIG_TYPE_RESERVED             0x04        /* 4 and above are reserved */
> -
> -struct acpi_nhlt_device_specific_config_b {
> -       u32 capabilities_size;
> -};
> -
> -struct acpi_nhlt_device_specific_config_c {
> -       u32 capabilities_size;
> -       u8 virtual_slot;
> -};
> -
> -struct acpi_nhlt_render_device_specific_config {
> -       u32 capabilities_size;
> -       u8 virtual_slot;
> -};
> -
> -struct acpi_nhlt_wave_extensible {
> -       u16 format_tag;
> -       u16 channel_count;
> -       u32 samples_per_sec;
> -       u32 avg_bytes_per_sec;
> -       u16 block_align;
> -       u16 bits_per_sample;
> -       u16 extra_format_size;
> -       u16 valid_bits_per_sample;
> -       u32 channel_mask;
> -       u8 sub_format_guid[16];
> -};
> -
> -/* Values for channel_mask 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
> -
> -struct acpi_nhlt_format_config {
> -       struct acpi_nhlt_wave_extensible format;
> -       u32 capability_size;
> -       u8 capabilities[];
> -};
> -
> -struct acpi_nhlt_formats_config {
> -       u8 formats_count;
> -};
> -
> -struct acpi_nhlt_device_specific_hdr {
> -       u8 virtual_slot;
> -       u8 config_type;
> -};
> -
> -/* Types for config_type above */
> -
> -#define ACPI_NHLT_GENERIC                   0
> -#define ACPI_NHLT_MIC                       1
> -#define ACPI_NHLT_RENDER                    3
> -
> -struct acpi_nhlt_mic_device_specific_config {
> -       struct acpi_nhlt_device_specific_hdr device_config;
> -       u8 array_type_ext;
> -};
> -
> -/* Values for array_type_ext above */
> -
> -#define ACPI_NHLT_ARRAY_TYPE_RESERVED               0x09       /* 9 and below are reserved */
> -#define ACPI_NHLT_SMALL_LINEAR_2ELEMENT             0x0A
> -#define ACPI_NHLT_BIG_LINEAR_2ELEMENT               0x0B
> -#define ACPI_NHLT_FIRST_GEOMETRY_LINEAR_4ELEMENT    0x0C
> -#define ACPI_NHLT_PLANAR_LSHAPED_4ELEMENT           0x0D
> -#define ACPI_NHLT_SECOND_GEOMETRY_LINEAR_4ELEMENT   0x0E
> -#define ACPI_NHLT_VENDOR_DEFINED                    0x0F
> -#define ACPI_NHLT_ARRAY_TYPE_MASK                   0x0F
> -#define ACPI_NHLT_ARRAY_TYPE_EXT_MASK               0x10
> -
> -#define ACPI_NHLT_NO_EXTENSION                      0x0
> -#define ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT           (1<<4)
> -
> -struct acpi_nhlt_vendor_mic_count {
> -       u8 microphone_count;
> -};
> -
> -struct acpi_nhlt_vendor_mic_config {
> -       u8 type;
> -       u8 panel;
> -       u16 speaker_position_distance;  /* mm */
> -       u16 horizontal_offset;  /* mm */
> -       u16 vertical_offset;    /* mm */
> -       u8 frequency_low_band;  /* 5*Hz */
> -       u8 frequency_high_band; /* 500*Hz */
> -       u16 direction_angle;    /* -180 - + 180 */
> -       u16 elevation_angle;    /* -180 - + 180 */
> -       u16 work_vertical_angle_begin;  /* -180 - + 180 with 2 deg step */
> -       u16 work_vertical_angle_end;    /* -180 - + 180 with 2 deg step */
> -       u16 work_horizontal_angle_begin;        /* -180 - + 180 with 2 deg step */
> -       u16 work_horizontal_angle_end;  /* -180 - + 180 with 2 deg step */
> -};
> -
> -/* Values for Type field above */
> -
> -#define ACPI_NHLT_MIC_OMNIDIRECTIONAL       0
> -#define ACPI_NHLT_MIC_SUBCARDIOID           1
> -#define ACPI_NHLT_MIC_CARDIOID              2
> -#define ACPI_NHLT_MIC_SUPER_CARDIOID        3
> -#define ACPI_NHLT_MIC_HYPER_CARDIOID        4
> -#define ACPI_NHLT_MIC_8_SHAPED              5
> -#define ACPI_NHLT_MIC_RESERVED6             6  /* 6 is reserved */
> -#define ACPI_NHLT_MIC_VENDOR_DEFINED        7
> -#define ACPI_NHLT_MIC_RESERVED              8  /* 8 and above are reserved */
> -
> -/* Values for Panel field above */
> -
> -#define ACPI_NHLT_MIC_POSITION_TOP          0
> -#define ACPI_NHLT_MIC_POSITION_BOTTOM       1
> -#define ACPI_NHLT_MIC_POSITION_LEFT         2
> -#define ACPI_NHLT_MIC_POSITION_RIGHT        3
> -#define ACPI_NHLT_MIC_POSITION_FRONT        4
> -#define ACPI_NHLT_MIC_POSITION_BACK         5
> -#define ACPI_NHLT_MIC_POSITION_RESERVED     6  /* 6 and above are reserved */
> -
> -struct acpi_nhlt_vendor_mic_device_specific_config {
> -       struct acpi_nhlt_mic_device_specific_config mic_array_device_config;
> -       u8 number_of_microphones;
> -       struct acpi_nhlt_vendor_mic_config mic_config[];        /* Indexed by number_of_microphones */
> -};
> -
> -/* Microphone SNR and Sensitivity extension */
> -
> -struct acpi_nhlt_mic_snr_sensitivity_extension {
> -       u32 SNR;
> -       u32 sensitivity;
> -};
> -
> -/* Render device with feedback */
> -
> -struct acpi_nhlt_render_feedback_device_specific_config {
> -       u8 feedback_virtual_slot;       /* Render slot in case of capture */
> -       u16 feedback_channels;  /* Informative only */
> -       u16 feedback_valid_bits_per_sample;
> -};
> -
> -/* Non documented structures */
> -
> -struct acpi_nhlt_device_info_count {
> -       u8 structure_count;
> -};
> -
> -struct acpi_nhlt_device_info {
> -       u8 device_id[16];
> -       u8 device_instance_id;
> -       u8 device_port_id;
> -};
> -
>  /*******************************************************************************
>   *
>   * NHLT - Non HDAudio Link Table
> --
> 2.25.1
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-03-12 20:24 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-11 10:16 [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Cezary Rojewski
2024-03-11 10:16 ` [PATCH v7 1/4] ACPI: NHLT: Reintroduce types the table consists of Cezary Rojewski
2024-03-12 20:14   ` Rafael J. Wysocki
2024-03-11 10:16 ` [PATCH v7 2/4] ACPI: NHLT: Introduce API for the table Cezary Rojewski
2024-03-12 20:23   ` Rafael J. Wysocki
2024-03-11 10:16 ` [PATCH v7 3/4] ACPI: NHLT: Drop redundant types Cezary Rojewski
2024-03-12 20:23   ` Rafael J. Wysocki
2024-03-11 10:16 ` [PATCH v7 4/4] ACPI: NHLT: Streamline struct naming Cezary Rojewski
2024-03-11 10:34 ` [PATCH v7 0/4] ACPI: NHLT: Access and query helpers Andy Shevchenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.