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

Commit fb792c68 authored by Skylar Chang's avatar Skylar Chang
Browse files

msm: ipa: protect q6_proxy_clk_vote



Add a mutex to protect q6_proxy_clk_vote.
The proxy vote/unvote may be called from different contexts
which can result in a a race condition.

Change-Id: I402090be5ff35897ed61499a13bf52eb60a1f5cf
CRs-Fixed: 2094724
Acked-by: default avatarAdy Abraham <adya@qti.qualcomm.com>
Signed-off-by: default avatarSkylar Chang <chiaweic@codeaurora.org>
parent f3fbc3a3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4853,6 +4853,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,

	mutex_init(&ipa3_ctx->lock);
	mutex_init(&ipa3_ctx->nat_mem.lock);
	mutex_init(&ipa3_ctx->q6_proxy_clk_vote_mutex);

	idr_init(&ipa3_ctx->ipa_idr);
	spin_lock_init(&ipa3_ctx->idr_lock);
+1 −0
Original line number Diff line number Diff line
@@ -1267,6 +1267,7 @@ struct ipa3_context {
	u32 enable_clock_scaling;
	u32 curr_ipa_clk_rate;
	bool q6_proxy_clk_vote_valid;
	struct mutex q6_proxy_clk_vote_mutex;
	u32 ipa_num_pipes;
	dma_addr_t pkt_init_imm[IPA3_MAX_NUM_PIPES];
	u32 pkt_init_imm_opcode;
+12 −2
Original line number Diff line number Diff line
@@ -4183,10 +4183,15 @@ bool ipa3_is_client_handle_valid(u32 clnt_hdl)
 */
void ipa3_proxy_clk_unvote(void)
{
	if (ipa3_is_ready() && ipa3_ctx->q6_proxy_clk_vote_valid) {
	if (!ipa3_is_ready())
		return;

	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_valid = false;
	}
	mutex_unlock(&ipa3_ctx->q6_proxy_clk_vote_mutex);
}

/**
@@ -4196,10 +4201,15 @@ void ipa3_proxy_clk_unvote(void)
 */
void ipa3_proxy_clk_vote(void)
{
	if (ipa3_is_ready() && !ipa3_ctx->q6_proxy_clk_vote_valid) {
	if (!ipa3_is_ready())
		return;

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

/**