diff options
Diffstat (limited to 'tests/pm_rps.c')
-rw-r--r-- | tests/pm_rps.c | 77 |
1 files changed, 62 insertions, 15 deletions
diff --git a/tests/pm_rps.c b/tests/pm_rps.c index ea085862..5a54d9d4 100644 --- a/tests/pm_rps.c +++ b/tests/pm_rps.c @@ -560,14 +560,67 @@ static void reset_gpu(void) close(fd); } -static void waitboost(bool reset) +static uint32_t *make_busy(int fd, uint32_t handle) { - const uint32_t bbe = MI_BATCH_BUFFER_END; - struct drm_i915_gem_exec_object2 object; + const int gen = intel_gen(intel_get_drm_devid(fd)); + struct drm_i915_gem_exec_object2 obj; + struct drm_i915_gem_relocation_entry reloc; struct drm_i915_gem_execbuffer2 execbuf; + uint32_t *batch; + int i; + + memset(&execbuf, 0, sizeof(execbuf)); + execbuf.buffers_ptr = (uintptr_t)&obj; + execbuf.buffer_count = 1; + + memset(&obj, 0, sizeof(obj)); + obj.handle = handle; + + obj.relocs_ptr = (uintptr_t)&reloc; + obj.relocation_count = 1; + memset(&reloc, 0, sizeof(reloc)); + + batch = gem_mmap__wc(fd, obj.handle, 0, 4096, PROT_WRITE); + gem_set_domain(fd, obj.handle, + I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT); + + reloc.target_handle = obj.handle; /* recurse */ + reloc.presumed_offset = 0; + reloc.offset = sizeof(uint32_t); + reloc.delta = 0; + reloc.read_domains = I915_GEM_DOMAIN_COMMAND; + reloc.write_domain = 0; + + i = 0; + batch[i] = MI_BATCH_BUFFER_START; + if (gen >= 8) { + batch[i] |= 1 << 8 | 1; + batch[++i] = 0; + batch[++i] = 0; + } else if (gen >= 6) { + batch[i] |= 1 << 8; + batch[++i] = 0; + } else { + batch[i] |= 2 << 6; + batch[++i] = 0; + if (gen < 4) { + batch[i] |= 1; + reloc.delta = 1; + } + } + i++; + + gem_execbuf(fd, &execbuf); + return batch; +} + +static void waitboost(bool reset) +{ int pre_freqs[NUMFREQ]; int boost_freqs[NUMFREQ]; int post_freqs[NUMFREQ]; + uint32_t *batch, handle; + int64_t timeout = 1; int fd = drm_open_driver(DRIVER_INTEL); @@ -588,20 +641,14 @@ static void waitboost(bool reset) } igt_debug("Wait for gpu...\n"); - memset(&object, 0, sizeof(object)); - object.handle = gem_create(fd, 4096); - gem_write(fd, object.handle, 0, &bbe, sizeof(bbe)); - memset(&execbuf, 0, sizeof(execbuf)); - execbuf.buffers_ptr = (uintptr_t)&object; - execbuf.buffer_count = 1; - do { - for (int i = 0; i < 64; i++) - gem_execbuf(fd, &execbuf); - } while (!gem_bo_busy(fd, object.handle)); - gem_sync(fd, object.handle); + handle = gem_create(fd, 4096); + batch = make_busy(fd, handle); + gem_wait(fd, handle, &timeout); read_freqs(boost_freqs); dump(boost_freqs); - gem_close(fd, object.handle); + *batch = MI_BATCH_BUFFER_END; + munmap(batch, 4096); + gem_close(fd, handle); igt_debug("Apply low load again...\n"); sleep(1); |