]>
Commit | Line | Data |
---|---|---|
82b8acc0 CR |
1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* | |
3 | * Copyright(c) 2023-2024 Intel Corporation | |
4 | * | |
5 | * Authors: Cezary Rojewski <[email protected]> | |
6 | * Amadeusz Slawinski <[email protected]> | |
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 | */ | |
a640acab CR |
26 | static inline struct acpi_nhlt_formats_config * |
27 | acpi_nhlt_endpoint_fmtscfg(const struct acpi_nhlt_endpoint *ep) | |
82b8acc0 CR |
28 | { |
29 | struct acpi_nhlt_config *cfg = __acpi_nhlt_endpoint_config(ep); | |
30 | ||
a640acab | 31 | return (struct acpi_nhlt_formats_config *)((u8 *)(cfg + 1) + cfg->capabilities_size); |
82b8acc0 CR |
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 the | |
54 | * variable length of each endpoint structure and the possible presence | |
55 | * 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 its | |
94 | * initialization and removal respectively to avoid excessive mapping | |
95 | * and unmapping of the memory occupied by the table between streaming | |
96 | * operations. | |
97 | */ | |
98 | ||
99 | acpi_status acpi_nhlt_get_gbl_table(void); | |
100 | void acpi_nhlt_put_gbl_table(void); | |
101 | ||
a640acab | 102 | bool acpi_nhlt_endpoint_match(const struct acpi_nhlt_endpoint *ep, |
82b8acc0 | 103 | int link_type, int dev_type, int dir, int bus_id); |
a640acab CR |
104 | struct acpi_nhlt_endpoint * |
105 | acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt *tb, | |
82b8acc0 | 106 | int link_type, int dev_type, int dir, int bus_id); |
a640acab | 107 | struct acpi_nhlt_endpoint * |
82b8acc0 | 108 | acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id); |
a640acab CR |
109 | struct acpi_nhlt_format_config * |
110 | acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt_endpoint *ep, | |
82b8acc0 | 111 | u16 ch, u32 rate, u16 vbps, u16 bps); |
a640acab CR |
112 | struct acpi_nhlt_format_config * |
113 | acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt *tb, | |
82b8acc0 CR |
114 | int link_type, int dev_type, int dir, int bus_id, |
115 | u16 ch, u32 rate, u16 vpbs, u16 bps); | |
a640acab | 116 | struct acpi_nhlt_format_config * |
82b8acc0 CR |
117 | acpi_nhlt_find_fmtcfg(int link_type, int dev_type, int dir, int bus_id, |
118 | u16 ch, u32 rate, u16 vpbs, u16 bps); | |
a640acab | 119 | int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt_endpoint *ep); |
82b8acc0 CR |
120 | |
121 | #else /* !CONFIG_ACPI_NHLT */ | |
122 | ||
123 | static inline acpi_status acpi_nhlt_get_gbl_table(void) | |
124 | { | |
125 | return AE_NOT_FOUND; | |
126 | } | |
127 | ||
128 | static inline void acpi_nhlt_put_gbl_table(void) | |
129 | { | |
130 | } | |
131 | ||
132 | static inline bool | |
a640acab | 133 | acpi_nhlt_endpoint_match(const struct acpi_nhlt_endpoint *ep, |
82b8acc0 CR |
134 | int link_type, int dev_type, int dir, int bus_id) |
135 | { | |
136 | return false; | |
137 | } | |
138 | ||
a640acab CR |
139 | static inline struct acpi_nhlt_endpoint * |
140 | acpi_nhlt_tb_find_endpoint(const struct acpi_table_nhlt *tb, | |
82b8acc0 CR |
141 | int link_type, int dev_type, int dir, int bus_id) |
142 | { | |
143 | return NULL; | |
144 | } | |
145 | ||
a640acab CR |
146 | static inline struct acpi_nhlt_format_config * |
147 | acpi_nhlt_endpoint_find_fmtcfg(const struct acpi_nhlt_endpoint *ep, | |
82b8acc0 CR |
148 | u16 ch, u32 rate, u16 vbps, u16 bps) |
149 | { | |
150 | return NULL; | |
151 | } | |
152 | ||
a640acab CR |
153 | static inline struct acpi_nhlt_format_config * |
154 | acpi_nhlt_tb_find_fmtcfg(const struct acpi_table_nhlt *tb, | |
82b8acc0 CR |
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 | ||
a640acab | 161 | static inline int acpi_nhlt_endpoint_mic_count(const struct acpi_nhlt_endpoint *ep) |
82b8acc0 CR |
162 | { |
163 | return 0; | |
164 | } | |
165 | ||
a640acab | 166 | static inline struct acpi_nhlt_endpoint * |
82b8acc0 CR |
167 | acpi_nhlt_find_endpoint(int link_type, int dev_type, int dir, int bus_id) |
168 | { | |
169 | return NULL; | |
170 | } | |
171 | ||
a640acab | 172 | static inline struct acpi_nhlt_format_config * |
82b8acc0 CR |
173 | acpi_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__ */ |