ac/drm: replace direct ioctl calls by util_sync_provider

Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Acked-by: Rob Clark <robdclark@chromium.org>
Acked-by: Marek Olšák <marek.olsak@amd.com>
Acked-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34470>
This commit is contained in:
Pierre-Eric Pelloux-Prayer
2025-03-07 14:38:41 +01:00
committed by Marge Bot
parent 62b9c3eafc
commit 5d63d2fb04
6 changed files with 59 additions and 59 deletions
+24 -24
View File
@@ -441,76 +441,76 @@ int ac_drm_cs_query_fence_status(ac_drm_device *dev, uint32_t ctx_id, uint32_t i
return r;
}
int ac_drm_cs_create_syncobj2(int device_fd, uint32_t flags, uint32_t *handle)
int ac_drm_cs_create_syncobj2(ac_drm_device *dev, uint32_t flags, uint32_t *handle)
{
return drmSyncobjCreate(device_fd, flags, handle);
return dev->p->create(dev->p, flags, handle);
}
int ac_drm_cs_destroy_syncobj(int device_fd, uint32_t handle)
int ac_drm_cs_destroy_syncobj(ac_drm_device *dev, uint32_t handle)
{
return drmSyncobjDestroy(device_fd, handle);
return dev->p->destroy(dev->p, handle);
}
int ac_drm_cs_syncobj_wait(int device_fd, uint32_t *handles, unsigned num_handles,
int ac_drm_cs_syncobj_wait(ac_drm_device *dev, uint32_t *handles, unsigned num_handles,
int64_t timeout_nsec, unsigned flags, uint32_t *first_signaled)
{
return drmSyncobjWait(device_fd, handles, num_handles, timeout_nsec, flags, first_signaled);
return dev->p->wait(dev->p, handles, num_handles, timeout_nsec, flags, first_signaled);
}
int ac_drm_cs_syncobj_query2(int device_fd, uint32_t *handles, uint64_t *points,
int ac_drm_cs_syncobj_query2(ac_drm_device *dev, uint32_t *handles, uint64_t *points,
unsigned num_handles, uint32_t flags)
{
return drmSyncobjQuery2(device_fd, handles, points, num_handles, flags);
return dev->p->query(dev->p, handles, points, num_handles, flags);
}
int ac_drm_cs_import_syncobj(int device_fd, int shared_fd, uint32_t *handle)
int ac_drm_cs_import_syncobj(ac_drm_device *dev, int shared_fd, uint32_t *handle)
{
return drmSyncobjFDToHandle(device_fd, shared_fd, handle);
return dev->p->fd_to_handle(dev->p, shared_fd, handle);
}
int ac_drm_cs_syncobj_export_sync_file(int device_fd, uint32_t syncobj, int *sync_file_fd)
int ac_drm_cs_syncobj_export_sync_file(ac_drm_device *dev, uint32_t syncobj, int *sync_file_fd)
{
return drmSyncobjExportSyncFile(device_fd, syncobj, sync_file_fd);
return dev->p->export_sync_file(dev->p, syncobj, sync_file_fd);
}
int ac_drm_cs_syncobj_import_sync_file(int device_fd, uint32_t syncobj, int sync_file_fd)
int ac_drm_cs_syncobj_import_sync_file(ac_drm_device *dev, uint32_t syncobj, int sync_file_fd)
{
return drmSyncobjImportSyncFile(device_fd, syncobj, sync_file_fd);
return dev->p->import_sync_file(dev->p, syncobj, sync_file_fd);
}
int ac_drm_cs_syncobj_export_sync_file2(int device_fd, uint32_t syncobj, uint64_t point,
int ac_drm_cs_syncobj_export_sync_file2(ac_drm_device *dev, uint32_t syncobj, uint64_t point,
uint32_t flags, int *sync_file_fd)
{
uint32_t binary_handle;
int ret;
if (!point)
return drmSyncobjExportSyncFile(device_fd, syncobj, sync_file_fd);
return dev->p->export_sync_file(dev->p, syncobj, sync_file_fd);
ret = drmSyncobjCreate(device_fd, 0, &binary_handle);
ret = dev->p->create(dev->p, 0, &binary_handle);
if (ret)
return ret;
ret = drmSyncobjTransfer(device_fd, binary_handle, 0, syncobj, point, flags);
ret = dev->p->transfer(dev->p, binary_handle, 0, syncobj, point, flags);
if (ret)
goto out;
ret = drmSyncobjExportSyncFile(device_fd, binary_handle, sync_file_fd);
ret = dev->p->export_sync_file(dev->p, binary_handle, sync_file_fd);
out:
drmSyncobjDestroy(device_fd, binary_handle);
dev->p->destroy(dev->p, binary_handle);
return ret;
}
int ac_drm_cs_syncobj_transfer(int device_fd, uint32_t dst_handle, uint64_t dst_point,
int ac_drm_cs_syncobj_transfer(ac_drm_device *dev, uint32_t dst_handle, uint64_t dst_point,
uint32_t src_handle, uint64_t src_point, uint32_t flags)
{
return drmSyncobjTransfer(device_fd, dst_handle, dst_point, src_handle, src_point, flags);
return dev->p->transfer(dev->p, dst_handle, dst_point, src_handle, src_point, flags);
}
int ac_drm_cs_syncobj_timeline_wait(int device_fd, uint32_t *handles, uint64_t *points,
int ac_drm_cs_syncobj_timeline_wait(ac_drm_device *dev, uint32_t *handles, uint64_t *points,
unsigned num_handles, int64_t timeout_nsec, unsigned flags,
uint32_t *first_signaled)
{
return drmSyncobjTimelineWait(device_fd, handles, points, num_handles, timeout_nsec, flags,
return dev->p->timeline_wait(dev->p, handles, points, num_handles, timeout_nsec, flags,
first_signaled);
}
+10 -10
View File
@@ -90,27 +90,27 @@ PROC int ac_drm_cs_query_reset_state2(ac_drm_device *dev, uint32_t ctx_id, uint6
PROC int ac_drm_cs_query_fence_status(ac_drm_device *dev, uint32_t ctx_id, uint32_t ip_type,
uint32_t ip_instance, uint32_t ring, uint64_t fence_seq_no,
uint64_t timeout_ns, uint64_t flags, uint32_t *expired) TAIL;
PROC int ac_drm_cs_create_syncobj2(int device_fd, uint32_t flags, uint32_t *handle) TAIL;
PROC int ac_drm_cs_destroy_syncobj(int device_fd, uint32_t handle) TAIL;
PROC int ac_drm_cs_syncobj_wait(int device_fd, uint32_t *handles, unsigned num_handles,
PROC int ac_drm_cs_create_syncobj2(ac_drm_device *dev, uint32_t flags, uint32_t *handle) TAIL;
PROC int ac_drm_cs_destroy_syncobj(ac_drm_device *dev, uint32_t handle) TAIL;
PROC int ac_drm_cs_syncobj_wait(ac_drm_device *dev, uint32_t *handles, unsigned num_handles,
int64_t timeout_nsec, unsigned flags,
uint32_t *first_signaled) TAIL;
PROC int ac_drm_cs_syncobj_query2(int device_fd, uint32_t *handles, uint64_t *points,
PROC int ac_drm_cs_syncobj_query2(ac_drm_device *dev, uint32_t *handles, uint64_t *points,
unsigned num_handles, uint32_t flags) TAIL;
PROC int ac_drm_cs_import_syncobj(int device_fd, int shared_fd, uint32_t *handle) TAIL;
PROC int ac_drm_cs_syncobj_export_sync_file(int device_fd, uint32_t syncobj,
PROC int ac_drm_cs_import_syncobj(ac_drm_device *dev, int shared_fd, uint32_t *handle) TAIL;
PROC int ac_drm_cs_syncobj_export_sync_file(ac_drm_device *dev, uint32_t syncobj,
int *sync_file_fd) TAIL;
PROC int ac_drm_cs_syncobj_import_sync_file(int device_fd, uint32_t syncobj, int sync_file_fd) TAIL;
PROC int ac_drm_cs_syncobj_export_sync_file2(int device_fd, uint32_t syncobj, uint64_t point,
PROC int ac_drm_cs_syncobj_import_sync_file(ac_drm_device *dev, uint32_t syncobj, int sync_file_fd) TAIL;
PROC int ac_drm_cs_syncobj_export_sync_file2(ac_drm_device *dev, uint32_t syncobj, uint64_t point,
uint32_t flags, int *sync_file_fd) TAIL;
PROC int ac_drm_cs_syncobj_transfer(int device_fd, uint32_t dst_handle, uint64_t dst_point,
PROC int ac_drm_cs_syncobj_transfer(ac_drm_device *dev, uint32_t dst_handle, uint64_t dst_point,
uint32_t src_handle, uint64_t src_point, uint32_t flags) TAIL;
PROC int ac_drm_cs_submit_raw2(ac_drm_device *dev, uint32_t ctx_id, uint32_t bo_list_handle,
int num_chunks, struct drm_amdgpu_cs_chunk *chunks,
uint64_t *seq_no) TAIL;
PROC void ac_drm_cs_chunk_fence_info_to_data(uint32_t bo_handle, uint64_t offset,
struct drm_amdgpu_cs_chunk_data *data) TAILV;
PROC int ac_drm_cs_syncobj_timeline_wait(int device_fd, uint32_t *handles, uint64_t *points,
PROC int ac_drm_cs_syncobj_timeline_wait(ac_drm_device *dev, uint32_t *handles, uint64_t *points,
unsigned num_handles, int64_t timeout_nsec, unsigned flags,
uint32_t *first_signaled) TAIL;
PROC int ac_drm_query_info(ac_drm_device *dev, unsigned info_id, unsigned size, void *value) TAIL;
+11 -11
View File
@@ -1242,13 +1242,13 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum amd_ip_type ip_type
if (sem_info->wait.syncobj_count || sem_info->wait.timeline_syncobj_count) {
int fd;
ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->fd, queue_syncobj, &fd);
ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->dev, queue_syncobj, &fd);
if (ret < 0)
return VK_ERROR_DEVICE_LOST;
for (unsigned i = 0; i < sem_info->wait.syncobj_count; ++i) {
int fd2;
ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->fd, sem_info->wait.syncobj[i], &fd2);
ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->dev, sem_info->wait.syncobj[i], &fd2);
if (ret < 0) {
close(fd);
return VK_ERROR_DEVICE_LOST;
@@ -1260,14 +1260,14 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum amd_ip_type ip_type
for (unsigned i = 0; i < sem_info->wait.timeline_syncobj_count; ++i) {
int fd2;
ret = ac_drm_cs_syncobj_export_sync_file2(
ctx->ws->fd, sem_info->wait.syncobj[i + sem_info->wait.syncobj_count], sem_info->wait.points[i], 0, &fd2);
ctx->ws->dev, sem_info->wait.syncobj[i + sem_info->wait.syncobj_count], sem_info->wait.points[i], 0, &fd2);
if (ret < 0) {
/* This works around a kernel bug where the fence isn't copied if it is already
* signalled. Since it is already signalled it is totally fine to not wait on it.
*
* kernel patch: https://patchwork.freedesktop.org/patch/465583/ */
uint64_t point;
ret = ac_drm_cs_syncobj_query2(ctx->ws->fd, &sem_info->wait.syncobj[i + sem_info->wait.syncobj_count],
ret = ac_drm_cs_syncobj_query2(ctx->ws->dev, &sem_info->wait.syncobj[i + sem_info->wait.syncobj_count],
&point, 1, 0);
if (!ret && point >= sem_info->wait.points[i])
continue;
@@ -1279,7 +1279,7 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum amd_ip_type ip_type
sync_accumulate("radv", &fd, fd2);
close(fd2);
}
ret = ac_drm_cs_syncobj_import_sync_file(ctx->ws->fd, queue_syncobj, fd);
ret = ac_drm_cs_syncobj_import_sync_file(ctx->ws->dev, queue_syncobj, fd);
close(fd);
if (ret < 0)
return VK_ERROR_DEVICE_LOST;
@@ -1292,23 +1292,23 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum amd_ip_type ip_type
uint32_t src_handle = queue_syncobj;
if (ctx->ws->info.has_timeline_syncobj) {
ret = ac_drm_cs_syncobj_transfer(ctx->ws->fd, dst_handle, 0, src_handle, 0, 0);
ret = ac_drm_cs_syncobj_transfer(ctx->ws->dev, dst_handle, 0, src_handle, 0, 0);
if (ret < 0)
return VK_ERROR_DEVICE_LOST;
} else {
int fd;
ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->fd, src_handle, &fd);
ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->dev, src_handle, &fd);
if (ret < 0)
return VK_ERROR_DEVICE_LOST;
ret = ac_drm_cs_syncobj_import_sync_file(ctx->ws->fd, dst_handle, fd);
ret = ac_drm_cs_syncobj_import_sync_file(ctx->ws->dev, dst_handle, fd);
close(fd);
if (ret < 0)
return VK_ERROR_DEVICE_LOST;
}
}
for (unsigned i = 0; i < sem_info->signal.timeline_syncobj_count; ++i) {
ret = ac_drm_cs_syncobj_transfer(ctx->ws->fd, sem_info->signal.syncobj[i + sem_info->signal.syncobj_count],
ret = ac_drm_cs_syncobj_transfer(ctx->ws->dev, sem_info->signal.syncobj[i + sem_info->signal.syncobj_count],
sem_info->signal.points[i], queue_syncobj, 0, 0);
if (ret < 0)
return VK_ERROR_DEVICE_LOST;
@@ -1630,7 +1630,7 @@ radv_amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx)
for (unsigned ip = 0; ip <= AMDGPU_HW_IP_NUM; ++ip) {
for (unsigned ring = 0; ring < MAX_RINGS_PER_TYPE; ++ring) {
if (ctx->queue_syncobj[ip][ring])
ac_drm_cs_destroy_syncobj(ctx->ws->fd, ctx->queue_syncobj[ip][ring]);
ac_drm_cs_destroy_syncobj(ctx->ws->dev, ctx->queue_syncobj[ip][ring]);
}
}
@@ -1644,7 +1644,7 @@ radv_amdgpu_ctx_queue_syncobj(struct radv_amdgpu_ctx *ctx, unsigned ip, unsigned
{
uint32_t *syncobj = &ctx->queue_syncobj[ip][ring];
if (!*syncobj) {
ac_drm_cs_create_syncobj2(ctx->ws->fd, DRM_SYNCOBJ_CREATE_SIGNALED, syncobj);
ac_drm_cs_create_syncobj2(ctx->ws->dev, DRM_SYNCOBJ_CREATE_SIGNALED, syncobj);
}
return *syncobj;
}
+11 -11
View File
@@ -29,7 +29,7 @@
void amdgpu_fence_destroy(struct amdgpu_fence *fence)
{
ac_drm_cs_destroy_syncobj(fence->aws->fd, fence->syncobj);
ac_drm_cs_destroy_syncobj(fence->aws->dev, fence->syncobj);
if (fence->ctx)
amdgpu_ctx_reference(&fence->ctx, NULL);
@@ -49,7 +49,7 @@ amdgpu_fence_create(struct amdgpu_cs *acs)
amdgpu_ctx_reference(&fence->ctx, ctx);
fence->ctx = ctx;
fence->ip_type = acs->ip_type;
if (ac_drm_cs_create_syncobj2(ctx->aws->fd, 0, &fence->syncobj)) {
if (ac_drm_cs_create_syncobj2(ctx->aws->dev, 0, &fence->syncobj)) {
free(fence);
return NULL;
}
@@ -74,7 +74,7 @@ amdgpu_fence_import_syncobj(struct radeon_winsys *rws, int fd)
fence->aws = aws;
fence->ip_type = 0xffffffff;
r = ac_drm_cs_import_syncobj(aws->fd, fd, &fence->syncobj);
r = ac_drm_cs_import_syncobj(aws->dev, fd, &fence->syncobj);
if (r) {
FREE(fence);
return NULL;
@@ -100,15 +100,15 @@ amdgpu_fence_import_sync_file(struct radeon_winsys *rws, int fd)
/* fence->ctx == NULL means that the fence is syncobj-based. */
/* Convert sync_file into syncobj. */
int r = ac_drm_cs_create_syncobj2(aws->fd, 0, &fence->syncobj);
int r = ac_drm_cs_create_syncobj2(aws->dev, 0, &fence->syncobj);
if (r) {
FREE(fence);
return NULL;
}
r = ac_drm_cs_syncobj_import_sync_file(aws->fd, fence->syncobj, fd);
r = ac_drm_cs_syncobj_import_sync_file(aws->dev, fence->syncobj, fd);
if (r) {
ac_drm_cs_destroy_syncobj(aws->fd, fence->syncobj);
ac_drm_cs_destroy_syncobj(aws->dev, fence->syncobj);
FREE(fence);
return NULL;
}
@@ -129,7 +129,7 @@ static int amdgpu_fence_export_sync_file(struct radeon_winsys *rws,
util_queue_fence_wait(&fence->submitted);
/* Convert syncobj into sync_file. */
r = ac_drm_cs_syncobj_export_sync_file(aws->fd, fence->syncobj, &fd);
r = ac_drm_cs_syncobj_export_sync_file(aws->dev, fence->syncobj, &fd);
return r ? -1 : fd;
}
@@ -139,18 +139,18 @@ static int amdgpu_export_signalled_sync_file(struct radeon_winsys *rws)
uint32_t syncobj;
int fd = -1;
int r = ac_drm_cs_create_syncobj2(aws->fd, DRM_SYNCOBJ_CREATE_SIGNALED,
int r = ac_drm_cs_create_syncobj2(aws->dev, DRM_SYNCOBJ_CREATE_SIGNALED,
&syncobj);
if (r) {
return -1;
}
r = ac_drm_cs_syncobj_export_sync_file(aws->fd, syncobj, &fd);
r = ac_drm_cs_syncobj_export_sync_file(aws->dev, syncobj, &fd);
if (r) {
fd = -1;
}
ac_drm_cs_destroy_syncobj(aws->fd, syncobj);
ac_drm_cs_destroy_syncobj(aws->dev, syncobj);
return fd;
}
@@ -209,7 +209,7 @@ bool amdgpu_fence_wait(struct pipe_fence_handle *fence, uint64_t timeout,
if ((uint64_t)abs_timeout == OS_TIMEOUT_INFINITE)
abs_timeout = INT64_MAX;
if (ac_drm_cs_syncobj_wait(afence->aws->fd, &afence->syncobj, 1,
if (ac_drm_cs_syncobj_wait(afence->aws->dev, &afence->syncobj, 1,
abs_timeout, 0, NULL))
return false;
+1 -1
View File
@@ -165,7 +165,7 @@ amdgpu_userq_init(struct amdgpu_winsys *aws, struct amdgpu_userq *userq, enum am
/* The VA page table for ring buffer should be ready before job submission so that the packets
* submitted can be read by gpu. The same applies to rptr, wptr buffers also.
*/
r = ac_drm_cs_syncobj_timeline_wait(aws->fd, &aws->vm_timeline_syncobj,
r = ac_drm_cs_syncobj_timeline_wait(aws->dev, &aws->vm_timeline_syncobj,
&get_real_bo(amdgpu_winsys_bo(userq->doorbell_bo))
->vm_timeline_point,
1, INT64_MAX, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL |
@@ -101,8 +101,8 @@ static void do_winsys_deinit(struct amdgpu_winsys *aws)
simple_mtx_destroy(&aws->bo_export_table_lock);
ac_addrlib_destroy(aws->addrlib);
ac_drm_cs_destroy_syncobj(aws->dev, aws->vm_timeline_syncobj);
ac_drm_device_deinitialize(aws->dev);
ac_drm_cs_destroy_syncobj(aws->fd, aws->vm_timeline_syncobj);
simple_mtx_destroy(&aws->bo_fence_lock);
FREE(aws);
@@ -456,7 +456,7 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
aws->info.drm_major = drm_major;
aws->info.drm_minor = drm_minor;
if (ac_drm_cs_create_syncobj2(aws->fd, 0, &aws->vm_timeline_syncobj))
if (ac_drm_cs_create_syncobj2(aws->dev, 0, &aws->vm_timeline_syncobj))
goto fail_alloc;
simple_mtx_init(&aws->vm_ioctl_lock, mtx_plain);