1 /******************************************************************************
2 *
3 * This file is provided under a dual BSD/GPLv2 license. When using or
4 * redistributing this file, you may do so under either license.
5 *
6 * GPL LICENSE SUMMARY
7 *
8 * Copyright(c) 2017 Intel Deutschland GmbH
9 * Copyright(c) 2018 - 2020 Intel Corporation
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as
13 * published by the Free Software Foundation.
14 *
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * The full GNU General Public License is included in this distribution
21 * in the file called COPYING.
22 *
23 * Contact Information:
24 * Intel Linux Wireless <linuxwifi@intel.com>
25 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26 *
27 * BSD LICENSE
28 *
29 * Copyright(c) 2017 Intel Deutschland GmbH
30 * Copyright(c) 2018 - 2020 Intel Corporation
31 * All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 *
37 * * Redistributions of source code must retain the above copyright
38 * notice, this list of conditions and the following disclaimer.
39 * * Redistributions in binary form must reproduce the above copyright
40 * notice, this list of conditions and the following disclaimer in
41 * the documentation and/or other materials provided with the
42 * distribution.
43 * * Neither the name Intel Corporation nor the names of its
44 * contributors may be used to endorse or promote products derived
45 * from this software without specific prior written permission.
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
48 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
49 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
50 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
51 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
52 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
53 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
54 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
55 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
56 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
57 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
58 *
59 *****************************************************************************/
60 #ifndef __iwl_fw_acpi__
61 #define __iwl_fw_acpi__
62
63 #include <linux/acpi.h>
64 #include "fw/api/commands.h"
65 #include "fw/api/power.h"
66 #include "fw/api/phy.h"
67 #include "fw/api/nvm-reg.h"
68 #include "fw/img.h"
69 #include "iwl-trans.h"
70
71
72 #define ACPI_WRDS_METHOD "WRDS"
73 #define ACPI_EWRD_METHOD "EWRD"
74 #define ACPI_WGDS_METHOD "WGDS"
75 #define ACPI_WRDD_METHOD "WRDD"
76 #define ACPI_SPLC_METHOD "SPLC"
77 #define ACPI_ECKV_METHOD "ECKV"
78 #define ACPI_PPAG_METHOD "PPAG"
79 #define ACPI_WTAS_METHOD "WTAS"
80
81 #define ACPI_WIFI_DOMAIN (0x07)
82
83 #define ACPI_SAR_TABLE_SIZE 10
84 #define ACPI_SAR_PROFILE_NUM 4
85
86 #define ACPI_GEO_TABLE_SIZE 6
87 #define ACPI_NUM_GEO_PROFILES 3
88 #define ACPI_GEO_PER_CHAIN_SIZE 3
89
90 #define ACPI_SAR_NUM_CHAIN_LIMITS 2
91 #define ACPI_SAR_NUM_SUB_BANDS 5
92 #define ACPI_SAR_NUM_TABLES 1
93
94 #define ACPI_WRDS_WIFI_DATA_SIZE (ACPI_SAR_TABLE_SIZE + 2)
95 #define ACPI_EWRD_WIFI_DATA_SIZE ((ACPI_SAR_PROFILE_NUM - 1) * \
96 ACPI_SAR_TABLE_SIZE + 3)
97 #define ACPI_WGDS_WIFI_DATA_SIZE 19
98 #define ACPI_WRDD_WIFI_DATA_SIZE 2
99 #define ACPI_SPLC_WIFI_DATA_SIZE 2
100 #define ACPI_ECKV_WIFI_DATA_SIZE 2
101
102 /*
103 * 1 type, 1 enabled, 1 block list size, 16 block list array
104 */
105 #define APCI_WTAS_BLACK_LIST_MAX 16
106 #define ACPI_WTAS_WIFI_DATA_SIZE (3 + APCI_WTAS_BLACK_LIST_MAX)
107
108 #define ACPI_WGDS_TABLE_SIZE 3
109
110 #define ACPI_PPAG_WIFI_DATA_SIZE ((IWL_NUM_CHAIN_LIMITS * \
111 IWL_NUM_SUB_BANDS) + 3)
112 #define ACPI_PPAG_WIFI_DATA_SIZE_V2 ((IWL_NUM_CHAIN_LIMITS * \
113 IWL_NUM_SUB_BANDS_V2) + 3)
114
115 /* PPAG gain value bounds in 1/8 dBm */
116 #define ACPI_PPAG_MIN_LB -16
117 #define ACPI_PPAG_MAX_LB 24
118 #define ACPI_PPAG_MIN_HB -16
119 #define ACPI_PPAG_MAX_HB 40
120
121 struct iwl_sar_profile {
122 bool enabled;
123 u8 table[ACPI_SAR_TABLE_SIZE];
124 };
125
126 struct iwl_geo_profile {
127 u8 values[ACPI_GEO_TABLE_SIZE];
128 };
129
130 enum iwl_dsm_funcs_rev_0 {
131 DSM_FUNC_QUERY = 0,
132 DSM_FUNC_DISABLE_SRD = 1,
133 DSM_FUNC_ENABLE_INDONESIA_5G2 = 2,
134 };
135
136 enum iwl_dsm_values_srd {
137 DSM_VALUE_SRD_ACTIVE,
138 DSM_VALUE_SRD_PASSIVE,
139 DSM_VALUE_SRD_DISABLE,
140 DSM_VALUE_SRD_MAX
141 };
142
143 enum iwl_dsm_values_indonesia {
144 DSM_VALUE_INDONESIA_DISABLE,
145 DSM_VALUE_INDONESIA_ENABLE,
146 DSM_VALUE_INDONESIA_RESERVED,
147 DSM_VALUE_INDONESIA_MAX
148 };
149
150 #ifdef CONFIG_ACPI
151
152 struct iwl_fw_runtime;
153
154 void *iwl_acpi_get_object(struct device *dev, acpi_string method);
155
156 int iwl_acpi_get_dsm_u8(struct device *dev, int rev, int func);
157
158 union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev,
159 union acpi_object *data,
160 int data_size, int *tbl_rev);
161
162 /**
163 * iwl_acpi_get_mcc - read MCC from ACPI, if available
164 *
165 * @dev: the struct device
166 * @mcc: output buffer (3 bytes) that will get the MCC
167 *
168 * This function tries to read the current MCC from ACPI if available.
169 */
170 int iwl_acpi_get_mcc(struct device *dev, char *mcc);
171
172 u64 iwl_acpi_get_pwr_limit(struct device *dev);
173
174 /*
175 * iwl_acpi_get_eckv - read external clock validation from ACPI, if available
176 *
177 * @dev: the struct device
178 * @extl_clk: output var (2 bytes) that will get the clk indication.
179 *
180 * This function tries to read the external clock indication
181 * from ACPI if available.
182 */
183 int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk);
184
185 int iwl_sar_select_profile(struct iwl_fw_runtime *fwrt,
186 __le16 *per_chain, u32 n_tables, u32 n_subbands,
187 int prof_a, int prof_b);
188
189 int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt);
190
191 int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt);
192
193 int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt);
194
195 bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt);
196
197 int iwl_sar_geo_init(struct iwl_fw_runtime *fwrt,
198 struct iwl_per_chain_offset *table, u32 n_bands);
199
200 int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, __le32 *block_list_array,
201 int *block_list_size);
202
203 #else /* CONFIG_ACPI */
204
iwl_acpi_get_object(struct device * dev,acpi_string method)205 static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method)
206 {
207 return ERR_PTR(-ENOENT);
208 }
209
iwl_acpi_get_dsm_object(struct device * dev,int rev,int func,union acpi_object * args)210 static inline void *iwl_acpi_get_dsm_object(struct device *dev, int rev,
211 int func, union acpi_object *args)
212 {
213 return ERR_PTR(-ENOENT);
214 }
215
iwl_acpi_get_dsm_u8(struct device * dev,int rev,int func)216 static inline int iwl_acpi_get_dsm_u8(struct device *dev, int rev, int func)
217 {
218 return -ENOENT;
219 }
220
iwl_acpi_get_wifi_pkg(struct device * dev,union acpi_object * data,int data_size,int * tbl_rev)221 static inline union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev,
222 union acpi_object *data,
223 int data_size,
224 int *tbl_rev)
225 {
226 return ERR_PTR(-ENOENT);
227 }
228
iwl_acpi_get_mcc(struct device * dev,char * mcc)229 static inline int iwl_acpi_get_mcc(struct device *dev, char *mcc)
230 {
231 return -ENOENT;
232 }
233
iwl_acpi_get_pwr_limit(struct device * dev)234 static inline u64 iwl_acpi_get_pwr_limit(struct device *dev)
235 {
236 return 0;
237 }
238
iwl_acpi_get_eckv(struct device * dev,u32 * extl_clk)239 static inline int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk)
240 {
241 return -ENOENT;
242 }
243
iwl_sar_select_profile(struct iwl_fw_runtime * fwrt,__le16 * per_chain,u32 n_tables,u32 n_subbands,int prof_a,int prof_b)244 static inline int iwl_sar_select_profile(struct iwl_fw_runtime *fwrt,
245 __le16 *per_chain, u32 n_tables, u32 n_subbands,
246 int prof_a, int prof_b)
247 {
248 return -ENOENT;
249 }
250
iwl_sar_get_wrds_table(struct iwl_fw_runtime * fwrt)251 static inline int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
252 {
253 return -ENOENT;
254 }
255
iwl_sar_get_ewrd_table(struct iwl_fw_runtime * fwrt)256 static inline int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt)
257 {
258 return -ENOENT;
259 }
260
iwl_sar_get_wgds_table(struct iwl_fw_runtime * fwrt)261 static inline int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt)
262 {
263 return -ENOENT;
264 }
265
iwl_sar_geo_support(struct iwl_fw_runtime * fwrt)266 static inline bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt)
267 {
268 return false;
269 }
270
iwl_acpi_get_tas(struct iwl_fw_runtime * fwrt,__le32 * block_list_array,int * block_list_size)271 static inline int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
272 __le32 *block_list_array,
273 int *block_list_size)
274 {
275 return -ENOENT;
276 }
277 #endif /* CONFIG_ACPI */
278 #endif /* __iwl_fw_acpi__ */
279