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

Commit 9bd664cc authored by Mohammed Javid's avatar Mohammed Javid
Browse files

msm: ipa: Fix to race condition proxy clock voting



Added code changes to fix the race condition during
proxy clock voating in IPA.

Change-Id: I1fee17836bf58d25f461643ea1e60bcd06182372
Acked-by: default avatarAshok Vuyyuru <avuyyuru@qti.qualcomm.com>
Signed-off-by: default avatarMohammed Javid <mjavid@codeaurora.org>
parent 6f6c6e07
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -4502,6 +4502,7 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,
	ipa3_register_panic_hdlr();

	ipa3_ctx->q6_proxy_clk_vote_valid = true;
	ipa3_ctx->q6_proxy_clk_vote_cnt++;

	mutex_lock(&ipa3_ctx->lock);
	ipa3_ctx->ipa_initialization_complete = true;
@@ -5138,6 +5139,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
	mutex_init(&ipa3_ctx->nat_mem.lock);
	mutex_init(&ipa3_ctx->q6_proxy_clk_vote_mutex);
	mutex_init(&ipa3_ctx->ipa_cne_evt_lock);
	ipa3_ctx->q6_proxy_clk_vote_cnt = 0;

	idr_init(&ipa3_ctx->ipa_idr);
	spin_lock_init(&ipa3_ctx->idr_lock);
+1 −0
Original line number Diff line number Diff line
@@ -1299,6 +1299,7 @@ struct ipa3_context {
	u32 curr_ipa_clk_rate;
	bool q6_proxy_clk_vote_valid;
	struct mutex q6_proxy_clk_vote_mutex;
	u32 q6_proxy_clk_vote_cnt;
	u32 ipa_num_pipes;
	dma_addr_t pkt_init_imm[IPA3_MAX_NUM_PIPES];

+6 −2
Original line number Diff line number Diff line
@@ -5757,6 +5757,8 @@ void ipa3_proxy_clk_unvote(void)
	mutex_lock(&ipa3_ctx->q6_proxy_clk_vote_mutex);
	if (ipa3_ctx->q6_proxy_clk_vote_valid) {
		IPA_ACTIVE_CLIENTS_DEC_SPECIAL("PROXY_CLK_VOTE");
		ipa3_ctx->q6_proxy_clk_vote_cnt--;
		if (ipa3_ctx->q6_proxy_clk_vote_cnt == 0)
			ipa3_ctx->q6_proxy_clk_vote_valid = false;
	}
	mutex_unlock(&ipa3_ctx->q6_proxy_clk_vote_mutex);
@@ -5773,8 +5775,10 @@ void ipa3_proxy_clk_vote(void)
		return;

	mutex_lock(&ipa3_ctx->q6_proxy_clk_vote_mutex);
	if (!ipa3_ctx->q6_proxy_clk_vote_valid) {
	if (!ipa3_ctx->q6_proxy_clk_vote_valid ||
		(ipa3_ctx->q6_proxy_clk_vote_cnt > 0)) {
		IPA_ACTIVE_CLIENTS_INC_SPECIAL("PROXY_CLK_VOTE");
		ipa3_ctx->q6_proxy_clk_vote_cnt++;
		ipa3_ctx->q6_proxy_clk_vote_valid = true;
	}
	mutex_unlock(&ipa3_ctx->q6_proxy_clk_vote_mutex);