| .. | .. |
|---|
| 6 | 6 | * GPL LICENSE SUMMARY |
|---|
| 7 | 7 | * |
|---|
| 8 | 8 | * Copyright(c) 2017 Intel Deutschland GmbH |
|---|
| 9 | | - * Copyright(c) 2018 Intel Corporation |
|---|
| 9 | + * Copyright(c) 2018 - 2020 Intel Corporation |
|---|
| 10 | 10 | * |
|---|
| 11 | 11 | * This program is free software; you can redistribute it and/or modify |
|---|
| 12 | 12 | * it under the terms of version 2 of the GNU General Public License as |
|---|
| .. | .. |
|---|
| 16 | 16 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 17 | 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|---|
| 18 | 18 | * General Public License for more details. |
|---|
| 19 | | - * |
|---|
| 20 | | - * You should have received a copy of the GNU General Public License |
|---|
| 21 | | - * along with this program; |
|---|
| 22 | 19 | * |
|---|
| 23 | 20 | * The full GNU General Public License is included in this distribution |
|---|
| 24 | 21 | * in the file called COPYING. |
|---|
| .. | .. |
|---|
| 30 | 27 | * BSD LICENSE |
|---|
| 31 | 28 | * |
|---|
| 32 | 29 | * Copyright(c) 2017 Intel Deutschland GmbH |
|---|
| 33 | | - * Copyright(c) 2018 Intel Corporation |
|---|
| 30 | + * Copyright(c) 2018 - 2020 Intel Corporation |
|---|
| 34 | 31 | * All rights reserved. |
|---|
| 35 | 32 | * |
|---|
| 36 | 33 | * Redistribution and use in source and binary forms, with or without |
|---|
| .. | .. |
|---|
| 64 | 61 | #define __iwl_fw_acpi__ |
|---|
| 65 | 62 | |
|---|
| 66 | 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 | + |
|---|
| 67 | 71 | |
|---|
| 68 | 72 | #define ACPI_WRDS_METHOD "WRDS" |
|---|
| 69 | 73 | #define ACPI_EWRD_METHOD "EWRD" |
|---|
| 70 | 74 | #define ACPI_WGDS_METHOD "WGDS" |
|---|
| 71 | 75 | #define ACPI_WRDD_METHOD "WRDD" |
|---|
| 72 | 76 | #define ACPI_SPLC_METHOD "SPLC" |
|---|
| 77 | +#define ACPI_ECKV_METHOD "ECKV" |
|---|
| 78 | +#define ACPI_PPAG_METHOD "PPAG" |
|---|
| 79 | +#define ACPI_WTAS_METHOD "WTAS" |
|---|
| 73 | 80 | |
|---|
| 74 | 81 | #define ACPI_WIFI_DOMAIN (0x07) |
|---|
| 75 | 82 | |
|---|
| .. | .. |
|---|
| 82 | 89 | |
|---|
| 83 | 90 | #define ACPI_SAR_NUM_CHAIN_LIMITS 2 |
|---|
| 84 | 91 | #define ACPI_SAR_NUM_SUB_BANDS 5 |
|---|
| 92 | +#define ACPI_SAR_NUM_TABLES 1 |
|---|
| 85 | 93 | |
|---|
| 86 | 94 | #define ACPI_WRDS_WIFI_DATA_SIZE (ACPI_SAR_TABLE_SIZE + 2) |
|---|
| 87 | 95 | #define ACPI_EWRD_WIFI_DATA_SIZE ((ACPI_SAR_PROFILE_NUM - 1) * \ |
|---|
| .. | .. |
|---|
| 89 | 97 | #define ACPI_WGDS_WIFI_DATA_SIZE 19 |
|---|
| 90 | 98 | #define ACPI_WRDD_WIFI_DATA_SIZE 2 |
|---|
| 91 | 99 | #define ACPI_SPLC_WIFI_DATA_SIZE 2 |
|---|
| 100 | +#define ACPI_ECKV_WIFI_DATA_SIZE 2 |
|---|
| 92 | 101 | |
|---|
| 93 | | -#define ACPI_WGDS_NUM_BANDS 2 |
|---|
| 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 | + |
|---|
| 94 | 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 | +}; |
|---|
| 95 | 149 | |
|---|
| 96 | 150 | #ifdef CONFIG_ACPI |
|---|
| 97 | 151 | |
|---|
| 152 | +struct iwl_fw_runtime; |
|---|
| 153 | + |
|---|
| 98 | 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 | + |
|---|
| 99 | 158 | union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, |
|---|
| 100 | 159 | union acpi_object *data, |
|---|
| 101 | | - int data_size); |
|---|
| 160 | + int data_size, int *tbl_rev); |
|---|
| 102 | 161 | |
|---|
| 103 | 162 | /** |
|---|
| 104 | 163 | * iwl_acpi_get_mcc - read MCC from ACPI, if available |
|---|
| .. | .. |
|---|
| 112 | 171 | |
|---|
| 113 | 172 | u64 iwl_acpi_get_pwr_limit(struct device *dev); |
|---|
| 114 | 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 | + |
|---|
| 115 | 203 | #else /* CONFIG_ACPI */ |
|---|
| 116 | 204 | |
|---|
| 117 | 205 | static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method) |
|---|
| .. | .. |
|---|
| 119 | 207 | return ERR_PTR(-ENOENT); |
|---|
| 120 | 208 | } |
|---|
| 121 | 209 | |
|---|
| 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 | + |
|---|
| 216 | +static inline int iwl_acpi_get_dsm_u8(struct device *dev, int rev, int func) |
|---|
| 217 | +{ |
|---|
| 218 | + return -ENOENT; |
|---|
| 219 | +} |
|---|
| 220 | + |
|---|
| 122 | 221 | static inline union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, |
|---|
| 123 | 222 | union acpi_object *data, |
|---|
| 124 | | - int data_size) |
|---|
| 223 | + int data_size, |
|---|
| 224 | + int *tbl_rev) |
|---|
| 125 | 225 | { |
|---|
| 126 | 226 | return ERR_PTR(-ENOENT); |
|---|
| 127 | 227 | } |
|---|
| .. | .. |
|---|
| 136 | 236 | return 0; |
|---|
| 137 | 237 | } |
|---|
| 138 | 238 | |
|---|
| 239 | +static inline int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk) |
|---|
| 240 | +{ |
|---|
| 241 | + return -ENOENT; |
|---|
| 242 | +} |
|---|
| 243 | + |
|---|
| 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 | + |
|---|
| 251 | +static inline int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt) |
|---|
| 252 | +{ |
|---|
| 253 | + return -ENOENT; |
|---|
| 254 | +} |
|---|
| 255 | + |
|---|
| 256 | +static inline int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt) |
|---|
| 257 | +{ |
|---|
| 258 | + return -ENOENT; |
|---|
| 259 | +} |
|---|
| 260 | + |
|---|
| 261 | +static inline int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt) |
|---|
| 262 | +{ |
|---|
| 263 | + return -ENOENT; |
|---|
| 264 | +} |
|---|
| 265 | + |
|---|
| 266 | +static inline bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt) |
|---|
| 267 | +{ |
|---|
| 268 | + return false; |
|---|
| 269 | +} |
|---|
| 270 | + |
|---|
| 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 | +} |
|---|
| 139 | 277 | #endif /* CONFIG_ACPI */ |
|---|
| 140 | 278 | #endif /* __iwl_fw_acpi__ */ |
|---|