File Index
Files and directories
Sign in
FILE

acpi.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/wireless/realtek/rtw89/acpi.h C
  1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
  2/* Copyright(c) 2021-2023  Realtek Corporation
  3 */
  4
  5#ifndef __RTW89_ACPI_H__
  6#define __RTW89_ACPI_H__
  7
  8#include "core.h"
  9
 10struct rtw89_acpi_data {
 11	u32 len;
 12	u8 buf[] __counted_by(len);
 13};
 14
 15enum rtw89_acpi_dsm_func {
 16	RTW89_ACPI_DSM_FUNC_IDN_BAND_SUP = 2,
 17	RTW89_ACPI_DSM_FUNC_6G_DIS = 3,
 18	RTW89_ACPI_DSM_FUNC_6G_BP = 4,
 19	RTW89_ACPI_DSM_FUNC_TAS_EN = 5,
 20	RTW89_ACPI_DSM_FUNC_UNII4_SUP = 6,
 21	RTW89_ACPI_DSM_FUNC_6GHZ_SP_SUP = 7,
 22	RTW89_ACPI_DSM_FUNC_REG_RULES_EN = 10,
 23	RTW89_ACPI_DSM_FUNC_6GHZ_VLP_SUP = 11,
 24};
 25
 26enum rtw89_acpi_conf_unii4 {
 27	RTW89_ACPI_CONF_UNII4_US = BIT(0),
 28	RTW89_ACPI_CONF_UNII4_CA = BIT(1),
 29};
 30
 31enum rtw89_acpi_policy_mode {
 32	RTW89_ACPI_POLICY_BLOCK = 0,
 33	RTW89_ACPI_POLICY_ALLOW = 1,
 34};
 35
 36enum rtw89_acpi_conf_tas {
 37	RTW89_ACPI_CONF_TAS_US = BIT(0),
 38	RTW89_ACPI_CONF_TAS_CA = BIT(1),
 39	RTW89_ACPI_CONF_TAS_KR = BIT(2),
 40	RTW89_ACPI_CONF_TAS_OTHERS = BIT(7),
 41};
 42
 43struct rtw89_acpi_country_code {
 44	/* below are allowed:
 45	 * * ISO alpha2 country code
 46	 * * EU for countries in Europe
 47	 */
 48	char alpha2[2];
 49} __packed;
 50
 51struct rtw89_acpi_policy_6ghz {
 52	u8 signature[3];
 53	u8 rsvd;
 54	u8 policy_mode;
 55	u8 country_count;
 56	struct rtw89_acpi_country_code country_list[] __counted_by(country_count);
 57} __packed;
 58
 59enum rtw89_acpi_conf_6ghz_sp {
 60	RTW89_ACPI_CONF_6GHZ_SP_US = BIT(0),
 61	RTW89_ACPI_CONF_6GHZ_SP_CA = BIT(1),
 62};
 63
 64struct rtw89_acpi_policy_6ghz_sp {
 65	u8 signature[4];
 66	u8 revision;
 67	u8 override;
 68	u8 conf;
 69	u8 rsvd;
 70} __packed;
 71
 72enum rtw89_acpi_conf_6ghz_vlp {
 73	RTW89_ACPI_CONF_6GHZ_VLP_US = BIT(0),
 74	RTW89_ACPI_CONF_6GHZ_VLP_CA = BIT(1),
 75};
 76
 77struct rtw89_acpi_policy_6ghz_vlp {
 78	u8 signature[4];
 79	u8 revision;
 80	u8 override;
 81	u8 conf;
 82	u8 rsvd;
 83} __packed;
 84
 85struct rtw89_acpi_policy_tas {
 86	u8 signature[4];
 87	u8 revision;
 88	u8 enable;
 89	u8 enabled_countries;
 90	u8 rsvd[3];
 91} __packed;
 92
 93enum rtw89_acpi_conf_reg_rules {
 94	RTW89_ACPI_CONF_REG_RULE_REGD_UK = BIT(0),
 95};
 96
 97struct rtw89_acpi_policy_reg_rules {
 98	u8 signature[4];
 99	u8 revision;
100	u8 conf;
101	u8 rsvd[3];
102} __packed;
103
104struct rtw89_acpi_dsm_result {
105	union {
106		u8 value;
107		/* caller needs to free it after using */
108		struct rtw89_acpi_policy_6ghz *policy_6ghz;
109		struct rtw89_acpi_policy_6ghz_sp *policy_6ghz_sp;
110		struct rtw89_acpi_policy_6ghz_vlp *policy_6ghz_vlp;
111		struct rtw89_acpi_policy_tas *policy_tas;
112		struct rtw89_acpi_policy_reg_rules *policy_reg_rules;
113	} u;
114};
115
116struct rtw89_acpi_rtag_result {
117	u8 tag[4];
118	u8 revision;
119	__le32 domain;
120	u8 ant_gain_table[RTW89_ANT_GAIN_CHAIN_NUM][RTW89_ANT_GAIN_SUBBAND_NR];
121} __packed;
122
123enum rtw89_acpi_sar_cid {
124	RTW89_ACPI_SAR_CID_HP = 0x5048,
125	RTW89_ACPI_SAR_CID_RT = 0x5452,
126};
127
128enum rtw89_acpi_sar_rev {
129	RTW89_ACPI_SAR_REV_LEGACY = 1,
130	RTW89_ACPI_SAR_REV_HAS_6GHZ = 2,
131};
132
133#define RTW89_ACPI_SAR_ANT_NR_STD 4
134#define RTW89_ACPI_SAR_ANT_NR_SML 2
135
136#define RTW89_ACPI_METHOD_STATIC_SAR "WRDS"
137#define RTW89_ACPI_METHOD_DYNAMIC_SAR "RWRD"
138#define RTW89_ACPI_METHOD_DYNAMIC_SAR_INDICATOR "RWSI"
139#define RTW89_ACPI_METHOD_GEO_SAR "RWGS"
140
141struct rtw89_acpi_sar_std_legacy {
142	u8 v[RTW89_ACPI_SAR_ANT_NR_STD][RTW89_ACPI_SAR_SUBBAND_NR_LEGACY];
143} __packed;
144
145struct rtw89_acpi_sar_std_has_6ghz {
146	u8 v[RTW89_ACPI_SAR_ANT_NR_STD][RTW89_ACPI_SAR_SUBBAND_NR_HAS_6GHZ];
147} __packed;
148
149struct rtw89_acpi_sar_sml_legacy {
150	u8 v[RTW89_ACPI_SAR_ANT_NR_SML][RTW89_ACPI_SAR_SUBBAND_NR_LEGACY];
151} __packed;
152
153struct rtw89_acpi_sar_sml_has_6ghz {
154	u8 v[RTW89_ACPI_SAR_ANT_NR_SML][RTW89_ACPI_SAR_SUBBAND_NR_HAS_6GHZ];
155} __packed;
156
157struct rtw89_acpi_static_sar_hdr {
158	__le16 cid;
159	u8 rev;
160	u8 content[];
161} __packed;
162
163struct rtw89_acpi_dynamic_sar_hdr {
164	__le16 cid;
165	u8 rev;
166	u8 cnt;
167	u8 content[];
168} __packed;
169
170struct rtw89_acpi_sar_identifier {
171	enum rtw89_acpi_sar_cid cid;
172	enum rtw89_acpi_sar_rev rev;
173	u8 size;
174};
175
176/* for rtw89_acpi_sar_identifier::size */
177#define RTW89_ACPI_SAR_SIZE_MAX U8_MAX
178#define RTW89_ACPI_SAR_SIZE_OF(type) \
179	(BUILD_BUG_ON_ZERO(sizeof(struct rtw89_acpi_sar_ ## type) > \
180			   RTW89_ACPI_SAR_SIZE_MAX) + \
181	 sizeof(struct rtw89_acpi_sar_ ## type))
182
183struct rtw89_acpi_sar_recognition {
184	struct rtw89_acpi_sar_identifier id;
185	const struct rtw89_acpi_geo_sar_handler *geo;
186
187	u8 (*rfpath_to_antidx)(enum rtw89_rf_path rfpath);
188	s16 (*normalize)(u8 v);
189	void (*load)(struct rtw89_dev *rtwdev,
190		     const struct rtw89_acpi_sar_recognition *rec,
191		     const void *content,
192		     struct rtw89_sar_entry_from_acpi *ent);
193};
194
195struct rtw89_acpi_geo_sar_hp_val {
196	u8 max;
197	s8 delta[RTW89_ACPI_SAR_ANT_NR_STD];
198} __packed;
199
200struct rtw89_acpi_geo_sar_hp_legacy_entry {
201	struct rtw89_acpi_geo_sar_hp_val val_2ghz;
202	struct rtw89_acpi_geo_sar_hp_val val_5ghz;
203} __packed;
204
205struct rtw89_acpi_geo_sar_hp_has_6ghz_entry {
206	struct rtw89_acpi_geo_sar_hp_val val_2ghz;
207	struct rtw89_acpi_geo_sar_hp_val val_5ghz;
208	struct rtw89_acpi_geo_sar_hp_val val_6ghz;
209} __packed;
210
211enum rtw89_acpi_geo_sar_regd_hp {
212	RTW89_ACPI_GEO_SAR_REGD_HP_FCC = 0,
213	RTW89_ACPI_GEO_SAR_REGD_HP_ETSI = 1,
214	RTW89_ACPI_GEO_SAR_REGD_HP_WW = 2,
215
216	RTW89_ACPI_GEO_SAR_REGD_NR_HP,
217};
218
219struct rtw89_acpi_geo_sar_hp_legacy {
220	struct rtw89_acpi_geo_sar_hp_legacy_entry
221		entries[RTW89_ACPI_GEO_SAR_REGD_NR_HP];
222} __packed;
223
224struct rtw89_acpi_geo_sar_hp_has_6ghz {
225	struct rtw89_acpi_geo_sar_hp_has_6ghz_entry
226		entries[RTW89_ACPI_GEO_SAR_REGD_NR_HP];
227} __packed;
228
229struct rtw89_acpi_geo_sar_rt_val {
230	u8 max;
231	s8 delta;
232} __packed;
233
234struct rtw89_acpi_geo_sar_rt_legacy_entry {
235	struct rtw89_acpi_geo_sar_rt_val val_2ghz;
236	struct rtw89_acpi_geo_sar_rt_val val_5ghz;
237} __packed;
238
239struct rtw89_acpi_geo_sar_rt_has_6ghz_entry {
240	struct rtw89_acpi_geo_sar_rt_val val_2ghz;
241	struct rtw89_acpi_geo_sar_rt_val val_5ghz;
242	struct rtw89_acpi_geo_sar_rt_val val_6ghz;
243} __packed;
244
245enum rtw89_acpi_geo_sar_regd_rt {
246	RTW89_ACPI_GEO_SAR_REGD_RT_FCC = 0,
247	RTW89_ACPI_GEO_SAR_REGD_RT_ETSI = 1,
248	RTW89_ACPI_GEO_SAR_REGD_RT_MKK = 2,
249	RTW89_ACPI_GEO_SAR_REGD_RT_IC = 3,
250	RTW89_ACPI_GEO_SAR_REGD_RT_KCC = 4,
251	RTW89_ACPI_GEO_SAR_REGD_RT_WW = 5,
252
253	RTW89_ACPI_GEO_SAR_REGD_NR_RT,
254};
255
256struct rtw89_acpi_geo_sar_rt_legacy {
257	struct rtw89_acpi_geo_sar_rt_legacy_entry
258		entries[RTW89_ACPI_GEO_SAR_REGD_NR_RT];
259} __packed;
260
261struct rtw89_acpi_geo_sar_rt_has_6ghz {
262	struct rtw89_acpi_geo_sar_rt_has_6ghz_entry
263		entries[RTW89_ACPI_GEO_SAR_REGD_NR_RT];
264} __packed;
265
266struct rtw89_acpi_geo_sar_handler {
267	u8 data_size;
268
269	void (*load)(struct rtw89_dev *rtwdev,
270		     const void *content,
271		     enum rtw89_regulation_type regd,
272		     struct rtw89_sar_entry_from_acpi *ent);
273};
274
275/* for rtw89_acpi_geo_sar_handler::data_size */
276#define RTW89_ACPI_GEO_SAR_SIZE_MAX U8_MAX
277#define RTW89_ACPI_GEO_SAR_SIZE_OF(type) \
278	(BUILD_BUG_ON_ZERO(sizeof(struct rtw89_acpi_geo_sar_ ## type) > \
279			   RTW89_ACPI_GEO_SAR_SIZE_MAX) + \
280	 sizeof(struct rtw89_acpi_geo_sar_ ## type))
281
282enum rtw89_acpi_sar_subband rtw89_acpi_sar_get_subband(struct rtw89_dev *rtwdev,
283						       u32 center_freq);
284enum rtw89_band rtw89_acpi_sar_subband_to_band(struct rtw89_dev *rtwdev,
285					       enum rtw89_acpi_sar_subband subband);
286
287int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev,
288			    enum rtw89_acpi_dsm_func func,
289			    struct rtw89_acpi_dsm_result *res);
290int rtw89_acpi_evaluate_rtag(struct rtw89_dev *rtwdev,
291			     struct rtw89_acpi_rtag_result *res);
292int rtw89_acpi_evaluate_sar(struct rtw89_dev *rtwdev,
293			    struct rtw89_sar_cfg_acpi *cfg);
294int rtw89_acpi_evaluate_dynamic_sar_indicator(struct rtw89_dev *rtwdev,
295					      struct rtw89_sar_cfg_acpi *cfg,
296					      bool *changed);
297
298#endif
~/ Read-only file preview.