cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

acpi.h (9107B)


      1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
      2/*
      3 * Copyright (C) 2017 Intel Deutschland GmbH
      4 * Copyright (C) 2018-2022 Intel Corporation
      5 */
      6#ifndef __iwl_fw_acpi__
      7#define __iwl_fw_acpi__
      8
      9#include <linux/acpi.h>
     10#include "fw/api/commands.h"
     11#include "fw/api/power.h"
     12#include "fw/api/phy.h"
     13#include "fw/api/nvm-reg.h"
     14#include "fw/img.h"
     15#include "iwl-trans.h"
     16
     17
     18#define ACPI_WRDS_METHOD	"WRDS"
     19#define ACPI_EWRD_METHOD	"EWRD"
     20#define ACPI_WGDS_METHOD	"WGDS"
     21#define ACPI_WRDD_METHOD	"WRDD"
     22#define ACPI_SPLC_METHOD	"SPLC"
     23#define ACPI_ECKV_METHOD	"ECKV"
     24#define ACPI_PPAG_METHOD	"PPAG"
     25#define ACPI_WTAS_METHOD	"WTAS"
     26
     27#define ACPI_WIFI_DOMAIN	(0x07)
     28
     29#define ACPI_SAR_PROFILE_NUM		4
     30
     31#define ACPI_NUM_GEO_PROFILES		3
     32#define ACPI_NUM_GEO_PROFILES_REV3	8
     33#define ACPI_GEO_PER_CHAIN_SIZE		3
     34
     35#define ACPI_SAR_NUM_CHAINS_REV0	2
     36#define ACPI_SAR_NUM_CHAINS_REV1	2
     37#define ACPI_SAR_NUM_CHAINS_REV2	4
     38#define ACPI_SAR_NUM_SUB_BANDS_REV0	5
     39#define ACPI_SAR_NUM_SUB_BANDS_REV1	11
     40#define ACPI_SAR_NUM_SUB_BANDS_REV2	11
     41
     42#define ACPI_WRDS_WIFI_DATA_SIZE_REV0	(ACPI_SAR_NUM_CHAINS_REV0 * \
     43					 ACPI_SAR_NUM_SUB_BANDS_REV0 + 2)
     44#define ACPI_WRDS_WIFI_DATA_SIZE_REV1	(ACPI_SAR_NUM_CHAINS_REV1 * \
     45					 ACPI_SAR_NUM_SUB_BANDS_REV1 + 2)
     46#define ACPI_WRDS_WIFI_DATA_SIZE_REV2	(ACPI_SAR_NUM_CHAINS_REV2 * \
     47					 ACPI_SAR_NUM_SUB_BANDS_REV2 + 2)
     48#define ACPI_EWRD_WIFI_DATA_SIZE_REV0	((ACPI_SAR_PROFILE_NUM - 1) * \
     49					 ACPI_SAR_NUM_CHAINS_REV0 * \
     50					 ACPI_SAR_NUM_SUB_BANDS_REV0 + 3)
     51#define ACPI_EWRD_WIFI_DATA_SIZE_REV1	((ACPI_SAR_PROFILE_NUM - 1) * \
     52					 ACPI_SAR_NUM_CHAINS_REV1 * \
     53					 ACPI_SAR_NUM_SUB_BANDS_REV1 + 3)
     54#define ACPI_EWRD_WIFI_DATA_SIZE_REV2	((ACPI_SAR_PROFILE_NUM - 1) * \
     55					 ACPI_SAR_NUM_CHAINS_REV2 * \
     56					 ACPI_SAR_NUM_SUB_BANDS_REV2 + 3)
     57
     58/* revision 0 and 1 are identical, except for the semantics in the FW */
     59#define ACPI_GEO_NUM_BANDS_REV0		2
     60#define ACPI_GEO_NUM_BANDS_REV2		3
     61#define ACPI_GEO_NUM_CHAINS		2
     62
     63#define ACPI_WRDD_WIFI_DATA_SIZE	2
     64#define ACPI_SPLC_WIFI_DATA_SIZE	2
     65#define ACPI_ECKV_WIFI_DATA_SIZE	2
     66
     67/*
     68 * TAS size: 1 elelment for type,
     69 *	     1 element for enabled field,
     70 *	     1 element for block list size,
     71 *	     16 elements for block list array
     72 */
     73#define APCI_WTAS_BLACK_LIST_MAX	16
     74#define ACPI_WTAS_WIFI_DATA_SIZE	(3 + APCI_WTAS_BLACK_LIST_MAX)
     75#define ACPI_WTAS_ENABLED_MSK		0x1
     76#define ACPI_WTAS_OVERRIDE_IEC_MSK	0x2
     77#define ACPI_WTAS_ENABLE_IEC_MSK	0x4
     78#define ACPI_WTAS_OVERRIDE_IEC_POS	0x1
     79#define ACPI_WTAS_ENABLE_IEC_POS	0x2
     80#define ACPI_WTAS_USA_UHB_MSK		BIT(16)
     81#define ACPI_WTAS_USA_UHB_POS		16
     82
     83
     84#define ACPI_PPAG_WIFI_DATA_SIZE_V1	((IWL_NUM_CHAIN_LIMITS * \
     85					  IWL_NUM_SUB_BANDS_V1) + 2)
     86#define ACPI_PPAG_WIFI_DATA_SIZE_V2	((IWL_NUM_CHAIN_LIMITS * \
     87					  IWL_NUM_SUB_BANDS_V2) + 2)
     88
     89/* PPAG gain value bounds in 1/8 dBm */
     90#define ACPI_PPAG_MIN_LB -16
     91#define ACPI_PPAG_MAX_LB 24
     92#define ACPI_PPAG_MIN_HB -16
     93#define ACPI_PPAG_MAX_HB 40
     94#define ACPI_PPAG_MASK 3
     95#define IWL_PPAG_ETSI_MASK BIT(0)
     96
     97#define IWL_SAR_ENABLE_MSK		BIT(0)
     98#define IWL_REDUCE_POWER_FLAGS_POS	1
     99
    100/*
    101 * The profile for revision 2 is a superset of revision 1, which is in
    102 * turn a superset of revision 0.  So we can store all revisions
    103 * inside revision 2, which is what we represent here.
    104 */
    105struct iwl_sar_profile_chain {
    106	u8 subbands[ACPI_SAR_NUM_SUB_BANDS_REV2];
    107};
    108
    109struct iwl_sar_profile {
    110	bool enabled;
    111	struct iwl_sar_profile_chain chains[ACPI_SAR_NUM_CHAINS_REV2];
    112};
    113
    114/* Same thing as with SAR, all revisions fit in revision 2 */
    115struct iwl_geo_profile_band {
    116	u8 max;
    117	u8 chains[ACPI_GEO_NUM_CHAINS];
    118};
    119
    120struct iwl_geo_profile {
    121	struct iwl_geo_profile_band bands[ACPI_GEO_NUM_BANDS_REV2];
    122};
    123
    124/* Same thing as with SAR, all revisions fit in revision 2 */
    125struct iwl_ppag_chain {
    126	s8 subbands[ACPI_SAR_NUM_SUB_BANDS_REV2];
    127};
    128
    129enum iwl_dsm_funcs_rev_0 {
    130	DSM_FUNC_QUERY = 0,
    131	DSM_FUNC_DISABLE_SRD = 1,
    132	DSM_FUNC_ENABLE_INDONESIA_5G2 = 2,
    133	DSM_FUNC_ENABLE_6E = 3,
    134	DSM_FUNC_11AX_ENABLEMENT = 6,
    135	DSM_FUNC_ENABLE_UNII4_CHAN = 7,
    136	DSM_FUNC_ACTIVATE_CHANNEL = 8,
    137	DSM_FUNC_FORCE_DISABLE_CHANNELS = 9
    138};
    139
    140enum iwl_dsm_values_srd {
    141	DSM_VALUE_SRD_ACTIVE,
    142	DSM_VALUE_SRD_PASSIVE,
    143	DSM_VALUE_SRD_DISABLE,
    144	DSM_VALUE_SRD_MAX
    145};
    146
    147enum iwl_dsm_values_indonesia {
    148	DSM_VALUE_INDONESIA_DISABLE,
    149	DSM_VALUE_INDONESIA_ENABLE,
    150	DSM_VALUE_INDONESIA_RESERVED,
    151	DSM_VALUE_INDONESIA_MAX
    152};
    153
    154/* DSM RFI uses a different GUID, so need separate definitions */
    155
    156#define DSM_RFI_FUNC_ENABLE 3
    157
    158enum iwl_dsm_values_rfi {
    159	DSM_VALUE_RFI_ENABLE,
    160	DSM_VALUE_RFI_DISABLE,
    161	DSM_VALUE_RFI_MAX
    162};
    163
    164#ifdef CONFIG_ACPI
    165
    166struct iwl_fw_runtime;
    167
    168extern const guid_t iwl_guid;
    169extern const guid_t iwl_rfi_guid;
    170
    171void *iwl_acpi_get_object(struct device *dev, acpi_string method);
    172
    173int iwl_acpi_get_dsm_u8(struct device *dev, int rev, int func,
    174			const guid_t *guid, u8 *value);
    175
    176int iwl_acpi_get_dsm_u32(struct device *dev, int rev, int func,
    177			 const guid_t *guid, u32 *value);
    178
    179union acpi_object *iwl_acpi_get_wifi_pkg_range(struct device *dev,
    180					       union acpi_object *data,
    181					       int min_data_size,
    182					       int max_data_size,
    183					       int *tbl_rev);
    184/**
    185 * iwl_acpi_get_mcc - read MCC from ACPI, if available
    186 *
    187 * @dev: the struct device
    188 * @mcc: output buffer (3 bytes) that will get the MCC
    189 *
    190 * This function tries to read the current MCC from ACPI if available.
    191 */
    192int iwl_acpi_get_mcc(struct device *dev, char *mcc);
    193
    194u64 iwl_acpi_get_pwr_limit(struct device *dev);
    195
    196/*
    197 * iwl_acpi_get_eckv - read external clock validation from ACPI, if available
    198 *
    199 * @dev: the struct device
    200 * @extl_clk: output var (2 bytes) that will get the clk indication.
    201 *
    202 * This function tries to read the external clock indication
    203 * from ACPI if available.
    204 */
    205int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk);
    206
    207int iwl_sar_select_profile(struct iwl_fw_runtime *fwrt,
    208			   __le16 *per_chain, u32 n_tables, u32 n_subbands,
    209			   int prof_a, int prof_b);
    210
    211int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt);
    212
    213int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt);
    214
    215int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt);
    216
    217bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt);
    218
    219int iwl_sar_geo_init(struct iwl_fw_runtime *fwrt,
    220		     struct iwl_per_chain_offset *table,
    221		     u32 n_bands, u32 n_profiles);
    222
    223int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
    224		     union iwl_tas_config_cmd *cmd, int fw_ver);
    225
    226__le32 iwl_acpi_get_lari_config_bitmap(struct iwl_fw_runtime *fwrt);
    227
    228int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt);
    229
    230int iwl_read_ppag_table(struct iwl_fw_runtime *fwrt, union iwl_ppag_table_cmd *cmd,
    231			int *cmd_size);
    232
    233bool iwl_acpi_is_ppag_approved(struct iwl_fw_runtime *fwrt);
    234
    235#else /* CONFIG_ACPI */
    236
    237static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method)
    238{
    239	return ERR_PTR(-ENOENT);
    240}
    241
    242static inline void *iwl_acpi_get_dsm_object(struct device *dev, int rev,
    243					    int func, union acpi_object *args)
    244{
    245	return ERR_PTR(-ENOENT);
    246}
    247
    248static inline int iwl_acpi_get_dsm_u8(struct device *dev, int rev, int func,
    249				      const guid_t *guid, u8 *value)
    250{
    251	return -ENOENT;
    252}
    253
    254static inline int iwl_acpi_get_dsm_u32(struct device *dev, int rev, int func,
    255				       const guid_t *guid, u32 *value)
    256{
    257	return -ENOENT;
    258}
    259
    260static inline union acpi_object *
    261iwl_acpi_get_wifi_pkg_range(struct device *dev,
    262			    union acpi_object *data,
    263			    int min_data_size, int max_data_size,
    264			    int *tbl_rev)
    265{
    266	return ERR_PTR(-ENOENT);
    267}
    268
    269static inline int iwl_acpi_get_mcc(struct device *dev, char *mcc)
    270{
    271	return -ENOENT;
    272}
    273
    274static inline u64 iwl_acpi_get_pwr_limit(struct device *dev)
    275{
    276	return 0;
    277}
    278
    279static inline int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk)
    280{
    281	return -ENOENT;
    282}
    283
    284static inline int iwl_sar_select_profile(struct iwl_fw_runtime *fwrt,
    285			   __le16 *per_chain, u32 n_tables, u32 n_subbands,
    286			   int prof_a, int prof_b)
    287{
    288	return -ENOENT;
    289}
    290
    291static inline int iwl_sar_get_wrds_table(struct iwl_fw_runtime *fwrt)
    292{
    293	return -ENOENT;
    294}
    295
    296static inline int iwl_sar_get_ewrd_table(struct iwl_fw_runtime *fwrt)
    297{
    298	return -ENOENT;
    299}
    300
    301static inline int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt)
    302{
    303	return 1;
    304}
    305
    306static inline bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt)
    307{
    308	return false;
    309}
    310
    311static inline int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
    312				   union iwl_tas_config_cmd *cmd, int fw_ver)
    313{
    314	return -ENOENT;
    315}
    316
    317static inline __le32 iwl_acpi_get_lari_config_bitmap(struct iwl_fw_runtime *fwrt)
    318{
    319	return 0;
    320}
    321
    322static inline int iwl_acpi_get_ppag_table(struct iwl_fw_runtime *fwrt)
    323{
    324	return -ENOENT;
    325}
    326
    327static inline int iwl_read_ppag_table(struct iwl_fw_runtime *fwrt,
    328				    union iwl_ppag_table_cmd *cmd, int *cmd_size)
    329{
    330	return -ENOENT;
    331}
    332
    333static inline bool iwl_acpi_is_ppag_approved(struct iwl_fw_runtime *fwrt)
    334{
    335	return false;
    336}
    337
    338#endif /* CONFIG_ACPI */
    339
    340static inline union acpi_object *
    341iwl_acpi_get_wifi_pkg(struct device *dev,
    342		      union acpi_object *data,
    343		      int data_size, int *tbl_rev)
    344{
    345	return iwl_acpi_get_wifi_pkg_range(dev, data, data_size, data_size,
    346					   tbl_rev);
    347}
    348
    349#endif /* __iwl_fw_acpi__ */