From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> 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@xxxxxxxxx> Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Cc: Jani Nikula <jani.nikula@xxxxxxxxx> Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> --- 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); \ } #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(I845G, 2) -i915_platform(I85X, 3) -i915_platform(I865G, 4) -i915_platform(I915G, 5) -i915_platform(I915GM, 6) -i915_platform(I945G, 7) -i915_platform(I945GM, 8) -i915_platform(G33, 9) -i915_platform(PINEVIEW, 10) -i915_platform(I965G, 11) -i915_platform(I965GM, 12) -i915_platform(G45, 13) -i915_platform(GM45, 14) -i915_platform(IRONLAKE, 15) -i915_platform(SANDYBRIDGE, 16) -i915_platform(IVYBRIDGE, 17) -i915_platform(VALLEYVIEW, 18) -i915_platform(HASWELL, 19) -i915_platform(BROADWELL, 20) -i915_platform(CHERRYVIEW, 21) -i915_platform(SKYLAKE, 22) -i915_platform(BROXTON, 23) -i915_platform(KABYLAKE, 24) -i915_platform(GEMINILAKE, 25) +i915_platform(I830, BIT(1)) +i915_platform(I845G, BIT(2)) +i915_platform(I85X, BIT(3)) +i915_platform(I865G, BIT(4)) +i915_platform(I915G, BIT(5)) +i915_platform(I915GM, BIT(6)) +i915_platform(I945G, BIT(7)) +i915_platform(I945GM, BIT(8)) +i915_platform(G33, BIT(9)) +i915_platform(PINEVIEW, BIT(10)) +i915_platform(I965G, BIT(11)) +i915_platform(I965GM, BIT(12)) +i915_platform(G45, BIT(13)) +i915_platform(GM45, BIT(14)) +i915_platform(IRONLAKE, BIT(15)) +i915_platform(SANDYBRIDGE, BIT(16)) +i915_platform(IVYBRIDGE, BIT(17)) +i915_platform(VALLEYVIEW, BIT(18)) +i915_platform(HASWELL, BIT(19)) +i915_platform(BROADWELL, BIT(20)) +i915_platform(CHERRYVIEW, BIT(21)) +i915_platform(SKYLAKE, BIT(22)) +i915_platform(BROXTON, BIT(23)) +i915_platform(KABYLAKE, BIT(24)) +i915_platform(GEMINILAKE, BIT(25)) 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); + + if (WARN_ON_ONCE(idx >= ARRAY_SIZE(platform_names) || + platform_names[idx] == NULL)) return "<unknown>"; - return platform_names[platform]; + return platform_names[idx]; } void intel_device_info_dump(struct drm_i915_private *dev_priv) -- 2.7.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx