From: Cezary Rojewski <cezary.rojewski@intel.com>
To: rafael@kernel.org, robert.moore@intel.com
Cc: linux-acpi@vger.kernel.org, amadeuszx.slawinski@linux.intel.com,
andriy.shevchenko@linux.intel.com,
pierre-louis.bossart@linux.intel.com,
Cezary Rojewski <cezary.rojewski@intel.com>
Subject: [PATCH v3 1/4] ACPI: NHLT: Device configuration access interface
Date: Fri, 21 Jul 2023 11:47:19 +0200 [thread overview]
Message-ID: <20230721094722.300586-2-cezary.rojewski@intel.com> (raw)
In-Reply-To: <20230721094722.300586-1-cezary.rojewski@intel.com>
Device configuration structures are plenty so declare a struct for each
known variant. As neither of them shall be accessed without verifying
the memory block first, introduce macros to make it easy to do so.
Link: https://github.com/acpica/acpica/pull/881
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
---
include/acpi/actbl2.h | 28 ++++++++++++++++++
include/acpi/nhlt.h | 66 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 94 insertions(+)
create mode 100644 include/acpi/nhlt.h
diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
index 0029336775a9..c4c9a3a89ba6 100644
--- a/include/acpi/actbl2.h
+++ b/include/acpi/actbl2.h
@@ -2014,6 +2014,25 @@ struct acpi_nhlt_vendor_mic_count {
u8 microphone_count;
};
+/* The only guaranteed configuration space header. Any other requires validation. */
+struct acpi_nhlt_cfg {
+ u32 capabilities_size;
+ u8 capabilities[];
+};
+
+struct acpi_nhlt_devcfg {
+ u32 capabilities_size;
+ u8 virtual_slot;
+ u8 config_type;
+};
+
+struct acpi_nhlt_mic_devcfg {
+ u32 capabilities_size;
+ u8 virtual_slot;
+ u8 config_type;
+ u8 array_type;
+};
+
struct acpi_nhlt_vendor_mic_config {
u8 type;
u8 panel;
@@ -2030,6 +2049,15 @@ struct acpi_nhlt_vendor_mic_config {
u16 work_horizontal_angle_end; /* -180 - + 180 with 2 deg step */
};
+struct acpi_nhlt_vendor_mic_devcfg {
+ u32 capabilities_size;
+ u8 virtual_slot;
+ u8 config_type;
+ u8 array_type;
+ u8 num_mics;
+ struct acpi_nhlt_vendor_mic_config mics[];
+};
+
/* Values for Type field above */
#define ACPI_NHLT_MIC_OMNIDIRECTIONAL 0
diff --git a/include/acpi/nhlt.h b/include/acpi/nhlt.h
new file mode 100644
index 000000000000..af3ec45ba4f9
--- /dev/null
+++ b/include/acpi/nhlt.h
@@ -0,0 +1,66 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright(c) 2023 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/overflow.h>
+#include <linux/types.h>
+
+#define __acpi_nhlt_endpoint_cfg(ep) ((void *)((ep) + 1))
+
+/*
+ * As device configuration spaces present in NHLT tables around the world are
+ * not following single pattern, first check if 'capabilities_size' is correct
+ * in respect to size of the specified space type before returning the pointer.
+ */
+#define __acpi_nhlt_endpoint_devcfg(ep, type) ({ \
+ struct acpi_nhlt_cfg *__cfg = __acpi_nhlt_endpoint_cfg(ep); \
+ __cfg->capabilities_size >= sizeof(type) ? \
+ ((type *)__cfg) : NULL; })
+
+/*
+ * acpi_nhlt_endpoint_devcfg - Test and access device configuration.
+ * @ep: endpoint for which to retrieve device configuration.
+ *
+ * Return: A pointer to device configuration space or NULL if the space's
+ * 'capabilities_size' is insufficient to cover the nested structure.
+ */
+#define acpi_nhlt_endpoint_devcfg(ep) \
+ __acpi_nhlt_endpoint_devcfg(ep, struct acpi_nhlt_devcfg)
+
+/*
+ * acpi_nhlt_endpoint_mic_devcfg - Test and access device configuration.
+ * @ep: endpoint for which to retrieve device configuration.
+ *
+ * Return: A pointer to device configuration space or NULL if the space's
+ * 'capabilities_size' is insufficient to cover the nested structure.
+ */
+#define acpi_nhlt_endpoint_mic_devcfg(ep) \
+ __acpi_nhlt_endpoint_devcfg(ep, struct acpi_nhlt_mic_devcfg)
+
+/*
+ * acpi_nhlt_endpoint_vendor_mic_devcfg - Test and access device configuration.
+ * @ep: endpoint for which to retrieve device configuration.
+ * @ptr: pointer to a device configuration structure.
+ *
+ * This is the same as acpi_nhlt_endpoint_devcfg(), except that it verifies
+ * if size of the flexible array following the structure header is also
+ * reflected in 'capabilities_size'.
+ *
+ * Return: A pointer to device configuration space or NULL if the space's
+ * 'capabilities_size' is insufficient to cover the nested structure.
+ */
+#define acpi_nhlt_endpoint_vendor_mic_devcfg(ep) ({ \
+ struct acpi_nhlt_vendor_mic_devcfg *__cfg = __acpi_nhlt_endpoint_cfg(ep); \
+ __cfg->capabilities_size >= sizeof(*__cfg) && \
+ __cfg->capabilities_size == struct_size(__cfg, mics, __cfg->num_mics) ? \
+ __cfg : NULL; })
+
+#endif /* __ACPI_NHLT_H__ */
--
2.25.1
next prev parent reply other threads:[~2023-07-21 9:48 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-21 9:47 [PATCH v3 0/4] ACPI: NHLT: Access and query helpers Cezary Rojewski
2023-07-21 9:47 ` Cezary Rojewski [this message]
2023-07-21 9:47 ` [PATCH v3 2/4] ACPI: NHLT: Introduce acpi_gbl_nhlt Cezary Rojewski
2023-07-21 10:48 ` Andy Shevchenko
2023-07-21 12:44 ` Cezary Rojewski
2023-07-21 12:55 ` Andy Shevchenko
2023-07-21 13:18 ` Cezary Rojewski
2023-07-21 13:52 ` Andy Shevchenko
2023-07-21 9:47 ` [PATCH v3 3/4] ACPI: NHLT: Table manipulation helpers Cezary Rojewski
2023-07-21 9:47 ` [PATCH v3 4/4] ACPI: NHLT: Add query functions Cezary Rojewski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230721094722.300586-2-cezary.rojewski@intel.com \
--to=cezary.rojewski@intel.com \
--cc=amadeuszx.slawinski@linux.intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=pierre-louis.bossart@linux.intel.com \
--cc=rafael@kernel.org \
--cc=robert.moore@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.