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

Commit 10c3c86d authored by Dhaval Patel's avatar Dhaval Patel
Browse files

msm: mdss: Call wait4comp after commit for wb intf



Writeback path uses the comp event allocated on
stack to wait for ISR done. It crashes if
ISR tries to set the comp event after kickoff
thread timeout. This change removes the comp
event usage for writeback interface and starts
to use the wait4comp API like video/command
mode interfaces.

CRs-fixed: 555036
Change-Id: I74994a0cbe4039c6d3d4a51d573d343751182bff
Signed-off-by: default avatarDhaval Patel <pdhaval@codeaurora.org>
parent 2542bca0
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -379,7 +379,6 @@ struct mdss_mdp_pipe {

struct mdss_mdp_writeback_arg {
	struct mdss_mdp_data *data;
	void (*callback_fnc) (void *arg);
	void *priv_data;
};

+10 −9
Original line number Diff line number Diff line
@@ -46,8 +46,6 @@ struct mdss_mdp_writeback_ctx {

	struct mdss_mdp_plane_sizes dst_planes;

	void (*callback_fnc) (void *arg);
	void *callback_arg;
	spinlock_t wb_lock;
	struct list_head vsync_handlers;
};
@@ -372,6 +370,8 @@ static int mdss_mdp_writeback_stop(struct mdss_mdp_ctl *ctl)
		mdss_mdp_set_intr_callback(ctx->intr_type, ctx->intf_num,
				NULL, NULL);

		complete_all(&ctx->wb_comp);

		ctl->priv_data = NULL;
		ctx->ref_cnt--;
	}
@@ -396,9 +396,6 @@ static void mdss_mdp_writeback_intr_done(void *arg)

	mdss_mdp_irq_disable_nosync(ctx->intr_type, ctx->intf_num);

	if (ctx->callback_fnc)
		ctx->callback_fnc(ctx->callback_arg);

	spin_lock(&ctx->wb_lock);
	list_for_each_entry(tmp, &ctx->vsync_handlers, list) {
		tmp->vsync_handler(ctl, vsync_time);
@@ -474,9 +471,6 @@ static int mdss_mdp_writeback_display(struct mdss_mdp_ctl *ctl, void *arg)
	mdss_mdp_set_intr_callback(ctx->intr_type, ctx->intf_num,
		   mdss_mdp_writeback_intr_done, ctl);

	ctx->callback_fnc = wb_args->callback_fnc;
	ctx->callback_arg = wb_args->priv_data;

	flush_bits = BIT(16); /* WB */
	mdp_wb_write(ctx, MDSS_MDP_REG_WB_DST_ADDR_SW_STATUS, ctl->is_secure);
	mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_FLUSH, flush_bits);
@@ -536,6 +530,8 @@ int mdss_mdp_writeback_start(struct mdss_mdp_ctl *ctl)

int mdss_mdp_writeback_display_commit(struct mdss_mdp_ctl *ctl, void *arg)
{
	int ret = 0;

	if (ctl->shared_lock && !mutex_is_locked(ctl->shared_lock)) {
		pr_err("shared mutex is not locked before commit on ctl=%d\n",
			ctl->num);
@@ -549,5 +545,10 @@ int mdss_mdp_writeback_display_commit(struct mdss_mdp_ctl *ctl, void *arg)
			ctl->mixer_right->params_changed++;
	}

	return mdss_mdp_display_commit(ctl, arg);
	ret = mdss_mdp_display_commit(ctl, arg);

	if (!IS_ERR_VALUE(ret))
		mdss_mdp_display_wait4comp(ctl);

	return ret;
}
+0 −1
Original line number Diff line number Diff line
@@ -140,7 +140,6 @@ static int mdss_mdp_rotator_kickoff(struct mdss_mdp_ctl *ctl,
{
	int ret;
	struct mdss_mdp_writeback_arg wb_args = {
		.callback_fnc = NULL,
		.data = dst_data,
		.priv_data = rot,
	};
+1 −17
Original line number Diff line number Diff line
@@ -516,23 +516,13 @@ static int mdss_mdp_wb_dequeue(struct msm_fb_data_type *mfd,
	return ret;
}

static void mdss_mdp_wb_callback(void *arg)
{
	if (arg)
		complete((struct completion *) arg);
}

int mdss_mdp_wb_kickoff(struct msm_fb_data_type *mfd)
{
	struct mdss_mdp_wb *wb = mfd_to_wb(mfd);
	struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);
	struct mdss_mdp_wb_data *node = NULL;
	int ret = 0;
	DECLARE_COMPLETION_ONSTACK(comp);
	struct mdss_mdp_writeback_arg wb_args = {
		.callback_fnc = mdss_mdp_wb_callback,
		.priv_data = &comp,
	};
	struct mdss_mdp_writeback_arg wb_args;

	if (!ctl->power_on)
		return 0;
@@ -574,12 +564,6 @@ int mdss_mdp_wb_kickoff(struct msm_fb_data_type *mfd)
		goto kickoff_fail;
	}

	ret = wait_for_completion_timeout(&comp, KOFF_TIMEOUT);
	if (ret == 0)
		WARN(1, "wfd kick off time out=%d ctl=%d", ret, ctl->num);
	else
		ret = 0;

	if (wb && node) {
		mutex_lock(&wb->lock);
		list_add_tail(&node->active_entry, &wb->busy_queue);