All of lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: Patrik Jakobsson <patrik.jakobsson@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 2/4] drm/i915/gen9: Sanitize handling of allowed DC states
Date: Mon, 29 Feb 2016 20:04:58 +0200	[thread overview]
Message-ID: <1456769098.18663.56.camel@intel.com> (raw)
In-Reply-To: <20160229130234.GB21228@patrik-desktop.isw.intel.com>

On ma, 2016-02-29 at 14:02 +0100, Patrik Jakobsson wrote:
> On Wed, Feb 24, 2016 at 07:57:44PM +0200, Imre Deak wrote:
> > We can simplify the conditions selecting the target DC state during
> > runtime by calculating the allowed DC states in advance during
> > driver
> > loading. This also makes it easier to disable DC states depending
> > on the
> > i915.disable_power_well module option, added in the next patch.
> > 
> > CC: Patrik Jakobsson <patrik.jakobsson@linux.intel.com>
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_drv.h         |  1 +
> >  drivers/gpu/drm/i915/intel_runtime_pm.c | 74
> > +++++++++++++++++++++++----------
> >  2 files changed, 54 insertions(+), 21 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h
> > b/drivers/gpu/drm/i915/i915_drv.h
> > index 9e76bfc..b563de5 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -750,6 +750,7 @@ struct intel_csr {
> >  	i915_reg_t mmioaddr[8];
> >  	uint32_t mmiodata[8];
> >  	uint32_t dc_state;
> > +	uint32_t allowed_dc_mask;
> >  };
> >  
> >  #define DEV_INFO_FOR_EACH_FLAG(func, sep) \
> > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c
> > b/drivers/gpu/drm/i915/intel_runtime_pm.c
> > index 8276dc2..88df99e 100644
> > --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> > @@ -538,12 +538,8 @@ static void gen9_set_dc_state(struct
> > drm_i915_private *dev_priv, uint32_t state)
> >  	else
> >  		mask |= DC_STATE_EN_UPTO_DC6;
> >  
> > -	WARN_ON_ONCE(state & ~mask);
> > -
> > -	if (i915.enable_dc == 0)
> > -		state = DC_STATE_DISABLE;
> > -	else if (i915.enable_dc == 1 && state >
> > DC_STATE_EN_UPTO_DC5)
> > -		state = DC_STATE_EN_UPTO_DC5;
> > +	if (WARN_ON_ONCE(state & ~dev_priv->csr.allowed_dc_mask))
> > +		state &= dev_priv->csr.allowed_dc_mask;
> >  
> >  	val = I915_READ(DC_STATE_EN);
> >  	DRM_DEBUG_KMS("Setting DC state from %02x to %02x\n",
> > @@ -659,8 +655,7 @@ static void gen9_disable_dc5_dc6(struct
> > drm_i915_private *dev_priv)
> >  {
> >  	assert_can_disable_dc5(dev_priv);
> >  
> > -	if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) &&
> > -	    i915.enable_dc != 0 && i915.enable_dc != 1)
> > +	if (dev_priv->csr.allowed_dc_mask & DC_STATE_EN_UPTO_DC6)
> >  		assert_can_disable_dc6(dev_priv);
> >  
> >  	gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
> > @@ -839,26 +834,19 @@ static void
> > gen9_dc_off_power_well_enable(struct drm_i915_private *dev_priv,
> >  static void gen9_dc_off_power_well_disable(struct drm_i915_private
> > *dev_priv,
> >  					   struct i915_power_well
> > *power_well)
> >  {
> > -	if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) &&
> > -	    i915.enable_dc != 0 && i915.enable_dc != 1)
> > +	if (dev_priv->csr.allowed_dc_mask & DC_STATE_EN_UPTO_DC6)
> >  		skl_enable_dc6(dev_priv);
> > -	else
> > +	else if (dev_priv->csr.allowed_dc_mask &
> > DC_STATE_EN_UPTO_DC5)
> >  		gen9_enable_dc5(dev_priv);
> >  }
> >  
> >  static void gen9_dc_off_power_well_sync_hw(struct drm_i915_private
> > *dev_priv,
> >  					   struct i915_power_well
> > *power_well)
> >  {
> > -	if (power_well->count > 0) {
> > -		gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
> > -	} else {
> > -		if ((IS_SKYLAKE(dev_priv) ||
> > IS_KABYLAKE(dev_priv)) &&
> > -		    i915.enable_dc != 0 &&
> > -		    i915.enable_dc != 1)
> > -			gen9_set_dc_state(dev_priv,
> > DC_STATE_EN_UPTO_DC6);
> > -		else
> > -			gen9_set_dc_state(dev_priv,
> > DC_STATE_EN_UPTO_DC5);
> > -	}
> > +	if (power_well->count > 0)
> > +		gen9_dc_off_power_well_enable(dev_priv,
> > power_well);
> > +	else
> > +		gen9_dc_off_power_well_disable(dev_priv,
> > power_well);
> >  }
> >  
> >  static void i9xx_always_on_power_well_noop(struct drm_i915_private
> > *dev_priv,
> > @@ -2023,6 +2011,48 @@ sanitize_disable_power_well_option(const
> > struct drm_i915_private *dev_priv,
> >  	return 1;
> >  }
> >  
> > +static uint32_t get_allowed_dc_mask(const struct drm_i915_private
> > *dev_priv,
> > +				    int enable_dc)
> > +{
> > +	uint32_t mask = 0;
> > +
> > +	/*
> > +	 * DC9 has a separate HW flow from the rest of the DC
> > states, not
> > +	 * depending on the DMC firmware. It's needed by system
> > +	 * suspend/resume, so allow it unconditionally.
> > +	 */
> > +	if (IS_BROXTON(dev_priv))
> > +		mask |= DC_STATE_EN_DC9;
> > +
> > +	if (!enable_dc)
> > +		return mask;
> > +
> > +	if (!HAS_CSR(dev_priv))
> > +		return mask;
> > +
> > +	mask |= DC_STATE_EN_UPTO_DC5;
> > +	if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
> > +		mask |= DC_STATE_EN_UPTO_DC6;
> > +	} else if (!IS_BROXTON(dev_priv)) {
> > +		MISSING_CASE(INTEL_DEVID(dev_priv));
> > +		mask = 0;
> > +	}
> > +
> > +	switch (enable_dc) {
> > +	case 1:
> > +		mask &= ~DC_STATE_EN_UPTO_DC6;
> > +		break;
> > +	case 2:
> 
> Should we make some noise here on BXT? Just a thought, not sure it's
> useful.

Yes, I added this now. I'll resend the whole patchset with this change
since patchwork didn't pick up the first version for testing.

--Imre

> 
> > +	case -1:
> > +		break;
> > +	default:
> > +		DRM_ERROR("Unexpected value for enable_dc (%d)\n",
> > enable_dc);
> > +		break;
> > +	}
> > +
> > +	return mask;
> > +}
> > +
> >  #define set_power_wells(power_domains, __power_wells) ({		
> > \
> >  	(power_domains)->power_wells = (__power_wells);		
> > 	\
> >  	(power_domains)->power_well_count =
> > ARRAY_SIZE(__power_wells);	\
> > @@ -2041,6 +2071,8 @@ int intel_power_domains_init(struct
> > drm_i915_private *dev_priv)
> >  
> >  	i915.disable_power_well =
> > sanitize_disable_power_well_option(dev_priv,
> >  						     i915.disable_
> > power_well);
> > +	dev_priv->csr.allowed_dc_mask =
> > get_allowed_dc_mask(dev_priv,
> > +							    i915.e
> > nable_dc);
> >  
> >  	BUILD_BUG_ON(POWER_DOMAIN_NUM > 31);
> >  
> > -- 
> > 2.5.0
> > 
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-02-29 18:05 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-24 17:57 [PATCH 0/4] drm/915: Sanitize DC state handling Imre Deak
2016-02-24 17:57 ` [PATCH 1/4] drm/i915/skl: Fix power domain suspend sequence Imre Deak
2016-02-24 17:57   ` Imre Deak
2016-02-29 12:30   ` Patrik Jakobsson
2016-02-24 17:57 ` [PATCH 2/4] drm/i915/gen9: Sanitize handling of allowed DC states Imre Deak
2016-02-29 13:02   ` Patrik Jakobsson
2016-02-29 18:04     ` Imre Deak [this message]
2016-02-24 17:57 ` [PATCH 3/4] drm/i915/gen9: Disable DC states if power well support is disabled Imre Deak
2016-02-29 13:05   ` Patrik Jakobsson
2016-02-24 17:57 ` [PATCH 4/4] drm/i915/gen9: Remove state asserts when disabling DC states Imre Deak
2016-02-29 13:07   ` Patrik Jakobsson

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=1456769098.18663.56.camel@intel.com \
    --to=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=patrik.jakobsson@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.