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

Commit 6993462f authored by Jeykumar Sankaran's avatar Jeykumar Sankaran Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm/sde: handle atomic commit with dynamic mode switch



This change handles atomic commit with dynamic mode switch request
by avoiding drm bridge disable and reconfiguring the display
pipeline with new mode info parameters.

Change-Id: Ia5f2903ab701e49df70e207e0c0068ab8915fa91
Signed-off-by: default avatarJeykumar Sankaran <jsanka@codeaurora.org>
parent a7c7bbe8
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -131,6 +131,10 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
				&connector->encoder->crtc->state->mode))
			continue;

		if (msm_is_mode_seamless_dms(
			       &connector->encoder->crtc->state->adjusted_mode))
			continue;

		funcs = encoder->helper_private;

		DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
@@ -166,6 +170,9 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
		if (msm_is_mode_seamless(&crtc->state->mode))
			continue;

		if (msm_is_mode_seamless_dms(&crtc->state->adjusted_mode))
			continue;

		funcs = crtc->helper_private;

		DRM_DEBUG_ATOMIC("disabling [CRTC:%d]\n",
@@ -303,6 +310,13 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
		if (msm_is_mode_seamless(&crtc->state->mode))
			continue;

		/**
		 * On DMS switch, wait for ping pong done to ensure the current
		 * frame transfer is complete.
		 */
		if (msm_is_mode_seamless_dms(&crtc->state->adjusted_mode))
			kms->funcs->wait_for_tx_complete(kms, crtc);

		funcs = crtc->helper_private;

		if (crtc->state->enable) {
+22 −5
Original line number Diff line number Diff line
@@ -638,7 +638,7 @@ static void _sde_encoder_adjust_mode(struct drm_connector *connector,
			cur_mode->hdisplay == adj_mode->hdisplay &&
			cur_mode->vrefresh == adj_mode->vrefresh) {
			adj_mode->private = cur_mode->private;
			adj_mode->private_flags = cur_mode->private_flags;
			adj_mode->private_flags |= cur_mode->private_flags;
		}
	}
}
@@ -1776,6 +1776,7 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
	struct sde_encoder_virt *sde_enc = NULL;
	int i, ret = 0;
	struct msm_compression_info *comp_info = NULL;
	struct drm_display_mode *cur_mode = NULL;

	if (!drm_enc) {
		SDE_ERROR("invalid encoder\n");
@@ -1787,6 +1788,8 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
	SDE_DEBUG_ENC(sde_enc, "\n");
	SDE_EVT32(DRMID(drm_enc));

	cur_mode = &sde_enc->base.crtc->state->adjusted_mode;

	sde_enc->cur_master = NULL;
	for (i = 0; i < sde_enc->num_phys_encs; i++) {
		struct sde_encoder_phys *phys = sde_enc->phys_encs[i];
@@ -1813,14 +1816,28 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
	for (i = 0; i < sde_enc->num_phys_encs; i++) {
		struct sde_encoder_phys *phys = sde_enc->phys_encs[i];

		if (phys) {
		if (!phys)
			continue;

		phys->comp_type = comp_info->comp_type;
			if ((phys != sde_enc->cur_master) && phys->ops.enable)
		if (phys != sde_enc->cur_master) {
			/**
			 * on DMS request, the encoder will be enabled
			 * already. Invoke restore to reconfigure the
			 * new mode.
			 */
			if (msm_is_mode_seamless_dms(cur_mode) &&
					phys->ops.restore)
				phys->ops.restore(phys);
			else if (phys->ops.enable)
				phys->ops.enable(phys);
		}
	}

	if (sde_enc->cur_master->ops.enable)
	if (msm_is_mode_seamless_dms(cur_mode) &&
			sde_enc->cur_master->ops.restore)
		sde_enc->cur_master->ops.restore(sde_enc->cur_master);
	else if (sde_enc->cur_master->ops.enable)
		sde_enc->cur_master->ops.enable(sde_enc->cur_master);

	_sde_encoder_virt_enable_helper(drm_enc);