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
121struct iwl_sar_profile {
122	bool enabled;
123	u8 table[ACPI_SAR_TABLE_SIZE];
124};
125
126struct iwl_geo_profile {
127	u8 values[ACPI_GEO_TABLE_SIZE];
128};
129
130enum 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
136enum 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
143enum 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
152struct iwl_fw_runtime;
153
154void *iwl_acpi_get_object(struct device *dev, acpi_string method);
155
156int iwl_acpi_get_dsm_u8(struct device *dev, int rev, int func);
157
158union 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 */
170int iwl_acpi_get_mcc(struct device *dev, char *mcc);
171
172u64 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 */
183int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk);
184
185int 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
189int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt);
190
191int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt);
192
193int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt);
194
195bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt);
196
197int iwl_sar_geo_init(struct iwl_fw_runtime *fwrt,
198		     struct iwl_per_chain_offset *table, u32 n_bands);
199
200int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, __le32 *block_list_array,
201		     int *block_list_size);
202
203#else /* CONFIG_ACPI */
204
205static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method)
206{
207	return ERR_PTR(-ENOENT);
208}
209
210static 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
216static inline int iwl_acpi_get_dsm_u8(struct device *dev, int rev, int func)
217{
218	return -ENOENT;
219}
220
221static 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
229static inline int iwl_acpi_get_mcc(struct device *dev, char *mcc)
230{
231	return -ENOENT;
232}
233
234static inline u64 iwl_acpi_get_pwr_limit(struct device *dev)
235{
236	return 0;
237}
238
239static inline int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk)
240{
241	return -ENOENT;
242}
243
244static 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
251static inline int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
252{
253	return -ENOENT;
254}
255
256static inline int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt)
257{
258	return -ENOENT;
259}
260
261static inline int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt)
262{
263	return -ENOENT;
264}
265
266static inline bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt)
267{
268	return false;
269}
270
271static 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