[igt-dev] [PATCH i-g-t v2 1/4] lib/xe_ioctl: Add xe_wait_ufence_abstime() helper

Kamil Konieczny kamil.konieczny at linux.intel.com
Wed Jun 14 09:30:49 UTC 2023


Hi Zbigniew,
On 2023-06-02 at 18:20:08 +0200, Zbigniew Kempczyński wrote:
> Xe user fences supports passing timeout in relative or absolute form.
> Add helper for absolute one.
> 
> Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> Cc: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> 

Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>

> ---
> v2: Add documentation and change subject (Kamil).
> ---
>  lib/xe/xe_ioctl.c | 35 +++++++++++++++++++++++++++++++++++
>  lib/xe/xe_ioctl.h |  3 +++
>  2 files changed, 38 insertions(+)
> 
> diff --git a/lib/xe/xe_ioctl.c b/lib/xe/xe_ioctl.c
> index 66a8393fe9..3331046b46 100644
> --- a/lib/xe/xe_ioctl.c
> +++ b/lib/xe/xe_ioctl.c
> @@ -36,6 +36,7 @@
>  #define major(__v__) (((__v__) >> 8) & 0xff)
>  #define minor(__v__) ((__v__) & 0xff)
>  #endif
> +#include <time.h>
>  
>  #include "config.h"
>  #include "drmtest.h"
> @@ -418,6 +419,40 @@ void xe_wait_ufence(int fd, uint64_t *addr, uint64_t value,
>  	igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_WAIT_USER_FENCE, &wait), 0);
>  }
>  
> +/**
> + * xe_wait_ufence_abstime:
> + * @fd: xe device fd
> + * @addr: address of value to compare
> + * @value: expected value (equal) in @address
> + * @eci: engine class instance
> + * @timeout: absolute time when wait expire
> + *
> + * Function compares @value with memory pointed by @addr until they are equal.
> + *
> + * Returns elapsed time in nanoseconds if user fence was signalled.
> + */
> +long xe_wait_ufence_abstime(int fd, uint64_t *addr, uint64_t value,
> +			    struct drm_xe_engine_class_instance *eci,
> +			    int64_t timeout)
> +{
> +	struct drm_xe_wait_user_fence wait = {
> +		.addr = to_user_pointer(addr),
> +		.op = DRM_XE_UFENCE_WAIT_EQ,
> +		.flags = !eci ? DRM_XE_UFENCE_WAIT_SOFT_OP | DRM_XE_UFENCE_WAIT_ABSTIME : 0,
> +		.value = value,
> +		.mask = DRM_XE_UFENCE_WAIT_U64,
> +		.timeout = timeout,
> +		.num_engines = eci ? 1 : 0,
> +		.instances = eci ? to_user_pointer(eci) : 0,
> +	};
> +	struct timespec ts;
> +
> +	igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_WAIT_USER_FENCE, &wait), 0);
> +	igt_assert_eq(clock_gettime(CLOCK_MONOTONIC, &ts), 0);
> +
> +	return ts.tv_sec * 1e9 + ts.tv_nsec;
> +}
> +
>  void xe_force_gt_reset(int fd, int gt)
>  {
>  	char reset_string[128];
> diff --git a/lib/xe/xe_ioctl.h b/lib/xe/xe_ioctl.h
> index 049cd183d6..9b44892fe9 100644
> --- a/lib/xe/xe_ioctl.h
> +++ b/lib/xe/xe_ioctl.h
> @@ -82,6 +82,9 @@ void xe_exec_wait(int fd, uint32_t engine, uint64_t addr);
>  void xe_wait_ufence(int fd, uint64_t *addr, uint64_t value,
>  		    struct drm_xe_engine_class_instance *eci,
>  		    int64_t timeout);
> +long xe_wait_ufence_abstime(int fd, uint64_t *addr, uint64_t value,
> +			    struct drm_xe_engine_class_instance *eci,
> +			    int64_t timeout);
>  void xe_force_gt_reset(int fd, int gt);
>  void xe_vm_madvise(int fd, uint32_t vm, uint64_t addr, uint64_t size,
>  		   uint32_t property, uint32_t value);
> -- 
> 2.34.1
> 


More information about the igt-dev mailing list