drm/i915: Use binary search when looking for shadowed registers
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Tue, 4 Oct 2016 08:29:28 +0000 (09:29 +0100)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Tue, 4 Oct 2016 10:09:59 +0000 (11:09 +0100)
Simply replace the linear search with the kernel's binary
search implementation. There is only six registers currently
in that table so this may not be that interesting. It adds a
function call so hopefully remains performance neutral for now.

v2: No need for manual conversion to bool for return.
    (Joonas Lahtinen)

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/intel_uncore.c

index d7c9b6bc6e5e0ddb96806949fb1e2974e6f3353c..8ac684598cec16ddffd31f27a687d4bfbcc44731 100644 (file)
@@ -691,14 +691,30 @@ static void intel_shadow_table_check(void)
        }
 }
 
+static int mmio_reg_cmp(const void *key, const void *elt)
+{
+       u32 offset = (u32)(unsigned long)key;
+       i915_reg_t *reg = (i915_reg_t *)elt;
+
+       if (offset < i915_mmio_reg_offset(*reg))
+               return -1;
+       else if (offset > i915_mmio_reg_offset(*reg))
+               return 1;
+       else
+               return 0;
+}
+
 static bool is_gen8_shadowed(u32 offset)
 {
-       int i;
-       for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++)
-               if (offset == gen8_shadowed_regs[i].reg)
-                       return true;
+       i915_reg_t *reg;
 
-       return false;
+       reg = bsearch((void *)(unsigned long)offset,
+                     (const void *)gen8_shadowed_regs,
+                     ARRAY_SIZE(gen8_shadowed_regs),
+                     sizeof(i915_reg_t),
+                     mmio_reg_cmp);
+
+       return reg;
 }
 
 #define __gen8_reg_write_fw_domains(offset) \