diff options
Diffstat (limited to 'benchmarks/gem_wsim.c')
-rw-r--r-- | benchmarks/gem_wsim.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c index b193378e..3da8499b 100644 --- a/benchmarks/gem_wsim.c +++ b/benchmarks/gem_wsim.c @@ -925,6 +925,73 @@ static void w_sync_to(struct workload *wrk, struct w_step *w, int target) gem_sync(fd, wrk->steps[target].obj[0].handle); } +static void init_status_page(struct workload *wrk) +{ + struct drm_i915_gem_exec_object2 obj[2] = {}; + struct drm_i915_gem_relocation_entry reloc[3] = {}; + struct drm_i915_gem_execbuffer2 eb = { + .buffer_count = 2, .buffers_ptr = to_user_pointer(obj) + }; + + /* Want to make sure that the balancer has a reasonable view of + * the background busyness of each engine. To do that we occasionally + * send a dummy batch down the pipeline. + */ + + if (!wrk->status_page_handle) + return; + + obj[0].handle = wrk->status_page_handle; + obj[1].relocs_ptr = to_user_pointer(reloc); + obj[1].relocation_count = ARRAY_SIZE(reloc); + + reloc[0].offset = sizeof(uint32_t); + reloc[1].offset = 5 * sizeof(uint32_t); + reloc[2].offset = 10 * sizeof(uint32_t); + + for (int engine = VCS1; engine <= VCS2; engine++) { + uint32_t *cs, *base; + uint64_t addr; + + reloc[0].delta = VCS_SEQNO_OFFSET(engine); + reloc[1].delta = VCS_SEQNO_OFFSET(engine) + sizeof(uint32_t); + reloc[2].delta = VCS_SEQNO_OFFSET(engine) + 2 * sizeof(uint32_t); + + obj[1].handle = gem_create(fd, 4096); + + base = gem_mmap__cpu(fd, obj[1].handle, 0, 4096, PROT_WRITE); + cs = base; + + addr = reloc[0].presumed_offset + reloc[0].delta; + *cs++ = MI_STORE_DWORD_IMM; + *cs++ = addr; + *cs++ = addr >> 32; + *cs++ = ++wrk->seqno[engine]; + + addr = reloc[1].presumed_offset + reloc[1].delta; + *cs++ = MI_STORE_DWORD_IMM; + *cs++ = addr; + *cs++ = addr >> 32; + *cs++ = *REG(RCS_TIMESTAMP); + + addr = reloc[2].presumed_offset + reloc[2].delta; + *cs++ = 0x24 << 23 | 2; /* MI_STORE_REG_MEM */ + *cs++ = RCS_TIMESTAMP; + *cs++ = addr; + *cs++ = addr >> 32; + + *cs++ = MI_BATCH_BUFFER_END; + munmap(base, 4096); + + eb.flags = eb_engine_map[engine]; + eb.flags |= I915_EXEC_HANDLE_LUT; + eb.flags |= I915_EXEC_NO_RELOC; + + gem_execbuf(fd, &eb); + gem_close(fd, obj[1].handle); + } +} + static void run_workload(unsigned int id, struct workload *wrk, bool background, int pipe_fd, @@ -946,6 +1013,7 @@ run_workload(unsigned int id, struct workload *wrk, for (j = 0; run && (background || j < repeat); j++) { clock_gettime(CLOCK_MONOTONIC, &wrk->repeat_start); + init_status_page(wrk); for (i = 0, w = wrk->steps; run && (i < wrk->nr_steps); i++, w++) { |