Commit c738fb61 authored by Alon Giladi's avatar Alon Giladi Committed by Johannes Berg
Browse files

wifi: iwlwifi: Separate loading and setting of power reduce tables



Take the part that copies the tables into DRAM, out of the method
that sets the prph_scratch to make the code cleaner. Each of the
operations will get more complex in the future when it will also
support larger power-reduce tables images.

Signed-off-by: default avatarAlon Giladi <alon.giladi@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230606103519.7695684dc848.I13626cd318e5d68efec9618b2045f52788bff114@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 63b9e7b9
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -329,14 +329,17 @@ int iwl_pnvm_load(struct iwl_trans *trans,
			 */
			trans->reduce_power_loaded = true;
		} else {
			ret = iwl_trans_set_reduce_power(trans, data, length);
			if (ret)
			ret = iwl_trans_load_reduce_power(trans, data, length);
			if (ret) {
				IWL_DEBUG_FW(trans,
					     "Failed to set reduce power table %d\n",
					     "Failed to load reduce power table %d\n",
					     ret);
				trans->reduce_power_loaded = true;
			}
			kfree(data);
		}
	}
	iwl_trans_set_reduce_power(trans);

	iwl_init_notification_wait(notif_wait, &pnvm_wait,
				   ntf_cmds, ARRAY_SIZE(ntf_cmds),
+3 −2
Original line number Diff line number Diff line
@@ -292,8 +292,9 @@ int iwl_trans_pcie_ctx_info_gen3_load_pnvm(struct iwl_trans *trans,
					   const struct iwl_ucode_capabilities *capa);
void iwl_trans_pcie_ctx_info_gen3_set_pnvm(struct iwl_trans *trans,
					   const struct iwl_ucode_capabilities *capa);
int iwl_trans_pcie_ctx_info_gen3_set_reduce_power(struct iwl_trans *trans,
int iwl_trans_pcie_ctx_info_gen3_load_reduce_power(struct iwl_trans *trans,
						   const void *data, u32 len);
void iwl_trans_pcie_ctx_info_gen3_set_reduce_power(struct iwl_trans *trans);
int iwl_trans_pcie_ctx_info_gen3_set_step(struct iwl_trans *trans,
					  u32 mbx_addr_0_step, u32 mbx_addr_1_step);
#endif /* __iwl_context_info_file_gen3_h__ */
+16 −12
Original line number Diff line number Diff line
@@ -562,6 +562,8 @@ struct iwl_pnvm_image {
 * @load_pnvm: save the pnvm data in DRAM
 * @set_pnvm: set the pnvm data in the prph scratch buffer, inside the
 *	context info.
 * @load_reduce_power: copy reduce power table to the corresponding DRAM memory
 * @set_reduce_power: set reduce power table addresses in the sratch buffer
 * @interrupts: disable/enable interrupts to transport
 */
struct iwl_trans_ops {
@@ -638,8 +640,11 @@ struct iwl_trans_ops {
			 const struct iwl_ucode_capabilities *capa);
	void (*set_pnvm)(struct iwl_trans *trans,
			 const struct iwl_ucode_capabilities *capa);
	int (*set_reduce_power)(struct iwl_trans *trans,
				const void *data, u32 len);
	int (*load_reduce_power)(struct iwl_trans *trans,
				 const void *data,
				 u32 len);
	void (*set_reduce_power)(struct iwl_trans *trans);

	void (*interrupts)(struct iwl_trans *trans, bool enable);
	int (*imr_dma_data)(struct iwl_trans *trans,
			    u32 dst_addr, u64 src_addr,
@@ -1554,18 +1559,17 @@ static inline void iwl_trans_set_pnvm(struct iwl_trans *trans,
		trans->ops->set_pnvm(trans, capa);
}

static inline int iwl_trans_set_reduce_power(struct iwl_trans *trans,
					     const void *data, u32 len)
static inline int iwl_trans_load_reduce_power(struct iwl_trans *trans,
					      const void *data,
					      u32 len)
{
	if (trans->ops->set_reduce_power) {
		int ret = trans->ops->set_reduce_power(trans, data, len);

		if (ret)
			return ret;
	return trans->ops->load_reduce_power(trans, data, len);
}

	trans->reduce_power_loaded = true;
	return 0;
static inline void iwl_trans_set_reduce_power(struct iwl_trans *trans)
{
	if (trans->ops->set_reduce_power)
		trans->ops->set_reduce_power(trans);
}

static inline bool iwl_trans_dbg_ini_valid(struct iwl_trans *trans)
+14 −4
Original line number Diff line number Diff line
@@ -442,8 +442,9 @@ void iwl_trans_pcie_ctx_info_gen3_set_pnvm(struct iwl_trans *trans,
		iwl_pcie_set_continuous_pnvm(trans);
}

int iwl_trans_pcie_ctx_info_gen3_set_reduce_power(struct iwl_trans *trans,
						  const void *data, u32 len)
int iwl_trans_pcie_ctx_info_gen3_load_reduce_power(struct iwl_trans *trans,
						   const void *data,
						   u32 len)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
	struct iwl_prph_scratch_ctrl_cfg *prph_sc_ctrl =
@@ -467,12 +468,21 @@ int iwl_trans_pcie_ctx_info_gen3_set_reduce_power(struct iwl_trans *trans,
			return ret;
		}
	}
	return 0;
}

void iwl_trans_pcie_ctx_info_gen3_set_reduce_power(struct iwl_trans *trans)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
	struct iwl_prph_scratch_ctrl_cfg *prph_sc_ctrl =
		&trans_pcie->prph_scratch->ctrl_cfg;

	if (trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_AX210)
		return;

	prph_sc_ctrl->reduce_power_cfg.base_addr =
		cpu_to_le64(trans_pcie->reduce_power_dram.physical);
	prph_sc_ctrl->reduce_power_cfg.size =
		cpu_to_le32(trans_pcie->reduce_power_dram.size);

	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -3556,6 +3556,7 @@ static const struct iwl_trans_ops trans_ops_pcie_gen2 = {
	.rxq_dma_data = iwl_trans_pcie_rxq_dma_data,
	.load_pnvm = iwl_trans_pcie_ctx_info_gen3_load_pnvm,
	.set_pnvm = iwl_trans_pcie_ctx_info_gen3_set_pnvm,
	.load_reduce_power = iwl_trans_pcie_ctx_info_gen3_load_reduce_power,
	.set_reduce_power = iwl_trans_pcie_ctx_info_gen3_set_reduce_power,
#ifdef CONFIG_IWLWIFI_DEBUGFS
	.debugfs_cleanup = iwl_trans_pcie_debugfs_cleanup,