Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b99dba9 authored by Skylar Chang's avatar Skylar Chang
Browse files

msm: ipa3: add modem BW voting change support



Add the QMI support to change the modem
Bandwidth voting throughput on APQ side
to change the IPA clk scaling.

Change-Id: I904019b4f71fde9edea90dfc62afacb8d65bbd1d
Signed-off-by: default avatarSkylar Chang <chiaweic@codeaurora.org>
parent 7adfd57c
Loading
Loading
Loading
Loading
+88 −0
Original line number Diff line number Diff line
@@ -1468,6 +1468,41 @@ static void ipa3_q6_clnt_install_firewall_rules_ind_cb(
	}
}

static void ipa3_q6_clnt_bw_vhang_ind_cb(struct qmi_handle *handle,
	struct sockaddr_qrtr *sq,
	struct qmi_txn *txn,
	const void *data)
{
	struct ipa_bw_change_ind_msg_v01 *qmi_ind;
	uint32_t bw_mbps = 0;

	if (handle != ipa_q6_clnt) {
		IPAWANERR("Wrong client\n");
		return;
	}

	qmi_ind = (struct ipa_bw_change_ind_msg_v01 *) data;

	IPAWANDBG("Q6 BW change UL valid(%d):(%d)Kbps\n",
		qmi_ind->peak_bw_ul_valid,
		qmi_ind->peak_bw_ul);

	IPAWANDBG("Q6 BW change DL valid(%d):(%d)Kbps\n",
		qmi_ind->peak_bw_dl_valid,
		qmi_ind->peak_bw_dl);

	if (qmi_ind->peak_bw_ul_valid)
		bw_mbps += qmi_ind->peak_bw_ul/1000;

	if (qmi_ind->peak_bw_dl_valid)
		bw_mbps += qmi_ind->peak_bw_dl/1000;

	IPAWANDBG("vote modem BW (%u)\n", bw_mbps);
	if (ipa3_vote_for_bus_bw(&bw_mbps)) {
		IPAWANERR("Failed to vote BW (%u)\n", bw_mbps);
	}
}

static void ipa3_q6_clnt_svc_arrive(struct work_struct *work)
{
	int rc;
@@ -1695,6 +1730,14 @@ static struct qmi_msg_handler client_handlers[] = {
			QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_MAX_MSG_LEN_V01,
		.fn = ipa3_q6_clnt_install_firewall_rules_ind_cb,
	},
	{
		.type = QMI_INDICATION,
		.msg_id = QMI_IPA_BW_CHANGE_INDICATION_V01,
		.ei = ipa_bw_change_ind_msg_v01_ei,
		.decoded_size =
			IPA_BW_CHANGE_IND_MSG_V01_MAX_MSG_LEN,
		.fn = ipa3_q6_clnt_bw_vhang_ind_cb,
	},
};


@@ -2061,6 +2104,51 @@ int ipa3_qmi_set_aggr_info(enum ipa_aggr_enum_type_v01 aggr_enum_type)
		resp.resp.error, "ipa_mhi_prime_aggr_info_req_msg_v01");
}

int ipa3_qmi_req_ind(void)
{
	struct ipa_indication_reg_req_msg_v01 req;
	struct ipa_indication_reg_resp_msg_v01 resp;
	struct ipa_msg_desc req_desc, resp_desc;
	int rc;

	memset(&req, 0, sizeof(struct ipa_indication_reg_req_msg_v01));
	memset(&resp, 0, sizeof(struct ipa_indication_reg_resp_msg_v01));

	req.bw_change_ind_valid = true;
	req.bw_change_ind = true;

	req_desc.max_msg_len =
		QMI_IPA_INDICATION_REGISTER_REQ_MAX_MSG_LEN_V01;
	req_desc.msg_id = QMI_IPA_INDICATION_REGISTER_REQ_V01;
	req_desc.ei_array = ipa3_indication_reg_req_msg_data_v01_ei;

	resp_desc.max_msg_len =
		QMI_IPA_INDICATION_REGISTER_RESP_MAX_MSG_LEN_V01;
	resp_desc.msg_id = QMI_IPA_INDICATION_REGISTER_RESP_V01;
	resp_desc.ei_array = ipa3_indication_reg_resp_msg_data_v01_ei;

	IPAWANDBG_LOW("Sending QMI_IPA_INDICATION_REGISTER_REQ_V01\n");
	if (unlikely(!ipa_q6_clnt))
		return -ETIMEDOUT;
	rc = ipa3_qmi_send_req_wait(ipa_q6_clnt,
		&req_desc, &req,
		&resp_desc, &resp,
		QMI_SEND_STATS_REQ_TIMEOUT_MS);

	if (rc < 0) {
		IPAWANERR("QMI send Req %d failed, rc= %d\n",
			QMI_IPA_INDICATION_REGISTER_REQ_V01,
			rc);
		return rc;
	}

	IPAWANDBG_LOW("QMI_IPA_INDICATION_REGISTER_RESP_V01 received\n");

	return ipa3_check_qmi_response(rc,
		QMI_IPA_INDICATION_REGISTER_REQ_V01, resp.resp.result,
		resp.resp.error, "ipa_indication_reg_req_msg_v01");
}

int ipa3_qmi_stop_data_qouta(void)
{
	struct ipa_stop_data_usage_quota_req_msg_v01 req;
+3 −0
Original line number Diff line number Diff line
@@ -213,6 +213,7 @@ extern struct qmi_elem_info ipa_add_offload_connection_req_msg_v01_ei[];
extern struct qmi_elem_info ipa_add_offload_connection_resp_msg_v01_ei[];
extern struct qmi_elem_info ipa_remove_offload_connection_req_msg_v01_ei[];
extern struct qmi_elem_info ipa_remove_offload_connection_resp_msg_v01_ei[];
extern struct qmi_elem_info ipa_bw_change_ind_msg_v01_ei[];

/**
 * struct ipa3_rmnet_context - IPA rmnet context
@@ -318,6 +319,8 @@ int ipa3_qmi_set_data_quota(struct ipa_set_data_usage_quota_req_msg_v01 *req);
int ipa3_qmi_set_aggr_info(
	enum ipa_aggr_enum_type_v01 aggr_enum_type);

int ipa3_qmi_req_ind(void);

int ipa3_qmi_stop_data_qouta(void);

void ipa3_q6_handshake_complete(bool ssr_bootup);
+66 −2
Original line number Diff line number Diff line
@@ -1349,6 +1349,16 @@ struct qmi_elem_info ipa3_indication_reg_req_msg_data_v01_ei[] = {
			struct ipa_indication_reg_req_msg_v01,
				ipa_mhi_ready_ind_valid),
	},
	{
		.data_type	= QMI_UNSIGNED_1_BYTE,
		.elem_len	= 1,
		.elem_size	= sizeof(u8),
		.array_type	= NO_ARRAY,
		.tlv_type	= 0x12,
		.offset		= offsetof(
			struct ipa_indication_reg_req_msg_v01,
				ipa_mhi_ready_ind),
	},
	{
		.data_type	= QMI_OPT_FLAG,
		.elem_len	= 1,
@@ -1369,15 +1379,25 @@ struct qmi_elem_info ipa3_indication_reg_req_msg_data_v01_ei[] = {
			struct ipa_indication_reg_req_msg_v01,
				endpoint_desc_ind),
	},
	{
		.data_type	= QMI_OPT_FLAG,
		.elem_len	= 1,
		.elem_size	= sizeof(u8),
		.array_type	= NO_ARRAY,
		.tlv_type	= 0x14,
		.offset		= offsetof(
			struct ipa_indication_reg_req_msg_v01,
				bw_change_ind_valid),
	},
	{
		.data_type	= QMI_UNSIGNED_1_BYTE,
		.elem_len	= 1,
		.elem_size	= sizeof(u8),
		.array_type	= NO_ARRAY,
		.tlv_type	= 0x12,
		.tlv_type	= 0x14,
		.offset		= offsetof(
			struct ipa_indication_reg_req_msg_v01,
				ipa_mhi_ready_ind),
				bw_change_ind),
	},
	{
		.data_type	= QMI_EOTI,
@@ -5118,3 +5138,47 @@ struct qmi_elem_info ipa_remove_offload_connection_resp_msg_v01_ei[] = {
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};

struct qmi_elem_info ipa_bw_change_ind_msg_v01_ei[] = {
	{
		.data_type      = QMI_OPT_FLAG,
		.elem_len       = 1,
		.elem_size      = sizeof(u8),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x10,
		.offset         = offsetof(struct ipa_bw_change_ind_msg_v01,
					   peak_bw_ul_valid),
	},
	{
		.data_type      = QMI_UNSIGNED_4_BYTE,
		.elem_len       = 1,
		.elem_size      = sizeof(u32),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x10,
		.offset         = offsetof(struct ipa_bw_change_ind_msg_v01,
					   peak_bw_ul),
	},
	{
		.data_type      = QMI_OPT_FLAG,
		.elem_len       = 1,
		.elem_size      = sizeof(u8),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x11,
		.offset         = offsetof(struct ipa_bw_change_ind_msg_v01,
					   peak_bw_dl_valid),
	},
	{
		.data_type      = QMI_UNSIGNED_4_BYTE,
		.elem_len       = 1,
		.elem_size      = sizeof(u32),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x11,
		.offset         = offsetof(struct ipa_bw_change_ind_msg_v01,
					   peak_bw_dl),
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};
+5 −22
Original line number Diff line number Diff line
@@ -1618,6 +1618,8 @@ static int handle3_egress_format(struct net_device *dev,
			rc = ipa3_qmi_set_aggr_info(DATA_AGGR_TYPE_QMAP_V01);
		}
		rmnet_ipa3_ctx->ipa_mhi_aggr_formet_set = true;
		/* register Q6 indication */
		rc = ipa3_qmi_req_ind();
		return rc;
	}

@@ -2147,35 +2149,16 @@ static int rmnet_ipa_send_coalesce_notification(uint8_t qmap_id,

int ipa3_wwan_set_modem_state(struct wan_ioctl_notify_wan_state *state)
{
	uint32_t bw_mbps = 0;
	int ret = 0;

	if (!state)
		return -EINVAL;

	if (state->up) {
		if (rmnet_ipa3_ctx->ipa_config_is_apq) {
			bw_mbps = 5200;
			ret = ipa3_vote_for_bus_bw(&bw_mbps);
			if (ret) {
				IPAERR("Failed to vote for bus BW (%u)\n",
							bw_mbps);
				return ret;
			}
		}
	if (state->up)
		ret = ipa_pm_activate_sync(rmnet_ipa3_ctx->q6_teth_pm_hdl);
	} else {
		if (rmnet_ipa3_ctx->ipa_config_is_apq) {
			bw_mbps = 0;
			ret = ipa3_vote_for_bus_bw(&bw_mbps);
			if (ret) {
				IPAERR("Failed to vote for bus BW (%u)\n",
							bw_mbps);
				return ret;
			}
		}
	else
		ret = ipa_pm_deactivate_sync(rmnet_ipa3_ctx->q6_teth_pm_hdl);
	}

	return ret;
}

+0 −4
Original line number Diff line number Diff line
@@ -178,10 +178,6 @@ int ipa3_teth_bridge_connect(struct teth_bridge_connect_params *connect_params)
		TETH_ERR("fail to register with PM %d\n", res);
		return res;
	}
	/* vote for turbo in case of MHIP channels*/
	if (ipa3_is_apq())
		res = ipa_pm_set_throughput(ipa3_teth_ctx->modem_pm_hdl,
			5200);
	res = ipa_pm_activate_sync(ipa3_teth_ctx->modem_pm_hdl);

	TETH_DBG_FUNC_EXIT();
Loading