[igt-dev] [PATCH] fixups
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Mon Apr 8 10:10:39 UTC 2019
From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
---
lib/igt_dummyload.c | 39 +++++++++++++++++++++++++++++++++++++--
lib/igt_gt.c | 14 --------------
lib/igt_gt.h | 2 --
tests/perf_pmu.c | 44 ++++++++++++++++++++++++++++++++++++--------
4 files changed, 73 insertions(+), 26 deletions(-)
diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index 13bd2e8dead1..8f457e5069e7 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -105,10 +105,45 @@ emit_recursive_batch(igt_spin_t *spin,
flags[nengine++] = engine->flags;
}
} else {
- gem_require_ring(fd, opts->engine);
+#define SIZEOF_CTX_PARAM offsetof(struct i915_context_param_engines, \
+ class_instance[GEM_MAX_ENGINES])
+ I915_DEFINE_CONTEXT_PARAM_ENGINES(engines, GEM_MAX_ENGINES);
+ struct drm_i915_gem_context_param param = {
+ .param = I915_CONTEXT_PARAM_ENGINES,
+ .ctx_id = opts->ctx,
+ .size = SIZEOF_CTX_PARAM,
+ .value = to_user_pointer(&engines),
+ };
+ unsigned int class;
+
+ /*
+ * If the context has engine map configured we need to consider
+ * the engine selector as index into the array. Therefore to
+ * find out the class and instance we need to query the map.
+ */
+ if (!__gem_context_get_param(fd, ¶m) && param.size) {
+ unsigned int nengines;
+
+ nengines = param.size >
+ sizeof(struct i915_context_param_engines) ?
+ (param.size -
+ sizeof(struct i915_context_param_engines)) /
+ sizeof(engines.class_instance[0]) : 0;
+
+ igt_assert(nengines > 0);
+ igt_assert(opts->engine < nengines);
+
+ class =
+ engines.class_instance[opts->engine].engine_class;
+ } else {
+
+ gem_require_ring(fd, opts->engine);
+
+ class = gem_eb_to_class(opts->engine);
+ }
if (opts->flags & IGT_SPIN_POLL_RUN)
- igt_require(gem_can_store_dword(fd, opts->engine));
+ igt_require(gem_class_can_store_dword(fd, class));
flags[nengine++] = opts->engine;
}
diff --git a/lib/igt_gt.c b/lib/igt_gt.c
index 12e19417a827..5d0a8e8060a7 100644
--- a/lib/igt_gt.c
+++ b/lib/igt_gt.c
@@ -609,20 +609,6 @@ int gem_eb_to_class(unsigned int flags)
}
}
-void gem_eb_to_class_instance(int fd, unsigned int flags,
- struct intel_execution_engine2 *e)
-{
- e->class = gem_eb_to_class(flags);
-
- e->instance = ((flags & 0x3f) | I915_EXEC_BSD_RING2) ==
- (I915_EXEC_BSD | I915_EXEC_BSD_RING2) ?
- 1 :
- 0;
-
- if (!gem_has_engine_topology(fd))
- e->flags = flags;
-}
-
unsigned int
gem_class_instance_to_eb_flags(int gem_fd,
enum drm_i915_gem_engine_class class,
diff --git a/lib/igt_gt.h b/lib/igt_gt.h
index b7e6bdc33db7..c2ca07e03738 100644
--- a/lib/igt_gt.h
+++ b/lib/igt_gt.h
@@ -101,8 +101,6 @@ extern const struct intel_execution_engine2 {
} intel_execution_engines2[];
int gem_eb_to_class(unsigned int flags);
-void gem_eb_to_class_instance(int fd, unsigned int flags,
- struct intel_execution_engine2 *e);
unsigned int
gem_class_instance_to_eb_flags(int gem_fd,
diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
index 0af955139c3e..d70f4585c147 100644
--- a/tests/perf_pmu.c
+++ b/tests/perf_pmu.c
@@ -225,9 +225,12 @@ static igt_spin_t * spin_sync(int fd, uint32_t ctx,
static igt_spin_t * spin_sync_flags(int fd, uint32_t ctx, unsigned int flags)
{
- struct intel_execution_engine2 e;
+ struct intel_execution_engine2 e = { };
- gem_eb_to_class_instance(fd, flags, &e);
+ e.class = gem_eb_to_class(flags);
+ e.instance = (flags & (I915_EXEC_BSD_MASK | I915_EXEC_RING_MASK)) ==
+ (I915_EXEC_BSD | I915_EXEC_BSD_RING2) ? 1 : 0;
+ e.flags = flags;
return spin_sync(fd, ctx, &e);
}
@@ -355,6 +358,9 @@ busy_double_start(int gem_fd, struct intel_execution_engine2 *e)
ctx = gem_context_create(gem_fd);
+ /* QQQ This feels ugly! */
+ intel_init_engine_list(gem_fd, ctx);
+
/*
* Defeat the busy stats delayed disable, we need to guarantee we are
* the first user.
@@ -510,7 +516,7 @@ most_busy_check_all(int gem_fd, struct intel_execution_engine2 *e,
else if (spin)
__submit_spin_batch(gem_fd, spin, e_, 64);
else
- spin = __spin_poll(gem_fd, 0, e);
+ spin = __spin_poll(gem_fd, 0, e_);
val[i++] = I915_PMU_ENGINE_BUSY(e_->class, e_->instance);
}
@@ -1046,6 +1052,7 @@ static void cpu_hotplug(int gem_fd)
igt_spin_t *spin[2];
uint64_t ts[2];
uint64_t val;
+ uint32_t ctx;
int link[2];
int fd, ret;
int cur = 0;
@@ -1053,14 +1060,18 @@ static void cpu_hotplug(int gem_fd)
igt_require(cpu0_hotplug_support());
+ ctx = gem_context_create(gem_fd);
+
fd = open_pmu(I915_PMU_ENGINE_BUSY(I915_ENGINE_CLASS_RENDER, 0));
/*
* Create two spinners so test can ensure shorter gaps in engine
* busyness as it is terminating one and re-starting the other.
*/
- spin[0] = igt_spin_batch_new(gem_fd, .engine = I915_EXEC_RENDER);
- spin[1] = __igt_spin_batch_new(gem_fd, .engine = I915_EXEC_RENDER);
+ spin[0] = igt_spin_batch_new(gem_fd,
+ .engine = I915_EXEC_RENDER, .ctx = ctx);
+ spin[1] = __igt_spin_batch_new(gem_fd,
+ .engine = I915_EXEC_RENDER, .ctx = ctx);
val = __pmu_read_single(fd, &ts[0]);
@@ -1144,6 +1155,7 @@ static void cpu_hotplug(int gem_fd)
igt_spin_batch_free(gem_fd, spin[cur]);
spin[cur] = __igt_spin_batch_new(gem_fd,
+ .ctx = ctx,
.engine = I915_EXEC_RENDER);
cur ^= 1;
}
@@ -1157,6 +1169,7 @@ static void cpu_hotplug(int gem_fd)
igt_waitchildren();
close(fd);
close(link[0]);
+ gem_context_destroy(gem_fd, ctx);
/* Skip if child signals a problem with offlining a CPU. */
igt_skip_on(buf == 's');
@@ -1172,17 +1185,21 @@ test_interrupts(int gem_fd)
igt_spin_t *spin[target];
struct pollfd pfd;
uint64_t idle, busy;
+ uint32_t ctx;
int fence_fd;
int fd;
gem_quiescent_gpu(gem_fd);
+ ctx = gem_context_create(gem_fd);
+
fd = open_pmu(I915_PMU_INTERRUPTS);
/* Queue spinning batches. */
for (int i = 0; i < target; i++) {
spin[i] = __igt_spin_batch_new(gem_fd,
.engine = I915_EXEC_RENDER,
+ .ctx = ctx,
.flags = IGT_SPIN_FENCE_OUT);
if (i == 0) {
fence_fd = spin[i]->out_fence;
@@ -1224,6 +1241,7 @@ test_interrupts(int gem_fd)
/* Check at least as many interrupts has been generated. */
busy = pmu_read_single(fd) - idle;
close(fd);
+ gem_context_destroy(gem_fd, ctx);
igt_assert_lte(target, busy);
}
@@ -1236,15 +1254,19 @@ test_interrupts_sync(int gem_fd)
igt_spin_t *spin[target];
struct pollfd pfd;
uint64_t idle, busy;
+ uint32_t ctx;
int fd;
gem_quiescent_gpu(gem_fd);
+ ctx = gem_context_create(gem_fd);
+
fd = open_pmu(I915_PMU_INTERRUPTS);
/* Queue spinning batches. */
for (int i = 0; i < target; i++)
spin[i] = __igt_spin_batch_new(gem_fd,
+ .ctx = ctx,
.flags = IGT_SPIN_FENCE_OUT);
/* Wait for idle state. */
@@ -1269,6 +1291,7 @@ test_interrupts_sync(int gem_fd)
/* Check at least as many interrupts has been generated. */
busy = pmu_read_single(fd) - idle;
close(fd);
+ gem_context_destroy(gem_fd, ctx);
igt_assert_lte(target, busy);
}
@@ -1281,6 +1304,9 @@ test_frequency(int gem_fd)
double min[2], max[2];
igt_spin_t *spin;
int fd, sysfs;
+ uint32_t ctx;
+
+ ctx = gem_context_create(gem_fd);
sysfs = igt_sysfs_open(gem_fd);
igt_require(sysfs >= 0);
@@ -1308,7 +1334,7 @@ test_frequency(int gem_fd)
igt_require(igt_sysfs_get_u32(sysfs, "gt_boost_freq_mhz") == min_freq);
gem_quiescent_gpu(gem_fd); /* Idle to be sure the change takes effect */
- spin = spin_sync_flags(gem_fd, 0, I915_EXEC_RENDER);
+ spin = spin_sync_flags(gem_fd, ctx, I915_EXEC_RENDER);
slept = pmu_read_multi(fd, 2, start);
measured_usleep(batch_duration_ns / 1000);
@@ -1334,7 +1360,7 @@ test_frequency(int gem_fd)
igt_require(igt_sysfs_get_u32(sysfs, "gt_min_freq_mhz") == max_freq);
gem_quiescent_gpu(gem_fd);
- spin = spin_sync_flags(gem_fd, 0, I915_EXEC_RENDER);
+ spin = spin_sync_flags(gem_fd, ctx, I915_EXEC_RENDER);
slept = pmu_read_multi(fd, 2, start);
measured_usleep(batch_duration_ns / 1000);
@@ -1355,6 +1381,8 @@ test_frequency(int gem_fd)
min_freq, igt_sysfs_get_u32(sysfs, "gt_min_freq_mhz"));
close(fd);
+ gem_context_destroy(gem_fd, ctx);
+
igt_info("Min frequency: requested %.1f, actual %.1f\n",
min[0], min[1]);
igt_info("Max frequency: requested %.1f, actual %.1f\n",
@@ -1904,7 +1932,7 @@ igt_main
gem_quiescent_gpu(fd);
}
- __for_each_physical_engine(fd, e) {
+ __for_each_physical_engine(render_fd, e) {
igt_subtest_group {
igt_fixture {
gem_require_engine(render_fd,
--
2.19.1
More information about the igt-dev
mailing list