igt: Fix use MI_STORE_DATA_IMM on gen3

For the older gen, MI_STORE_DATA_IMM is a privileged command so we need
to set the "secure" batch flag, and we also need to instruct the command
to use the GTT virtual address.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2016-01-22 17:25:08 +00:00
parent 4a3a826342
commit fbb0f636bd
2 changed files with 13 additions and 4 deletions

View File

@ -45,10 +45,10 @@ struct shadow {
uint32_t handle;
struct drm_i915_gem_relocation_entry reloc;
};
int gen;
static void setup(int fd, struct shadow *shadow)
{
int gen = intel_gen(intel_get_drm_devid(fd));
uint32_t *cpu;
int i = 0;
@ -66,6 +66,7 @@ static void setup(int fd, struct shadow *shadow)
cpu[i++] = BATCH_SIZE - sizeof(uint32_t);
} else {
cpu[i-1]--;
cpu[i-1] |= 1 << 22;
cpu[i++] = BATCH_SIZE - sizeof(uint32_t);
}
cpu[i++] = MI_BATCH_BUFFER_END;
@ -98,6 +99,8 @@ static uint32_t new_batch(int fd, struct shadow *shadow)
memset(&execbuf, 0, sizeof(execbuf));
execbuf.buffers_ptr = (uintptr_t)gem_exec;
execbuf.buffer_count = 2;
if (gen < 4)
execbuf.flags |= I915_EXEC_SECURE;
gem_execbuf(fd, &execbuf);
@ -129,7 +132,8 @@ igt_simple_main
igt_skip_on_simulation();
fd = drm_open_driver(DRIVER_INTEL);
fd = drm_open_driver_master(DRIVER_INTEL);
gen = intel_gen(intel_get_drm_devid(fd));
setup(fd, &shadow);
count = gem_aperture_size(fd) / BATCH_SIZE;

View File

@ -100,6 +100,8 @@ static void run_test(int fd, unsigned ring, unsigned flags)
execbuf.buffers_ptr = (uintptr_t)obj;
execbuf.buffer_count = 2;
execbuf.flags = ring | (1 << 11);
if (gen < 4)
execbuf.flags |= I915_EXEC_SECURE;
memset(obj, 0, sizeof(obj));
obj[0].handle = gem_create(fd, 4096);
@ -121,8 +123,8 @@ static void run_test(int fd, unsigned ring, unsigned flags)
uint64_t offset;
reloc[i].target_handle = obj[0].handle;
reloc[i].offset = (b - batch + 1) * sizeof(*batch);
reloc[i].presumed_offset = obj[0].offset;
reloc[i].offset = (b - batch + 1) * sizeof(*batch);
reloc[i].delta = i * sizeof(uint32_t);
reloc[i].read_domains = I915_GEM_DOMAIN_INSTRUCTION;
reloc[i].write_domain = I915_GEM_DOMAIN_INSTRUCTION;
@ -137,6 +139,8 @@ static void run_test(int fd, unsigned ring, unsigned flags)
*b++ = offset;
reloc[i].offset += sizeof(*batch);
} else {
b[-1] -= 1;
b[-1] |= 1 << 22;
*b++ = offset;
}
*b++ = i;
@ -144,6 +148,7 @@ static void run_test(int fd, unsigned ring, unsigned flags)
*b++ = MI_BATCH_BUFFER_END;
munmap(batch, 16*1024+4096);
gem_execbuf(fd, &execbuf);
check_bo(fd, obj[0].handle);
memset(&hang, 0, sizeof(hang));
if (flags & HANG)
@ -215,7 +220,7 @@ igt_main
igt_skip_on_simulation();
igt_fixture
fd = drm_open_driver(DRIVER_INTEL);
fd = drm_open_driver_master(DRIVER_INTEL);
for (mode = modes; mode->prefix; mode++) {
for (ring = rings; ring->name; ring++) {