|
@@ -26,6 +26,7 @@
|
|
|
#include "i915_vgpu.h"
|
|
|
|
|
|
#include <linux/pm_runtime.h>
|
|
|
+#include <linux/bsearch.h>
|
|
|
|
|
|
#define FORCEWAKE_ACK_TIMEOUT_MS 50
|
|
|
|
|
@@ -589,20 +590,30 @@ struct intel_forcewake_range
|
|
|
enum forcewake_domains domains;
|
|
|
};
|
|
|
|
|
|
+static int fw_range_cmp(const void *key, const void *elt)
|
|
|
+{
|
|
|
+ const struct intel_forcewake_range *entry = elt;
|
|
|
+ u32 offset = (u32)((unsigned long)key);
|
|
|
+
|
|
|
+ if (offset < entry->start)
|
|
|
+ return -1;
|
|
|
+ else if (offset > entry->end)
|
|
|
+ return 1;
|
|
|
+ else
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static enum forcewake_domains
|
|
|
find_fw_domain(u32 offset, const struct intel_forcewake_range *ranges,
|
|
|
unsigned int num_ranges)
|
|
|
{
|
|
|
- unsigned int i;
|
|
|
- struct intel_forcewake_range *entry =
|
|
|
- (struct intel_forcewake_range *)ranges;
|
|
|
+ struct intel_forcewake_range *entry;
|
|
|
|
|
|
- for (i = 0; i < num_ranges; i++, entry++) {
|
|
|
- if (offset >= entry->start && offset <= entry->end)
|
|
|
- return entry->domains;
|
|
|
- }
|
|
|
+ entry = bsearch((void *)(unsigned long)offset, (const void *)ranges,
|
|
|
+ num_ranges, sizeof(struct intel_forcewake_range),
|
|
|
+ fw_range_cmp);
|
|
|
|
|
|
- return -1;
|
|
|
+ return entry ? entry->domains : -1;
|
|
|
}
|
|
|
|
|
|
static void
|