Commit 9480dbf0 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin

drm/i915: Inline binary search

Instead of using bsearch library function make a local generator
macro out of it so the comparison callback can be inlined.
Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Suggested-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1475569769-31108-1-git-send-email-tvrtko.ursulin@linux.intel.com
parent 5a659383
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include "i915_vgpu.h" #include "i915_vgpu.h"
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/bsearch.h>
#define FORCEWAKE_ACK_TIMEOUT_MS 50 #define FORCEWAKE_ACK_TIMEOUT_MS 50
...@@ -582,11 +581,8 @@ void assert_forcewakes_inactive(struct drm_i915_private *dev_priv) ...@@ -582,11 +581,8 @@ void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
__fwd; \ __fwd; \
}) })
static int fw_range_cmp(const void *key, const void *elt) static int fw_range_cmp(u32 offset, const struct intel_forcewake_range *entry)
{ {
const struct intel_forcewake_range *entry = elt;
u32 offset = (u32)((unsigned long)key);
if (offset < entry->start) if (offset < entry->start)
return -1; return -1;
else if (offset > entry->end) else if (offset > entry->end)
...@@ -595,17 +591,33 @@ static int fw_range_cmp(const void *key, const void *elt) ...@@ -595,17 +591,33 @@ static int fw_range_cmp(const void *key, const void *elt)
return 0; return 0;
} }
/* Copied and "macroized" from lib/bsearch.c */
#define BSEARCH(key, base, num, cmp) ({ \
unsigned int start__ = 0, end__ = (num); \
typeof(base) result__ = NULL; \
while (start__ < end__) { \
unsigned int mid__ = start__ + (end__ - start__) / 2; \
int ret__ = (cmp)((key), (base) + mid__); \
if (ret__ < 0) { \
end__ = mid__; \
} else if (ret__ > 0) { \
start__ = mid__ + 1; \
} else { \
result__ = (base) + mid__; \
break; \
} \
} \
result__; \
})
static enum forcewake_domains static enum forcewake_domains
find_fw_domain(struct drm_i915_private *dev_priv, u32 offset) find_fw_domain(struct drm_i915_private *dev_priv, u32 offset)
{ {
const struct intel_forcewake_range *table, *entry; const struct intel_forcewake_range *entry;
unsigned int num_entries;
table = dev_priv->uncore.fw_domains_table; entry = BSEARCH(offset,
num_entries = dev_priv->uncore.fw_domains_table_entries; dev_priv->uncore.fw_domains_table,
dev_priv->uncore.fw_domains_table_entries,
entry = bsearch((void *)(unsigned long)offset, (const void *)table,
num_entries, sizeof(struct intel_forcewake_range),
fw_range_cmp); fw_range_cmp);
return entry ? entry->domains : 0; return entry ? entry->domains : 0;
...@@ -691,14 +703,13 @@ static void intel_shadow_table_check(void) ...@@ -691,14 +703,13 @@ static void intel_shadow_table_check(void)
} }
} }
static int mmio_reg_cmp(const void *key, const void *elt) static int mmio_reg_cmp(u32 key, const i915_reg_t *reg)
{ {
u32 offset = (u32)(unsigned long)key; u32 offset = i915_mmio_reg_offset(*reg);
i915_reg_t *reg = (i915_reg_t *)elt;
if (offset < i915_mmio_reg_offset(*reg)) if (key < offset)
return -1; return -1;
else if (offset > i915_mmio_reg_offset(*reg)) else if (key > offset)
return 1; return 1;
else else
return 0; return 0;
...@@ -706,15 +717,10 @@ static int mmio_reg_cmp(const void *key, const void *elt) ...@@ -706,15 +717,10 @@ static int mmio_reg_cmp(const void *key, const void *elt)
static bool is_gen8_shadowed(u32 offset) static bool is_gen8_shadowed(u32 offset)
{ {
i915_reg_t *reg; const i915_reg_t *regs = gen8_shadowed_regs;
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; return BSEARCH(offset, regs, ARRAY_SIZE(gen8_shadowed_regs),
mmio_reg_cmp);
} }
#define __gen8_reg_write_fw_domains(offset) \ #define __gen8_reg_write_fw_domains(offset) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment