Loading...
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#define IWL_UEFI_OEM_PNVM_NAME L"UefiCnvWlanOemSignedPnvm"
9#define IWL_UEFI_REDUCED_POWER_NAME L"UefiCnvWlanReducedPower"
10#define IWL_UEFI_SGOM_NAME L"UefiCnvWlanSarGeoOffsetMapping"
11#define IWL_UEFI_STEP_NAME L"UefiCnvCommonSTEP"
12#define IWL_UEFI_UATS_NAME L"CnvUefiWlanUATS"
13
14#define IWL_SGOM_MAP_SIZE 339
15#define IWL_UATS_MAP_SIZE 339
16
17struct pnvm_sku_package {
18 u8 rev;
19 u32 total_size;
20 u8 n_skus;
21 u32 reserved[2];
22 u8 data[];
23} __packed;
24
25struct uefi_cnv_wlan_sgom_data {
26 u8 revision;
27 u8 offset_map[IWL_SGOM_MAP_SIZE - 1];
28} __packed;
29
30struct uefi_cnv_wlan_uats_data {
31 u8 revision;
32 u8 offset_map[IWL_UATS_MAP_SIZE - 1];
33} __packed;
34
35struct uefi_cnv_common_step_data {
36 u8 revision;
37 u8 step_mode;
38 u8 cnvi_eq_channel;
39 u8 cnvr_eq_channel;
40 u8 radio1;
41 u8 radio2;
42} __packed;
43
44/*
45 * This is known to be broken on v4.19 and to work on v5.4. Until we
46 * figure out why this is the case and how to make it work, simply
47 * disable the feature in old kernels.
48 */
49#ifdef CONFIG_EFI
50void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len);
51u8 *iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len);
52int iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
53 const u8 *data, size_t len,
54 struct iwl_pnvm_image *pnvm_data);
55void iwl_uefi_get_step_table(struct iwl_trans *trans);
56int iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
57 u32 tlv_len, struct iwl_pnvm_image *pnvm_data);
58#else /* CONFIG_EFI */
59static inline void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len)
60{
61 return ERR_PTR(-EOPNOTSUPP);
62}
63
64static inline int
65iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
66 const u8 *data, size_t len,
67 struct iwl_pnvm_image *pnvm_data)
68{
69 return -EOPNOTSUPP;
70}
71
72static inline u8 *
73iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len)
74{
75 return ERR_PTR(-EOPNOTSUPP);
76}
77
78static inline void iwl_uefi_get_step_table(struct iwl_trans *trans)
79{
80}
81
82static inline int
83iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
84 u32 tlv_len, struct iwl_pnvm_image *pnvm_data)
85{
86 return 0;
87}
88#endif /* CONFIG_EFI */
89
90#if defined(CONFIG_EFI) && defined(CONFIG_ACPI)
91void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt);
92int iwl_uefi_get_uats_table(struct iwl_trans *trans,
93 struct iwl_fw_runtime *fwrt);
94#else
95static inline
96void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt)
97{
98}
99
100static inline
101int iwl_uefi_get_uats_table(struct iwl_trans *trans,
102 struct iwl_fw_runtime *fwrt)
103{
104 return 0;
105}
106
107#endif
108#endif /* __iwl_fw_uefi__ */
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
40struct pnvm_sku_package {
41 u8 rev;
42 u32 total_size;
43 u8 n_skus;
44 u32 reserved[2];
45 u8 data[];
46} __packed;
47
48struct uefi_cnv_wlan_sgom_data {
49 u8 revision;
50 u8 offset_map[IWL_SGOM_MAP_SIZE - 1];
51} __packed;
52
53struct uefi_cnv_wlan_uats_data {
54 u8 revision;
55 u8 offset_map[IWL_UATS_MAP_SIZE - 1];
56} __packed;
57
58struct 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 */
72struct 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 */
83struct 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 */
96struct 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 */
110struct 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 */
122struct 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 */
134struct 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 */
145struct 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 */
156struct 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 */
165struct 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 */
176struct 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
187void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len);
188u8 *iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len);
189int iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
190 const u8 *data, size_t len,
191 struct iwl_pnvm_image *pnvm_data);
192void iwl_uefi_get_step_table(struct iwl_trans *trans);
193int iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
194 u32 tlv_len, struct iwl_pnvm_image *pnvm_data);
195int iwl_uefi_get_wrds_table(struct iwl_fw_runtime *fwrt);
196int iwl_uefi_get_ewrd_table(struct iwl_fw_runtime *fwrt);
197int iwl_uefi_get_wgds_table(struct iwl_fw_runtime *fwrt);
198int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt);
199int iwl_uefi_get_tas_table(struct iwl_fw_runtime *fwrt,
200 struct iwl_tas_data *data);
201int iwl_uefi_get_pwr_limit(struct iwl_fw_runtime *fwrt,
202 u64 *dflt_pwr_limit);
203int iwl_uefi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc);
204int iwl_uefi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk);
205int iwl_uefi_get_dsm(struct iwl_fw_runtime *fwrt, enum iwl_dsm_funcs func,
206 u32 *value);
207void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt);
208int iwl_uefi_get_uats_table(struct iwl_trans *trans,
209 struct iwl_fw_runtime *fwrt);
210#else /* CONFIG_EFI */
211static inline void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len)
212{
213 return ERR_PTR(-EOPNOTSUPP);
214}
215
216static inline int
217iwl_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
224static inline u8 *
225iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len)
226{
227 return ERR_PTR(-EOPNOTSUPP);
228}
229
230static inline void iwl_uefi_get_step_table(struct iwl_trans *trans)
231{
232}
233
234static inline int
235iwl_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
241static inline int iwl_uefi_get_wrds_table(struct iwl_fw_runtime *fwrt)
242{
243 return -ENOENT;
244}
245
246static inline int iwl_uefi_get_ewrd_table(struct iwl_fw_runtime *fwrt)
247{
248 return -ENOENT;
249}
250
251static inline int iwl_uefi_get_wgds_table(struct iwl_fw_runtime *fwrt)
252{
253 return -ENOENT;
254}
255
256static inline int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt)
257{
258 return -ENOENT;
259}
260
261static inline int iwl_uefi_get_tas_table(struct iwl_fw_runtime *fwrt,
262 struct iwl_tas_data *data)
263{
264 return -ENOENT;
265}
266
267static 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
274static inline int iwl_uefi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc)
275{
276 return -ENOENT;
277}
278
279static inline int iwl_uefi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk)
280{
281 return -ENOENT;
282}
283
284static 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
290static inline
291void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt)
292{
293}
294
295static inline
296int 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__ */