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

Commit b725d52a authored by Sachin Bhayare's avatar Sachin Bhayare
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
submitting 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>
parent 3e1f25e9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2643,6 +2643,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd)
	mdp3_interface->kickoff_fnc = mdp3_ctrl_display_commit_kickoff;
	mdp3_interface->lut_update = NULL;
	mdp3_interface->configure_panel = mdp3_update_panel_info;
	mdp3_interface->signal_retire_fence = NULL;

	mdp3_session = kzalloc(sizeof(struct mdp3_session_data), GFP_KERNEL);
	if (!mdp3_session) {
+4 −1
Original line number Diff line number Diff line
@@ -3743,8 +3743,11 @@ 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) {
		MDSS_XLOG(mfd->index, mfd->split_mode, new_dsi_mode,
			XLOG_FUNC_EXIT);
+2 −0
Original line number Diff line number Diff line
@@ -234,6 +234,8 @@ struct msm_mdp_interface {
	int (*input_event_handler)(struct msm_fb_data_type *mfd);
	void (*footswitch_ctrl)(bool on);
	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;
};

+11 −0
Original line number Diff line number Diff line
@@ -6140,6 +6140,9 @@ static void __vsync_retire_signal(struct msm_fb_data_type *mfd, int val)
		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,
@@ -6361,6 +6364,13 @@ void mdss_mdp_footswitch_ctrl_handler(bool on)
	mdss_mdp_footswitch_ctrl(mdata, on);
}

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;
@@ -6402,6 +6412,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;

	/*
	 * Register footswitch control only for primary fb pm