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