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

Commit 4affc600 authored by Xiaoming Zhou's avatar Xiaoming Zhou
Browse files

msm: mdss: wait for the first display update



Display backlight is enabled after commit kickoff function
returns.  However, the return of the function does not mean
the data has been sent to the panel yet.  During suspend and
resume use case, it results a split of second of screen
corruption.  This makes sure backlight is enabled only after
the first display update is complete.

Change-Id: Id5e6bada69c51180ebedfdb301d4d68fc12877b0
Signed-off-by: default avatarXiaoming Zhou <zhoux@codeaurora.org>
parent 6917c867
Loading
Loading
Loading
Loading
+83 −1
Original line number Diff line number Diff line
@@ -481,12 +481,13 @@ static int mdp3_ctrl_on(struct msm_fb_data_type *mfd)
			pr_err("fail to start the MDP display interface\n");
			goto on_error;
		}
	} else {
		mdp3_session->first_commit = true;
	}

on_error:
	if (!rc)
		mdp3_session->status = 1;

	mutex_unlock(&mdp3_session->lock);
	return rc;
}
@@ -557,6 +558,57 @@ off_error:
	return 0;
}

static int mdp3_ctrl_reset_cmd(struct msm_fb_data_type *mfd)
{
	int rc = 0;
	struct mdp3_session_data *mdp3_session;
	struct mdp3_dma *mdp3_dma;
	struct mdss_panel_data *panel;
	struct mdp3_vsync_notification vsync_client;

	pr_debug("mdp3_ctrl_reset_cmd\n");
	mdp3_session = (struct mdp3_session_data *)mfd->mdp.private1;
	if (!mdp3_session || !mdp3_session->panel || !mdp3_session->dma ||
		!mdp3_session->intf) {
		pr_err("mdp3_ctrl_reset no device");
		return -ENODEV;
	}

	panel = mdp3_session->panel;
	mdp3_dma = mdp3_session->dma;
	mutex_lock(&mdp3_session->lock);

	vsync_client = mdp3_dma->vsync_client;

	rc = mdp3_dma->stop(mdp3_dma, mdp3_session->intf);
	if (rc) {
		pr_err("fail to stop the MDP3 dma\n");
		goto reset_error;
	}

	rc = mdp3_iommu_enable(MDP3_CLIENT_DMA_P);
	if (rc) {
		pr_err("fail to attach dma iommu\n");
		goto reset_error;
	}

	mdp3_ctrl_intf_init(mfd, mdp3_session->intf);
	mdp3_ctrl_dma_init(mfd, mdp3_dma);

	if (vsync_client.handler)
		mdp3_dma->vsync_enable(mdp3_dma, &vsync_client);

	if (mfd->fbi->screen_base)
		rc = mdp3_dma->start(mdp3_dma, mdp3_session->intf);
	else
		mdp3_session->first_commit = true;

reset_error:
	mutex_unlock(&mdp3_session->lock);
	return rc;
}


static int mdp3_ctrl_reset(struct msm_fb_data_type *mfd)
{
	int rc = 0;
@@ -573,6 +625,11 @@ static int mdp3_ctrl_reset(struct msm_fb_data_type *mfd)
		return -ENODEV;
	}

	if (mfd->panel.type == MIPI_CMD_PANEL) {
		rc = mdp3_ctrl_reset_cmd(mfd);
		return rc;
	}

	panel = mdp3_session->panel;
	mdp3_dma = mdp3_session->dma;
	mutex_lock(&mdp3_session->lock);
@@ -633,6 +690,8 @@ static int mdp3_ctrl_reset(struct msm_fb_data_type *mfd)

	if (mfd->fbi->screen_base)
		rc = mdp3_dma->start(mdp3_dma, mdp3_session->intf);
	else
		mdp3_session->first_commit = true;

reset_error:
	mutex_unlock(&mdp3_session->lock);
@@ -747,6 +806,7 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd,
{
	struct mdp3_session_data *mdp3_session;
	struct mdp3_img_data *data;
	struct mdss_panel_info *panel_info = mfd->panel_info;
	int rc = 0;

	if (!mfd || !mfd->mdp.private1)
@@ -756,6 +816,11 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd,
	if (!mdp3_session || !mdp3_session->dma)
		return -EINVAL;

	if (mdp3_bufq_count(&mdp3_session->bufq_in) == 0) {
		pr_debug("no buffer in queue yet\n");
		return -EPERM;
	}

	if (!mdp3_iommu_is_attached(MDP3_CLIENT_DMA_P)) {
		pr_debug("continuous splash screen, IOMMU not attached\n");
		mdp3_ctrl_reset(mfd);
@@ -782,6 +847,13 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd,
		data = mdp3_bufq_pop(&mdp3_session->bufq_out);
		mdp3_put_img(data, MDP3_CLIENT_DMA_P);
	}

	if (mdp3_session->first_commit) {
		/*wait for one frame time to ensure frame is sent to panel*/
		msleep(1000 / panel_info->mipi.frame_rate);
		mdp3_session->first_commit = false;
	}

	mutex_unlock(&mdp3_session->lock);

	mdss_fb_update_notify_update(mfd);
@@ -795,6 +867,7 @@ static void mdp3_ctrl_pan_display(struct msm_fb_data_type *mfd)
	struct mdp3_session_data *mdp3_session;
	u32 offset;
	int bpp;
	struct mdss_panel_info *panel_info = mfd->panel_info;

	pr_debug("mdp3_ctrl_pan_display\n");
	if (!mfd || !mfd->mdp.private1)
@@ -809,6 +882,8 @@ static void mdp3_ctrl_pan_display(struct msm_fb_data_type *mfd)
		mdp3_ctrl_reset(mfd);
	}

	mdp3_release_splash_memory();

	mutex_lock(&mdp3_session->lock);

	if (!mdp3_session->status) {
@@ -836,6 +911,13 @@ static void mdp3_ctrl_pan_display(struct msm_fb_data_type *mfd)
		pr_debug("mdp3_ctrl_pan_display no memory, stop interface");
		mdp3_session->dma->stop(mdp3_session->dma, mdp3_session->intf);
	}

	if (mdp3_session->first_commit) {
		/*wait for one frame time to ensure frame is sent to panel*/
		msleep(1000 / panel_info->mipi.frame_rate);
		mdp3_session->first_commit = false;
	}

pan_error:
	mutex_unlock(&mdp3_session->lock);
}
+1 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ struct mdp3_session_data {
	struct mutex histo_lock;
	int lut_sel;
	int cc_vect_sel;
	bool first_commit;
};

int mdp3_ctrl_init(struct msm_fb_data_type *mfd);