xref: /freebsd/sys/contrib/dev/iwlwifi/fw/acpi.h (revision a4128aad8503277614f2d214011ef60a19447b83)
1bfcc09ddSBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2bfcc09ddSBjoern A. Zeeb /*
3bfcc09ddSBjoern A. Zeeb  * Copyright (C) 2017 Intel Deutschland GmbH
49af1bba4SBjoern A. Zeeb  * Copyright (C) 2018-2023 Intel Corporation
5bfcc09ddSBjoern A. Zeeb  */
6bfcc09ddSBjoern A. Zeeb #ifndef __iwl_fw_acpi__
7bfcc09ddSBjoern A. Zeeb #define __iwl_fw_acpi__
8bfcc09ddSBjoern A. Zeeb 
9bfcc09ddSBjoern A. Zeeb #include <linux/acpi.h>
10*a4128aadSBjoern A. Zeeb #include "fw/regulatory.h"
11bfcc09ddSBjoern A. Zeeb #include "fw/api/commands.h"
12bfcc09ddSBjoern A. Zeeb #include "fw/api/power.h"
13bfcc09ddSBjoern A. Zeeb #include "fw/api/phy.h"
14bfcc09ddSBjoern A. Zeeb #include "fw/api/nvm-reg.h"
159af1bba4SBjoern A. Zeeb #include "fw/api/config.h"
16bfcc09ddSBjoern A. Zeeb #include "fw/img.h"
17bfcc09ddSBjoern A. Zeeb #include "iwl-trans.h"
18bfcc09ddSBjoern A. Zeeb 
19bfcc09ddSBjoern A. Zeeb 
20bfcc09ddSBjoern A. Zeeb #define ACPI_WRDS_METHOD	"WRDS"
21bfcc09ddSBjoern A. Zeeb #define ACPI_EWRD_METHOD	"EWRD"
22bfcc09ddSBjoern A. Zeeb #define ACPI_WGDS_METHOD	"WGDS"
23bfcc09ddSBjoern A. Zeeb #define ACPI_WRDD_METHOD	"WRDD"
24bfcc09ddSBjoern A. Zeeb #define ACPI_SPLC_METHOD	"SPLC"
25bfcc09ddSBjoern A. Zeeb #define ACPI_ECKV_METHOD	"ECKV"
26bfcc09ddSBjoern A. Zeeb #define ACPI_PPAG_METHOD	"PPAG"
27bfcc09ddSBjoern A. Zeeb #define ACPI_WTAS_METHOD	"WTAS"
289af1bba4SBjoern A. Zeeb #define ACPI_WPFC_METHOD	"WPFC"
29*a4128aadSBjoern A. Zeeb #define ACPI_GLAI_METHOD	"GLAI"
30*a4128aadSBjoern A. Zeeb #define ACPI_WBEM_METHOD	"WBEM"
31bfcc09ddSBjoern A. Zeeb 
32bfcc09ddSBjoern A. Zeeb #define ACPI_WIFI_DOMAIN	(0x07)
33bfcc09ddSBjoern A. Zeeb 
34bfcc09ddSBjoern A. Zeeb #define ACPI_SAR_PROFILE_NUM		4
35bfcc09ddSBjoern A. Zeeb 
36bfcc09ddSBjoern A. Zeeb #define ACPI_NUM_GEO_PROFILES		3
37bfcc09ddSBjoern A. Zeeb #define ACPI_NUM_GEO_PROFILES_REV3	8
38bfcc09ddSBjoern A. Zeeb #define ACPI_GEO_PER_CHAIN_SIZE		3
39bfcc09ddSBjoern A. Zeeb 
40bfcc09ddSBjoern A. Zeeb #define ACPI_SAR_NUM_CHAINS_REV0	2
41bfcc09ddSBjoern A. Zeeb #define ACPI_SAR_NUM_CHAINS_REV1	2
42bfcc09ddSBjoern A. Zeeb #define ACPI_SAR_NUM_CHAINS_REV2	4
43bfcc09ddSBjoern A. Zeeb #define ACPI_SAR_NUM_SUB_BANDS_REV0	5
44bfcc09ddSBjoern A. Zeeb #define ACPI_SAR_NUM_SUB_BANDS_REV1	11
45bfcc09ddSBjoern A. Zeeb #define ACPI_SAR_NUM_SUB_BANDS_REV2	11
46bfcc09ddSBjoern A. Zeeb 
47bfcc09ddSBjoern A. Zeeb #define ACPI_WRDS_WIFI_DATA_SIZE_REV0	(ACPI_SAR_NUM_CHAINS_REV0 * \
48bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_SUB_BANDS_REV0 + 2)
49bfcc09ddSBjoern A. Zeeb #define ACPI_WRDS_WIFI_DATA_SIZE_REV1	(ACPI_SAR_NUM_CHAINS_REV1 * \
50bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_SUB_BANDS_REV1 + 2)
51bfcc09ddSBjoern A. Zeeb #define ACPI_WRDS_WIFI_DATA_SIZE_REV2	(ACPI_SAR_NUM_CHAINS_REV2 * \
52bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_SUB_BANDS_REV2 + 2)
53bfcc09ddSBjoern A. Zeeb #define ACPI_EWRD_WIFI_DATA_SIZE_REV0	((ACPI_SAR_PROFILE_NUM - 1) * \
54bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_CHAINS_REV0 * \
55bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_SUB_BANDS_REV0 + 3)
56bfcc09ddSBjoern A. Zeeb #define ACPI_EWRD_WIFI_DATA_SIZE_REV1	((ACPI_SAR_PROFILE_NUM - 1) * \
57bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_CHAINS_REV1 * \
58bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_SUB_BANDS_REV1 + 3)
59bfcc09ddSBjoern A. Zeeb #define ACPI_EWRD_WIFI_DATA_SIZE_REV2	((ACPI_SAR_PROFILE_NUM - 1) * \
60bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_CHAINS_REV2 * \
61bfcc09ddSBjoern A. Zeeb 					 ACPI_SAR_NUM_SUB_BANDS_REV2 + 3)
62*a4128aadSBjoern A. Zeeb #define ACPI_WPFC_WIFI_DATA_SIZE	5 /* domain and 4 filter config words */
63bfcc09ddSBjoern A. Zeeb 
64bfcc09ddSBjoern A. Zeeb /* revision 0 and 1 are identical, except for the semantics in the FW */
65bfcc09ddSBjoern A. Zeeb #define ACPI_GEO_NUM_BANDS_REV0		2
66bfcc09ddSBjoern A. Zeeb #define ACPI_GEO_NUM_BANDS_REV2		3
67bfcc09ddSBjoern A. Zeeb 
68bfcc09ddSBjoern A. Zeeb #define ACPI_WRDD_WIFI_DATA_SIZE	2
69bfcc09ddSBjoern A. Zeeb #define ACPI_SPLC_WIFI_DATA_SIZE	2
70bfcc09ddSBjoern A. Zeeb #define ACPI_ECKV_WIFI_DATA_SIZE	2
71bfcc09ddSBjoern A. Zeeb 
72bfcc09ddSBjoern A. Zeeb /*
73*a4128aadSBjoern A. Zeeb  * One element for domain type,
74*a4128aadSBjoern A. Zeeb  * and one for enablement of Wi-Fi 320MHz per MCC
75*a4128aadSBjoern A. Zeeb  */
76*a4128aadSBjoern A. Zeeb #define ACPI_WBEM_WIFI_DATA_SIZE	2
77*a4128aadSBjoern A. Zeeb /*
78*a4128aadSBjoern A. Zeeb  * One element for domain type,
79*a4128aadSBjoern A. Zeeb  * and one for the status
80*a4128aadSBjoern A. Zeeb  */
81*a4128aadSBjoern A. Zeeb #define ACPI_GLAI_WIFI_DATA_SIZE	2
82*a4128aadSBjoern A. Zeeb #define ACPI_GLAI_MAX_STATUS		2
83*a4128aadSBjoern A. Zeeb /*
84d9836fb4SBjoern A. Zeeb  * TAS size: 1 elelment for type,
85d9836fb4SBjoern A. Zeeb  *	     1 element for enabled field,
86d9836fb4SBjoern A. Zeeb  *	     1 element for block list size,
87d9836fb4SBjoern A. Zeeb  *	     16 elements for block list array
88bfcc09ddSBjoern A. Zeeb  */
89*a4128aadSBjoern A. Zeeb #define ACPI_WTAS_WIFI_DATA_SIZE	(3 + IWL_WTAS_BLACK_LIST_MAX)
90bfcc09ddSBjoern A. Zeeb 
91bfcc09ddSBjoern A. Zeeb #define ACPI_PPAG_WIFI_DATA_SIZE_V1	((IWL_NUM_CHAIN_LIMITS * \
92bfcc09ddSBjoern A. Zeeb 					  IWL_NUM_SUB_BANDS_V1) + 2)
93bfcc09ddSBjoern A. Zeeb #define ACPI_PPAG_WIFI_DATA_SIZE_V2	((IWL_NUM_CHAIN_LIMITS * \
94bfcc09ddSBjoern A. Zeeb 					  IWL_NUM_SUB_BANDS_V2) + 2)
95bfcc09ddSBjoern A. Zeeb 
96fac1f593SBjoern A. Zeeb #define IWL_SAR_ENABLE_MSK		BIT(0)
97fac1f593SBjoern A. Zeeb #define IWL_REDUCE_POWER_FLAGS_POS	1
98bfcc09ddSBjoern A. Zeeb 
99*a4128aadSBjoern A. Zeeb /* The Inidcator whether UEFI WIFI GUID tables are locked is read from ACPI */
100*a4128aadSBjoern A. Zeeb #define UEFI_WIFI_GUID_UNLOCKED		0
101bfcc09ddSBjoern A. Zeeb 
102*a4128aadSBjoern A. Zeeb #define ACPI_DSM_REV 0
103bfcc09ddSBjoern A. Zeeb 
104*a4128aadSBjoern A. Zeeb #define IWL_ACPI_WBEM_REV0_MASK (BIT(0) | BIT(1))
105*a4128aadSBjoern A. Zeeb #define IWL_ACPI_WBEM_REVISION 0
106bfcc09ddSBjoern A. Zeeb 
107bfcc09ddSBjoern A. Zeeb #ifdef CONFIG_ACPI
108bfcc09ddSBjoern A. Zeeb 
109bfcc09ddSBjoern A. Zeeb struct iwl_fw_runtime;
110bfcc09ddSBjoern A. Zeeb 
111bfcc09ddSBjoern A. Zeeb extern const guid_t iwl_guid;
112bfcc09ddSBjoern A. Zeeb 
113bfcc09ddSBjoern A. Zeeb /**
114bfcc09ddSBjoern A. Zeeb  * iwl_acpi_get_mcc - read MCC from ACPI, if available
115bfcc09ddSBjoern A. Zeeb  *
116*a4128aadSBjoern A. Zeeb  * @fwrt: the fw runtime struct
117bfcc09ddSBjoern A. Zeeb  * @mcc: output buffer (3 bytes) that will get the MCC
118bfcc09ddSBjoern A. Zeeb  *
119bfcc09ddSBjoern A. Zeeb  * This function tries to read the current MCC from ACPI if available.
120bfcc09ddSBjoern A. Zeeb  */
121*a4128aadSBjoern A. Zeeb int iwl_acpi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc);
122bfcc09ddSBjoern A. Zeeb 
123*a4128aadSBjoern A. Zeeb int iwl_acpi_get_pwr_limit(struct iwl_fw_runtime *fwrt, u64 *dflt_pwr_limit);
124bfcc09ddSBjoern A. Zeeb 
125bfcc09ddSBjoern A. Zeeb /*
126bfcc09ddSBjoern A. Zeeb  * iwl_acpi_get_eckv - read external clock validation from ACPI, if available
127bfcc09ddSBjoern A. Zeeb  *
128*a4128aadSBjoern A. Zeeb  * @fwrt: the fw runtime struct
129bfcc09ddSBjoern A. Zeeb  * @extl_clk: output var (2 bytes) that will get the clk indication.
130bfcc09ddSBjoern A. Zeeb  *
131bfcc09ddSBjoern A. Zeeb  * This function tries to read the external clock indication
132bfcc09ddSBjoern A. Zeeb  * from ACPI if available.
133bfcc09ddSBjoern A. Zeeb  */
134*a4128aadSBjoern A. Zeeb int iwl_acpi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk);
135bfcc09ddSBjoern A. Zeeb 
136*a4128aadSBjoern A. Zeeb int iwl_acpi_get_wrds_table(struct iwl_fw_runtime *fwrt);
137bfcc09ddSBjoern A. Zeeb 
138*a4128aadSBjoern A. Zeeb int iwl_acpi_get_ewrd_table(struct iwl_fw_runtime *fwrt);
139bfcc09ddSBjoern A. Zeeb 
140*a4128aadSBjoern A. Zeeb int iwl_acpi_get_wgds_table(struct iwl_fw_runtime *fwrt);
141bfcc09ddSBjoern A. Zeeb 
142*a4128aadSBjoern A. Zeeb int iwl_acpi_get_tas_table(struct iwl_fw_runtime *fwrt,
143*a4128aadSBjoern A. Zeeb 			   struct iwl_tas_data *data);
144bfcc09ddSBjoern A. Zeeb 
145fac1f593SBjoern A. Zeeb int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt);
146fac1f593SBjoern A. Zeeb 
1479af1bba4SBjoern A. Zeeb void iwl_acpi_get_phy_filters(struct iwl_fw_runtime *fwrt,
1489af1bba4SBjoern A. Zeeb 			      struct iwl_phy_specific_cfg *filters);
149bfcc09ddSBjoern A. Zeeb 
150*a4128aadSBjoern A. Zeeb void iwl_acpi_get_guid_lock_status(struct iwl_fw_runtime *fwrt);
151*a4128aadSBjoern A. Zeeb 
152*a4128aadSBjoern A. Zeeb int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,
153*a4128aadSBjoern A. Zeeb 		     enum iwl_dsm_funcs func, u32 *value);
154*a4128aadSBjoern A. Zeeb 
155*a4128aadSBjoern A. Zeeb int iwl_acpi_get_wbem(struct iwl_fw_runtime *fwrt, u32 *value);
1569af1bba4SBjoern A. Zeeb #else /* CONFIG_ACPI */
157bfcc09ddSBjoern A. Zeeb 
158bfcc09ddSBjoern A. Zeeb static inline void *iwl_acpi_get_dsm_object(struct device *dev, int rev,
159bfcc09ddSBjoern A. Zeeb 					    int func, union acpi_object *args)
160bfcc09ddSBjoern A. Zeeb {
161bfcc09ddSBjoern A. Zeeb 	return ERR_PTR(-ENOENT);
162bfcc09ddSBjoern A. Zeeb }
163bfcc09ddSBjoern A. Zeeb 
164*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc)
165bfcc09ddSBjoern A. Zeeb {
166bfcc09ddSBjoern A. Zeeb 	return -ENOENT;
167bfcc09ddSBjoern A. Zeeb }
168bfcc09ddSBjoern A. Zeeb 
169*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_pwr_limit(struct iwl_fw_runtime *fwrt,
170*a4128aadSBjoern A. Zeeb 					 u64 *dflt_pwr_limit)
171bfcc09ddSBjoern A. Zeeb {
172*a4128aadSBjoern A. Zeeb 	*dflt_pwr_limit = 0;
173bfcc09ddSBjoern A. Zeeb 	return 0;
174bfcc09ddSBjoern A. Zeeb }
175bfcc09ddSBjoern A. Zeeb 
176*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk)
177bfcc09ddSBjoern A. Zeeb {
178bfcc09ddSBjoern A. Zeeb 	return -ENOENT;
179bfcc09ddSBjoern A. Zeeb }
180bfcc09ddSBjoern A. Zeeb 
181*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_wrds_table(struct iwl_fw_runtime *fwrt)
182bfcc09ddSBjoern A. Zeeb {
183bfcc09ddSBjoern A. Zeeb 	return -ENOENT;
184bfcc09ddSBjoern A. Zeeb }
185bfcc09ddSBjoern A. Zeeb 
186*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_ewrd_table(struct iwl_fw_runtime *fwrt)
187bfcc09ddSBjoern A. Zeeb {
188bfcc09ddSBjoern A. Zeeb 	return -ENOENT;
189bfcc09ddSBjoern A. Zeeb }
190bfcc09ddSBjoern A. Zeeb 
191*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_wgds_table(struct iwl_fw_runtime *fwrt)
192bfcc09ddSBjoern A. Zeeb {
193bfcc09ddSBjoern A. Zeeb 	return 1;
194bfcc09ddSBjoern A. Zeeb }
195bfcc09ddSBjoern A. Zeeb 
196*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_tas_table(struct iwl_fw_runtime *fwrt,
197*a4128aadSBjoern A. Zeeb 					 struct iwl_tas_data *data)
198bfcc09ddSBjoern A. Zeeb {
199bfcc09ddSBjoern A. Zeeb 	return -ENOENT;
200bfcc09ddSBjoern A. Zeeb }
201bfcc09ddSBjoern A. Zeeb 
202fac1f593SBjoern A. Zeeb static inline int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt)
203fac1f593SBjoern A. Zeeb {
204fac1f593SBjoern A. Zeeb 	return -ENOENT;
205fac1f593SBjoern A. Zeeb }
206fac1f593SBjoern A. Zeeb 
207*a4128aadSBjoern A. Zeeb /* macro since the second argument doesn't always exist */
208*a4128aadSBjoern A. Zeeb #define iwl_acpi_get_phy_filters(fwrt, filters) do { } while (0)
209*a4128aadSBjoern A. Zeeb 
210*a4128aadSBjoern A. Zeeb static inline void iwl_acpi_get_guid_lock_status(struct iwl_fw_runtime *fwrt)
211*a4128aadSBjoern A. Zeeb {
212*a4128aadSBjoern A. Zeeb }
213*a4128aadSBjoern A. Zeeb 
214*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,
215*a4128aadSBjoern A. Zeeb 				   enum iwl_dsm_funcs func, u32 *value)
216fac1f593SBjoern A. Zeeb {
217fac1f593SBjoern A. Zeeb 	return -ENOENT;
218fac1f593SBjoern A. Zeeb }
219fac1f593SBjoern A. Zeeb 
220*a4128aadSBjoern A. Zeeb static inline int iwl_acpi_get_wbem(struct iwl_fw_runtime *fwrt, u32 *value)
221fac1f593SBjoern A. Zeeb {
222*a4128aadSBjoern A. Zeeb 	return -ENOENT;
223fac1f593SBjoern A. Zeeb }
2249af1bba4SBjoern A. Zeeb #endif /* CONFIG_ACPI */
2259af1bba4SBjoern A. Zeeb 
226bfcc09ddSBjoern A. Zeeb #endif /* __iwl_fw_acpi__ */
227