[igt-dev] [PATCH i-g-t 04/12] lib/xe: support cpu_caching and coh_mod for gem_create

Mishra, Pallavi pallavi.mishra at intel.com
Mon Oct 9 22:04:34 UTC 2023



> -----Original Message-----
> From: Auld, Matthew <matthew.auld at intel.com>
> Sent: Thursday, October 5, 2023 8:31 AM
> To: igt-dev at lists.freedesktop.org
> Cc: intel-xe at lists.freedesktop.org; Souza, Jose <jose.souza at intel.com>;
> Mishra, Pallavi <pallavi.mishra at intel.com>
> Subject: [PATCH i-g-t 04/12] lib/xe: support cpu_caching and coh_mod for
> gem_create
> 
> Most tests shouldn't about such things, so likely it's just a case of picking the
> most sane default. However we also add some helpers for the tests that do
> care.
> 
> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
> Cc: José Roberto de Souza <jose.souza at intel.com>
> Cc: Pallavi Mishra <pallavi.mishra at intel.com>

Reviewed-by: Pallavi Mishra <pallavi.mishra at intel.com>
> ---
>  lib/xe/xe_ioctl.c       | 65 ++++++++++++++++++++++++++++++++++-------
>  lib/xe/xe_ioctl.h       |  8 +++++
>  tests/intel/xe_create.c |  3 ++
>  3 files changed, 65 insertions(+), 11 deletions(-)
> 
> diff --git a/lib/xe/xe_ioctl.c b/lib/xe/xe_ioctl.c index 730dcfd16..80696aa59
> 100644
> --- a/lib/xe/xe_ioctl.c
> +++ b/lib/xe/xe_ioctl.c
> @@ -233,13 +233,30 @@ void xe_vm_destroy(int fd, uint32_t vm)
>  	igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_VM_DESTROY, &destroy),
> 0);  }
> 
> -uint32_t __xe_bo_create_flags(int fd, uint32_t vm, uint64_t size, uint32_t
> flags,
> -			      uint32_t *handle)
> +void __xe_default_coh_caching_from_flags(int fd, uint32_t flags,
> +					 uint16_t *cpu_caching,
> +					 uint16_t *coh_mode)
> +{
> +	if ((flags & all_memory_regions(fd)) != system_memory(fd) ||
> +	    flags & XE_GEM_CREATE_FLAG_SCANOUT) {
> +		/* VRAM placements or scanout should always use WC */
> +		*cpu_caching = DRM_XE_GEM_CPU_CACHING_WC;
> +		*coh_mode = DRM_XE_GEM_COH_NONE;
> +	} else {
> +		*cpu_caching = DRM_XE_GEM_CPU_CACHING_WB;
> +		*coh_mode = DRM_XE_GEM_COH_AT_LEAST_1WAY;
> +	}
> +}
> +
> +static uint32_t ___xe_bo_create_flags(int fd, uint32_t vm, uint64_t size,
> uint32_t flags,
> +				      uint16_t cpu_caching, uint16_t coh_mode,
> uint32_t *handle)
>  {
>  	struct drm_xe_gem_create create = {
>  		.vm_id = vm,
>  		.size = size,
>  		.flags = flags,
> +		.cpu_caching = cpu_caching,
> +		.coh_mode = coh_mode,
>  	};
>  	int err;
> 
> @@ -249,6 +266,18 @@ uint32_t __xe_bo_create_flags(int fd, uint32_t vm,
> uint64_t size, uint32_t flags
> 
>  	*handle = create.handle;
>  	return 0;
> +
> +}
> +
> +uint32_t __xe_bo_create_flags(int fd, uint32_t vm, uint64_t size, uint32_t
> flags,
> +			      uint32_t *handle)
> +{
> +	uint16_t cpu_caching, coh_mode;
> +
> +	__xe_default_coh_caching_from_flags(fd, flags, &cpu_caching,
> +&coh_mode);
> +
> +	return ___xe_bo_create_flags(fd, vm, size, flags, cpu_caching,
> coh_mode,
> +				     handle);
>  }
> 
>  uint32_t xe_bo_create_flags(int fd, uint32_t vm, uint64_t size, uint32_t flags)
> @@ -260,19 +289,33 @@ uint32_t xe_bo_create_flags(int fd, uint32_t vm,
> uint64_t size, uint32_t flags)
>  	return handle;
>  }
> 
> +uint32_t __xe_bo_create_caching(int fd, uint32_t vm, uint64_t size, uint32_t
> flags,
> +				uint16_t cpu_caching, uint16_t coh_mode,
> +				uint32_t *handle)
> +{
> +	return ___xe_bo_create_flags(fd, vm, size, flags, cpu_caching,
> coh_mode,
> +				     handle);
> +}
> +
> +uint32_t xe_bo_create_caching(int fd, uint32_t vm, uint64_t size, uint32_t
> flags,
> +			      uint16_t cpu_caching, uint16_t coh_mode) {
> +	uint32_t handle;
> +
> +	igt_assert_eq(__xe_bo_create_caching(fd, vm, size, flags,
> +					     cpu_caching, coh_mode, &handle),
> 0);
> +
> +	return handle;
> +}
> +
>  uint32_t xe_bo_create(int fd, int gt, uint32_t vm, uint64_t size)  {
> -	struct drm_xe_gem_create create = {
> -		.vm_id = vm,
> -		.size = size,
> -		.flags = vram_if_possible(fd, gt),
> -	};
> -	int err;
> +	uint32_t handle;
> 
> -	err = igt_ioctl(fd, DRM_IOCTL_XE_GEM_CREATE, &create);
> -	igt_assert_eq(err, 0);
> +	igt_assert_eq(__xe_bo_create_flags(fd, vm, size, vram_if_possible(fd,
> gt),
> +					   &handle), 0);
> 
> -	return create.handle;
> +	return handle;
>  }
> 
>  uint32_t xe_bind_exec_queue_create(int fd, uint32_t vm, uint64_t ext) diff --
> git a/lib/xe/xe_ioctl.h b/lib/xe/xe_ioctl.h index 6c281b3bf..c18fc878c 100644
> --- a/lib/xe/xe_ioctl.h
> +++ b/lib/xe/xe_ioctl.h
> @@ -67,6 +67,14 @@ void xe_vm_destroy(int fd, uint32_t vm);  uint32_t
> __xe_bo_create_flags(int fd, uint32_t vm, uint64_t size, uint32_t flags,
>  			      uint32_t *handle);
>  uint32_t xe_bo_create_flags(int fd, uint32_t vm, uint64_t size, uint32_t
> flags);
> +uint32_t __xe_bo_create_caching(int fd, uint32_t vm, uint64_t size, uint32_t
> flags,
> +				uint16_t cpu_caching, uint16_t coh_mode,
> +				uint32_t *handle);
> +uint32_t xe_bo_create_caching(int fd, uint32_t vm, uint64_t size, uint32_t
> flags,
> +			      uint16_t cpu_caching, uint16_t coh_mode); void
> +__xe_default_coh_caching_from_flags(int fd, uint32_t flags,
> +					 uint16_t *cpu_caching,
> +					 uint16_t *coh_mode);
>  uint32_t xe_bo_create(int fd, int gt, uint32_t vm, uint64_t size);  uint32_t
> xe_exec_queue_create(int fd, uint32_t vm,
>  			  struct drm_xe_engine_class_instance *instance, diff -
> -git a/tests/intel/xe_create.c b/tests/intel/xe_create.c index
> 8d845e5c8..f5d2cc1b2 100644
> --- a/tests/intel/xe_create.c
> +++ b/tests/intel/xe_create.c
> @@ -30,6 +30,9 @@ static int __create_bo(int fd, uint32_t vm, uint64_t size,
> uint32_t flags,
> 
>  	igt_assert(handlep);
> 
> +	__xe_default_coh_caching_from_flags(fd, flags, &create.cpu_caching,
> +					    &create.coh_mode);
> +
>  	if (igt_ioctl(fd, DRM_IOCTL_XE_GEM_CREATE, &create)) {
>  		ret = -errno;
>  		errno = 0;
> --
> 2.41.0



More information about the igt-dev mailing list