All of lore.kernel.org
 help / color / mirror / Atom feed
From: Karthik B S <karthik.b.s@intel.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>,
	intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH v2 02/11] drm/i915: Limit plane stride to below TILEOFF.x limit
Date: Thu, 28 Jan 2021 15:11:20 +0530	[thread overview]
Message-ID: <d3cd8734-4ffb-1c55-d895-38e6215d5b9a@intel.com> (raw)
In-Reply-To: <20210111163711.12913-3-ville.syrjala@linux.intel.com>

On 1/11/2021 10:07 PM, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Limit pre-skl plane stride to below 4k or 8k pixels (depending on
> the platform). We do this in order guarantee that TILEOFF/OFFSET.x
> does not get too big.
>
> Currently this is not a problem as we align SURF to 4k, and so
> TILEOFF/OFFSET only have to deal with a single tile's worth of
> pixels. But for async flips we're going to have to bump SURF
> alignment to 256k, and thus we can no longer guarantee
> TILEOFF/OFFSET.x will stay within acceptable bounds. We can avoid
> this by borrowing a trick from the skl+ code and limit the max
> plane stride to whatever value we can fit into TILEOFF/OFFSET.x.
>
> The slight downside is that we may end up doing GTT remapping in
> a few more cases where previously we did not have to. But since
> that will only happen with huge buffers I'm not really concerned
> about it.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Looks good to me.

Reviewed-by: Karthik B S <karthik.b.s@intel.com>

> ---
>   drivers/gpu/drm/i915/display/i9xx_plane.c   | 64 ++++++++++++++++++---
>   drivers/gpu/drm/i915/display/i9xx_plane.h   |  2 +-
>   drivers/gpu/drm/i915/display/intel_sprite.c | 33 +++++++++--
>   3 files changed, 83 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.c b/drivers/gpu/drm/i915/display/i9xx_plane.c
> index b1158ce4df92..7d968ca890da 100644
> --- a/drivers/gpu/drm/i915/display/i9xx_plane.c
> +++ b/drivers/gpu/drm/i915/display/i9xx_plane.c
> @@ -530,21 +530,56 @@ static bool i9xx_plane_get_hw_state(struct intel_plane *plane,
>   	return ret;
>   }
>   
> +static unsigned int
> +hsw_primary_max_stride(struct intel_plane *plane,
> +		       u32 pixel_format, u64 modifier,
> +		       unsigned int rotation)
> +{
> +	const struct drm_format_info *info = drm_format_info(pixel_format);
> +	int cpp = info->cpp[0];
> +
> +	/* Limit to 8k pixels to guarantee OFFSET.x doesn't get too big. */
> +	return min(8192 * cpp, 32 * 1024);
> +}
> +
> +static unsigned int
> +ilk_primary_max_stride(struct intel_plane *plane,
> +		       u32 pixel_format, u64 modifier,
> +		       unsigned int rotation)
> +{
> +	const struct drm_format_info *info = drm_format_info(pixel_format);
> +	int cpp = info->cpp[0];
> +
> +	/* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */
> +	if (modifier == I915_FORMAT_MOD_X_TILED)
> +		return min(4096 * cpp, 32 * 1024);
> +	else
> +		return 32 * 1024;
> +}
> +
>   unsigned int
> +i965_plane_max_stride(struct intel_plane *plane,
> +		      u32 pixel_format, u64 modifier,
> +		      unsigned int rotation)
> +{
> +	const struct drm_format_info *info = drm_format_info(pixel_format);
> +	int cpp = info->cpp[0];
> +
> +	/* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */
> +	if (modifier == I915_FORMAT_MOD_X_TILED)
> +		return min(4096 * cpp, 16 * 1024);
> +	else
> +		return 32 * 1024;
> +}
> +
> +static unsigned int
>   i9xx_plane_max_stride(struct intel_plane *plane,
>   		      u32 pixel_format, u64 modifier,
>   		      unsigned int rotation)
>   {
>   	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
>   
> -	if (!HAS_GMCH(dev_priv)) {
> -		return 32*1024;
> -	} else if (INTEL_GEN(dev_priv) >= 4) {
> -		if (modifier == I915_FORMAT_MOD_X_TILED)
> -			return 16*1024;
> -		else
> -			return 32*1024;
> -	} else if (INTEL_GEN(dev_priv) >= 3) {
> +	if (INTEL_GEN(dev_priv) >= 3) {
>   		if (modifier == I915_FORMAT_MOD_X_TILED)
>   			return 8*1024;
>   		else
> @@ -656,7 +691,18 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
>   	else
>   		plane->min_cdclk = i9xx_plane_min_cdclk;
>   
> -	plane->max_stride = i9xx_plane_max_stride;
> +	if (HAS_GMCH(dev_priv)) {
> +		if (INTEL_GEN(dev_priv) >= 4)
> +			plane->max_stride = i965_plane_max_stride;
> +		else
> +			plane->max_stride = i9xx_plane_max_stride;
> +	} else {
> +		if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
> +			plane->max_stride = hsw_primary_max_stride;
> +		else
> +			plane->max_stride = ilk_primary_max_stride;
> +	}
> +
>   	plane->update_plane = i9xx_update_plane;
>   	plane->disable_plane = i9xx_disable_plane;
>   	plane->get_hw_state = i9xx_plane_get_hw_state;
> diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.h b/drivers/gpu/drm/i915/display/i9xx_plane.h
> index bc2834a62735..ca963c2a8457 100644
> --- a/drivers/gpu/drm/i915/display/i9xx_plane.h
> +++ b/drivers/gpu/drm/i915/display/i9xx_plane.h
> @@ -13,7 +13,7 @@ struct drm_i915_private;
>   struct intel_plane;
>   struct intel_plane_state;
>   
> -unsigned int i9xx_plane_max_stride(struct intel_plane *plane,
> +unsigned int i965_plane_max_stride(struct intel_plane *plane,
>   				   u32 pixel_format, u64 modifier,
>   				   unsigned int rotation);
>   int i9xx_check_plane_surface(struct intel_plane_state *plane_state);
> diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
> index cf3589fd0ddb..b24c8fc8e83e 100644
> --- a/drivers/gpu/drm/i915/display/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/display/intel_sprite.c
> @@ -1851,7 +1851,26 @@ g4x_sprite_max_stride(struct intel_plane *plane,
>   		      u32 pixel_format, u64 modifier,
>   		      unsigned int rotation)
>   {
> -	return 16384;
> +	const struct drm_format_info *info = drm_format_info(pixel_format);
> +	int cpp = info->cpp[0];
> +
> +	/* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */
> +	if (modifier == I915_FORMAT_MOD_X_TILED)
> +		return min(4096 * cpp, 16 * 1024);
> +	else
> +		return 16 * 1024;
> +}
> +
> +static unsigned int
> +hsw_sprite_max_stride(struct intel_plane *plane,
> +		      u32 pixel_format, u64 modifier,
> +		      unsigned int rotation)
> +{
> +	const struct drm_format_info *info = drm_format_info(pixel_format);
> +	int cpp = info->cpp[0];
> +
> +	/* Limit to 8k pixels to guarantee OFFSET.x doesn't get too big. */
> +	return min(8192 * cpp, 16 * 1024);
>   }
>   
>   static u32 g4x_sprite_ctl_crtc(const struct intel_crtc_state *crtc_state)
> @@ -3398,11 +3417,11 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
>   		return plane;
>   
>   	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
> -		plane->max_stride = i9xx_plane_max_stride;
>   		plane->update_plane = vlv_update_plane;
>   		plane->disable_plane = vlv_disable_plane;
>   		plane->get_hw_state = vlv_plane_get_hw_state;
>   		plane->check_plane = vlv_sprite_check;
> +		plane->max_stride = i965_plane_max_stride;
>   		plane->min_cdclk = vlv_plane_min_cdclk;
>   
>   		if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
> @@ -3416,16 +3435,18 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
>   
>   		plane_funcs = &vlv_sprite_funcs;
>   	} else if (INTEL_GEN(dev_priv) >= 7) {
> -		plane->max_stride = g4x_sprite_max_stride;
>   		plane->update_plane = ivb_update_plane;
>   		plane->disable_plane = ivb_disable_plane;
>   		plane->get_hw_state = ivb_plane_get_hw_state;
>   		plane->check_plane = g4x_sprite_check;
>   
> -		if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
> +		if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) {
> +			plane->max_stride = hsw_sprite_max_stride;
>   			plane->min_cdclk = hsw_plane_min_cdclk;
> -		else
> +		} else {
> +			plane->max_stride = g4x_sprite_max_stride;
>   			plane->min_cdclk = ivb_sprite_min_cdclk;
> +		}
>   
>   		formats = snb_plane_formats;
>   		num_formats = ARRAY_SIZE(snb_plane_formats);
> @@ -3433,11 +3454,11 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
>   
>   		plane_funcs = &snb_sprite_funcs;
>   	} else {
> -		plane->max_stride = g4x_sprite_max_stride;
>   		plane->update_plane = g4x_update_plane;
>   		plane->disable_plane = g4x_disable_plane;
>   		plane->get_hw_state = g4x_plane_get_hw_state;
>   		plane->check_plane = g4x_sprite_check;
> +		plane->max_stride = g4x_sprite_max_stride;
>   		plane->min_cdclk = g4x_sprite_min_cdclk;
>   
>   		modifiers = i9xx_plane_format_modifiers;


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

  reply	other threads:[~2021-01-28  9:41 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-11 16:37 [Intel-gfx] [PATCH v2 00/11] drm/i915: Async flips for all ilk+ platforms Ville Syrjala
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 01/11] drm/i915: WARN if plane src coords are too big Ville Syrjala
2021-01-27 11:11   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 02/11] drm/i915: Limit plane stride to below TILEOFF.x limit Ville Syrjala
2021-01-28  9:41   ` Karthik B S [this message]
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 03/11] drm/i915: Drop redundant parens Ville Syrjala
2021-01-15 10:19   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 04/11] drm/i915: Generalize the async flip capability check Ville Syrjala
2021-01-15 10:23   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 05/11] drm/i915: Add plane vfuncs to enable/disable flip_done interrupt Ville Syrjala
2021-01-15 11:38   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 06/11] drm/i915: Move the async_flip bit setup into the .async_flip() hook Ville Syrjala
2021-01-15 11:40   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 07/11] drm/i915: Reuse the async_flip() hook for the async flip disable w/a Ville Syrjala
2021-01-18  9:27   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 08/11] drm/i915: Implement async flips for bdw Ville Syrjala
2021-01-18  9:44   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 09/11] drm/i915: Implement async flip for ivb/hsw Ville Syrjala
2021-01-18 10:45   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 10/11] drm/i915: Implement async flip for ilk/snb Ville Syrjala
2021-01-18 11:08   ` Karthik B S
2021-01-11 16:37 ` [Intel-gfx] [PATCH v2 11/11] drm/i915: Implement async flips for vlv/chv Ville Syrjala
2021-01-27  8:09   ` Karthik B S
2021-01-11 17:23 ` [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915: Async flips for all ilk+ platforms (rev2) Patchwork
2021-01-11 18:58 ` [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=d3cd8734-4ffb-1c55-d895-38e6215d5b9a@intel.com \
    --to=karthik.b.s@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 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.