linux/drivers/net/wireless/intel/iwlwifi/fw/uefi.h

/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
 * Copyright(c) 2021-2024 Intel Corporation
 */
#ifndef __iwl_fw_uefi__
#define __iwl_fw_uefi__

#include "fw/regulatory.h"

#define IWL_UEFI_OEM_PNVM_NAME
#define IWL_UEFI_REDUCED_POWER_NAME
#define IWL_UEFI_SGOM_NAME
#define IWL_UEFI_STEP_NAME
#define IWL_UEFI_UATS_NAME
#define IWL_UEFI_WRDS_NAME
#define IWL_UEFI_EWRD_NAME
#define IWL_UEFI_WGDS_NAME
#define IWL_UEFI_PPAG_NAME
#define IWL_UEFI_WTAS_NAME
#define IWL_UEFI_SPLC_NAME
#define IWL_UEFI_WRDD_NAME
#define IWL_UEFI_ECKV_NAME
#define IWL_UEFI_DSM_NAME
#define IWL_UEFI_WBEM_NAME


#define IWL_SGOM_MAP_SIZE
#define IWL_UATS_MAP_SIZE

#define IWL_UEFI_WRDS_REVISION
#define IWL_UEFI_EWRD_REVISION
#define IWL_UEFI_WGDS_REVISION
#define IWL_UEFI_MIN_PPAG_REV
#define IWL_UEFI_MAX_PPAG_REV
#define IWL_UEFI_WTAS_REVISION
#define IWL_UEFI_SPLC_REVISION
#define IWL_UEFI_WRDD_REVISION
#define IWL_UEFI_ECKV_REVISION
#define IWL_UEFI_WBEM_REVISION
#define IWL_UEFI_DSM_REVISION

struct pnvm_sku_package {} __packed;

struct uefi_cnv_wlan_sgom_data {} __packed;

struct uefi_cnv_wlan_uats_data {} __packed;

struct uefi_cnv_common_step_data {} __packed;

/*
 * struct uefi_sar_profile - a SAR profile as defined in UEFI
 *
 * @chains: a per-chain table of SAR values
 */
struct uefi_sar_profile {} __packed;

/*
 * struct uefi_cnv_var_wrds - WRDS table as defined in UEFI
 *
 * @revision: the revision of the table
 * @mode: is WRDS enbaled/disabled
 * @sar_profile: sar profile #1
 */
struct uefi_cnv_var_wrds {} __packed;

/*
 * struct uefi_cnv_var_ewrd - EWRD table as defined in UEFI
 * @revision: the revision of the table
 * @mode: is WRDS enbaled/disabled
 * @num_profiles: how many additional profiles we have in this table (0-3)
 * @sar_profiles: the additional SAR profiles (#2-#4)
 */
struct uefi_cnv_var_ewrd {} __packed;

/*
 * struct uefi_cnv_var_wgds - WGDS table as defined in UEFI
 * @revision: the revision of the table
 * @num_profiles: the number of geo profiles we have in the table.
 *	The first 3 are mandatory, and can have up to 8.
 * @geo_profiles: a per-profile table of the offsets to add to SAR values.
 */
struct uefi_cnv_var_wgds {} __packed;

/*
 * struct uefi_cnv_var_ppag - PPAG table as defined in UEFI
 * @revision: the revision of the table
 * @ppag_modes: values from &enum iwl_ppag_flags
 * @ppag_chains: the PPAG values per chain and band
 */
struct uefi_cnv_var_ppag {} __packed;

/* struct uefi_cnv_var_wtas - WTAS tabled as defined in UEFI
 * @revision: the revision of the table
 * @tas_selection: different options of TAS enablement.
 * @black_list_size: the number of defined entried in the black list
 * @black_list: a list of countries that are not allowed to use the TAS feature
 */
struct uefi_cnv_var_wtas {} __packed;

/* struct uefi_cnv_var_splc - SPLC tabled as defined in UEFI
 * @revision: the revision of the table
 * @default_pwr_limit: The default maximum power per device
 */
struct uefi_cnv_var_splc {} __packed;

#define UEFI_MCC_CHINA

/* struct uefi_cnv_var_wrdd - WRDD table as defined in UEFI
 * @revision: the revision of the table
 * @mcc: country identifier as defined in ISO/IEC 3166-1 Alpha 2 code
 */
struct uefi_cnv_var_wrdd {} __packed;

/* struct uefi_cnv_var_eckv - ECKV table as defined in UEFI
 * @revision: the revision of the table
 * @ext_clock_valid: indicates if external 32KHz clock is valid
 */
struct uefi_cnv_var_eckv {} __packed;

#define UEFI_MAX_DSM_FUNCS

/* struct uefi_cnv_var_general_cfg - DSM-like table as defined in UEFI
 * @revision: the revision of the table
 * @functions: payload of the different DSM functions
 */
struct uefi_cnv_var_general_cfg {} __packed;

#define IWL_UEFI_WBEM_REV0_MASK
/* struct uefi_cnv_wlan_wbem_data - Bandwidth enablement per MCC as defined
 *	in UEFI
 * @revision: the revision of the table
 * @wbem_320mhz_per_mcc: enablement of 320MHz bandwidth per MCC
 *	bit 0 - if set, 320MHz is enabled for Japan
 *	bit 1 - if set, 320MHz is enabled for South Korea
 *	bit 2- 31, Reserved
 */
struct uefi_cnv_wlan_wbem_data {} __packed;

/*
 * This is known to be broken on v4.19 and to work on v5.4.  Until we
 * figure out why this is the case and how to make it work, simply
 * disable the feature in old kernels.
 */
#ifdef CONFIG_EFI
void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len);
u8 *iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len);
int iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
				const u8 *data, size_t len,
				struct iwl_pnvm_image *pnvm_data);
void iwl_uefi_get_step_table(struct iwl_trans *trans);
int iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
				 u32 tlv_len, struct iwl_pnvm_image *pnvm_data);
int iwl_uefi_get_wrds_table(struct iwl_fw_runtime *fwrt);
int iwl_uefi_get_ewrd_table(struct iwl_fw_runtime *fwrt);
int iwl_uefi_get_wgds_table(struct iwl_fw_runtime *fwrt);
int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt);
int iwl_uefi_get_tas_table(struct iwl_fw_runtime *fwrt,
			   struct iwl_tas_data *data);
int iwl_uefi_get_pwr_limit(struct iwl_fw_runtime *fwrt,
			   u64 *dflt_pwr_limit);
int iwl_uefi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc);
int iwl_uefi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk);
int iwl_uefi_get_wbem(struct iwl_fw_runtime *fwrt, u32 *value);
int iwl_uefi_get_dsm(struct iwl_fw_runtime *fwrt, enum iwl_dsm_funcs func,
		     u32 *value);
void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt);
int iwl_uefi_get_uats_table(struct iwl_trans *trans,
			    struct iwl_fw_runtime *fwrt);
#else /* CONFIG_EFI */
static inline void *iwl_uefi_get_pnvm(struct iwl_trans *trans, size_t *len)
{
	return ERR_PTR(-EOPNOTSUPP);
}

static inline int
iwl_uefi_reduce_power_parse(struct iwl_trans *trans,
			    const u8 *data, size_t len,
			    struct iwl_pnvm_image *pnvm_data)
{
	return -EOPNOTSUPP;
}

static inline u8 *
iwl_uefi_get_reduced_power(struct iwl_trans *trans, size_t *len)
{
	return ERR_PTR(-EOPNOTSUPP);
}

static inline void iwl_uefi_get_step_table(struct iwl_trans *trans)
{
}

static inline int
iwl_uefi_handle_tlv_mem_desc(struct iwl_trans *trans, const u8 *data,
			     u32 tlv_len, struct iwl_pnvm_image *pnvm_data)
{
	return 0;
}

static inline int iwl_uefi_get_wrds_table(struct iwl_fw_runtime *fwrt)
{
	return -ENOENT;
}

static inline int iwl_uefi_get_ewrd_table(struct iwl_fw_runtime *fwrt)
{
	return -ENOENT;
}

static inline int iwl_uefi_get_wgds_table(struct iwl_fw_runtime *fwrt)
{
	return -ENOENT;
}

static inline int iwl_uefi_get_ppag_table(struct iwl_fw_runtime *fwrt)
{
	return -ENOENT;
}

static inline int iwl_uefi_get_tas_table(struct iwl_fw_runtime *fwrt,
					 struct iwl_tas_data *data)
{
	return -ENOENT;
}

static inline int iwl_uefi_get_pwr_limit(struct iwl_fw_runtime *fwrt,
					 u64 *dflt_pwr_limit)
{
	*dflt_pwr_limit = 0;
	return 0;
}

static inline int iwl_uefi_get_mcc(struct iwl_fw_runtime *fwrt, char *mcc)
{
	return -ENOENT;
}

static inline int iwl_uefi_get_eckv(struct iwl_fw_runtime *fwrt, u32 *extl_clk)
{
	return -ENOENT;
}

static inline int iwl_uefi_get_wbem(struct iwl_fw_runtime *fwrt, u32 *value)
{
	return -ENOENT;
}

static inline int iwl_uefi_get_dsm(struct iwl_fw_runtime *fwrt,
				   enum iwl_dsm_funcs func, u32 *value)
{
	return -ENOENT;
}

static inline
void iwl_uefi_get_sgom_table(struct iwl_trans *trans, struct iwl_fw_runtime *fwrt)
{
}

static inline
int iwl_uefi_get_uats_table(struct iwl_trans *trans,
			    struct iwl_fw_runtime *fwrt)
{
	return 0;
}
#endif /* CONFIG_EFI */
#endif /* __iwl_fw_uefi__ */