[Intel-gfx] [PATCH] drm/i915: Assert that we don't overflow frontbuffer tracking bits

Chris Wilson chris at chris-wilson.co.uk
Wed Jan 24 18:50:45 UTC 2018


Quoting Ville Syrjala (2018-01-24 18:36:42)
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Add some compile time assrts to the frontbuffer tracking to make sure
> that we have enough bits per pipe to cover all the planes, and that we
> have enough total bits to cover all the planes across all pipes.
> 
> We'll ignore any potential clash between the overlay bit and the
> plane bits because that will allow us to keep using a total of 32
> bits for the foreseeable future.
> 
> While at it change the macros to use BIT() and GENMASK(). The latter
> gets rid of the hardcoded 0xff and thus means we can change the
> number of bits per pipe by just changing
> INTEL_FRONTBUFFER_BITS_PER_PIPE.
> 
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 454d8f937fae..98f346c7b0b3 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2411,12 +2411,16 @@ enum hdmi_force_audio {
>   * We have one bit per pipe and per scanout plane type.
>   */
>  #define INTEL_FRONTBUFFER_BITS_PER_PIPE 8
> -#define INTEL_FRONTBUFFER(pipe, plane_id) \
> -       (1 << ((plane_id) + INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)))
> +#define INTEL_FRONTBUFFER(pipe, plane_id) ({ \
> +       BUILD_BUG_ON(INTEL_FRONTBUFFER_BITS_PER_PIPE * I915_MAX_PIPES > 32); \
> +       BUILD_BUG_ON(I915_MAX_PLANES > INTEL_FRONTBUFFER_BITS_PER_PIPE); \
> +       BIT((plane_id) + INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)); \
> +})

Next endeavour will be to convert to unsigned long just so we can use
BITS_PER_LONG here ; (These masks are now defined as ul, seems a natural
progression to use unsigned long throughout. Alternatively typedef
intel_frontbuffer_mask_t and 8*sizeof().)

>  #define INTEL_FRONTBUFFER_OVERLAY(pipe) \
> -       (1 << (INTEL_FRONTBUFFER_BITS_PER_PIPE - 1 + INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)))
> +       BIT(INTEL_FRONTBUFFER_BITS_PER_PIPE - 1 + INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))
>  #define INTEL_FRONTBUFFER_ALL_MASK(pipe) \
> -       (0xff << (INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)))
> +       GENMASK(INTEL_FRONTBUFFER_BITS_PER_PIPE * ((pipe) + 1) - 1, \
> +               INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))

Inclusive ends, check.

Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris


More information about the Intel-gfx mailing list