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

Commit 8b42bd9e authored by Animesh Kishore's avatar Animesh Kishore Committed by Gerrit - the friendly Code Review server
Browse files

fbdev: mdss: Signal pending retire fence



During fb blank or dma stop check if there
are any pending retire fences. Signal all.

Change-Id: I24322c8eeb1afbd79c898d037b72b77df27a91fa
Signed-off-by: default avatarAnimesh Kishore <animeshk@codeaurora.org>
parent f7979ae4
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -263,7 +263,7 @@ static void mdp3_vsync_retire_handle_vsync(void *arg)
	schedule_work(&mdp3_session->retire_work);
}

static void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val)
void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val)
{
	struct mdp3_session_data *mdp3_session;

@@ -273,6 +273,10 @@ static void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val)
	if (mdp3_session->retire_cnt > 0) {
		mdss_inc_timeline(mfd->mdp_sync_pt_data.timeline_retire, val);
		mdp3_session->retire_cnt -= min(val, mdp3_session->retire_cnt);
		pr_debug("Retire signaled! timeline val=%d remaining=%d\n",
			mdss_get_timeline_retire_ts(
			mfd->mdp_sync_pt_data.timeline_retire),
			mdp3_session->retire_cnt);
	}
	mutex_unlock(&mfd->mdp_sync_pt_data.sync_mutex);
}
@@ -3044,7 +3048,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd)
	mdp3_interface->lut_update = NULL;
	mdp3_interface->configure_panel = mdp3_update_panel_info;
	mdp3_interface->input_event_handler = NULL;
	mdp3_interface->signal_retire_fence = NULL;
	mdp3_interface->signal_retire_fence = mdp3_vsync_retire_signal;
	mdp3_interface->is_twm_en = mdp3_is_twm_en;

	mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL);
+4 −0
Original line number Diff line number Diff line
@@ -36,6 +36,9 @@ struct mdp3_buffer_queue {
	int pop_idx;
};

/* struct mdp3_session_data is MDP3 fb private data */
#define mfd_to_mdp3_data(mfd)	(mfd->mdp.private1)

struct mdp3_session_data {
	struct mutex lock;
	int status;
@@ -92,5 +95,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);
void mdp3_flush_dma_done(struct mdp3_session_data *mdp3_session);
void mdp3_vsync_retire_signal(struct msm_fb_data_type *mfd, int val);

#endif /* MDP3_CTRL_H */
+10 −5
Original line number Diff line number Diff line
@@ -1084,12 +1084,17 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf)

	/*
	 * Interrupts are disabled.
	 * Check for blocked dma done interrupt.
	 * Flush items waiting for dma done interrupt.
	 * Check for blocked dma done and vsync interrupt.
	 * Flush items waiting for interrupts.
	 */
	if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_CMD &&
		atomic_read(&dma->session->dma_done_cnt))
	if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_CMD) {
		if (atomic_read(&dma->session->dma_done_cnt))
			mdp3_flush_dma_done(dma->session);
		if (dma->session->retire_cnt) {
			mdp3_vsync_retire_signal(dma->session->mfd,
			dma->session->retire_cnt);
		}
	}

	return ret;
}
+23 −8
Original line number Diff line number Diff line
@@ -1859,6 +1859,20 @@ static void mdss_panel_validate_debugfs_info(struct msm_fb_data_type *mfd)
	}
}

static void mdss_fb_signal_retire_fence(struct msm_fb_data_type *mfd)
{
#ifdef TARGET_HW_MDSS_MDP3
	struct mdp3_session_data *mdp3_session = mfd_to_mdp3_data(mfd);
	int retire_cnt = mdp3_session->retire_cnt;
#else
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	int retire_cnt = mdp5_data->retire_cnt;
#endif

	if (mfd->mdp.signal_retire_fence)
		mfd->mdp.signal_retire_fence(mfd, retire_cnt);
}

static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd,
	int req_power_state)
{
@@ -1906,10 +1920,13 @@ static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd,
	mfd->panel_power_state = req_power_state;

	ret = mfd->mdp.off_fnc(mfd);
	if (ret)
	if (ret) {
		mfd->panel_power_state = cur_power_state;
	else if (!mdss_panel_is_power_on_interactive(req_power_state))
	} else if (!mdss_panel_is_power_on_interactive(req_power_state)) {
		mdss_fb_release_fences(mfd);
		if (mfd->panel.type == MIPI_CMD_PANEL)
			mdss_fb_signal_retire_fence(mfd);
	}
	mfd->op_enable = true;
	complete(&mfd->power_off_comp);

@@ -3712,9 +3729,8 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd)
		 */
		mdss_fb_release_kickoff(mfd);
		mdss_fb_signal_timeline(sync_pt_data);
		if ((mfd->panel.type == MIPI_CMD_PANEL) &&
			(mfd->mdp.signal_retire_fence))
			mfd->mdp.signal_retire_fence(mfd, 1);
		if (mfd->panel.type == MIPI_CMD_PANEL)
			mdss_fb_signal_retire_fence(mfd);
		return ret;
	}
	if (!sync_pt_data->async_wait_fences)
@@ -3772,9 +3788,8 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd)
	if (IS_ERR_VALUE((unsigned long)ret) || !sync_pt_data->flushed) {
		mdss_fb_release_kickoff(mfd);
		mdss_fb_signal_timeline(sync_pt_data);
		if ((mfd->panel.type == MIPI_CMD_PANEL) &&
			(mfd->mdp.signal_retire_fence))
			mfd->mdp.signal_retire_fence(mfd, 1);
		if (mfd->panel.type == MIPI_CMD_PANEL)
			mdss_fb_signal_retire_fence(mfd);
	}

	if (dynamic_dsi_switch) {