182 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright(c) 2023-2024 Intel Corporation4 *5 * Authors: Cezary Rojewski <cezary.rojewski@intel.com>6 * Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>7 */8 9#ifndef __ACPI_NHLT_H__10#define __ACPI_NHLT_H__11 12#include <linux/acpi.h>13#include <linux/kconfig.h>14#include <linux/overflow.h>15#include <linux/types.h>16 17#define __acpi_nhlt_endpoint_config(ep) ((void *)((ep) + 1))18#define __acpi_nhlt_config_caps(cfg) ((void *)((cfg) + 1))19 20/**21 * acpi_nhlt_endpoint_fmtscfg - Get the formats configuration space.22 * @ep: the endpoint to retrieve the space for.23 *24 * Return: A pointer to the formats configuration space.25 */26static inline struct acpi_nhlt_formats_config *27acpi_nhlt_endpoint_fmtscfg(const struct acpi_nhlt_endpoint *ep)28{29 struct acpi_nhlt_config *cfg = __acpi_nhlt_endpoint_config(ep);30 31 return (struct acpi_nhlt_formats_config *)((u8 *)(cfg + 1) + cfg->capabilities_size);32}33 34#define __acpi_nhlt_first_endpoint(tb) \35 ((void *)(tb + 1))36 37#define __acpi_nhlt_next_endpoint(ep) \38 ((void *)((u8 *)(ep) + (ep)->length))39 40#define __acpi_nhlt_get_endpoint(tb, ep, i) \41 ((i) ? __acpi_nhlt_next_endpoint(ep) : __acpi_nhlt_first_endpoint(tb))42 43#define __acpi_nhlt_first_fmtcfg(fmts) \44 ((void *)(fmts + 1))45 46#define __acpi_nhlt_next_fmtcfg(fmt) \47 ((void *)((u8 *)((fmt) + 1) + (fmt)->config.capabilities_size))48 49#define __acpi_nhlt_get_fmtcfg(fmts, fmt, i) \50 ((i) ? __acpi_nhlt_next_fmtcfg(fmt) : __acpi_nhlt_first_fmtcfg(fmts))51 52/*53 * The for_each_nhlt_*() macros rely on an iterator to deal with the54 * variable length of each endpoint structure and the possible presence55 * of an OED-Config used by Windows only.56 */57 58/**59 * for_each_nhlt_endpoint - Iterate over endpoints in a NHLT table.60 * @tb: the pointer to a NHLT table.61 * @ep: the pointer to endpoint to use as loop cursor.62 */63#define for_each_nhlt_endpoint(tb, ep) \64 for (unsigned int __i = 0; \65 __i < (tb)->endpoints_count && \66 (ep = __acpi_nhlt_get_endpoint(tb, ep, __i)); \67 __i++)68 69/**70 * for_each_nhlt_fmtcfg - Iterate over format configurations.71 * @fmts: the pointer to formats configuration space.72 * @fmt: the pointer to format to use as loop cursor.73 */74#define for_each_nhlt_fmtcfg(fmts, fmt) \75 for (unsigned int __i = 0; \76 __i < (fmts)->formats_count && \77 (fmt = __acpi_nhlt_get_fmtcfg(fmts, fmt, __i)); \78 __i++)79 80/**81 * for_each_nhlt_endpoint_fmtcfg - Iterate over format configurations in an endpoint.82 * @ep: the pointer to an endpoint.83 * @fmt: the pointer to format to use as loop cursor.84 */85#define for_each_nhlt_endpoint_fmtcfg(ep, fmt) \86 for_each_nhlt_fmtcfg(acpi_nhlt_endpoint_fmtscfg(ep), fmt)87 88#if IS_ENABLED(CONFIG_ACPI_NHLT)89 90/*91 * System-wide pointer to the first NHLT table.92 *93 * A sound driver may utilize acpi_nhlt_get/put_gbl_table() on its94 * initialization and removal respectively to avoid excessive mapping95 * and unmapping of the memory occupied by the table between streaming96 * operations.97 */98 99acpi_status acpi_nhlt_get_gbl_table(void);100void acpi_nhlt_put_gbl_table(void);101 102bool acpi_nhlt_endpoint_match(const struct acpi_nhlt_endpoint *ep,103 int link_type, int dev_type, int dir, int bus_id);104struct acpi_nhlt_endpoint *105acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt *tb,106 int link_type, int dev_type, int dir, int bus_id);107struct acpi_nhlt_endpoint *108acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id);109struct acpi_nhlt_format_config *110acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt_endpoint *ep,111 u16 ch, u32 rate, u16 vbps, u16 bps);112struct acpi_nhlt_format_config *113acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt *tb,114 int link_type, int dev_type, int dir, int bus_id,115 u16 ch, u32 rate, u16 vpbs, u16 bps);116struct acpi_nhlt_format_config *117acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id,118 u16 ch, u32 rate, u16 vpbs, u16 bps);119int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt_endpoint *ep);120 121#else /* !CONFIG_ACPI_NHLT */122 123static inline acpi_status acpi_nhlt_get_gbl_table(void)124{125 return AE_NOT_FOUND;126}127 128static inline void acpi_nhlt_put_gbl_table(void)129{130}131 132static inline bool133acpi_nhlt_endpoint_match(const struct acpi_nhlt_endpoint *ep,134 int link_type, int dev_type, int dir, int bus_id)135{136 return false;137}138 139static inline struct acpi_nhlt_endpoint *140acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt *tb,141 int link_type, int dev_type, int dir, int bus_id)142{143 return NULL;144}145 146static inline struct acpi_nhlt_format_config *147acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt_endpoint *ep,148 u16 ch, u32 rate, u16 vbps, u16 bps)149{150 return NULL;151}152 153static inline struct acpi_nhlt_format_config *154acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt *tb,155 int link_type, int dev_type, int dir, int bus_id,156 u16 ch, u32 rate, u16 vpbs, u16 bps)157{158 return NULL;159}160 161static inline int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt_endpoint *ep)162{163 return 0;164}165 166static inline struct acpi_nhlt_endpoint *167acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id)168{169 return NULL;170}171 172static inline struct acpi_nhlt_format_config *173acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id,174 u16 ch, u32 rate, u16 vpbs, u16 bps)175{176 return NULL;177}178 179#endif /* CONFIG_ACPI_NHLT */180 181#endif /* __ACPI_NHLT_H__ */182