diff mbox series

[3/4] ACPI: NHLT: Table manipulation helpers

Message ID 20230712091048.2545319-4-cezary.rojewski@intel.com
State Superseded
Headers show
Series ACPI: NHLT: Access and query helpers | expand

Commit Message

Cezary Rojewski July 12, 2023, 9:10 a.m. UTC
The table is composed of a range of endpoints with each describing
audio formats they support. Thus most of the operations involve
iterating over elements of the table. Simplify the process by
implementing range of getters.

Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
---
 include/acpi/nhlt.h | 68 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

Comments

Cezary Rojewski July 17, 2023, 8:08 a.m. UTC | #1
On 2023-07-12 5:36 PM, Andy Shevchenko wrote:
> On Wed, Jul 12, 2023 at 11:10:47AM +0200, Cezary Rojewski wrote:
>> The table is composed of a range of endpoints with each describing
>> audio formats they support. Thus most of the operations involve
>> iterating over elements of the table. Simplify the process by
>> implementing range of getters.
> 
> A few nit-picks below.
> In general, LGTM,
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> 
> (Please, use my @linux.intel.com address for LKML and related)

...

>> +/*
>> + * The for_each_nhlt_xxx() macros rely on an iterator to deal with the
> 
> I would do s/xxx/*/

Ack.

>> + * 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)->endpoint_count &&				\
>> +		((ep) = __acpi_nhlt_get_endpoint(tb, ep, __i));		\
> 
> Do you really need ep to be in parentheses?

Agree. Also, checked how include/linux/list.h looks like and it aligns 
with your proposal.

>> +	     __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));	\
> 
> Similar for fmt.

Ditto.

>> +	     __i++)
diff mbox series

Patch

diff --git a/include/acpi/nhlt.h b/include/acpi/nhlt.h
index a2b93b08218f..076aac41a74e 100644
--- a/include/acpi/nhlt.h
+++ b/include/acpi/nhlt.h
@@ -81,4 +81,72 @@  static inline void acpi_nhlt_put_gbl_table(void)
 	__cfg->capabilities_size == struct_size(__cfg, mics, __cfg->num_mics) ?		\
 		__cfg : NULL; })
 
+/**
+ * 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_nhlt_formats_config *
+acpi_nhlt_endpoint_fmtscfg(const struct acpi_nhlt_endpoint *ep)
+{
+	struct acpi_nhlt_cfg *cfg = __acpi_nhlt_endpoint_cfg(ep);
+
+	return (struct acpi_nhlt_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)->descriptor_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)->capability_size))
+
+#define __acpi_nhlt_get_fmtcfg(fmts, fmt, i) \
+	((i) ? __acpi_nhlt_next_fmtcfg(fmt) : __acpi_nhlt_first_fmtcfg(fmts))
+
+/*
+ * The for_each_nhlt_xxx() 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)->endpoint_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)
+
 #endif /* __ACPI_NHLT_H__ */