brintos

brintos / linux-shallow public Read only

0
0
Text · 17.2 KiB · 4d9a1f8 Raw
653 lines · c
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause2/*3 * Copyright (C) 2023 Intel Corporation4 */5#include <linux/dmi.h>6#include "iwl-drv.h"7#include "iwl-debug.h"8#include "regulatory.h"9#include "fw/runtime.h"10#include "fw/uefi.h"11 12#define GET_BIOS_TABLE(__name, ...)					\13do {									\14	int ret = -ENOENT;						\15	if (fwrt->uefi_tables_lock_status > UEFI_WIFI_GUID_UNLOCKED)	\16		ret = iwl_uefi_get_ ## __name(__VA_ARGS__);		\17	if (ret < 0)							\18		ret = iwl_acpi_get_ ## __name(__VA_ARGS__);		\19	return ret;							\20} while (0)21 22#define IWL_BIOS_TABLE_LOADER(__name)					\23int iwl_bios_get_ ## __name(struct iwl_fw_runtime *fwrt)		\24{GET_BIOS_TABLE(__name, fwrt); }					\25IWL_EXPORT_SYMBOL(iwl_bios_get_ ## __name)26 27#define IWL_BIOS_TABLE_LOADER_DATA(__name, data_type)			\28int iwl_bios_get_ ## __name(struct iwl_fw_runtime *fwrt,		\29			    data_type * data)				\30{GET_BIOS_TABLE(__name, fwrt, data); }					\31IWL_EXPORT_SYMBOL(iwl_bios_get_ ## __name)32 33IWL_BIOS_TABLE_LOADER(wrds_table);34IWL_BIOS_TABLE_LOADER(ewrd_table);35IWL_BIOS_TABLE_LOADER(wgds_table);36IWL_BIOS_TABLE_LOADER(ppag_table);37IWL_BIOS_TABLE_LOADER_DATA(tas_table, struct iwl_tas_data);38IWL_BIOS_TABLE_LOADER_DATA(pwr_limit, u64);39IWL_BIOS_TABLE_LOADER_DATA(mcc, char);40IWL_BIOS_TABLE_LOADER_DATA(eckv, u32);41IWL_BIOS_TABLE_LOADER_DATA(wbem, u32);42 43 44static const struct dmi_system_id dmi_ppag_approved_list[] = {45	{ .ident = "HP",46	  .matches = {47			DMI_MATCH(DMI_SYS_VENDOR, "HP"),48		},49	},50	{ .ident = "SAMSUNG",51	  .matches = {52			DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD"),53		},54	},55	{ .ident = "MSFT",56	  .matches = {57			DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),58		},59	},60	{ .ident = "ASUS",61	  .matches = {62			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),63		},64	},65	{ .ident = "GOOGLE-HP",66	  .matches = {67			DMI_MATCH(DMI_SYS_VENDOR, "Google"),68			DMI_MATCH(DMI_BOARD_VENDOR, "HP"),69		},70	},71	{ .ident = "GOOGLE-ASUS",72	  .matches = {73			DMI_MATCH(DMI_SYS_VENDOR, "Google"),74			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek COMPUTER INC."),75		},76	},77	{ .ident = "GOOGLE-SAMSUNG",78	  .matches = {79			DMI_MATCH(DMI_SYS_VENDOR, "Google"),80			DMI_MATCH(DMI_BOARD_VENDOR, "SAMSUNG ELECTRONICS CO., LTD"),81		},82	},83	{ .ident = "DELL",84	  .matches = {85			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),86		},87	},88	{ .ident = "DELL",89	  .matches = {90			DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),91		},92	},93	{ .ident = "RAZER",94	  .matches = {95			DMI_MATCH(DMI_SYS_VENDOR, "Razer"),96		},97	},98	{ .ident = "Honor",99	  .matches = {100			DMI_MATCH(DMI_SYS_VENDOR, "HONOR"),101		},102	},103	{}104};105 106static const struct dmi_system_id dmi_tas_approved_list[] = {107	{ .ident = "HP",108	  .matches = {109			DMI_MATCH(DMI_SYS_VENDOR, "HP"),110		},111	},112	{ .ident = "SAMSUNG",113	  .matches = {114			DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD"),115		},116	},117		{ .ident = "LENOVO",118	  .matches = {119			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),120		},121	},122	{ .ident = "DELL",123	  .matches = {124			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),125		},126	},127	{ .ident = "MSFT",128	  .matches = {129			DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),130		},131	},132	{ .ident = "Acer",133	  .matches = {134			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),135		},136	},137	{ .ident = "ASUS",138	  .matches = {139			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),140		},141	},142	{ .ident = "GOOGLE-HP",143	  .matches = {144			DMI_MATCH(DMI_SYS_VENDOR, "Google"),145			DMI_MATCH(DMI_BOARD_VENDOR, "HP"),146		},147	},148	{ .ident = "MSI",149	  .matches = {150			DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International Co., Ltd."),151		},152	},153	{ .ident = "Honor",154	  .matches = {155			DMI_MATCH(DMI_SYS_VENDOR, "HONOR"),156		},157	},158	/* keep last */159	{}160};161 162bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt)163{164	/*165	 * The PER_CHAIN_LIMIT_OFFSET_CMD command is not supported on166	 * earlier firmware versions.  Unfortunately, we don't have a167	 * TLV API flag to rely on, so rely on the major version which168	 * is in the first byte of ucode_ver.  This was implemented169	 * initially on version 38 and then backported to 17.  It was170	 * also backported to 29, but only for 7265D devices.  The171	 * intention was to have it in 36 as well, but not all 8000172	 * family got this feature enabled.  The 8000 family is the173	 * only one using version 36, so skip this version entirely.174	 */175	return IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) >= 38 ||176		(IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 17 &&177		 fwrt->trans->hw_rev != CSR_HW_REV_TYPE_3160) ||178		(IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 29 &&179		 ((fwrt->trans->hw_rev & CSR_HW_REV_TYPE_MSK) ==180		  CSR_HW_REV_TYPE_7265D));181}182IWL_EXPORT_SYMBOL(iwl_sar_geo_support);183 184int iwl_sar_geo_fill_table(struct iwl_fw_runtime *fwrt,185			   struct iwl_per_chain_offset *table,186			   u32 n_bands, u32 n_profiles)187{188	int i, j;189 190	if (!fwrt->geo_enabled)191		return -ENODATA;192 193	if (!iwl_sar_geo_support(fwrt))194		return -EOPNOTSUPP;195 196	for (i = 0; i < n_profiles; i++) {197		for (j = 0; j < n_bands; j++) {198			struct iwl_per_chain_offset *chain =199				&table[i * n_bands + j];200 201			chain->max_tx_power =202				cpu_to_le16(fwrt->geo_profiles[i].bands[j].max);203			chain->chain_a =204				fwrt->geo_profiles[i].bands[j].chains[0];205			chain->chain_b =206				fwrt->geo_profiles[i].bands[j].chains[1];207			IWL_DEBUG_RADIO(fwrt,208					"SAR geographic profile[%d] Band[%d]: chain A = %d chain B = %d max_tx_power = %d\n",209					i, j,210					fwrt->geo_profiles[i].bands[j].chains[0],211					fwrt->geo_profiles[i].bands[j].chains[1],212					fwrt->geo_profiles[i].bands[j].max);213		}214	}215 216	return 0;217}218IWL_EXPORT_SYMBOL(iwl_sar_geo_fill_table);219 220static int iwl_sar_fill_table(struct iwl_fw_runtime *fwrt,221			      __le16 *per_chain, u32 n_subbands,222			      int prof_a, int prof_b)223{224	int profs[BIOS_SAR_NUM_CHAINS] = { prof_a, prof_b };225	int i, j;226 227	for (i = 0; i < BIOS_SAR_NUM_CHAINS; i++) {228		struct iwl_sar_profile *prof;229 230		/* don't allow SAR to be disabled (profile 0 means disable) */231		if (profs[i] == 0)232			return -EPERM;233 234		/* we are off by one, so allow up to BIOS_SAR_MAX_PROFILE_NUM */235		if (profs[i] > BIOS_SAR_MAX_PROFILE_NUM)236			return -EINVAL;237 238		/* profiles go from 1 to 4, so decrement to access the array */239		prof = &fwrt->sar_profiles[profs[i] - 1];240 241		/* if the profile is disabled, do nothing */242		if (!prof->enabled) {243			IWL_DEBUG_RADIO(fwrt, "SAR profile %d is disabled.\n",244					profs[i]);245			/*246			 * if one of the profiles is disabled, we247			 * ignore all of them and return 1 to248			 * differentiate disabled from other failures.249			 */250			return 1;251		}252 253		IWL_DEBUG_INFO(fwrt,254			       "SAR EWRD: chain %d profile index %d\n",255			       i, profs[i]);256		IWL_DEBUG_RADIO(fwrt, "  Chain[%d]:\n", i);257		for (j = 0; j < n_subbands; j++) {258			per_chain[i * n_subbands + j] =259				cpu_to_le16(prof->chains[i].subbands[j]);260			IWL_DEBUG_RADIO(fwrt, "    Band[%d] = %d * .125dBm\n",261					j, prof->chains[i].subbands[j]);262		}263	}264 265	return 0;266}267 268int iwl_sar_fill_profile(struct iwl_fw_runtime *fwrt,269			 __le16 *per_chain, u32 n_tables, u32 n_subbands,270			 int prof_a, int prof_b)271{272	int i, ret = 0;273 274	for (i = 0; i < n_tables; i++) {275		ret = iwl_sar_fill_table(fwrt,276			&per_chain[i * n_subbands * BIOS_SAR_NUM_CHAINS],277			n_subbands, prof_a, prof_b);278		if (ret)279			break;280	}281 282	return ret;283}284IWL_EXPORT_SYMBOL(iwl_sar_fill_profile);285 286static bool iwl_ppag_value_valid(struct iwl_fw_runtime *fwrt, int chain,287				 int subband)288{289	s8 ppag_val = fwrt->ppag_chains[chain].subbands[subband];290 291	if ((subband == 0 &&292	     (ppag_val > IWL_PPAG_MAX_LB || ppag_val < IWL_PPAG_MIN_LB)) ||293	    (subband != 0 &&294	     (ppag_val > IWL_PPAG_MAX_HB || ppag_val < IWL_PPAG_MIN_HB))) {295		IWL_DEBUG_RADIO(fwrt, "Invalid PPAG value: %d\n", ppag_val);296		return false;297	}298	return true;299}300 301int iwl_fill_ppag_table(struct iwl_fw_runtime *fwrt,302			union iwl_ppag_table_cmd *cmd, int *cmd_size)303{304	u8 cmd_ver;305	int i, j, num_sub_bands;306	s8 *gain;307	bool send_ppag_always;308 309	/* many firmware images for JF lie about this */310	if (CSR_HW_RFID_TYPE(fwrt->trans->hw_rf_id) ==311	    CSR_HW_RFID_TYPE(CSR_HW_RF_ID_TYPE_JF))312		return -EOPNOTSUPP;313 314	if (!fw_has_capa(&fwrt->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) {315		IWL_DEBUG_RADIO(fwrt,316				"PPAG capability not supported by FW, command not sent.\n");317		return -EINVAL;318	}319 320	cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw,321					WIDE_ID(PHY_OPS_GROUP,322						PER_PLATFORM_ANT_GAIN_CMD), 1);323	/*324	 * Starting from ver 4, driver needs to send the PPAG CMD regardless325	 * if PPAG is enabled/disabled or valid/invalid.326	 */327	send_ppag_always = cmd_ver > 3;328 329	/* Don't send PPAG if it is disabled */330	if (!send_ppag_always && !fwrt->ppag_flags) {331		IWL_DEBUG_RADIO(fwrt, "PPAG not enabled, command not sent.\n");332		return -EINVAL;333	}334 335	/* The 'flags' field is the same in v1 and in v2 so we can just336	 * use v1 to access it.337	 */338	cmd->v1.flags = cpu_to_le32(fwrt->ppag_flags);339 340	IWL_DEBUG_RADIO(fwrt, "PPAG cmd ver is %d\n", cmd_ver);341	if (cmd_ver == 1) {342		num_sub_bands = IWL_NUM_SUB_BANDS_V1;343		gain = cmd->v1.gain[0];344		*cmd_size = sizeof(cmd->v1);345		if (fwrt->ppag_ver >= 1) {346			/* in this case FW supports revision 0 */347			IWL_DEBUG_RADIO(fwrt,348					"PPAG table rev is %d, send truncated table\n",349					fwrt->ppag_ver);350		}351	} else if (cmd_ver >= 2 && cmd_ver <= 6) {352		num_sub_bands = IWL_NUM_SUB_BANDS_V2;353		gain = cmd->v2.gain[0];354		*cmd_size = sizeof(cmd->v2);355		if (fwrt->ppag_ver == 0) {356			/* in this case FW supports revisions 1,2 or 3 */357			IWL_DEBUG_RADIO(fwrt,358					"PPAG table rev is 0, send padded table\n");359		}360	} else {361		IWL_DEBUG_RADIO(fwrt, "Unsupported PPAG command version\n");362		return -EINVAL;363	}364 365	/* ppag mode */366	IWL_DEBUG_RADIO(fwrt,367			"PPAG MODE bits were read from bios: %d\n",368			le32_to_cpu(cmd->v1.flags));369 370	if (cmd_ver == 5)371		cmd->v1.flags &= cpu_to_le32(IWL_PPAG_CMD_V5_MASK);372	else if (cmd_ver < 5)373		cmd->v1.flags &= cpu_to_le32(IWL_PPAG_CMD_V4_MASK);374 375	if ((cmd_ver == 1 &&376	     !fw_has_capa(&fwrt->fw->ucode_capa,377			  IWL_UCODE_TLV_CAPA_PPAG_CHINA_BIOS_SUPPORT)) ||378	    (cmd_ver == 2 && fwrt->ppag_ver >= 2)) {379		cmd->v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK);380		IWL_DEBUG_RADIO(fwrt, "masking ppag China bit\n");381	} else {382		IWL_DEBUG_RADIO(fwrt, "isn't masking ppag China bit\n");383	}384 385	IWL_DEBUG_RADIO(fwrt,386			"PPAG MODE bits going to be sent: %d\n",387			le32_to_cpu(cmd->v1.flags));388 389	for (i = 0; i < IWL_NUM_CHAIN_LIMITS; i++) {390		for (j = 0; j < num_sub_bands; j++) {391			if (!send_ppag_always &&392			    !iwl_ppag_value_valid(fwrt, i, j))393				return -EINVAL;394 395			gain[i * num_sub_bands + j] =396				fwrt->ppag_chains[i].subbands[j];397			IWL_DEBUG_RADIO(fwrt,398					"PPAG table: chain[%d] band[%d]: gain = %d\n",399					i, j, gain[i * num_sub_bands + j]);400		}401	}402 403	return 0;404}405IWL_EXPORT_SYMBOL(iwl_fill_ppag_table);406 407bool iwl_is_ppag_approved(struct iwl_fw_runtime *fwrt)408{409	if (!dmi_check_system(dmi_ppag_approved_list)) {410		IWL_DEBUG_RADIO(fwrt,411				"System vendor '%s' is not in the approved list, disabling PPAG.\n",412				dmi_get_system_info(DMI_SYS_VENDOR) ?: "<unknown>");413		fwrt->ppag_flags = 0;414		return false;415	}416 417	return true;418}419IWL_EXPORT_SYMBOL(iwl_is_ppag_approved);420 421bool iwl_is_tas_approved(void)422{423	return dmi_check_system(dmi_tas_approved_list);424}425IWL_EXPORT_SYMBOL(iwl_is_tas_approved);426 427int iwl_parse_tas_selection(struct iwl_fw_runtime *fwrt,428			    struct iwl_tas_data *tas_data,429			    const u32 tas_selection)430{431	u8 override_iec = u32_get_bits(tas_selection,432				       IWL_WTAS_OVERRIDE_IEC_MSK);433	u8 enabled_iec = u32_get_bits(tas_selection, IWL_WTAS_ENABLE_IEC_MSK);434	u8 usa_tas_uhb = u32_get_bits(tas_selection, IWL_WTAS_USA_UHB_MSK);435	int enabled = tas_selection & IWL_WTAS_ENABLED_MSK;436 437	IWL_DEBUG_RADIO(fwrt, "TAS selection as read from BIOS: 0x%x\n",438			tas_selection);439 440	tas_data->usa_tas_uhb_allowed = usa_tas_uhb;441	tas_data->override_tas_iec = override_iec;442	tas_data->enable_tas_iec = enabled_iec;443 444	return enabled;445}446 447static __le32 iwl_get_lari_config_bitmap(struct iwl_fw_runtime *fwrt)448{449	int ret;450	u32 val;451	__le32 config_bitmap = 0;452 453	switch (CSR_HW_RFID_TYPE(fwrt->trans->hw_rf_id)) {454	case IWL_CFG_RF_TYPE_HR1:455	case IWL_CFG_RF_TYPE_HR2:456	case IWL_CFG_RF_TYPE_JF1:457	case IWL_CFG_RF_TYPE_JF2:458		ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENABLE_INDONESIA_5G2,459				       &val);460 461		if (!ret && val == DSM_VALUE_INDONESIA_ENABLE)462			config_bitmap |=463			    cpu_to_le32(LARI_CONFIG_ENABLE_5G2_IN_INDONESIA_MSK);464		break;465	default:466		break;467	}468 469	ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_DISABLE_SRD, &val);470	if (!ret) {471		if (val == DSM_VALUE_SRD_PASSIVE)472			config_bitmap |=473				cpu_to_le32(LARI_CONFIG_CHANGE_ETSI_TO_PASSIVE_MSK);474		else if (val == DSM_VALUE_SRD_DISABLE)475			config_bitmap |=476				cpu_to_le32(LARI_CONFIG_CHANGE_ETSI_TO_DISABLED_MSK);477	}478 479	if (fw_has_capa(&fwrt->fw->ucode_capa,480			IWL_UCODE_TLV_CAPA_CHINA_22_REG_SUPPORT)) {481		ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_REGULATORY_CONFIG,482				       &val);483		/*484		 * China 2022 enable if the BIOS object does not exist or485		 * if it is enabled in BIOS.486		 */487		if (ret < 0 || val & DSM_MASK_CHINA_22_REG)488			config_bitmap |=489				cpu_to_le32(LARI_CONFIG_ENABLE_CHINA_22_REG_SUPPORT_MSK);490	}491 492	return config_bitmap;493}494 495static size_t iwl_get_lari_config_cmd_size(u8 cmd_ver)496{497	size_t cmd_size;498 499	switch (cmd_ver) {500	case 12:501	case 11:502		cmd_size = sizeof(struct iwl_lari_config_change_cmd);503		break;504	case 10:505		cmd_size = sizeof(struct iwl_lari_config_change_cmd_v10);506		break;507	case 9:508	case 8:509	case 7:510		cmd_size = sizeof(struct iwl_lari_config_change_cmd_v7);511		break;512	case 6:513		cmd_size = sizeof(struct iwl_lari_config_change_cmd_v6);514		break;515	case 5:516		cmd_size = sizeof(struct iwl_lari_config_change_cmd_v5);517		break;518	case 4:519		cmd_size = sizeof(struct iwl_lari_config_change_cmd_v4);520		break;521	case 3:522		cmd_size = sizeof(struct iwl_lari_config_change_cmd_v3);523		break;524	case 2:525		cmd_size = sizeof(struct iwl_lari_config_change_cmd_v2);526		break;527	default:528		cmd_size = sizeof(struct iwl_lari_config_change_cmd_v1);529		break;530	}531	return cmd_size;532}533 534int iwl_fill_lari_config(struct iwl_fw_runtime *fwrt,535			 struct iwl_lari_config_change_cmd *cmd,536			 size_t *cmd_size)537{538	int ret;539	u32 value;540	u8 cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw,541					   WIDE_ID(REGULATORY_AND_NVM_GROUP,542						   LARI_CONFIG_CHANGE), 1);543 544	memset(cmd, 0, sizeof(*cmd));545	*cmd_size = iwl_get_lari_config_cmd_size(cmd_ver);546 547	cmd->config_bitmap = iwl_get_lari_config_bitmap(fwrt);548 549	ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_11AX_ENABLEMENT, &value);550	if (!ret)551		cmd->oem_11ax_allow_bitmap = cpu_to_le32(value);552 553	ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENABLE_UNII4_CHAN, &value);554	if (!ret) {555		if (cmd_ver < 9)556			value &= DSM_UNII4_ALLOW_BITMAP_CMD_V8;557		else558			value &= DSM_UNII4_ALLOW_BITMAP;559 560		cmd->oem_unii4_allow_bitmap = cpu_to_le32(value);561	}562 563	ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ACTIVATE_CHANNEL, &value);564	if (!ret) {565		if (cmd_ver < 8)566			value &= ~ACTIVATE_5G2_IN_WW_MASK;567		if (cmd_ver < 12)568			value &= CHAN_STATE_ACTIVE_BITMAP_CMD_V11;569 570		cmd->chan_state_active_bitmap = cpu_to_le32(value);571	}572 573	ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENABLE_6E, &value);574	if (!ret)575		cmd->oem_uhb_allow_bitmap = cpu_to_le32(value);576 577	ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_FORCE_DISABLE_CHANNELS, &value);578	if (!ret)579		cmd->force_disable_channels_bitmap = cpu_to_le32(value);580 581	ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENERGY_DETECTION_THRESHOLD,582			       &value);583	if (!ret)584		cmd->edt_bitmap = cpu_to_le32(value);585 586	ret = iwl_bios_get_wbem(fwrt, &value);587	if (!ret)588		cmd->oem_320mhz_allow_bitmap = cpu_to_le32(value);589 590	ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENABLE_11BE, &value);591	if (!ret)592		cmd->oem_11be_allow_bitmap = cpu_to_le32(value);593 594	if (cmd->config_bitmap ||595	    cmd->oem_uhb_allow_bitmap ||596	    cmd->oem_11ax_allow_bitmap ||597	    cmd->oem_unii4_allow_bitmap ||598	    cmd->chan_state_active_bitmap ||599	    cmd->force_disable_channels_bitmap ||600	    cmd->edt_bitmap ||601	    cmd->oem_320mhz_allow_bitmap ||602	    cmd->oem_11be_allow_bitmap) {603		IWL_DEBUG_RADIO(fwrt,604				"sending LARI_CONFIG_CHANGE, config_bitmap=0x%x, oem_11ax_allow_bitmap=0x%x\n",605				le32_to_cpu(cmd->config_bitmap),606				le32_to_cpu(cmd->oem_11ax_allow_bitmap));607		IWL_DEBUG_RADIO(fwrt,608				"sending LARI_CONFIG_CHANGE, oem_unii4_allow_bitmap=0x%x, chan_state_active_bitmap=0x%x, cmd_ver=%d\n",609				le32_to_cpu(cmd->oem_unii4_allow_bitmap),610				le32_to_cpu(cmd->chan_state_active_bitmap),611				cmd_ver);612		IWL_DEBUG_RADIO(fwrt,613				"sending LARI_CONFIG_CHANGE, oem_uhb_allow_bitmap=0x%x, force_disable_channels_bitmap=0x%x\n",614				le32_to_cpu(cmd->oem_uhb_allow_bitmap),615				le32_to_cpu(cmd->force_disable_channels_bitmap));616		IWL_DEBUG_RADIO(fwrt,617				"sending LARI_CONFIG_CHANGE, edt_bitmap=0x%x, oem_320mhz_allow_bitmap=0x%x\n",618				le32_to_cpu(cmd->edt_bitmap),619				le32_to_cpu(cmd->oem_320mhz_allow_bitmap));620		IWL_DEBUG_RADIO(fwrt,621				"sending LARI_CONFIG_CHANGE, oem_11be_allow_bitmap=0x%x\n",622				le32_to_cpu(cmd->oem_11be_allow_bitmap));623	} else {624		return 1;625	}626 627	return 0;628}629IWL_EXPORT_SYMBOL(iwl_fill_lari_config);630 631int iwl_bios_get_dsm(struct iwl_fw_runtime *fwrt, enum iwl_dsm_funcs func,632		     u32 *value)633{634	GET_BIOS_TABLE(dsm, fwrt, func, value);635}636IWL_EXPORT_SYMBOL(iwl_bios_get_dsm);637 638bool iwl_puncturing_is_allowed_in_bios(u32 puncturing, u16 mcc)639{640	/* Some kind of regulatory mess means we need to currently disallow641	 * puncturing in the US and Canada unless enabled in BIOS.642	 */643	switch (mcc) {644	case IWL_MCC_US:645		return puncturing & IWL_UEFI_CNV_PUNCTURING_USA_EN_MSK;646	case IWL_MCC_CANADA:647		return puncturing & IWL_UEFI_CNV_PUNCTURING_CANADA_EN_MSK;648	default:649		return true;650	}651}652IWL_EXPORT_SYMBOL(iwl_puncturing_is_allowed_in_bios);653