[igt-dev] [PATCH i-g-t v4 26/56] tests/gem_exec_params: Support gens without relocations

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Mon Aug 9 12:53:58 UTC 2021


On Fri, Aug 06, 2021 at 03:41:15PM +0200, Zbigniew Kempczyński wrote:
> From: Sai Gowtham <sai.gowtham.ch at intel.com>
> 
> When relocations are not available tests must assign addresses to objects
> by themselves instead of relying on the driver. We use allocator for
> that purpose.
> 
> Signed-off-by: Sai Gowtham <sai.gowtham.ch at intel.com>
> Cc: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> Cc: Petri Latvala <petri.latvala at intel.com>
> Cc: Ashutosh Dixit <ashutosh.dixit at intel.com>
> ---
>  tests/i915/gem_exec_params.c | 74 ++++++++++++++++++++++++++----------
>  1 file changed, 53 insertions(+), 21 deletions(-)
> 
> diff --git a/tests/i915/gem_exec_params.c b/tests/i915/gem_exec_params.c
> index 729d38a43..ba79791a1 100644
> --- a/tests/i915/gem_exec_params.c
> +++ b/tests/i915/gem_exec_params.c
> @@ -45,6 +45,8 @@
>  #include "igt_device.h"
>  #include "sw_sync.h"
>  
> +#define ALIGNMENT (1 << 22)
> +
>  static bool has_exec_batch_first(int fd)
>  {
>  	int val = -1;
> @@ -74,24 +76,45 @@ static void test_batch_first(int fd)
>  	struct drm_i915_gem_exec_object2 obj[3];
>  	struct drm_i915_gem_relocation_entry reloc[2];
>  	uint32_t *map, value;
> +	uint64_t ahnd;
> +	bool do_relocs = !gem_uses_ppgtt(fd);
>  	int i;
>  
>  	igt_require(gem_can_store_dword(fd, 0));
>  	igt_require(has_exec_batch_first(fd));
>  
> +	ahnd = intel_allocator_open(fd, 0, INTEL_ALLOCATOR_SIMPLE);
> +
>  	memset(obj, 0, sizeof(obj));
>  	memset(reloc, 0, sizeof(reloc));
>  
>  	obj[0].handle = gem_create(fd, 4096);
> +	obj[0].offset = intel_allocator_alloc(ahnd, obj[0].handle,
> +						4096, ALIGNMENT);
> +	obj[0].offset = CANONICAL(obj[0].offset);
> +	obj[0].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
>  	obj[1].handle = gem_create(fd, 4096);
> +	obj[1].offset = intel_allocator_alloc(ahnd, obj[1].handle,
> +						4096, ALIGNMENT);
> +	obj[1].offset = CANONICAL(obj[1].offset);
> +	obj[1].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
>  	obj[2].handle = gem_create(fd, 4096);
> -
> -	reloc[0].target_handle = obj[1].handle;
> -	reloc[0].offset = sizeof(uint32_t);
> -	reloc[0].read_domains = I915_GEM_DOMAIN_INSTRUCTION;
> -	reloc[0].write_domain = I915_GEM_DOMAIN_INSTRUCTION;
> -	obj[0].relocs_ptr = to_user_pointer(&reloc[0]);
> -	obj[0].relocation_count = 1;
> +	obj[2].offset = intel_allocator_alloc(ahnd, obj[2].handle,
> +						4096, ALIGNMENT);
> +	obj[2].offset = CANONICAL(obj[2].offset);
> +	obj[2].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
> +
> +	if (do_relocs) {
> +		reloc[0].target_handle = obj[1].handle;
> +		reloc[0].offset = sizeof(uint32_t);
> +		reloc[0].read_domains = I915_GEM_DOMAIN_INSTRUCTION;
> +		reloc[0].write_domain = I915_GEM_DOMAIN_INSTRUCTION;
> +		obj[0].relocs_ptr = to_user_pointer(&reloc[0]);
> +		obj[0].relocation_count = 1;
> +	} else {
> +		obj[0].flags |= EXEC_OBJECT_PINNED;
> +		obj[1].flags |= EXEC_OBJECT_PINNED | EXEC_OBJECT_WRITE;
> +	}
>  
>  	i = 0;
>  	map = gem_mmap__cpu(fd, obj[0].handle, 0, 4096, PROT_WRITE);
> @@ -99,26 +122,31 @@ static void test_batch_first(int fd)
>  			I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
>  	map[i] = MI_STORE_DWORD_IMM | (gen < 6 ? 1 << 22 : 0);
>  	if (gen >= 8) {
> -		map[++i] = 0;
> -		map[++i] = 0;
> +		map[++i] = obj[1].offset;
> +		map[++i] = obj[1].offset >> 32;
>  	} else if (gen >= 4) {
>  		map[++i] = 0;
> -		map[++i] = 0;
> +		map[++i] = obj[1].offset;
>  		reloc[0].offset += sizeof(uint32_t);
>  	} else {
>  		map[i]--;
> -		map[++i] = 0;
> +		map[++i] = obj[1].offset;
>  	}
>  	map[++i] = 1;
>  	map[++i] = MI_BATCH_BUFFER_END;
>  	munmap(map, 4096);
>  
> -	reloc[1].target_handle = obj[1].handle;
> -	reloc[1].offset = sizeof(uint32_t);
> -	reloc[1].read_domains = I915_GEM_DOMAIN_INSTRUCTION;
> -	reloc[1].write_domain = I915_GEM_DOMAIN_INSTRUCTION;
> -	obj[2].relocs_ptr = to_user_pointer(&reloc[1]);
> -	obj[2].relocation_count = 1;
> +	if (do_relocs) {
> +		reloc[1].target_handle = obj[1].handle;
> +		reloc[1].offset = sizeof(uint32_t);
> +		reloc[1].read_domains = I915_GEM_DOMAIN_INSTRUCTION;
> +		reloc[1].write_domain = I915_GEM_DOMAIN_INSTRUCTION;
> +		obj[2].relocs_ptr = to_user_pointer(&reloc[1]);
> +		obj[2].relocation_count = 1;
> +	} else {
> +		obj[1].flags |= EXEC_OBJECT_PINNED | EXEC_OBJECT_WRITE;

Small nit, flags were previously set for obj[1], but there's no problem,
maybe it is more readable - we know where's target object.

Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>

--
Zbigniew

> +		obj[2].flags |= EXEC_OBJECT_PINNED;
> +	}
>  
>  	i = 0;
>  	map = gem_mmap__cpu(fd, obj[2].handle, 0, 4096, PROT_WRITE);
> @@ -126,15 +154,15 @@ static void test_batch_first(int fd)
>  			I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
>  	map[i] = MI_STORE_DWORD_IMM | (gen < 6 ? 1 << 22 : 0);
>  	if (gen >= 8) {
> -		map[++i] = 0;
> -		map[++i] = 0;
> +		map[++i] = obj[1].offset;
> +		map[++i] = obj[1].offset >> 32;
>  	} else if (gen >= 4) {
>  		map[++i] = 0;
> -		map[++i] = 0;
> +		map[++i] = obj[1].offset;
>  		reloc[1].offset += sizeof(uint32_t);
>  	} else {
>  		map[i]--;
> -		map[++i] = 0;
> +		map[++i] = obj[1].offset;
>  	}
>  	map[++i] = 2;
>  	map[++i] = MI_BATCH_BUFFER_END;
> @@ -158,8 +186,12 @@ static void test_batch_first(int fd)
>  	igt_assert_eq_u32(value, 1);
>  
>  	gem_close(fd, obj[2].handle);
> +	intel_allocator_free(ahnd, obj[2].handle);
>  	gem_close(fd, obj[1].handle);
> +	intel_allocator_free(ahnd, obj[1].handle);
>  	gem_close(fd, obj[0].handle);
> +	intel_allocator_free(ahnd, obj[0].handle);
> +	intel_allocator_close(ahnd);
>  }
>  
>  static int has_secure_batches(const int fd)
> -- 
> 2.26.0
> 


More information about the igt-dev mailing list