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

Commit 5a2f8cf1 authored by Sachin Bhayare's avatar Sachin Bhayare Committed by Nirmal Abraham
Browse files

msm: mdss: release retire fence during commit failure



In existing implementation on commit failure release fence are signaled.
But retire fence is not signaled. Which block the framework from submiting
next commit. And result in UI freez.

Add logic to signal retire fence along with release fence commit fails.

Change-Id: I84774280a110339450a1c5ef50eab68168e9bd20
Signed-off-by: default avatarSachin Bhayare <sachin.bhayare@codeaurora.org>
Signed-off-by: default avatarNirmal Abraham <nabrah@codeaurora.org>
parent d96c71eb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2852,6 +2852,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_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL);
	if (!mdp3_session) {
+3 −0
Original line number Diff line number Diff line
@@ -3646,6 +3646,9 @@ skip_commit:
	if (IS_ERR_VALUE(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 (dynamic_dsi_switch) {
+2 −0
Original line number Diff line number Diff line
@@ -233,6 +233,8 @@ struct msm_mdp_interface {
				int dest_ctrl);
	int (*input_event_handler)(struct msm_fb_data_type *mfd);
	int (*pp_release_fnc)(struct msm_fb_data_type *mfd);
	void (*signal_retire_fence)(struct msm_fb_data_type *mfd,
					int retire_cnt);
	void *private1;
};

+12 −1
Original line number Diff line number Diff line
@@ -6337,8 +6337,11 @@ static void __vsync_retire_signal(struct msm_fb_data_type *mfd, int val)
	mutex_lock(&mfd->mdp_sync_pt_data.sync_mutex);
	if (mdp5_data->retire_cnt > 0) {
		sw_sync_timeline_inc(mdp5_data->vsync_timeline, val);

		mdp5_data->retire_cnt -= min(val, mdp5_data->retire_cnt);
		pr_debug("Retire signaled! timeline val=%d remaining=%d\n",
				mdp5_data->vsync_timeline->value,
				mdp5_data->retire_cnt);

		if (mdp5_data->retire_cnt == 0) {
			mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON);
			mdp5_data->ctl->ops.remove_vsync_handler(mdp5_data->ctl,
@@ -6530,6 +6533,13 @@ int mdss_mdp_input_event_handler(struct msm_fb_data_type *mfd)
	return rc;
}

static void mdss_mdp_signal_retire_fence(struct msm_fb_data_type *mfd,
						int retire_cnt)
{
	__vsync_retire_signal(mfd, retire_cnt);
	pr_debug("Signaled (%d) pending retire fence\n", retire_cnt);
}

int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
{
	struct device *dev = mfd->fbi->dev;
@@ -6578,6 +6588,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
	mdp5_interface->splash_init_fnc = mdss_mdp_splash_init;
	mdp5_interface->configure_panel = mdss_mdp_update_panel_info;
	mdp5_interface->input_event_handler = mdss_mdp_input_event_handler;
	mdp5_interface->signal_retire_fence = mdss_mdp_signal_retire_fence;

	if (mfd->panel_info->type == WRITEBACK_PANEL) {
		mdp5_interface->atomic_validate =