All of lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: jeff.mcgee@intel.com
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 2/4] drm/i915/bxt: Determine BXT slice/subslice/EU info
Date: Thu, 09 Apr 2015 16:26:19 +0300	[thread overview]
Message-ID: <1428585979.22233.13.camel@ideak-mobl> (raw)
In-Reply-To: <1428109998-22832-3-git-send-email-jeff.mcgee@intel.com>

On Fri, 2015-04-03 at 18:13 -0700, jeff.mcgee@intel.com wrote:
> From: Jeff McGee <jeff.mcgee@intel.com>
> 
> Modify the Gen9 SSEU info initialization logic to support
> Broxton. Broxton reuses the SKL fuse registers but has at most
> 1 slice and 6 EU per subslice.
> 
> Signed-off-by: Jeff McGee <jeff.mcgee@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_dma.c | 47 ++++++++++++++++++++++++++---------------
>  drivers/gpu/drm/i915/i915_reg.h |  4 +---
>  2 files changed, 31 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
> index 9691f0f..a9b7770 100644
> --- a/drivers/gpu/drm/i915/i915_dma.c
> +++ b/drivers/gpu/drm/i915/i915_dma.c
> @@ -611,9 +611,21 @@ static void gen9_sseu_info_init(struct drm_device *dev)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_device_info *info;
> -	const int s_max = 3, ss_max = 4, eu_max = 8;
> +	int s_max = 3, ss_max = 4, eu_max = 8;
>  	int s, ss;
> -	u32 fuse2, eu_disable[s_max], s_enable, ss_disable;
> +	u32 fuse2, s_enable, ss_disable, eu_disable;
> +	u8 eu_mask = 0xff;
> +
> +	/*
> +	 * BXT has a single slice. BXT also has at most 6 EU per subslice,
> +	 * and therefore only the lowest 6 bits of the 8-bit EU disable
> +	 * fields are valid.
> +	*/
> +	if (IS_BROXTON(dev)) {
> +		s_max = 1;
> +		eu_max = 6;
> +		eu_mask = 0x3f;
> +	}
>  
>  	info = (struct intel_device_info *)&dev_priv->info;
>  	fuse2 = I915_READ(GEN8_FUSE2);
> @@ -622,10 +634,6 @@ static void gen9_sseu_info_init(struct drm_device *dev)
>  	ss_disable = (fuse2 & GEN9_F2_SS_DIS_MASK) >>
>  		     GEN9_F2_SS_DIS_SHIFT;
>  
> -	eu_disable[0] = I915_READ(GEN8_EU_DISABLE0);
> -	eu_disable[1] = I915_READ(GEN8_EU_DISABLE1);
> -	eu_disable[2] = I915_READ(GEN8_EU_DISABLE2);
> -
>  	info->slice_total = hweight32(s_enable);
>  	/*
>  	 * The subslice disable field is global, i.e. it applies
> @@ -644,25 +652,26 @@ static void gen9_sseu_info_init(struct drm_device *dev)
>  			/* skip disabled slice */
>  			continue;
>  
> +		eu_disable = I915_READ(GEN9_EU_DISABLE(s));
>  		for (ss = 0; ss < ss_max; ss++) {
> -			u32 n_disabled;
> +			int eu_per_ss;
>  
>  			if (ss_disable & (0x1 << ss))
>  				/* skip disabled subslice */
>  				continue;
>  
> -			n_disabled = hweight8(eu_disable[s] >>
> -					      (ss * eu_max));
> +			eu_per_ss = eu_max - hweight8((eu_disable >> (ss*8)) &
> +						      eu_mask);
>  
>  			/*
>  			 * Record which subslice(s) has(have) 7 EUs. we
>  			 * can tune the hash used to spread work among
>  			 * subslices if they are unbalanced.
>  			 */
> -			if (eu_max - n_disabled == 7)
> +			if (eu_per_ss == 7)
>  				info->subslice_7eu[s] |= 1 << ss;
>  
> -			info->eu_total += eu_max - n_disabled;
> +			info->eu_total += eu_per_ss;
>  		}
>  	}
>  
> @@ -670,7 +679,8 @@ static void gen9_sseu_info_init(struct drm_device *dev)
>  	 * SKL is expected to always have a uniform distribution
>  	 * of EU across subslices with the exception that any one
>  	 * EU in any one subslice may be fused off for die
> -	 * recovery.
> +	 * recovery. BXT is expected to be perfectly uniform in EU
> +	 * distribution.

Nitpick: I would have added here an assertion for BXT about the above.
The patchset looks otherwise ok to me, so on 1-4:
Reviewed-by: Imre Deak <imre.deak@intel.com>

>  	*/
>  	info->eu_per_subslice = info->subslice_total ?
>  				DIV_ROUND_UP(info->eu_total,
> @@ -678,11 +688,14 @@ static void gen9_sseu_info_init(struct drm_device *dev)
>  	/*
>  	 * SKL supports slice power gating on devices with more than
>  	 * one slice, and supports EU power gating on devices with
> -	 * more than one EU pair per subslice.
> +	 * more than one EU pair per subslice. BXT supports subslice
> +	 * power gating on devices with more than one subslice, and
> +	 * supports EU power gating on devices with more than one EU
> +	 * pair per subslice.
>  	*/
> -	info->has_slice_pg = (info->slice_total > 1) ? 1 : 0;
> -	info->has_subslice_pg = 0;
> -	info->has_eu_pg = (info->eu_per_subslice > 2) ? 1 : 0;
> +	info->has_slice_pg = (IS_SKYLAKE(dev) && (info->slice_total > 1));
> +	info->has_subslice_pg = (IS_BROXTON(dev) && (info->subslice_total > 1));
> +	info->has_eu_pg = (info->eu_per_subslice > 2);
>  }
>  
>  /*
> @@ -747,7 +760,7 @@ static void intel_device_info_runtime_init(struct drm_device *dev)
>  	/* Initialize slice/subslice/EU info */
>  	if (IS_CHERRYVIEW(dev))
>  		cherryview_sseu_info_init(dev);
> -	else if (IS_SKYLAKE(dev))
> +	else if (INTEL_INFO(dev)->gen >= 9)
>  		gen9_sseu_info_init(dev);
>  
>  	DRM_DEBUG_DRIVER("slice total: %u\n", info->slice_total);
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index b134fa3..69d3689 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -1554,9 +1554,7 @@ enum skl_disp_power_wells {
>  #define   GEN9_F2_SS_DIS_SHIFT		20
>  #define   GEN9_F2_SS_DIS_MASK		(0xf << GEN9_F2_SS_DIS_SHIFT)
>  
> -#define GEN8_EU_DISABLE0		0x9134
> -#define GEN8_EU_DISABLE1		0x9138
> -#define GEN8_EU_DISABLE2		0x913c
> +#define GEN9_EU_DISABLE(slice)		(0x9134 + (slice)*0x4)
>  
>  #define GEN6_BSD_SLEEP_PSMI_CONTROL	0x12050
>  #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)


_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2015-04-09 13:26 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-04  1:13 [PATCH 0/4 v2] BXT basic slice/subslice/EU stuff jeff.mcgee
2015-04-04  1:13 ` [PATCH 1/4] drm/i915: Split SSEU init into functions by platform jeff.mcgee
2015-04-04  1:13 ` [PATCH 2/4] drm/i915/bxt: Determine BXT slice/subslice/EU info jeff.mcgee
2015-04-09 13:26   ` Imre Deak [this message]
2015-04-09 13:59     ` Daniel Vetter
2015-04-04  1:13 ` [PATCH 3/4] drm/i915: Split-up SSEU device status by platform jeff.mcgee
2015-04-04  1:13 ` [PATCH 4/4] drm/i915/bxt: Support BXT in SSEU device status dump jeff.mcgee
2015-04-09 16:21   ` shuang.he

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=1428585979.22233.13.camel@ideak-mobl \
    --to=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jeff.mcgee@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.