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

Commit 06220ef7 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: display: display prepare unblock for command mode"

parents 80b4c17c b5038608
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -121,6 +121,19 @@ enum mdss_mdp_reg_bus_cfg {
	REG_CLK_CFG_HIGH,
};

/**
 * enum mdp_commit_stage_type - Indicate different commit stages
 *
 * @MDP_COMMIT_STATE_WAIT_FOR_PINGPONG:	At the stage of being ready to
*			wait for pingpong buffer.
 * @MDP_COMMIT_STATE_PINGPONG_DONE:		At the stage that pingpong
 *			buffer is ready.
 */
enum mdp_commit_stage_type {
	MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG,
	MDP_COMMIT_STAGE_PINGPONG_DONE,
};

struct mdss_mdp_ctl;
typedef void (*mdp_vsync_handler_t)(struct mdss_mdp_ctl *, ktime_t);

@@ -467,6 +480,12 @@ struct mdss_overlay_private {
	int retire_cnt;
};

struct mdss_mdp_commit_cb {
	void *data;
	int (*commit_cb_fnc) (enum mdp_commit_stage_type commit_state,
		void *data);
};

/**
 * enum mdss_screen_state - Screen states that MDP can be forced into
 *
@@ -683,7 +702,8 @@ int mdss_mdp_mixer_pipe_update(struct mdss_mdp_pipe *pipe,
int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe,
	struct mdss_mdp_mixer *mixer);
void mdss_mdp_mixer_unstage_all(struct mdss_mdp_mixer *mixer);
int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg);
int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg,
	struct mdss_mdp_commit_cb *commit_cb);
int mdss_mdp_display_wait4comp(struct mdss_mdp_ctl *ctl);
int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl);
int mdss_mdp_display_wakeup_time(struct mdss_mdp_ctl *ctl,
+23 −12
Original line number Diff line number Diff line
@@ -2930,7 +2930,8 @@ int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl)
	return ret;
}

int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg)
int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg,
	struct mdss_mdp_commit_cb *commit_cb)
{
	struct mdss_mdp_ctl *sctl = NULL;
	int ret = 0;
@@ -3013,20 +3014,9 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg)
		mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_READY);
	ATRACE_END("frame_ready");

	ATRACE_BEGIN("wait_pingpong");
	if (ctl->wait_pingpong)
		ctl->wait_pingpong(ctl, NULL);
	ATRACE_END("wait_pingpong");

	ctl->roi_bkup.w = ctl->roi.w;
	ctl->roi_bkup.h = ctl->roi.h;

	if (sctl && sctl->wait_pingpong) {
		ATRACE_BEGIN("wait_pingpong sctl");
		sctl->wait_pingpong(sctl, NULL);
		ATRACE_END("wait_pingpong sctl");
	}

	/*
	 * With partial frame update, enable split display bit only
	 * when validity of ROI's on both the DSI's are identical
@@ -3071,6 +3061,27 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg)
			sctl->panel_data->panel_info.roi = sctl->roi;
	}

	if (ctl->wait_pingpong) {
		if (commit_cb)
			commit_cb->commit_cb_fnc(
				MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG,
				commit_cb->data);

		ATRACE_BEGIN("wait_pingpong");
		ctl->wait_pingpong(ctl, NULL);
		ATRACE_END("wait_pingpong");

		if (sctl && sctl->wait_pingpong) {
			ATRACE_BEGIN("wait_pingpong sctl");
			sctl->wait_pingpong(sctl, NULL);
			ATRACE_END("wait_pingpong sctl");
		}

		if (commit_cb)
			commit_cb->commit_cb_fnc(MDP_COMMIT_STAGE_PINGPONG_DONE,
				commit_cb->data);
	}

	if (sctl && !ctl->valid_roi && sctl->valid_roi) {
		/*
		 * Seperate kickoff on DSI1 is needed only when we have
+2 −2
Original line number Diff line number Diff line
@@ -635,7 +635,7 @@ static int mdss_mdp_video_config_fps(struct mdss_mdp_ctl *ctl,
				return -EINVAL;
			}
			ctl->force_screen_state = MDSS_SCREEN_FORCE_BLANK;
			mdss_mdp_display_commit(ctl, NULL);
			mdss_mdp_display_commit(ctl, NULL, NULL);
			mdss_mdp_display_wait4comp(ctl);
			mdp_video_write(ctx,
					MDSS_MDP_REG_INTF_TIMING_ENGINE_EN, 0);
@@ -657,7 +657,7 @@ static int mdss_mdp_video_config_fps(struct mdss_mdp_ctl *ctl,
			 */
			mb();
			ctl->force_screen_state = MDSS_SCREEN_DEFAULT;
			mdss_mdp_display_commit(ctl, NULL);
			mdss_mdp_display_commit(ctl, NULL, NULL);
			mdss_mdp_display_wait4comp(ctl);
		} else if (pdata->panel_info.dfps_update
				== DFPS_IMMEDIATE_PORCH_UPDATE_MODE){
+1 −1
Original line number Diff line number Diff line
@@ -723,5 +723,5 @@ 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);
	return mdss_mdp_display_commit(ctl, arg, NULL);
}
+39 −4
Original line number Diff line number Diff line
@@ -1298,17 +1298,42 @@ static void __overlay_kickoff_requeue(struct msm_fb_data_type *mfd)
{
	struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd);

	mdss_mdp_display_commit(ctl, NULL);
	mdss_mdp_display_commit(ctl, NULL, NULL);
	mdss_mdp_display_wait4comp(ctl);

	ATRACE_BEGIN("sspp_programming");
	__overlay_queue_pipes(mfd);
	ATRACE_END("sspp_programming");

	mdss_mdp_display_commit(ctl, NULL);
	mdss_mdp_display_commit(ctl, NULL,  NULL);
	mdss_mdp_display_wait4comp(ctl);
}

static int mdss_mdp_commit_cb(enum mdp_commit_stage_type commit_stage,
	void *data)
{
	int ret = 0;
	struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)data;
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	struct mdss_mdp_ctl *ctl;

	switch (commit_stage) {
	case MDP_COMMIT_STAGE_WAIT_FOR_PINGPONG:
		ctl = mfd_to_ctl(mfd);
		mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_START);
		mutex_unlock(&mdp5_data->ov_lock);
		break;
	case MDP_COMMIT_STAGE_PINGPONG_DONE:
		mutex_lock(&mdp5_data->ov_lock);
		break;
	default:
		pr_err("Invalid commit stage %x", commit_stage);
		break;
	}

	return ret;
}

int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
				struct mdp_display_commit *data)
{
@@ -1319,6 +1344,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
	int ret = 0;
	int sd_in_pipe = 0;
	bool need_cleanup = false;
	struct mdss_mdp_commit_cb commit_cb;

	ATRACE_BEGIN(__func__);
	if (ctl->shared_lock) {
@@ -1392,13 +1418,22 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
		ATRACE_BEGIN("wb_kickoff");
		ret = mdss_mdp_wb_kickoff(mfd);
		ATRACE_END("wb_kickoff");
	} else if (!need_cleanup) {
		ATRACE_BEGIN("display_commit");
		commit_cb.commit_cb_fnc = mdss_mdp_commit_cb;
		commit_cb.data = mfd;
		ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL,
			&commit_cb);
		ATRACE_END("display_commit");
	} else {
		ATRACE_BEGIN("display_commit");
		ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL);
		ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL,
			NULL);
		ATRACE_END("display_commit");
	}

	if (!need_cleanup)
	/* MDP_NOTIFY_FRAME_START is sent in cb for command panel */
	if ((!need_cleanup) && (!mdp5_data->ctl->wait_pingpong))
		mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_START);

	if (IS_ERR_VALUE(ret))
Loading