[igt-dev] [PATCH] tests/i915/gem_userptr_blits: Use softpinning support for MTL

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Fri Feb 24 11:20:20 UTC 2023


On Thu, Feb 23, 2023 at 10:23:36PM +0530, Vikas Srivastava wrote:
> MTL and other platforms which are gen12 must use softpinning
> instead of relocations so adding no reloc supoprt for MTL target.
> 
> Signed-off-by: Vikas Srivastava <vikas.srivastava at intel.com>

IMO looks correct:

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

--
Zbigniew

> ---
>  tests/i915/gem_userptr_blits.c | 105 ++++++++++++++++++++++-----------
>  1 file changed, 70 insertions(+), 35 deletions(-)
> 
> diff --git a/tests/i915/gem_userptr_blits.c b/tests/i915/gem_userptr_blits.c
> index 698508669..483570d0a 100644
> --- a/tests/i915/gem_userptr_blits.c
> +++ b/tests/i915/gem_userptr_blits.c
> @@ -204,65 +204,100 @@ blit(int fd, uint32_t dst, uint32_t src, uint32_t *all_bo, int n_bo)
>  	struct drm_i915_gem_relocation_entry reloc[2];
>  	struct drm_i915_gem_exec_object2 *obj;
>  	struct drm_i915_gem_execbuffer2 exec;
> +	uint32_t devid;
>  	uint32_t handle;
>  	int n, ret, i=0;
> +	uint64_t src_offset, dst_offset;
> +	uint32_t size = HEIGHT * WIDTH * 4;
> +	bool has_relocs = gem_has_relocations(fd);
>  
> -	batch[i++] = XY_SRC_COPY_BLT_CMD |
> -		  XY_SRC_COPY_BLT_WRITE_ALPHA |
> -		  XY_SRC_COPY_BLT_WRITE_RGB;
> -	if (intel_gen(intel_get_drm_devid(fd)) >= 8)
> -		batch[i - 1] |= 8;
> -	else
> -		batch[i - 1] |= 6;
> -	batch[i++] = (3 << 24) | /* 32 bits */
> -		  (0xcc << 16) | /* copy ROP */
> -		  WIDTH*4;
> -	batch[i++] = 0; /* dst x1,y1 */
> -	batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
> -	batch[i++] = 0; /* dst reloc */
> -	if (intel_gen(intel_get_drm_devid(fd)) >= 8)
> -		batch[i++] = 0;
> -	batch[i++] = 0; /* src x1,y1 */
> -	batch[i++] = WIDTH*4;
> -	batch[i++] = 0; /* src reloc */
> -	if (intel_gen(intel_get_drm_devid(fd)) >= 8)
> -		batch[i++] = 0;
> -	batch[i++] = MI_BATCH_BUFFER_END;
> -	batch[i++] = MI_NOOP;
> +	src_offset = src * size;
> +	dst_offset = dst * size;
>  
> +	devid = intel_get_drm_devid(fd);
>  	handle = gem_create(fd, 4096);
> -	gem_write(fd, handle, 0, batch, sizeof(batch));
> +	memset(&exec, 0, sizeof(exec));
> +	obj = calloc(n_bo + 1, sizeof(*obj));
> +	for (n = 0; n < n_bo; n++) {
> +		obj[n].handle = all_bo[n];
> +		obj[n].offset = all_bo[n] * size;
> +		obj[n].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
> +		if (all_bo[n] == dst)
> +			obj[n].flags |= EXEC_OBJECT_WRITE;
> +		if (!has_relocs)
> +			obj[n].flags |= EXEC_OBJECT_PINNED;
> +	}
> +
> +	obj[n].handle = handle;
> +	obj[n].offset = handle * size;
> +	obj[n].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
> +	obj[n].relocation_count = 2;
> +	obj[n].relocs_ptr = to_user_pointer(reloc);
> +	if (!has_relocs) {
> +		obj[n].flags |= EXEC_OBJECT_PINNED;
> +		obj[n].relocation_count = 0;
> +	}
>  
>  	reloc[0].target_handle = dst;
>  	reloc[0].delta = 0;
>  	reloc[0].offset = 4 * sizeof(batch[0]);
> -	reloc[0].presumed_offset = 0;
> +	reloc[0].presumed_offset = dst_offset;
>  	reloc[0].read_domains = I915_GEM_DOMAIN_RENDER;
>  	reloc[0].write_domain = I915_GEM_DOMAIN_RENDER;
>  
>  	reloc[1].target_handle = src;
>  	reloc[1].delta = 0;
>  	reloc[1].offset = 7 * sizeof(batch[0]);
> -	if (intel_gen(intel_get_drm_devid(fd)) >= 8)
> +	if (intel_gen(devid) >= 8)
>  		reloc[1].offset += sizeof(batch[0]);
> -	reloc[1].presumed_offset = 0;
> +	reloc[1].presumed_offset = src_offset;
>  	reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
>  	reloc[1].write_domain = 0;
>  
> -	memset(&exec, 0, sizeof(exec));
> -	obj = calloc(n_bo + 1, sizeof(*obj));
> -	for (n = 0; n < n_bo; n++) {
> -		obj[n].handle = all_bo[n];
> -		obj[n].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
> +	if (intel_graphics_ver(devid) >= IP_VER(12, 60)) {
> +		batch[i++] = XY_FAST_COPY_BLT;
> +		batch[i++] = XY_FAST_COPY_COLOR_DEPTH_32 | WIDTH*4;
> +		batch[i++] = 0; /* dst x1,y1 */
> +		batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
> +		batch[i++] = lower_32_bits(dst_offset); /* dst address */
> +		batch[i++] = upper_32_bits(CANONICAL(dst_offset));
> +		batch[i++] = 0; /* src x1,y1 */
> +		batch[i++] = WIDTH*4; /* src pitch */
> +		batch[i++] = lower_32_bits(src_offset); /* src address */
> +		batch[i++] = upper_32_bits(CANONICAL(src_offset));
> +		batch[i++] = MI_BATCH_BUFFER_END;
> +		batch[i++] = MI_NOOP;
> +	} else {
> +		batch[i++] = XY_SRC_COPY_BLT_CMD |
> +			     XY_SRC_COPY_BLT_WRITE_ALPHA |
> +			     XY_SRC_COPY_BLT_WRITE_RGB;
> +		if (intel_gen(devid) >= 8)
> +			batch[i - 1] |= 8;
> +		else
> +			batch[i - 1] |= 6;
> +		batch[i++] = (3 << 24) | /* 32 bits */
> +			     (0xcc << 16) | /* copy ROP */
> +			     WIDTH*4;
> +		batch[i++] = 0; /* dst x1,y1 */
> +		batch[i++] = (HEIGHT << 16) | WIDTH; /* dst x2,y2 */
> +		batch[i++] = lower_32_bits(dst_offset);
> +		if (intel_gen(devid) >= 8)
> +			batch[i++] = upper_32_bits(CANONICAL(dst_offset));
> +		batch[i++] = 0; /* src x1,y1 */
> +		batch[i++] = WIDTH*4;
> +		batch[i++] = lower_32_bits(src_offset);
> +		if (intel_gen(devid) >= 8)
> +			batch[i++] = upper_32_bits(CANONICAL(src_offset));
> +		batch[i++] = MI_BATCH_BUFFER_END;
> +		batch[i++] = MI_NOOP;
>  	}
> -	obj[n].handle = handle;
> -	obj[n].flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
> -	obj[n].relocation_count = 2;
> -	obj[n].relocs_ptr = to_user_pointer(reloc);
> +
> +	gem_write(fd, handle, 0, batch, sizeof(batch));
>  
>  	exec.buffers_ptr = to_user_pointer(obj);
>  	exec.buffer_count = n_bo + 1;
>  	exec.flags = HAS_BLT_RING(intel_get_drm_devid(fd)) ? I915_EXEC_BLT : 0;
> +	exec.flags |= I915_EXEC_NO_RELOC;
>  
>  	ret = __gem_execbuf(fd, &exec);
>  	gem_close(fd, handle);
> -- 
> 2.25.1
> 


More information about the igt-dev mailing list