#include "xe_device.h"
#include "xe_gt.h"
#include "xe_macros.h"
-#include "xe_vm.h"
static int do_compare(u64 addr, u64 value, u64 mask, u16 op)
{
}
#define VALID_FLAGS (DRM_XE_UFENCE_WAIT_SOFT_OP | \
- DRM_XE_UFENCE_WAIT_ABSTIME | \
- DRM_XE_UFENCE_WAIT_VM_ERROR)
+ DRM_XE_UFENCE_WAIT_ABSTIME)
#define MAX_OP DRM_XE_UFENCE_WAIT_LTE
static long to_jiffies_timeout(struct xe_device *xe,
struct drm_xe_engine_class_instance eci[XE_HW_ENGINE_MAX_INSTANCE];
struct drm_xe_engine_class_instance __user *user_eci =
u64_to_user_ptr(args->instances);
- struct xe_vm *vm = NULL;
u64 addr = args->addr;
int err;
- bool no_engines = args->flags & DRM_XE_UFENCE_WAIT_SOFT_OP ||
- args->flags & DRM_XE_UFENCE_WAIT_VM_ERROR;
+ bool no_engines = args->flags & DRM_XE_UFENCE_WAIT_SOFT_OP;
long timeout;
ktime_t start;
if (XE_IOCTL_DBG(xe, !no_engines && !args->num_engines))
return -EINVAL;
- if (XE_IOCTL_DBG(xe, !(args->flags & DRM_XE_UFENCE_WAIT_VM_ERROR) &&
- addr & 0x7))
+ if (XE_IOCTL_DBG(xe, addr & 0x7))
return -EINVAL;
if (XE_IOCTL_DBG(xe, args->num_engines > XE_HW_ENGINE_MAX_INSTANCE))
return -EINVAL;
}
- if (args->flags & DRM_XE_UFENCE_WAIT_VM_ERROR) {
- if (XE_IOCTL_DBG(xe, args->vm_id >> 32))
- return -EINVAL;
-
- vm = xe_vm_lookup(to_xe_file(file), args->vm_id);
- if (XE_IOCTL_DBG(xe, !vm))
- return -ENOENT;
-
- if (XE_IOCTL_DBG(xe, !vm->async_ops.error_capture.addr)) {
- xe_vm_put(vm);
- return -EOPNOTSUPP;
- }
-
- addr = vm->async_ops.error_capture.addr;
- }
-
timeout = to_jiffies_timeout(xe, args);
start = ktime_get();
* hardware engine. Open coding as 'do_compare' can sleep which doesn't
* work with the wait_event_* macros.
*/
- if (vm)
- add_wait_queue(&vm->async_ops.error_capture.wq, &w_wait);
- else
- add_wait_queue(&xe->ufence_wq, &w_wait);
+ add_wait_queue(&xe->ufence_wq, &w_wait);
for (;;) {
- if (vm && xe_vm_is_closed(vm)) {
- err = -ENODEV;
- break;
- }
err = do_compare(addr, args->value, args->mask, args->op);
if (err <= 0)
break;
timeout = wait_woken(&w_wait, TASK_INTERRUPTIBLE, timeout);
}
- if (vm) {
- remove_wait_queue(&vm->async_ops.error_capture.wq, &w_wait);
- xe_vm_put(vm);
- } else {
- remove_wait_queue(&xe->ufence_wq, &w_wait);
- }
+ remove_wait_queue(&xe->ufence_wq, &w_wait);
if (!(args->flags & DRM_XE_UFENCE_WAIT_ABSTIME)) {
args->timeout -= ktime_to_ns(ktime_sub(ktime_get(), start));
/** @extensions: Pointer to the first extension struct, if any */
__u64 extensions;
- union {
- /**
- * @addr: user pointer address to wait on, must qword aligned
- */
- __u64 addr;
-
- /**
- * @vm_id: The ID of the VM which encounter an error used with
- * DRM_XE_UFENCE_WAIT_VM_ERROR. Upper 32 bits must be clear.
- */
- __u64 vm_id;
- };
+ /**
+ * @addr: user pointer address to wait on, must qword aligned
+ */
+ __u64 addr;
#define DRM_XE_UFENCE_WAIT_EQ 0
#define DRM_XE_UFENCE_WAIT_NEQ 1
#define DRM_XE_UFENCE_WAIT_SOFT_OP (1 << 0) /* e.g. Wait on VM bind */
#define DRM_XE_UFENCE_WAIT_ABSTIME (1 << 1)
-#define DRM_XE_UFENCE_WAIT_VM_ERROR (1 << 2)
/** @flags: wait flags */
__u16 flags;