dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: jsanka@codeaurora.org
To: Sean Paul <seanpaul@chromium.org>
Cc: linux-arm-msm@vger.kernel.org, abhinavk@codeaurora.org,
	dri-devel@lists.freedesktop.org, hoegsberg@chromium.org,
	freedreno@lists.freedesktop.org
Subject: Re: [DPU PATCH 01/11] drm/msm: Skip seamless disables in crtc/encoder
Date: Fri, 02 Mar 2018 16:04:24 -0800	[thread overview]
Message-ID: <d51bfdafccd143ee258fc995a7cafecc@codeaurora.org> (raw)
In-Reply-To: <20180228191906.185417-2-seanpaul@chromium.org>

On 2018-02-28 11:18, Sean Paul wrote:
> Instead of duplicating whole swaths of atomic helper functions (which
> are already out-of-date), just skip the encoder/crtc disables in the
> .disable hooks.
> 
> Change-Id: I7bd9183ae60624204fb1de9550656b776efc7202
> Signed-off-by: Sean Paul <seanpaul@chromium.org>

Can you consider getting rid of these checks?

> ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c    |   8 +
>  drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c |   8 +
>  drivers/gpu/drm/msm/msm_atomic.c            | 185 +-------------------
>  3 files changed, 17 insertions(+), 184 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index 3cdf1e3d9d96..a3ab6ed2bf1d 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -3393,6 +3393,7 @@ static void dpu_crtc_disable(struct drm_crtc 
> *crtc)
>  {
>  	struct dpu_crtc *dpu_crtc;
>  	struct dpu_crtc_state *cstate;
> +	struct drm_display_mode *mode;
>  	struct drm_encoder *encoder;
>  	struct msm_drm_private *priv;
>  	unsigned long flags;
> @@ -3407,8 +3408,15 @@ static void dpu_crtc_disable(struct drm_crtc 
> *crtc)
>  	}
>  	dpu_crtc = to_dpu_crtc(crtc);
>  	cstate = to_dpu_crtc_state(crtc->state);
> +	mode = &cstate->base.adjusted_mode;
>  	priv = crtc->dev->dev_private;
> 
> +	if (msm_is_mode_seamless(mode) || msm_is_mode_seamless_vrr(mode)
> ||
> +	    msm_is_mode_seamless_dms(mode)) {
> +		DPU_DEBUG("Seamless mode is being applied, skip
> disable\n");
> +		return;
> +	}
> +
Another topic of discussion which should be brought up with dri-devel.

May not be common in PC world, but there are a handful of mobile OEM's
using panels which supports more than one resolution. Primary use cases
involve "seamless" switching to optimized display resolution when
streaming content changes resolutions or rendering lossless data.

Jeykumar S.

>  	DPU_DEBUG("crtc%d\n", crtc->base.id);
> 
>  	if (dpu_kms_is_suspend_state(crtc->dev))
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 3d168fa09f3f..28ceb589ee40 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -2183,6 +2183,7 @@ static void dpu_encoder_virt_disable(struct
> drm_encoder *drm_enc)
>  	struct dpu_encoder_virt *dpu_enc = NULL;
>  	struct msm_drm_private *priv;
>  	struct dpu_kms *dpu_kms;
> +	struct drm_display_mode *mode;
>  	int i = 0;
> 
>  	if (!drm_enc) {
> @@ -2196,6 +2197,13 @@ static void dpu_encoder_virt_disable(struct
> drm_encoder *drm_enc)
>  		return;
>  	}
> 
> +	mode = &drm_enc->crtc->state->adjusted_mode;
> +	if (msm_is_mode_seamless(mode) || msm_is_mode_seamless_vrr(mode)
> ||
> +	    msm_is_mode_seamless_dms(mode)) {
> +		DPU_DEBUG("Seamless mode is being applied, skip
> disable\n");
> +		return;
> +	}
> +
>  	dpu_enc = to_dpu_encoder_virt(drm_enc);
>  	DPU_DEBUG_ENC(dpu_enc, "\n");
> 
> diff --git a/drivers/gpu/drm/msm/msm_atomic.c
> b/drivers/gpu/drm/msm/msm_atomic.c
> index 46536edb72ee..5cfb80345052 100644
> --- a/drivers/gpu/drm/msm/msm_atomic.c
> +++ b/drivers/gpu/drm/msm/msm_atomic.c
> @@ -84,189 +84,6 @@ static void msm_atomic_wait_for_commit_done(
>  	}
>  }
> 
> -static void
> -msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state
> *old_state)
> -{
> -	struct drm_connector *connector;
> -	struct drm_connector_state *old_conn_state, *new_conn_state;
> -	struct drm_crtc *crtc;
> -	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
> -	int i;
> -
> -	for_each_oldnew_connector_in_state(old_state, connector,
> old_conn_state, new_conn_state, i) {
> -		const struct drm_encoder_helper_funcs *funcs;
> -		struct drm_encoder *encoder;
> -		struct drm_crtc_state *old_crtc_state;
> -		unsigned int crtc_idx;
> -
> -		/*
> -		 * Shut down everything that's in the changeset and
> currently
> -		 * still on. So need to check the old, saved state.
> -		 */
> -		if (!old_conn_state->crtc)
> -			continue;
> -
> -		crtc_idx = drm_crtc_index(old_conn_state->crtc);
> -		old_crtc_state = drm_atomic_get_old_crtc_state(old_state,
> -
> old_conn_state->crtc);
> -
> -		if (!old_crtc_state->active ||
> -
> !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
> -			continue;
> -
> -		encoder = old_conn_state->best_encoder;
> -
> -		/* We shouldn't get this far if we didn't previously have
> -		 * an encoder.. but WARN_ON() rather than explode.
> -		 */
> -		if (WARN_ON(!encoder))
> -			continue;
> -
> -		if (msm_is_mode_seamless(
> -			&connector->encoder->crtc->state->mode) ||
> -			msm_is_mode_seamless_vrr(
> -			&connector->encoder->crtc->state->adjusted_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",
> -				 encoder->base.id, encoder->name);
> -
> -		/*
> -		 * Each encoder has at most one connector (since we always
> steal
> -		 * it away), so we won't call disable hooks twice.
> -		 */
> -		drm_bridge_disable(encoder->bridge);
> -
> -		/* Right function depends upon target state. */
> -		if (new_conn_state->crtc && funcs->prepare)
> -			funcs->prepare(encoder);
> -		else if (funcs->disable)
> -			funcs->disable(encoder);
> -		else
> -			funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
> -
> -		drm_bridge_post_disable(encoder->bridge);
> -	}
> -
> -	for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state,
> new_crtc_state, i) {
> -		const struct drm_crtc_helper_funcs *funcs;
> -
> -		/* Shut down everything that needs a full modeset. */
> -		if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
> -			continue;
> -
> -		if (!old_crtc_state->active)
> -			continue;
> -
> -		if (msm_is_mode_seamless(&crtc->state->mode) ||
> -
> msm_is_mode_seamless_vrr(&crtc->state->adjusted_mode))
> -			continue;
> -
> -		if (msm_is_mode_seamless_dms(&crtc->state->adjusted_mode))
> -			continue;
> -
> -		funcs = crtc->helper_private;
> -
> -		DRM_DEBUG_ATOMIC("disabling [CRTC:%d]\n",
> -				 crtc->base.id);
> -
> -		/* Right function depends upon target state. */
> -		if (new_crtc_state->enable && funcs->prepare)
> -			funcs->prepare(crtc);
> -		else if (funcs->disable)
> -			funcs->disable(crtc);
> -		else
> -			funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
> -	}
> -}
> -
> -static void
> -msm_crtc_set_mode(struct drm_device *dev, struct drm_atomic_state
> *old_state)
> -{
> -	struct drm_crtc *crtc;
> -	struct drm_crtc_state *new_crtc_state;
> -	struct drm_connector *connector;
> -	struct drm_connector_state *new_conn_state;
> -	int i;
> -
> -	for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
> -		const struct drm_crtc_helper_funcs *funcs;
> -
> -		if (!new_crtc_state->mode_changed)
> -			continue;
> -
> -		funcs = crtc->helper_private;
> -
> -		if (new_crtc_state->enable && funcs->mode_set_nofb) {
> -			DRM_DEBUG_ATOMIC("modeset on [CRTC:%d]\n",
> -					 crtc->base.id);
> -
> -			funcs->mode_set_nofb(crtc);
> -		}
> -	}
> -
> -	for_each_new_connector_in_state(old_state, connector,
> new_conn_state, i) {
> -		const struct drm_encoder_helper_funcs *funcs;
> -		struct drm_crtc_state *new_crtc_state;
> -		struct drm_encoder *encoder;
> -		struct drm_display_mode *mode, *adjusted_mode;
> -
> -		if (!new_conn_state->best_encoder)
> -			continue;
> -
> -		encoder = new_conn_state->best_encoder;
> -		funcs = encoder->helper_private;
> -		new_crtc_state = new_conn_state->crtc->state;
> -		mode = &new_crtc_state->mode;
> -		adjusted_mode = &new_crtc_state->adjusted_mode;
> -
> -		if (!new_crtc_state->mode_changed)
> -			continue;
> -
> -		DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
> -				 encoder->base.id, encoder->name);
> -
> -		/*
> -		 * Each encoder has at most one connector (since we always
> steal
> -		 * it away), so we won't call mode_set hooks twice.
> -		 */
> -		if (funcs->mode_set)
> -			funcs->mode_set(encoder, mode, adjusted_mode);
> -
> -		drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
> -	}
> -}
> -
> -/**
> - * msm_atomic_helper_commit_modeset_disables - modeset commit to 
> disable
> outputs
> - * @dev: DRM device
> - * @old_state: atomic state object with old state structures
> - *
> - * This function shuts down all the outputs that need to be shut down 
> and
> - * prepares them (if required) with the new mode.
> - *
> - * For compatibility with legacy crtc helpers this should be called
> before
> - * drm_atomic_helper_commit_planes(), which is what the default commit
> function
> - * does. But drivers with different needs can group the modeset 
> commits
> together
> - * and do the plane commits at the end. This is useful for drivers 
> doing
> runtime
> - * PM since planes updates then only happen when the CRTC is actually
> enabled.
> - */
> -void msm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
> -		struct drm_atomic_state *old_state)
> -{
> -	msm_disable_outputs(dev, old_state);
> -
> -	drm_atomic_helper_update_legacy_modeset_state(dev, old_state);
> -
> -	msm_crtc_set_mode(dev, old_state);
> -}
> -
>  /**
>   * msm_atomic_helper_commit_modeset_enables - modeset commit to enable
> outputs
>   * @dev: DRM device
> @@ -406,7 +223,7 @@ static void complete_commit(struct msm_commit *c)
> 
>  	kms->funcs->prepare_commit(kms, state);
> 
> -	msm_atomic_helper_commit_modeset_disables(dev, state);
> +	drm_atomic_helper_commit_modeset_disables(dev, state);
> 
>  	drm_atomic_helper_commit_planes(dev, state, 0);
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2018-03-03  0:04 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-28 19:18 [DPU PATCH 00/11] drm/msm: Use atomic helper functions for msm Sean Paul
     [not found] ` <20180228191906.185417-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-02-28 19:18   ` [DPU PATCH 01/11] drm/msm: Skip seamless disables in crtc/encoder Sean Paul
2018-03-03  0:04     ` jsanka [this message]
     [not found]       ` <d51bfdafccd143ee258fc995a7cafecc-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:14         ` Sean Paul
2018-03-13 18:10           ` Jeykumar Sankaran
2018-02-28 19:18   ` [DPU PATCH 02/11] drm/msm: Don't duplicate modeset_enables atomic helper Sean Paul
     [not found]     ` <20180228191906.185417-3-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  0:56       ` Jeykumar Sankaran
     [not found]         ` <aaf8f07e18801c60cdf7eb30b0cac123-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:21           ` Sean Paul
2018-03-13 23:57             ` Jeykumar Sankaran
     [not found]               ` <677c8c29a788a147aa45bc1e9768527e-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-14 15:14                 ` Sean Paul
2018-03-15  1:39                   ` Jeykumar Sankaran
     [not found]                     ` <645777c3f76662ce5b0b14bcf7b81acb-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-16 19:45                       ` [DPU PATCH v2] " Sean Paul
2018-03-16 20:57                         ` Jeykumar Sankaran
2018-02-28 19:18   ` [DPU PATCH 03/11] drm/msm: Refactor complete_commit() to look more the helpers Sean Paul
     [not found]     ` <20180228191906.185417-4-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  1:01       ` Jeykumar Sankaran
2018-02-28 19:18   ` [DPU PATCH 04/11] drm/msm: Move implicit sync fence handling to prepare_fb Sean Paul
     [not found]     ` <20180228191906.185417-5-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-03  0:20       ` jsanka-sgV2jX0FEOL9JmXXK+q4OQ
2018-02-28 19:19   ` [DPU PATCH 05/11] drm/msm: Mark the crtc->state->event consumed Sean Paul
2018-03-06  1:53     ` Jeykumar Sankaran
2018-02-28 19:19   ` [DPU PATCH 06/11] drm/msm: Remove msm_commit/kthread, use atomic helper commit Sean Paul
     [not found]     ` <20180228191906.185417-7-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-01  4:07       ` jsanka-sgV2jX0FEOL9JmXXK+q4OQ
2018-03-01 15:27         ` Sean Paul
2018-03-01 20:37           ` jsanka-sgV2jX0FEOL9JmXXK+q4OQ
     [not found]             ` <156ab33c41d436c79cc661e84bebc353-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-02  0:37               ` Rob Clark
     [not found]                 ` <CAF6AEGvDZ8sWYwwbyPYcQZN6Ba01Gc7db724GeehF3cLY6d-XQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-03-02 14:56                   ` Sean Paul
2018-03-09  1:08                     ` Jeykumar Sankaran
2018-03-12 20:23                       ` Sean Paul
2018-03-19 15:01                         ` Sean Paul
2018-03-19 19:54                           ` Jeykumar Sankaran
2018-02-28 19:19   ` [DPU PATCH 07/11] drm/msm: Use atomic private_obj instead of subclassing Sean Paul
     [not found]     ` <20180228191906.185417-8-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  1:59       ` Jeykumar Sankaran
     [not found]         ` <7fb92416ee99990f6a1280a617736051-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:28           ` Sean Paul
2018-03-19 17:31             ` [DPU PATCH v2] " Sean Paul
     [not found]               ` <20180319173113.94879-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-19 19:33                 ` Jeykumar Sankaran
2018-03-19 19:58                   ` [DPU PATCH v3] " Sean Paul
     [not found]                     ` <20180319195853.49006-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-20 11:01                       ` Archit Taneja
     [not found]                         ` <41aebf2e-48a0-a2e2-167c-70da912353f4-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-05-25  1:16                           ` Jeykumar Sankaran
2018-02-28 19:19   ` [DPU PATCH 08/11] drm/msm: Remove hand-rolled out fences Sean Paul
     [not found]     ` <20180228191906.185417-9-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-03  0:44       ` Jeykumar Sankaran
     [not found]         ` <1a1c79ddb6ddabbc72e4624b53460188-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:30           ` Sean Paul
2018-03-13 18:11             ` Jeykumar Sankaran
2018-02-28 19:19   ` [DPU PATCH 09/11] drm/msm: Remove prepare_fence kms_function Sean Paul
     [not found]     ` <20180228191906.185417-10-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  1:28       ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
2018-02-28 19:19   ` [DPU PATCH 10/11] drm/msm: Switch to atomic_helper_commit() Sean Paul
     [not found]     ` <20180228191906.185417-11-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-09  3:28       ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
     [not found]         ` <bf44a79fc08d00245640694c364b8b03-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-03-12 20:32           ` Sean Paul
2018-03-13  2:08             ` abhinavk-sgV2jX0FEOL9JmXXK+q4OQ
2018-02-28 19:19   ` [DPU PATCH 11/11] drm/msm: Remove dpu input fences Sean Paul
     [not found]     ` <20180228191906.185417-12-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-03-03  0:50       ` Jeykumar Sankaran

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d51bfdafccd143ee258fc995a7cafecc@codeaurora.org \
    --to=jsanka@codeaurora.org \
    --cc=abhinavk@codeaurora.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=freedreno@lists.freedesktop.org \
    --cc=hoegsberg@chromium.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=seanpaul@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).