[Intel-gfx] [PATCH 1/2] drm/i915/cnl: Add support slice/subslice/eu configs

Oscar Mateo oscar.mateo at intel.com
Wed Sep 20 17:37:32 UTC 2017



On 09/19/2017 03:06 PM, Rodrigo Vivi wrote:
> From: Ben Widawsky <ben at bwidawsk.net>
>
> Cannonlake Slice and Subslice information has changed.
>
> This patch initially provided by Ben adds the proper sseu
> initialization.
>
> v2: This v2 done by Rodrigo includes:
>      - Fix on Total slices count by avoiding [1][2] and [2][2].
>      - Inclusion of EU Per Subslice.
>      - Commit message.
> v3: This v3 done by Rodrigo includes:
>      - Handle all possible bits and extra fuse register.
>      - Use INTEL_GEN macro.
>      - Fully assume uniform distribution so remove union
>        with eu_per_subslice and add proper the comment.
> v4: This v4 done by Rodrigo includes:
>      - Consider all bits available: 6 bits for slices [27:22]
>        and 4 for subslices [21:18].
> v5: This v5 done by Rodrigo includes:
>      - sseu->subslice_mask = (1 << 4) - 1 - missed on previous
>      versions and noticed by Oscar.
>
> Cc: Oscar Mateo <oscar.mateo at intel.com>
> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
> ---
>   drivers/gpu/drm/i915/i915_reg.h          |  8 +++++++
>   drivers/gpu/drm/i915/intel_device_info.c | 37 +++++++++++++++++++++++++++++++-
>   2 files changed, 44 insertions(+), 1 deletion(-)

Reviewed-by: Oscar Mateo <oscar.mateo at intel.com>

> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 94b40a469afd..9f4b8faf2982 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2730,6 +2730,11 @@ enum i915_power_well_id {
>   #define   GEN9_F2_SS_DIS_SHIFT		20
>   #define   GEN9_F2_SS_DIS_MASK		(0xf << GEN9_F2_SS_DIS_SHIFT)
>   
> +#define   GEN10_F2_S_ENA_SHIFT		22
> +#define   GEN10_F2_S_ENA_MASK		(0x3f << GEN10_F2_S_ENA_SHIFT)
> +#define   GEN10_F2_SS_DIS_SHIFT		18
> +#define   GEN10_F2_SS_DIS_MASK		(0xf << GEN10_F2_SS_DIS_SHIFT)
> +
>   #define GEN8_EU_DISABLE0		_MMIO(0x9134)
>   #define   GEN8_EU_DIS0_S0_MASK		0xffffff
>   #define   GEN8_EU_DIS0_S1_SHIFT		24
> @@ -2745,6 +2750,9 @@ enum i915_power_well_id {
>   
>   #define GEN9_EU_DISABLE(slice)		_MMIO(0x9134 + (slice)*0x4)
>   
> +#define GEN10_EU_DISABLE3		_MMIO(0x9140)
> +#define   GEN10_EU_DIS_SS_MASK		0xff
> +
>   #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
>   #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
>   #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
> diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
> index 43831b09b47a..d2e7ae61775d 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.c
> +++ b/drivers/gpu/drm/i915/intel_device_info.c
> @@ -82,6 +82,39 @@ void intel_device_info_dump(struct drm_i915_private *dev_priv)
>   #undef PRINT_FLAG
>   }
>   
> +static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)
> +{
> +	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
> +	const u32 fuse2 = I915_READ(GEN8_FUSE2);
> +
> +	sseu->slice_mask = (fuse2 & GEN10_F2_S_ENA_MASK) >>
> +			    GEN10_F2_S_ENA_SHIFT;
> +	sseu->subslice_mask = (1 << 4) - 1;
> +	sseu->subslice_mask &= ~((fuse2 & GEN10_F2_SS_DIS_MASK) >>
> +				 GEN10_F2_SS_DIS_SHIFT);
> +
> +	sseu->eu_total = hweight32(~I915_READ(GEN8_EU_DISABLE0));
> +	sseu->eu_total += hweight32(~I915_READ(GEN8_EU_DISABLE1));
> +	sseu->eu_total += hweight32(~I915_READ(GEN8_EU_DISABLE2));
> +	sseu->eu_total += hweight8(~(I915_READ(GEN10_EU_DISABLE3) &
> +				     GEN10_EU_DIS_SS_MASK));
> +
> +	/*
> +	 * CNL 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.
> +	 */
> +	sseu->eu_per_subslice = sseu_subslice_total(sseu) ?
> +				DIV_ROUND_UP(sseu->eu_total,
> +					     sseu_subslice_total(sseu)) : 0;
> +
> +	/* No restrictions on Power Gating */
> +	sseu->has_slice_pg = 1;
> +	sseu->has_subslice_pg = 1;
> +	sseu->has_eu_pg = 1;
> +}
> +
>   static void cherryview_sseu_info_init(struct drm_i915_private *dev_priv)
>   {
>   	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
> @@ -409,8 +442,10 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
>   		cherryview_sseu_info_init(dev_priv);
>   	else if (IS_BROADWELL(dev_priv))
>   		broadwell_sseu_info_init(dev_priv);
> -	else if (INTEL_INFO(dev_priv)->gen >= 9)
> +	else if (INTEL_GEN(dev_priv) == 9)
>   		gen9_sseu_info_init(dev_priv);
> +	else if (INTEL_GEN(dev_priv) >= 10)
> +		gen10_sseu_info_init(dev_priv);
>   
>   	DRM_DEBUG_DRIVER("slice mask: %04x\n", info->sseu.slice_mask);
>   	DRM_DEBUG_DRIVER("slice total: %u\n", hweight8(info->sseu.slice_mask));



More information about the Intel-gfx mailing list