public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: "Kahola, Mika" <mika.kahola@intel.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>
Subject: Re: [Intel-gfx] [PATCH 3/6] drm/i915: Use pipes instead crtc indices in PLL state tracking
Date: Thu, 4 Mar 2021 10:52:30 +0000	[thread overview]
Message-ID: <e288be0df88240eeb3855a2ce8073dc7@intel.com> (raw)
In-Reply-To: <20210224144214.24803-4-ville.syrjala@linux.intel.com>

> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Wednesday, February 24, 2021 4:42 PM
> To: intel-gfx@lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH 3/6] drm/i915: Use pipes instead crtc indices in PLL
> state tracking
> 
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> All the other places we have use pipes instead of crtc indices when tracking
> resource usage. Life is easier when we do it the same way always, so switch
> the dpll mgr to using pipes as well. Looks like it was actually mixing these up
> in some cases so it would not even have worked correctly except when the
> device has a contiguous set of pipes starting from pipe A.
> Granted, that is the typical case but supposedly it may not always hold on
> modern hw.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> ---
>  drivers/gpu/drm/i915/display/intel_display.c  | 40 ++++++++--------
> .../drm/i915/display/intel_display_debugfs.c  |  4 +-
> drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 48 ++++++++++---------
> drivers/gpu/drm/i915/display/intel_dpll_mgr.h |  8 ++--
>  4 files changed, 51 insertions(+), 49 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index b34620545d3b..958c2a796bae 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -9653,7 +9653,7 @@ verify_single_dpll_state(struct drm_i915_private
> *dev_priv,
>  			 struct intel_crtc_state *new_crtc_state)  {
>  	struct intel_dpll_hw_state dpll_hw_state;
> -	unsigned int crtc_mask;
> +	u8 pipe_mask;
>  	bool active;
> 
>  	memset(&dpll_hw_state, 0, sizeof(dpll_hw_state)); @@ -9666,34
> +9666,34 @@ verify_single_dpll_state(struct drm_i915_private *dev_priv,
>  		I915_STATE_WARN(!pll->on && pll->active_mask,
>  		     "pll in active use but not on in sw tracking\n");
>  		I915_STATE_WARN(pll->on && !pll->active_mask,
> -		     "pll is on but not used by any active crtc\n");
> +		     "pll is on but not used by any active pipe\n");
>  		I915_STATE_WARN(pll->on != active,
>  		     "pll on state mismatch (expected %i, found %i)\n",
>  		     pll->on, active);
>  	}
> 
>  	if (!crtc) {
> -		I915_STATE_WARN(pll->active_mask & ~pll->state.crtc_mask,
> -				"more active pll users than references: %x vs
> %x\n",
> -				pll->active_mask, pll->state.crtc_mask);
> +		I915_STATE_WARN(pll->active_mask & ~pll-
> >state.pipe_mask,
> +				"more active pll users than references: 0x%x
> vs 0x%x\n",
> +				pll->active_mask, pll->state.pipe_mask);
> 
>  		return;
>  	}
> 
> -	crtc_mask = drm_crtc_mask(&crtc->base);
> +	pipe_mask = BIT(crtc->pipe);
> 
>  	if (new_crtc_state->hw.active)
> -		I915_STATE_WARN(!(pll->active_mask & crtc_mask),
> -				"pll active mismatch (expected pipe %c in
> active mask 0x%02x)\n",
> +		I915_STATE_WARN(!(pll->active_mask & pipe_mask),
> +				"pll active mismatch (expected pipe %c in
> active mask 0x%x)\n",
>  				pipe_name(crtc->pipe), pll->active_mask);
>  	else
> -		I915_STATE_WARN(pll->active_mask & crtc_mask,
> -				"pll active mismatch (didn't expect pipe %c in
> active mask 0x%02x)\n",
> +		I915_STATE_WARN(pll->active_mask & pipe_mask,
> +				"pll active mismatch (didn't expect pipe %c in
> active mask
> +0x%x)\n",
>  				pipe_name(crtc->pipe), pll->active_mask);
> 
> -	I915_STATE_WARN(!(pll->state.crtc_mask & crtc_mask),
> -			"pll enabled crtcs mismatch (expected 0x%x in
> 0x%02x)\n",
> -			crtc_mask, pll->state.crtc_mask);
> +	I915_STATE_WARN(!(pll->state.pipe_mask & pipe_mask),
> +			"pll enabled crtcs mismatch (expected 0x%x in
> 0x%x)\n",
> +			pipe_mask, pll->state.pipe_mask);
> 
>  	I915_STATE_WARN(pll->on && memcmp(&pll->state.hw_state,
>  					  &dpll_hw_state,
> @@ -9713,15 +9713,15 @@ verify_shared_dpll_state(struct intel_crtc *crtc,
> 
>  	if (old_crtc_state->shared_dpll &&
>  	    old_crtc_state->shared_dpll != new_crtc_state->shared_dpll) {
> -		unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
> +		u8 pipe_mask = BIT(crtc->pipe);
>  		struct intel_shared_dpll *pll = old_crtc_state->shared_dpll;
> 
> -		I915_STATE_WARN(pll->active_mask & crtc_mask,
> -				"pll active mismatch (didn't expect pipe %c in
> active mask)\n",
> -				pipe_name(crtc->pipe));
> -		I915_STATE_WARN(pll->state.crtc_mask & crtc_mask,
> -				"pll enabled crtcs mismatch (found %x in
> enabled mask)\n",
> -				pipe_name(crtc->pipe));
> +		I915_STATE_WARN(pll->active_mask & pipe_mask,
> +				"pll active mismatch (didn't expect pipe %c in
> active mask (0x%x))\n",
> +				pipe_name(crtc->pipe), pll->active_mask);
> +		I915_STATE_WARN(pll->state.pipe_mask & pipe_mask,
> +				"pll enabled crtcs mismatch (found %x in
> enabled mask (0x%x))\n",
> +				pipe_name(crtc->pipe), pll-
> >state.pipe_mask);
>  	}
>  }
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 35f176ea8280..20194ccfec05 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -1094,8 +1094,8 @@ static int i915_shared_dplls_info(struct seq_file
> *m, void *unused)
> 
>  		seq_printf(m, "DPLL%i: %s, id: %i\n", i, pll->info->name,
>  			   pll->info->id);
> -		seq_printf(m, " crtc_mask: 0x%08x, active: 0x%x, on: %s\n",
> -			   pll->state.crtc_mask, pll->active_mask, yesno(pll-
> >on));
> +		seq_printf(m, " pipe_mask: 0x%x, active: 0x%x, on: %s\n",
> +			   pll->state.pipe_mask, pll->active_mask, yesno(pll-
> >on));
>  		seq_printf(m, " tracked hardware state:\n");
>  		seq_printf(m, " dpll:    0x%08x\n", pll->state.hw_state.dpll);
>  		seq_printf(m, " dpll_md: 0x%08x\n",
> diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> index 529b1d569af2..a68ae90b07e3 100644
> --- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> +++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> @@ -176,7 +176,7 @@ void intel_prepare_shared_dpll(const struct
> intel_crtc_state *crtc_state)
>  		return;
> 
>  	mutex_lock(&dev_priv->dpll.lock);
> -	drm_WARN_ON(&dev_priv->drm, !pll->state.crtc_mask);
> +	drm_WARN_ON(&dev_priv->drm, !pll->state.pipe_mask);
>  	if (!pll->active_mask) {
>  		drm_dbg(&dev_priv->drm, "setting up %s\n", pll->info-
> >name);
>  		drm_WARN_ON(&dev_priv->drm, pll->on); @@ -198,7
> +198,7 @@ void intel_enable_shared_dpll(const struct intel_crtc_state
> *crtc_state)
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
>  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>  	struct intel_shared_dpll *pll = crtc_state->shared_dpll;
> -	unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
> +	unsigned int pipe_mask = BIT(crtc->pipe);
>  	unsigned int old_mask;
> 
>  	if (drm_WARN_ON(&dev_priv->drm, pll == NULL)) @@ -207,16
> +207,16 @@ void intel_enable_shared_dpll(const struct intel_crtc_state
> *crtc_state)
>  	mutex_lock(&dev_priv->dpll.lock);
>  	old_mask = pll->active_mask;
> 
> -	if (drm_WARN_ON(&dev_priv->drm, !(pll->state.crtc_mask &
> crtc_mask)) ||
> -	    drm_WARN_ON(&dev_priv->drm, pll->active_mask & crtc_mask))
> +	if (drm_WARN_ON(&dev_priv->drm, !(pll->state.pipe_mask &
> pipe_mask)) ||
> +	    drm_WARN_ON(&dev_priv->drm, pll->active_mask & pipe_mask))
>  		goto out;
> 
> -	pll->active_mask |= crtc_mask;
> +	pll->active_mask |= pipe_mask;
> 
>  	drm_dbg_kms(&dev_priv->drm,
> -		    "enable %s (active %x, on? %d) for crtc %d\n",
> +		    "enable %s (active 0x%x, on? %d) for [CRTC:%d:%s]\n",
>  		    pll->info->name, pll->active_mask, pll->on,
> -		    crtc->base.base.id);
> +		    crtc->base.base.id, crtc->base.name);
> 
>  	if (old_mask) {
>  		drm_WARN_ON(&dev_priv->drm, !pll->on); @@ -244,7
> +244,7 @@ void intel_disable_shared_dpll(const struct intel_crtc_state
> *crtc_state)
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
>  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>  	struct intel_shared_dpll *pll = crtc_state->shared_dpll;
> -	unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
> +	unsigned int pipe_mask = BIT(crtc->pipe);
> 
>  	/* PCH only available on ILK+ */
>  	if (INTEL_GEN(dev_priv) < 5)
> @@ -254,18 +254,20 @@ void intel_disable_shared_dpll(const struct
> intel_crtc_state *crtc_state)
>  		return;
> 
>  	mutex_lock(&dev_priv->dpll.lock);
> -	if (drm_WARN_ON(&dev_priv->drm, !(pll->active_mask &
> crtc_mask)))
> +	if (drm_WARN(&dev_priv->drm, !(pll->active_mask & pipe_mask),
> +		     "%s not used by [CRTC:%d:%s]\n", pll->info->name,
> +		     crtc->base.base.id, crtc->base.name))
>  		goto out;
> 
>  	drm_dbg_kms(&dev_priv->drm,
> -		    "disable %s (active %x, on? %d) for crtc %d\n",
> +		    "disable %s (active 0x%x, on? %d) for [CRTC:%d:%s]\n",
>  		    pll->info->name, pll->active_mask, pll->on,
> -		    crtc->base.base.id);
> +		    crtc->base.base.id, crtc->base.name);
> 
>  	assert_shared_dpll_enabled(dev_priv, pll);
>  	drm_WARN_ON(&dev_priv->drm, !pll->on);
> 
> -	pll->active_mask &= ~crtc_mask;
> +	pll->active_mask &= ~pipe_mask;
>  	if (pll->active_mask)
>  		goto out;
> 
> @@ -296,7 +298,7 @@ intel_find_shared_dpll(struct intel_atomic_state
> *state,
>  		pll = &dev_priv->dpll.shared_dplls[i];
> 
>  		/* Only want to check enabled timings first */
> -		if (shared_dpll[i].crtc_mask == 0) {
> +		if (shared_dpll[i].pipe_mask == 0) {
>  			if (!unused_pll)
>  				unused_pll = pll;
>  			continue;
> @@ -306,10 +308,10 @@ intel_find_shared_dpll(struct intel_atomic_state
> *state,
>  			   &shared_dpll[i].hw_state,
>  			   sizeof(*pll_state)) == 0) {
>  			drm_dbg_kms(&dev_priv->drm,
> -				    "[CRTC:%d:%s] sharing existing %s (crtc
> mask 0x%08x, active %x)\n",
> +				    "[CRTC:%d:%s] sharing existing %s (pipe
> mask 0x%x, active
> +0x%x)\n",
>  				    crtc->base.base.id, crtc->base.name,
>  				    pll->info->name,
> -				    shared_dpll[i].crtc_mask,
> +				    shared_dpll[i].pipe_mask,
>  				    pll->active_mask);
>  			return pll;
>  		}
> @@ -338,13 +340,13 @@ intel_reference_shared_dpll(struct
> intel_atomic_state *state,
> 
>  	shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
> 
> -	if (shared_dpll[id].crtc_mask == 0)
> +	if (shared_dpll[id].pipe_mask == 0)
>  		shared_dpll[id].hw_state = *pll_state;
> 
>  	drm_dbg(&i915->drm, "using %s for pipe %c\n", pll->info->name,
>  		pipe_name(crtc->pipe));
> 
> -	shared_dpll[id].crtc_mask |= 1 << crtc->pipe;
> +	shared_dpll[id].pipe_mask |= BIT(crtc->pipe);
>  }
> 
>  static void intel_unreference_shared_dpll(struct intel_atomic_state *state,
> @@ -354,7 +356,7 @@ static void intel_unreference_shared_dpll(struct
> intel_atomic_state *state,
>  	struct intel_shared_dpll_state *shared_dpll;
> 
>  	shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
> -	shared_dpll[pll->info->id].crtc_mask &= ~(1 << crtc->pipe);
> +	shared_dpll[pll->info->id].pipe_mask &= ~BIT(crtc->pipe);
>  }
> 
>  static void intel_put_dpll(struct intel_atomic_state *state, @@ -4597,19
> +4599,19 @@ static void readout_dpll_hw_state(struct drm_i915_private
> *i915,
> 
> POWER_DOMAIN_DPLL_DC_OFF);
>  	}
> 
> -	pll->state.crtc_mask = 0;
> +	pll->state.pipe_mask = 0;
>  	for_each_intel_crtc(&i915->drm, crtc) {
>  		struct intel_crtc_state *crtc_state =
>  			to_intel_crtc_state(crtc->base.state);
> 
>  		if (crtc_state->hw.active && crtc_state->shared_dpll == pll)
> -			pll->state.crtc_mask |= 1 << crtc->pipe;
> +			pll->state.pipe_mask |= BIT(crtc->pipe);
>  	}
> -	pll->active_mask = pll->state.crtc_mask;
> +	pll->active_mask = pll->state.pipe_mask;
> 
>  	drm_dbg_kms(&i915->drm,
> -		    "%s hw state readout: crtc_mask 0x%08x, on %i\n",
> -		    pll->info->name, pll->state.crtc_mask, pll->on);
> +		    "%s hw state readout: pipe_mask 0x%x, on %i\n",
> +		    pll->info->name, pll->state.pipe_mask, pll->on);
>  }
> 
>  void intel_dpll_readout_hw_state(struct drm_i915_private *i915) diff --git
> a/drivers/gpu/drm/i915/display/intel_dpll_mgr.h
> b/drivers/gpu/drm/i915/display/intel_dpll_mgr.h
> index 2eb7618ef957..eb52e85022e2 100644
> --- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.h
> +++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.h
> @@ -241,9 +241,9 @@ struct intel_dpll_hw_state {
>   */
>  struct intel_shared_dpll_state {
>  	/**
> -	 * @crtc_mask: mask of CRTC using this DPLL, active or not
> +	 * @pipe_mask: mask of pipes using this DPLL, active or not
>  	 */
> -	unsigned crtc_mask;
> +	u8 pipe_mask;
> 
>  	/**
>  	 * @hw_state: hardware configuration for the DPLL stored in @@ -
> 351,9 +351,9 @@ struct intel_shared_dpll {
>  	struct intel_shared_dpll_state state;
> 
>  	/**
> -	 * @active_mask: mask of active CRTCs (i.e. DPMS on) using this DPLL
> +	 * @active_mask: mask of active pipes (i.e. DPMS on) using this DPLL
>  	 */
> -	unsigned active_mask;
> +	u8 active_mask;
> 
>  	/**
>  	 * @on: is the PLL actually active? Disabled during modeset
> --
> 2.26.2
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2021-03-04 10:52 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-24 14:42 [Intel-gfx] [PATCH 0/6] drm/i915: Move DDI clock readout to encoder->get_config() Ville Syrjala
2021-02-24 14:42 ` [Intel-gfx] [PATCH 1/6] drm/i915: Call primary encoder's .get_config() from MST .get_config() Ville Syrjala
2021-03-04 10:42   ` Kahola, Mika
2021-02-24 14:42 ` [Intel-gfx] [PATCH 2/6] drm/i915: Do intel_dpll_readout_hw_state() after encoder readout Ville Syrjala
2021-02-25 16:12   ` [Intel-gfx] [PATCH v2 " Ville Syrjala
2021-03-08 11:43     ` Kahola, Mika
2021-03-04 10:43   ` [Intel-gfx] [PATCH " Kahola, Mika
2021-02-24 14:42 ` [Intel-gfx] [PATCH 3/6] drm/i915: Use pipes instead crtc indices in PLL state tracking Ville Syrjala
2021-03-04 10:52   ` Kahola, Mika [this message]
2021-02-24 14:42 ` [Intel-gfx] [PATCH 4/6] drm/i915: Move DDI clock readout to encoder->get_config() Ville Syrjala
2021-03-08 13:11   ` Kahola, Mika
2021-02-24 14:42 ` [Intel-gfx] [PATCH 5/6] drm/i915: Add encoder->is_clock_enabled() Ville Syrjala
2021-03-08 13:16   ` Kahola, Mika
2021-02-24 14:42 ` [Intel-gfx] [PATCH 6/6] drm/i915: Extend icl_sanitize_encoder_pll_mapping() to all DDI platforms Ville Syrjala
2021-03-08 13:17   ` Kahola, Mika
2021-02-24 18:59 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915: Move DDI clock readout to encoder->get_config() Patchwork
2021-02-24 19:28 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2021-02-25 16:37 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915: Move DDI clock readout to encoder->get_config() (rev2) Patchwork
2021-02-25 17:04 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-02-25 18:24 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork

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=e288be0df88240eeb3855a2ce8073dc7@intel.com \
    --to=mika.kahola@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=ville.syrjala@linux.intel.com \
    /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