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

Commit 0a969a5b authored by Animesh Kishore's avatar Animesh Kishore
Browse files

mdss: mdp3: Flush fences on dma stop



If during dma stop, we detect that dma
done interrupt was blocked , we flush out
any waiting activity, that includes fb
release fence signaling.

Change-Id: I12a2a43aa22a0fb6546d5e4c7482b6bdbbc2d5b0
Signed-off-by: default avatarAnimesh Kishore <animeshk@codeaurora.org>
parent 0a80d2e0
Loading
Loading
Loading
Loading
+25 −8
Original line number Diff line number Diff line
@@ -152,10 +152,32 @@ int mdp3_ctrl_notify(struct mdp3_session_data *ses, int event)
	return blocking_notifier_call_chain(&ses->notifier_head, event, ses);
}

static void __mdp3_dispatch_dma_done(struct mdp3_session_data *session)
{
	int cnt;

	cnt = atomic_read(&session->dma_done_cnt);
	MDSS_XLOG(cnt);
	while (cnt > 0) {
		mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_DONE);
		atomic_dec(&session->dma_done_cnt);
		cnt--;
	}
}

void mdp3_flush_dma_done(struct mdp3_session_data *session)
{
	if (!session)
		return;

	pr_debug("%s\n", __func__);

	__mdp3_dispatch_dma_done(session);
}

static void mdp3_dispatch_dma_done(struct kthread_work *work)
{
	struct mdp3_session_data *session;
	int cnt = 0;

	pr_debug("%s\n", __func__);
	session = container_of(work, struct mdp3_session_data,
@@ -163,13 +185,7 @@ static void mdp3_dispatch_dma_done(struct kthread_work *work)
	if (!session)
		return;

	cnt = atomic_read(&session->dma_done_cnt);
	MDSS_XLOG(cnt);
	while (cnt > 0) {
		mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_DONE);
		atomic_dec(&session->dma_done_cnt);
		cnt--;
	}
	__mdp3_dispatch_dma_done(session);
}

static void mdp3_dispatch_clk_off(struct work_struct *work)
@@ -3219,6 +3235,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd)
		pr_err("fail to init dma\n");
		goto init_done;
	}
	mdp3_session->dma->session = mdp3_session;

	intf_type = mdp3_ctrl_get_intf_type(mfd);
	mdp3_session->intf = mdp3_get_display_intf(intf_type);
+1 −0
Original line number Diff line number Diff line
@@ -96,5 +96,6 @@ int mdp3_ctrl_get_pack_pattern(u32 imgType);
int mdp3_ctrl_reset(struct msm_fb_data_type *mfd);
int mdp3_get_ion_client(struct msm_fb_data_type *mfd);
int config_secure_display(struct mdp3_session_data *mdp3_session);
void mdp3_flush_dma_done(struct mdp3_session_data *mdp3_session);

#endif /* MDP3_CTRL_H */
+10 −0
Original line number Diff line number Diff line
@@ -1162,6 +1162,16 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf)

	reinit_completion(&dma->dma_comp);
	dma->vsync_client.handler = NULL;

	/*
	 * Interrupts are disabled.
	 * Check for blocked dma done interrupt.
	 * Flush items waiting for dma done interrupt.
	 */
	if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_CMD &&
		atomic_read(&dma->session->dma_done_cnt))
		mdp3_flush_dma_done(dma->session);

	return ret;
}

+2 −0
Original line number Diff line number Diff line
@@ -294,6 +294,8 @@ struct mdp3_dma {
	struct fb_cmap *gc_cmap;
	struct fb_cmap *hist_cmap;

	struct mdp3_session_data *session;

	bool (*busy)(void);

	int (*dma_config)(struct mdp3_dma *dma,