Module: Mesa Branch: main Commit: d67d501af46f04bf12a16110f3a1e86b565cac96 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d67d501af46f04bf12a16110f3a1e86b565cac96
Author: Rob Clark <robdcl...@chromium.org> Date: Fri Aug 11 13:32:10 2023 -0700 tu/drm/virtio: Switch to vdrm helper Signed-off-by: Rob Clark <robdcl...@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24733> --- src/freedreno/drm/virtio/virtio_bo.c | 2 +- src/freedreno/vulkan/meson.build | 7 +- src/freedreno/vulkan/tu_knl.h | 6 +- src/freedreno/vulkan/tu_knl_drm_virtio.cc | 402 +++++------------------------- 4 files changed, 74 insertions(+), 343 deletions(-) diff --git a/src/freedreno/drm/virtio/virtio_bo.c b/src/freedreno/drm/virtio/virtio_bo.c index a8dcc011110..f892473977f 100644 --- a/src/freedreno/drm/virtio/virtio_bo.c +++ b/src/freedreno/drm/virtio/virtio_bo.c @@ -245,7 +245,7 @@ static const struct fd_bo_funcs funcs = { .madvise = virtio_bo_madvise, .iova = virtio_bo_iova, .set_name = virtio_bo_set_name, - .dmabuf = fd_bo_dmabuf_drm, + .dmabuf = virtio_bo_dmabuf, .upload = virtio_bo_upload, .prefer_upload = virtio_bo_prefer_upload, .finalize = virtio_bo_finalize, diff --git a/src/freedreno/vulkan/meson.build b/src/freedreno/vulkan/meson.build index 065347f71cb..5dac85c38dc 100644 --- a/src/freedreno/vulkan/meson.build +++ b/src/freedreno/vulkan/meson.build @@ -91,7 +91,10 @@ endif if freedreno_kmds.contains('virtio') tu_flags += '-DTU_HAS_VIRTIO' libtu_files += files('tu_knl_drm_virtio.cc', 'tu_knl_drm.cc') - libtu_includes += inc_virtio_gpu + libtu_includes += [ + inc_virtio_gpu, + inc_virtio_vdrm, + ] tu_deps += dep_libdrm endif @@ -152,6 +155,8 @@ libvulkan_freedreno = shared_library( libfreedreno_ir3, libfreedreno_layout, libfreedreno_perfcntrs, + # TODO + libvdrm, ], dependencies : [ idep_libfreedreno_common, diff --git a/src/freedreno/vulkan/tu_knl.h b/src/freedreno/vulkan/tu_knl.h index fccfccadd2b..78cb442dc93 100644 --- a/src/freedreno/vulkan/tu_knl.h +++ b/src/freedreno/vulkan/tu_knl.h @@ -13,6 +13,7 @@ #include "tu_common.h" struct tu_u_trace_syncobj; +struct vdrm_bo; enum tu_bo_alloc_flags { @@ -41,11 +42,6 @@ enum tu_timeline_sync_state { struct tu_bo { uint32_t gem_handle; #ifdef TU_HAS_VIRTIO - /* Between the guest UMD and host native-ctx shim/proxy, guest kernel - * assigned res_id is used instead of host gem handle. This allows - * the guest to run ahead of the host without having to wait for - * response from the host when buffers are allocated. - */ uint32_t res_id; #endif uint64_t size; diff --git a/src/freedreno/vulkan/tu_knl_drm_virtio.cc b/src/freedreno/vulkan/tu_knl_drm_virtio.cc index 9c1809cc7ca..999a4af2fd4 100644 --- a/src/freedreno/vulkan/tu_knl_drm_virtio.cc +++ b/src/freedreno/vulkan/tu_knl_drm_virtio.cc @@ -33,6 +33,8 @@ #include "virglrenderer_hw.h" #include "msm_proto.h" +#include "vdrm.h" + struct tu_userspace_fence_cmd { uint32_t pkt[4]; /* first 4 dwords of packet */ uint32_t fence; /* fifth dword is fence value which is plugged in at runtime */ @@ -67,23 +69,9 @@ struct tu_u_trace_syncobj { }; struct tu_virtio_device { - uint32_t shmem_handle; + struct vdrm_device *vdrm; struct msm_shmem *shmem; - uint8_t *rsp_mem; - uint32_t rsp_mem_len; - uint32_t next_rsp_off; - simple_mtx_t rsp_lock; - simple_mtx_t eb_lock; - uint32_t next_blob_id; - uint32_t next_seqno; - - /* - * Buffering for requests to host: - */ - uint32_t reqbuf_len; - uint32_t reqbuf_cnt; - uint8_t reqbuf[0x4000]; struct tu_userspace_fence_cmds *fence_cmds; struct tu_bo *fence_cmds_mem; @@ -100,174 +88,7 @@ struct tu_virtio_device { struct u_vector zombie_vmas_stage_2; }; -#define virtio_ioctl(fd, name, args) ({ \ - MESA_TRACE_SCOPE(#name); \ - int ret = drmIoctl((fd), DRM_IOCTL_ ## name, (args)); \ - ret; \ - }) - static int tu_drm_get_param(struct tu_device *dev, uint32_t param, uint64_t *value); -static VkResult virtio_bo_map_handle(struct tu_device *dev, uint32_t handle, - uint32_t size, void **map); -static void tu_gem_close(struct tu_device *dev, uint32_t gem_handle); - -static int -get_capset(int fd, struct virgl_renderer_capset_drm *caps) -{ - struct drm_virtgpu_get_caps args = { - .cap_set_id = VIRGL_RENDERER_CAPSET_DRM, - .cap_set_ver = 0, - .addr = (uint64_t)(uintptr_t)caps, - .size = sizeof(*caps), - }; - - memset(caps, 0, sizeof(*caps)); - - return virtio_ioctl(fd, VIRTGPU_GET_CAPS, &args); -} - -static int -set_context(int fd) -{ - struct drm_virtgpu_context_set_param params[] = { - { VIRTGPU_CONTEXT_PARAM_CAPSET_ID, VIRGL_RENDERER_CAPSET_DRM }, - { VIRTGPU_CONTEXT_PARAM_NUM_RINGS, 64 }, - }; - struct drm_virtgpu_context_init args = { - .num_params = ARRAY_SIZE(params), - .ctx_set_params = (uint64_t)(uintptr_t)params, - }; - - return virtio_ioctl(fd, VIRTGPU_CONTEXT_INIT, &args); -} - -static int -execbuf_locked(struct tu_device *device, void *cmd, uint32_t cmd_size, - struct tu_queue_submit *submit, int *out_fence_fd, int ring_idx) -{ - struct drm_virtgpu_execbuffer eb = { - .flags = COND(out_fence_fd, VIRTGPU_EXECBUF_FENCE_FD_OUT) | - VIRTGPU_EXECBUF_RING_IDX, - .size = cmd_size, - .command = (uint64_t)(uintptr_t)cmd, - .ring_idx = ring_idx, - }; - - simple_mtx_assert_locked(&device->vdev->eb_lock); - - if (submit) { - eb.in_syncobjs = (uint64_t)(uintptr_t)submit->in_syncobjs; - eb.out_syncobjs = (uint64_t)(uintptr_t)submit->out_syncobjs; - eb.num_in_syncobjs = submit->nr_in_syncobjs; - eb.num_out_syncobjs = submit->nr_out_syncobjs; - eb.syncobj_stride = sizeof(struct drm_virtgpu_execbuffer_syncobj); - } - - int ret = virtio_ioctl(device->fd, VIRTGPU_EXECBUFFER, &eb); - if (ret) - return ret; - - if (out_fence_fd) - *out_fence_fd = eb.fence_fd; - - return 0; -} - -static int -execbuf_flush_locked(struct tu_device *device, int *out_fence_fd) -{ - struct tu_virtio_device *vdev = device->vdev; - - simple_mtx_assert_locked(&device->vdev->eb_lock); - - if (!vdev->reqbuf_len) - return 0; - - int ret = execbuf_locked(device, vdev->reqbuf, vdev->reqbuf_len, NULL, out_fence_fd, 0); - if (ret) - return ret; - - vdev->reqbuf_len = 0; - vdev->reqbuf_cnt = 0; - - return 0; -} - -static int -execbuf_flush(struct tu_device *device) -{ - struct tu_virtio_device *vdev = device->vdev; - simple_mtx_lock(&vdev->eb_lock); - int ret = execbuf_flush_locked(device, NULL); - simple_mtx_unlock(&vdev->eb_lock); - return ret; -} - -static int -send_ccmd(struct tu_device *device, struct vdrm_ccmd_req *req, bool sync) -{ - MESA_TRACE_FUNC(); - struct tu_virtio_device *vdev = device->vdev; - int fence_fd, ret = 0; - - simple_mtx_lock(&vdev->eb_lock); - req->seqno = ++vdev->next_seqno; - - if ((vdev->reqbuf_len + req->len) > sizeof(vdev->reqbuf)) { - ret = execbuf_flush_locked(device, NULL); - if (ret) - goto out_unlock; - } - - memcpy(&vdev->reqbuf[vdev->reqbuf_len], req, req->len); - vdev->reqbuf_len += req->len; - vdev->reqbuf_cnt++; - - if (!sync) - goto out_unlock; - - ret = execbuf_flush_locked(device, &fence_fd); - -out_unlock: - simple_mtx_unlock(&vdev->eb_lock); - - if (ret) - return ret; - - if (sync) { - MESA_TRACE_SCOPE("virtio_execbuf sync"); - sync_wait(fence_fd, -1); - close(fence_fd); - } - - return 0; -} - -static void * -virtio_alloc_rsp(struct tu_device *dev, struct vdrm_ccmd_req *req, uint32_t sz) -{ - struct tu_virtio_device *vdev = dev->vdev; - unsigned off; - - simple_mtx_lock(&vdev->rsp_lock); - - sz = align(sz, 8); - - if ((vdev->next_rsp_off + sz) >= vdev->rsp_mem_len) - vdev->next_rsp_off = 0; - - off = vdev->next_rsp_off; - vdev->next_rsp_off += sz; - - simple_mtx_unlock(&vdev->rsp_lock); - - req->rsp_off = off; - - struct vdrm_ccmd_rsp *rsp = (struct vdrm_ccmd_rsp *)&vdev->rsp_mem[off]; - rsp->len = sz; - - return rsp; -} /** * Helper for simple pass-thru ioctls @@ -276,6 +97,7 @@ static int virtio_simple_ioctl(struct tu_device *dev, unsigned cmd, void *_req) { MESA_TRACE_FUNC(); + struct vdrm_device *vdrm = dev->vdev->vdrm; unsigned req_len = sizeof(struct msm_ccmd_ioctl_simple_req); unsigned rsp_len = sizeof(struct msm_ccmd_ioctl_simple_rsp); @@ -292,9 +114,9 @@ virtio_simple_ioctl(struct tu_device *dev, unsigned cmd, void *_req) memcpy(req->payload, _req, _IOC_SIZE(cmd)); rsp = (struct msm_ccmd_ioctl_simple_rsp *) - virtio_alloc_rsp(dev, &req->hdr, rsp_len); + vdrm_alloc_rsp(vdrm, &req->hdr, rsp_len); - int ret = send_ccmd(dev, &req->hdr, true); + int ret = vdrm_send_req(vdrm, &req->hdr, true); if (cmd & IOC_OUT) memcpy(_req, rsp->payload, _IOC_SIZE(cmd)); @@ -313,45 +135,7 @@ set_iova(struct tu_device *device, uint32_t res_id, uint64_t iova) .res_id = res_id, }; - return send_ccmd(device, &req.hdr, false); -} - -#define SHMEM_SZ 0x4000 - -static VkResult -init_shmem(struct tu_device *dev, struct tu_virtio_device *vdev) -{ - struct tu_instance *instance = dev->physical_device->instance; - struct drm_virtgpu_resource_create_blob args = { - .blob_mem = VIRTGPU_BLOB_MEM_HOST3D, - .blob_flags = VIRTGPU_BLOB_FLAG_USE_MAPPABLE, - .size = SHMEM_SZ, - .blob_id = 0, - }; - VkResult result; - int ret; - - ret = virtio_ioctl(dev->fd, VIRTGPU_RESOURCE_CREATE_BLOB, &args); - if (ret) { - return vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED, - "failed to allocate shmem buffer"); - } - - vdev->shmem_handle = args.bo_handle; - - result = virtio_bo_map_handle(dev, vdev->shmem_handle, args.size, - (void **)&vdev->shmem); - if (result != VK_SUCCESS) { - tu_gem_close(dev, vdev->shmem_handle); - vdev->shmem_handle = 0; - return vk_startup_errorf(instance, result, "failed to map shmem buffer"); - } - - uint32_t offset = vdev->shmem->base.rsp_mem_offset; - vdev->rsp_mem_len = args.size - offset; - vdev->rsp_mem = &((uint8_t *)vdev->shmem)[offset]; - - return VK_SUCCESS; + return vdrm_send_req(device->vdev->vdrm, &req.hdr, false); } static int @@ -415,7 +199,7 @@ set_debuginfo(struct tu_device *dev) memcpy(&req->payload[0], comm, comm_len); memcpy(&req->payload[comm_len], cmdline, cmdline_len); - send_ccmd(dev, &req->hdr, false); + vdrm_send_req(dev->vdev->vdrm, &req->hdr, false); free(req); } @@ -424,7 +208,6 @@ static VkResult virtio_device_init(struct tu_device *dev) { struct tu_instance *instance = dev->physical_device->instance; - VkResult result; int fd; fd = open(dev->physical_device->fd_path, O_RDWR | O_CLOEXEC); @@ -433,16 +216,6 @@ virtio_device_init(struct tu_device *dev) "failed to open device %s", dev->physical_device->fd_path); } - /* We don't need to get capset again, we already know we are good there - * from the initial device file open. But we still need to set the ctx - * type on the device fd that we'll _actually_ be using.. - */ - if (set_context(fd)) { - close(fd); - return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER, - "Could not set context type: %s", strerror(errno)); - } - struct tu_virtio_device *vdev = (struct tu_virtio_device *) vk_zalloc(&instance->vk.alloc, sizeof(*vdev), 8, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); @@ -451,20 +224,15 @@ virtio_device_init(struct tu_device *dev) return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY); }; - simple_mtx_init(&vdev->rsp_lock, mtx_plain); - simple_mtx_init(&vdev->eb_lock, mtx_plain); - u_vector_init(&vdev->zombie_vmas_stage_2, 64, sizeof(struct tu_zombie_vma)); dev->vdev = vdev; dev->fd = fd; - result = init_shmem(dev, vdev); - if (result != VK_SUCCESS) { - vk_free(&instance->vk.alloc, vdev); - close(fd); - return result; - } + vdev->vdrm = vdrm_device_connect(fd, VIRTGPU_DRM_CONTEXT_MSM); + + p_atomic_set(&vdev->next_blob_id, 1); + vdev->shmem = to_msm_shmem(vdev->vdrm->shmem); query_faults(dev, &dev->fault_count); @@ -481,8 +249,7 @@ virtio_device_finish(struct tu_device *dev) u_vector_finish(&vdev->zombie_vmas_stage_2); - munmap(vdev->shmem, SHMEM_SZ); - tu_gem_close(dev, vdev->shmem_handle); + vdrm_device_close(vdev->vdrm); vk_free(&instance->vk.alloc, vdev); dev->vdev = NULL; @@ -563,25 +330,14 @@ virtio_submitqueue_close(struct tu_device *dev, uint32_t queue_id) virtio_simple_ioctl(dev, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &queue_id); } -static void -tu_gem_close(struct tu_device *dev, uint32_t gem_handle) -{ - struct drm_gem_close req = { - .handle = gem_handle, - }; - - /* Need to flush buffered SET_IOVA cmds before closing handles: */ - execbuf_flush(dev); - - drmIoctl(dev->fd, DRM_IOCTL_GEM_CLOSE, &req); -} - static VkResult tu_wait_fence(struct tu_device *dev, uint32_t queue_id, int fence, uint64_t timeout_ns) { + struct vdrm_device *vdrm = dev->vdev->vdrm; + if (!fence_before(dev->global_bo_map->userspace_fence, fence)) return VK_SUCCESS; @@ -601,9 +357,9 @@ tu_wait_fence(struct tu_device *dev, do { rsp = (struct msm_ccmd_submitqueue_query_rsp *) - virtio_alloc_rsp(dev, &req.hdr, sizeof(*rsp)); + vdrm_alloc_rsp(vdrm, &req.hdr, sizeof(*rsp)); - ret = send_ccmd(dev, &req.hdr, true); + ret = vdrm_send_req(vdrm, &req.hdr, true); if (ret) goto out; @@ -672,7 +428,7 @@ tu_free_zombie_vma_locked(struct tu_device *dev, bool wait) u_vector_remove(&vdev->zombie_vmas_stage_2); util_vma_heap_free(&dev->vma, vma->iova, vma->size); - tu_gem_close(dev, vma->gem_handle); + vdrm_bo_close(dev->vdev->vdrm, vma->gem_handle); } return VK_SUCCESS; @@ -736,7 +492,7 @@ tu_bo_init(struct tu_device *dev, if (!new_ptr) { dev->bo_count--; mtx_unlock(&dev->bo_mutex); - tu_gem_close(dev, gem_handle); + vdrm_bo_close(dev->vdev->vdrm, bo->gem_handle); return VK_ERROR_OUT_OF_HOST_MEMORY; } @@ -797,7 +553,7 @@ tu_bo_set_kernel_name(struct tu_device *dev, struct tu_bo *bo, const char *name) memcpy(req->payload, name, sz); - send_ccmd(dev, &req->hdr, false); + vdrm_send_req(dev->vdev->vdrm, &req->hdr, false); } static VkResult @@ -810,10 +566,6 @@ virtio_bo_init(struct tu_device *dev, const char *name) { struct tu_virtio_device *vdev = dev->vdev; - struct drm_virtgpu_resource_create_blob args = { - .blob_mem = VIRTGPU_BLOB_MEM_HOST3D, - .size = size, - }; struct msm_ccmd_gem_new_req req = { .hdr = MSM_CCMD(GEM_NEW, sizeof(req)), .size = size, @@ -836,48 +588,40 @@ virtio_bo_init(struct tu_device *dev, req.flags |= MSM_BO_WC; } + uint32_t blob_flags = 0; if (mem_property & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { - args.blob_flags |= VIRTGPU_BLOB_FLAG_USE_MAPPABLE; + blob_flags |= VIRTGPU_BLOB_FLAG_USE_MAPPABLE; } if (!(mem_property & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)) { - args.blob_flags |= VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE | + blob_flags |= VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE | VIRTGPU_BLOB_FLAG_USE_SHAREABLE; } if (flags & TU_BO_ALLOC_GPU_READ_ONLY) req.flags |= MSM_BO_GPU_READONLY; - args.blob_id = p_atomic_inc_return(&vdev->next_blob_id); - args.cmd = (uint64_t)(intptr_t)(&req); - args.cmd_size = sizeof(req); - /* tunneled cmds are processed separately on host side, * before the renderer->get_blob() callback.. the blob_id * is used to link the created bo to the get_blob() call */ - req.blob_id = args.blob_id; + req.blob_id = p_atomic_inc_return(&vdev->next_blob_id);; - /* RESOURCE_CREATE_BLOB has a "back-door" EXECBUF in terms of - * the tunneled cmds. To preserve the ordering, we need to - * flush any buffered ccmds and do the ioctl with eb_lock - * held. - */ - simple_mtx_lock(&vdev->eb_lock); - execbuf_flush_locked(dev, NULL); - req.hdr.seqno = ++vdev->next_seqno; - int ret = virtio_ioctl(dev->fd, VIRTGPU_RESOURCE_CREATE_BLOB, &args); - simple_mtx_unlock(&vdev->eb_lock); + uint32_t handle = + vdrm_bo_create(vdev->vdrm, size, blob_flags, req.blob_id, &req.hdr); - if (ret) + if (!handle) { + util_vma_heap_free(&dev->vma, req.iova, size); return vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); + } - struct tu_bo* bo = tu_device_lookup_bo(dev, args.res_handle); + uint32_t res_id = vdrm_handle_to_res_id(vdev->vdrm, handle); + struct tu_bo* bo = tu_device_lookup_bo(dev, res_id); assert(bo && bo->gem_handle == 0); - bo->res_id = args.res_handle; + bo->res_id = res_id; - result = tu_bo_init(dev, bo, args.bo_handle, size, req.iova, flags, name); + result = tu_bo_init(dev, bo, handle, size, req.iova, flags, name); if (result != VK_SUCCESS) memset(bo, 0, sizeof(*bo)); else @@ -909,6 +653,7 @@ virtio_bo_init_dmabuf(struct tu_device *dev, uint64_t size, int prime_fd) { + struct vdrm_device *vdrm = dev->vdev->vdrm; VkResult result; struct tu_bo* bo = NULL; @@ -934,21 +679,21 @@ virtio_bo_init_dmabuf(struct tu_device *dev, */ u_rwlock_wrlock(&dev->dma_bo_lock); - struct drm_virtgpu_resource_info args = {}; - int ret = drmPrimeFDToHandle(dev->fd, prime_fd, - &args.bo_handle); - if (ret) { + uint32_t handle, res_id; + + handle = vdrm_dmabuf_to_handle(vdrm, prime_fd); + if (!handle) { result = vk_error(dev, VK_ERROR_INVALID_EXTERNAL_HANDLE); goto out_unlock; } - ret = virtio_ioctl(dev->fd, VIRTGPU_RESOURCE_INFO, &args); - if (ret) { + res_id = vdrm_handle_to_res_id(vdrm, handle); + if (!res_id) { result = vk_error(dev, VK_ERROR_INVALID_EXTERNAL_HANDLE); goto out_unlock; } - bo = tu_device_lookup_bo(dev, args.res_handle); + bo = tu_device_lookup_bo(dev, res_id); if (bo->refcnt != 0) { p_atomic_inc(&bo->refcnt); @@ -957,9 +702,7 @@ virtio_bo_init_dmabuf(struct tu_device *dev, goto out_unlock; } - bo->res_id = args.res_handle; - - result = tu_bo_init(dev, bo, args.bo_handle, size, iova, + result = tu_bo_init(dev, bo, handle, size, iova, TU_BO_ALLOC_NO_FLAGS, "dmabuf"); if (result != VK_SUCCESS) memset(bo, 0, sizeof(*bo)); @@ -977,33 +720,17 @@ out_unlock: return result; } -static VkResult -virtio_bo_map_handle(struct tu_device *dev, uint32_t handle, - uint32_t size, void **map) -{ - struct drm_virtgpu_map req = { - .handle = handle, - }; - int ret; - - ret = virtio_ioctl(dev->fd, VIRTGPU_MAP, &req); - if (ret) - return vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); - - *map = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, dev->fd, req.offset); - if (*map == MAP_FAILED) - return vk_error(dev, VK_ERROR_MEMORY_MAP_FAILED); - - return VK_SUCCESS; -} - static VkResult virtio_bo_map(struct tu_device *dev, struct tu_bo *bo) { if (bo->map) return VK_SUCCESS; - return virtio_bo_map_handle(dev, bo->gem_handle, bo->size, &bo->map); + bo->map = vdrm_bo_map(dev->vdev->vdrm, bo->gem_handle, bo->size); + if (bo->map == MAP_FAILED) + return vk_error(dev, VK_ERROR_MEMORY_MAP_FAILED); + + return VK_SUCCESS; } static void @@ -1193,6 +920,8 @@ tu_queue_build_msm_gem_submit_cmds(struct tu_queue *queue, /* Last, add the userspace fence cmd: */ struct tu_userspace_fence_cmds *fcmds = vdev->fence_cmds; + if (queue->fence <= 0) + queue->fence = 0; uint32_t fence = ++queue->fence; int idx = fence % ARRAY_SIZE(fcmds->cmds); @@ -1323,11 +1052,16 @@ tu_queue_submit_locked(struct tu_queue *queue, struct tu_queue_submit *submit) int ring_idx = queue->priority + 1; int ret; - simple_mtx_lock(&vdev->eb_lock); - ret = execbuf_flush_locked(queue->device, NULL) || - execbuf_locked(queue->device, &req->hdr, req->hdr.len, - submit, NULL, ring_idx); - simple_mtx_unlock(&vdev->eb_lock); + struct vdrm_execbuf_params p = { + .ring_idx = ring_idx, + .req = &req->hdr, + .in_syncobjs = submit->in_syncobjs, + .out_syncobjs = submit->out_syncobjs, + .num_in_syncobjs = submit->nr_in_syncobjs, + .num_out_syncobjs = submit->nr_out_syncobjs, + }; + + ret = vdrm_execbuf(vdev->vdrm, &p); mtx_unlock(&queue->device->bo_mutex); @@ -1498,6 +1232,7 @@ tu_knl_drm_virtio_load(struct tu_instance *instance, struct tu_physical_device **out) { struct virgl_renderer_capset_drm caps; + struct vdrm_device *vdrm; VkResult result = VK_SUCCESS; uint64_t val; @@ -1511,15 +1246,15 @@ tu_knl_drm_virtio_load(struct tu_instance *instance, version->name); } - if (get_capset(fd, &caps)) { + vdrm = vdrm_device_connect(fd, VIRTGPU_DRM_CONTEXT_MSM); + if (!vdrm) { return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER, - "could not get caps: %s", strerror(errno)); + "could not get connect vdrm: %s", strerror(errno)); } - if (caps.context_type != VIRTGPU_DRM_CONTEXT_MSM) { - return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER, - "wrong context_type: %u", caps.context_type); - } + caps = vdrm->caps; + + vdrm_device_close(vdrm); mesa_logd("wire_format_version: %u", caps.wire_format_version); mesa_logd("version_major: %u", caps.version_major); @@ -1553,11 +1288,6 @@ tu_knl_drm_virtio_load(struct tu_instance *instance, "No address space"); } - if (set_context(fd)) { - return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER, - "Could not set context type: %s", strerror(errno)); - } - struct tu_physical_device *device = (struct tu_physical_device *) vk_zalloc(&instance->vk.alloc, sizeof(*device), 8, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);