Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+31 −25
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@
#include "i915_vgpu.h"

#include <linux/pm_runtime.h>
#include <linux/bsearch.h>

#define FORCEWAKE_ACK_TIMEOUT_MS 50

@@ -582,11 +581,8 @@ void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
	__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)
		return -1;
	else if (offset > entry->end)
@@ -595,17 +591,33 @@ static int fw_range_cmp(const void *key, const void *elt)
		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
find_fw_domain(struct drm_i915_private *dev_priv, u32 offset)
{
	const struct intel_forcewake_range *table, *entry;
	unsigned int num_entries;

	table = dev_priv->uncore.fw_domains_table;
	num_entries = dev_priv->uncore.fw_domains_table_entries;
	const struct intel_forcewake_range *entry;

	entry = bsearch((void *)(unsigned long)offset, (const void *)table,
			num_entries, sizeof(struct intel_forcewake_range),
	entry = BSEARCH(offset,
			dev_priv->uncore.fw_domains_table,
			dev_priv->uncore.fw_domains_table_entries,
			fw_range_cmp);

	return entry ? entry->domains : 0;
@@ -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;
	i915_reg_t *reg = (i915_reg_t *)elt;
	u32 offset = i915_mmio_reg_offset(*reg);

	if (offset < i915_mmio_reg_offset(*reg))
	if (key < offset)
		return -1;
	else if (offset > i915_mmio_reg_offset(*reg))
	else if (key > offset)
		return 1;
	else
		return 0;
@@ -706,15 +717,10 @@ static int mmio_reg_cmp(const void *key, const void *elt)

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),
	return BSEARCH(offset, regs, ARRAY_SIZE(gen8_shadowed_regs),
		       mmio_reg_cmp);

	return reg;
}

#define __gen8_reg_write_fw_domains(offset) \