[Intel-gfx] [PATCH 3/3] drm/i915: Number the platform enum strategically

Chris Wilson chris at chris-wilson.co.uk
Thu Dec 8 10:04:01 UTC 2016


On Thu, Dec 08, 2016 at 09:49:59AM +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> 
> If we use only power of two values for the platform enum
> values we can let the compiler optimize some common
> checks to a single conditional.
> 
> For example code like this:
> 
> 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
> 
> Goes from this:
> 
>    5c3c5:       8b 83 d8 06 00 00       mov    0x6d8(%rbx),%eax
>    5c3cb:       83 f8 12                cmp    $0x12,%eax
>    5c3ce:       0f 84 f3 00 00 00       je     5c4c7 <fw_domain_init+0x1a7>
>    5c3d4:       83 f8 15                cmp    $0x15,%eax
>    5c3d7:       0f 84 ea 00 00 00       je     5c4c7 <fw_domain_init+0x1a7>
> 
> To this:
> 
>    5c1d5:       f7 83 d8 06 00 00 00    testl  $0x240000,0x6d8(%rbx)
>    5c1dc:       00 24 00
>    5c1df:       0f 85 da 00 00 00       jne    5c2bf <fw_domain_init+0x18f>
> 
> It is not much but there is value in this that as long as we
> have to have conditions like the above sprinkled troughout the
> code, we can at least have the generate binary a bit smarter.
> 
> Until we get to more than 32 platforms there is no downside
> to this approach.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Jani Nikula <jani.nikula at intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h          |  2 +-
>  drivers/gpu/drm/i915/i915_platforms.h    | 50 ++++++++++++++++----------------
>  drivers/gpu/drm/i915/intel_device_info.c | 10 ++++---
>  3 files changed, 32 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index fb8f4b7cd1ae..347d5c6ffc1b 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2590,7 +2590,7 @@ intel_info(const struct drm_i915_private *dev_priv)
>  #define i915_platform(name, id) \
>  static inline bool IS_##name(const struct drm_i915_private *dev_priv) \
>  { \
> -	return (dev_priv)->info.platform == INTEL_##name; \
> +	return !!((dev_priv)->info.platform & INTEL_##name); \

Redundant !!. It's an integer in a bool context, the !! are implied by
spec and gcc.

>  }
>  #include "i915_platforms.h"
>  #undef i915_platform
> diff --git a/drivers/gpu/drm/i915/i915_platforms.h b/drivers/gpu/drm/i915/i915_platforms.h
> index b44ea1dd9c15..4118f152eac9 100644
> --- a/drivers/gpu/drm/i915/i915_platforms.h
> +++ b/drivers/gpu/drm/i915/i915_platforms.h
> @@ -7,28 +7,28 @@
>   */
>  
>  i915_platform(UNINITIALIZED,  0)
> -i915_platform(I830,	      1)
> +i915_platform(I830,	      BIT(1))

Could start from BIT(0) or are we still anticipating support for i810?
And i740?

> diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
> index 5192d388d10e..26df6363e265 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.c
> +++ b/drivers/gpu/drm/i915/intel_device_info.c
> @@ -25,18 +25,20 @@
>  #include "i915_drv.h"
>  
>  static const char * const platform_names[] = {
> -#define i915_platform(name, id) [id] = #name,
> +#define i915_platform(name, id) [__builtin_ffs(id)] = #name,
>  #include "i915_platforms.h"
>  #undef i915_platform
>  };
>  
>  const char *intel_platform_name(enum intel_platform platform)
>  {
> -	if (WARN_ON_ONCE(platform >= ARRAY_SIZE(platform_names) ||
> -			 platform_names[platform] == NULL))
> +	unsigned int idx = ffs(platform);

Ah, ffs() is offset by one, and our id's are offset by another 1.

Using i915_platforms.h for a single list is a good improvement. And I
think we can get the best of both worlds: a concise identifier in the
logs and error state; and concise code. Looks good with a few fixes.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list