blob: b535f75da124f49b931cecf87a16bb98bc111f28 [file] [log] [blame]
/*
* Copyright 2024 Intel Corporation
* SPDX-License-Identifier: MIT
*/
#include "xe/intel_queue.h"
#include "common/intel_gem.h"
#include "drm-uapi/xe_drm.h"
/* Creates a syncobj that will be signaled when all the workloads in given
* exec_queue_id are completed.
* Syncobj set must be destroyed by caller.
*/
int
xe_queue_get_syncobj_for_idle(int fd, uint32_t exec_queue_id, uint32_t *syncobj)
{
struct drm_syncobj_create syncobj_create = {};
struct drm_xe_sync xe_sync = {
.type = DRM_XE_SYNC_TYPE_SYNCOBJ,
.flags = DRM_XE_SYNC_FLAG_SIGNAL,
};
struct drm_xe_exec exec = {
.exec_queue_id = exec_queue_id,
.num_syncs = 1,
.syncs = (uintptr_t)&xe_sync,
.num_batch_buffer = 0,
};
struct drm_syncobj_destroy syncobj_destroy = {};
int ret = intel_ioctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &syncobj_create);
if (ret)
return -errno;
xe_sync.handle = syncobj_create.handle;
/* Using the special exec.num_batch_buffer == 0 handling to get syncobj
* signaled when the last DRM_IOCTL_XE_EXEC is completed.
*/
ret = intel_ioctl(fd, DRM_IOCTL_XE_EXEC, &exec);
if (ret) {
/* exec_queue could have been banned, that is why it is being destroyed
* so no assert() here
*/
ret = -errno;
goto error_exec;
}
*syncobj = syncobj_create.handle;
return 0;
error_exec:
syncobj_destroy.handle = syncobj_create.handle,
intel_ioctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &syncobj_destroy);
return ret;
}