xref: /linux/drivers/net/wireless/intel/iwlwifi/fw/uefi.h (revision eb01fe7abbe2d0b38824d2a93fdb4cc3eaf2ccc1)
1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /*
3  * Copyright(c) 2021-2023 Intel Corporation
4  */
5 #ifndef __iwl_fw_uefi__
6 #define __iwl_fw_uefi__
7 
8 #include "fw/regulatory.h"
9 
10 #define IWL_UEFI_OEM_PNVM_NAME		L"UefiCnvWlanOemSignedPnvm"
11 #define IWL_UEFI_REDUCED_POWER_NAME	L"UefiCnvWlanReducedPower"
12 #define IWL_UEFI_SGOM_NAME		L"UefiCnvWlanSarGeoOffsetMapping"
13 #define IWL_UEFI_STEP_NAME		L"UefiCnvCommonSTEP"
14 #define IWL_UEFI_UATS_NAME		L"CnvUefiWlanUATS"
15 #define IWL_UEFI_WRDS_NAME		L"UefiCnvWlanWRDS"
16 #define IWL_UEFI_EWRD_NAME		L"UefiCnvWlanEWRD"
17 #define IWL_UEFI_WGDS_NAME		L"UefiCnvWlanWGDS"
18 #define IWL_UEFI_PPAG_NAME		L"UefiCnvWlanPPAG"
19 #define IWL_UEFI_WTAS_NAME		L"UefiCnvWlanWTAS"
20 #define IWL_UEFI_SPLC_NAME		L"UefiCnvWlanSPLC"
21 #define IWL_UEFI_WRDD_NAME		L"UefiCnvWlanWRDD"
22 #define IWL_UEFI_ECKV_NAME		L"UefiCnvWlanECKV"
23 #define IWL_UEFI_DSM_NAME		L"UefiCnvWlanGeneralCfg"
24 
25 
26 #define IWL_SGOM_MAP_SIZE		339
27 #define IWL_UATS_MAP_SIZE		339
28 
29 #define IWL_UEFI_WRDS_REVISION		2
30 #define IWL_UEFI_EWRD_REVISION		2
31 #define IWL_UEFI_WGDS_REVISION		3
32 #define IWL_UEFI_MIN_PPAG_REV		1
33 #define IWL_UEFI_MAX_PPAG_REV		3
34 #define IWL_UEFI_WTAS_REVISION		1
35 #define IWL_UEFI_SPLC_REVISION		0
36 #define IWL_UEFI_WRDD_REVISION		0
37 #define IWL_UEFI_ECKV_REVISION		0
38 #define IWL_UEFI_DSM_REVISION		4
39 
40 struct pnvm_sku_package {
41 	u8 rev;
42 	u32 total_size;
43 	u8 n_skus;
44 	u32 reserved[2];
45 	u8 data[];
46 } __packed;
47 
48 struct uefi_cnv_wlan_sgom_data {
49 	u8 revision;
50 	u8 offset_map[IWL_SGOM_MAP_SIZE - 1];
51 } __packed;
52 
53 struct uefi_cnv_wlan_uats_data {
54 	u8 revision;
55 	u8 offset_map[IWL_UATS_MAP_SIZE - 1];
56 } __packed;
57 
58 struct uefi_cnv_common_step_data {
59 	u8 revision;
60 	u8 step_mode;
61 	u8 cnvi_eq_channel;
62 	u8 cnvr_eq_channel;
63 	u8 radio1;
64 	u8 radio2;
65 } __packed;
66 
67 /*
68  * struct uefi_sar_profile - a SAR profile as defined in UEFI
69  *
70  * @chains: a per-chain table of SAR values
71  */
72 struct uefi_sar_profile {
73 	struct iwl_sar_profile_chain chains[BIOS_SAR_MAX_CHAINS_PER_PROFILE];
74 } __packed;
75 
76 /*
77  * struct uefi_cnv_var_wrds - WRDS table as defined in UEFI
78  *
79  * @revision: the revision of the table
80  * @mode: is WRDS enbaled/disabled
81  * @sar_profile: sar profile #1
82  */
83 struct uefi_cnv_var_wrds {
84 	u8 revision;
85 	u32 mode;
86 	struct uefi_sar_profile sar_profile;
87 } __packed;
88 
89 /*
90  * struct uefi_cnv_var_ewrd - EWRD table as defined in UEFI
91  * @revision: the revision of the table
92  * @mode: is WRDS enbaled/disabled
93  * @num_profiles: how many additional profiles we have in this table (0-3)
94  * @sar_profiles: the additional SAR profiles (#2-#4)
95  */
96 struct uefi_cnv_var_ewrd {
97 	u8 revision;
98 	u32 mode;
99 	u32 num_profiles;
100 	struct uefi_sar_profile sar_profiles[BIOS_SAR_MAX_PROFILE_NUM - 1];
101 } __packed;
102 
103 /*
104  * struct uefi_cnv_var_wgds - WGDS table as defined in UEFI
105  * @revision: the revision of the table
106  * @num_profiles: the number of geo profiles we have in the table.
107  *	The first 3 are mandatory, and can have up to 8.
108  * @geo_profiles: a per-profile table of the offsets to add to SAR values.
109  */
110 struct uefi_cnv_var_wgds {
111 	u8 revision;
112 	u8 num_profiles;
113 	struct iwl_geo_profile geo_profiles[BIOS_GEO_MAX_PROFILE_NUM];
114 } __packed;
115 
116 /*
117  * struct uefi_cnv_var_ppag - PPAG table as defined in UEFI
118  * @revision: the revision of the table
119  * @ppag_modes: values from &enum iwl_ppag_flags
120  * @ppag_chains: the PPAG values per chain and band
121  */
122 struct uefi_cnv_var_ppag {
123 	u8 revision;
124 	u32 ppag_modes;
125 	struct iwl_ppag_chain ppag_chains[IWL_NUM_CHAIN_LIMITS];
126 } __packed;
127 
128 /* struct uefi_cnv_var_wtas - WTAS tabled as defined in UEFI
129  * @revision: the revision of the table
130  * @tas_selection: different options of TAS enablement.
131  * @black_list_size: the number of defined entried in the black list
132  * @black_list: a list of countries that are not allowed to use the TAS feature
133  */
134 struct uefi_cnv_var_wtas {
135 	u8 revision;
136 	u32 tas_selection;
137 	u8 black_list_size;
138 	u16 black_list[IWL_WTAS_BLACK_LIST_MAX];
139 } __packed;
140 
141 /* struct uefi_cnv_var_splc - SPLC tabled as defined in UEFI
142  * @revision: the revision of the table
143  * @default_pwr_limit: The default maximum power per device
144  */
145 struct uefi_cnv_var_splc {
146 	u8 revision;
147 	u32 default_pwr_limit;
148 } __packed;
149 
150 #define UEFI_MCC_CHINA 0x434e
151 
152 /* struct uefi_cnv_var_wrdd - WRDD table as defined in UEFI
153  * @revision: the revision of the table
154  * @mcc: country identifier as defined in ISO/IEC 3166-1 Alpha 2 code
155  */
156 struct uefi_cnv_var_wrdd {
157 	u8 revision;
158 	u32 mcc;
159 } __packed;
160 
161 /* struct uefi_cnv_var_eckv - ECKV table as defined in UEFI
162  * @revision: the revision of the table
163  * @ext_clock_valid: indicates if external 32KHz clock is valid
164  */
165 struct uefi_cnv_var_eckv {
166 	u8 revision;
167 	u32 ext_clock_valid;
168 } __packed;
169 
170 #define UEFI_MAX_DSM_FUNCS 32
171 
172 /* struct uefi_cnv_var_general_cfg - DSM-like table as defined in UEFI
173  * @revision: the revision of the table
174  * @functions: payload of the different DSM functions
175  */
176 struct uefi_cnv_var_general_cfg {
177 	u8 revision;
178 	u32 functions[UEFI_MAX_DSM_FUNCS];
179 } __packed;
180 
181 /*
182  * This is known to be broken on v4.19 and to work on v5.4.  Until we
183  * figure out why this is the case and how to make it work, simply
184  * disable the feature in old kernels.
185  */
186 #ifdef CONFIG_EFI
187 void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len);
188 u8 *iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len);
189 int iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
190 				const u8 *data, size_t len,
191 				struct iwl_pnvm_image *pnvm_data);
192 void iwl_uefi_get_step_table(struct iwl_trans *trans);
193 int iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
194 				 u32 tlv_len, struct iwl_pnvm_image *pnvm_data);
195 int iwl_uefi_get_wrds_table(struct iwl_fw_runtime *fwrt);
196 int iwl_uefi_get_ewrd_table(struct iwl_fw_runtime *fwrt);
197 int iwl_uefi_get_wgds_table(struct iwl_fw_runtime *fwrt);
198 int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt);
199 int iwl_uefi_get_tas_table(struct iwl_fw_runtime *fwrt,
200 			   struct iwl_tas_data *data);
201 int iwl_uefi_get_pwr_limit(struct iwl_fw_runtime *fwrt,
202 			   u64 *dflt_pwr_limit);
203 int iwl_uefi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc);
204 int iwl_uefi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk);
205 int iwl_uefi_get_dsm(struct iwl_fw_runtime *fwrt, enum iwl_dsm_funcs func,
206 		     u32 *value);
207 void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt);
208 int iwl_uefi_get_uats_table(struct iwl_trans *trans,
209 			    struct iwl_fw_runtime *fwrt);
210 #else /* CONFIG_EFI */
211 static inline void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len)
212 {
213 	return ERR_PTR(-EOPNOTSUPP);
214 }
215 
216 static inline int
217 iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
218 			    const u8 *data, size_t len,
219 			    struct iwl_pnvm_image *pnvm_data)
220 {
221 	return -EOPNOTSUPP;
222 }
223 
224 static inline u8 *
225 iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len)
226 {
227 	return ERR_PTR(-EOPNOTSUPP);
228 }
229 
230 static inline void iwl_uefi_get_step_table(struct iwl_trans *trans)
231 {
232 }
233 
234 static inline int
235 iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
236 			     u32 tlv_len, struct iwl_pnvm_image *pnvm_data)
237 {
238 	return 0;
239 }
240 
241 static inline int iwl_uefi_get_wrds_table(struct iwl_fw_runtime *fwrt)
242 {
243 	return -ENOENT;
244 }
245 
246 static inline int iwl_uefi_get_ewrd_table(struct iwl_fw_runtime *fwrt)
247 {
248 	return -ENOENT;
249 }
250 
251 static inline int iwl_uefi_get_wgds_table(struct iwl_fw_runtime *fwrt)
252 {
253 	return -ENOENT;
254 }
255 
256 static inline int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt)
257 {
258 	return -ENOENT;
259 }
260 
261 static inline int iwl_uefi_get_tas_table(struct iwl_fw_runtime *fwrt,
262 					 struct iwl_tas_data *data)
263 {
264 	return -ENOENT;
265 }
266 
267 static inline int iwl_uefi_get_pwr_limit(struct iwl_fw_runtime *fwrt,
268 					 u64 *dflt_pwr_limit)
269 {
270 	*dflt_pwr_limit = 0;
271 	return 0;
272 }
273 
274 static inline int iwl_uefi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc)
275 {
276 	return -ENOENT;
277 }
278 
279 static inline int iwl_uefi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk)
280 {
281 	return -ENOENT;
282 }
283 
284 static inline int iwl_uefi_get_dsm(struct iwl_fw_runtime *fwrt,
285 				   enum iwl_dsm_funcs func, u32 *value)
286 {
287 	return -ENOENT;
288 }
289 
290 static inline
291 void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt)
292 {
293 }
294 
295 static inline
296 int iwl_uefi_get_uats_table(struct iwl_trans *trans,
297 			    struct iwl_fw_runtime *fwrt)
298 {
299 	return 0;
300 }
301 #endif /* CONFIG_EFI */
302 #endif /* __iwl_fw_uefi__ */
303