From 36b6f3ade4dc6f2dfffd93d06caad5a56289885b Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 28 Nov 2024 09:13:13 -0800 Subject: [PATCH] vdrm+tu+fd: Make cross-device optional Similar to commit 087e9a96d131 ("venus: make cross-device optional"), make VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE use optional, because qemu does not support this. Fixes: 06e57e32310f ("virtio: Add vdrm native-context helper") Signed-off-by: Rob Clark Part-of: (cherry picked from commit dfd519ed80f7e8fc6700d27c454085e2a1038875) --- .pick_status.json | 2 +- src/freedreno/drm/virtio/virtio_bo.c | 5 +++-- src/freedreno/vulkan/tu_knl_drm_virtio.cc | 5 +++-- src/virtio/vdrm/vdrm.h | 1 + src/virtio/vdrm/vdrm_virtgpu.c | 21 +++++++++++++++++++++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index a450d5dcea1..b66e6286720 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1694,7 +1694,7 @@ "description": "vdrm+tu+fd: Make cross-device optional", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "06e57e32310f51e752d7798e287400e8edc10312", "notes": null diff --git a/src/freedreno/drm/virtio/virtio_bo.c b/src/freedreno/drm/virtio/virtio_bo.c index 888fbce106d..9145b5184fe 100644 --- a/src/freedreno/drm/virtio/virtio_bo.c +++ b/src/freedreno/drm/virtio/virtio_bo.c @@ -316,8 +316,9 @@ virtio_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags) uint32_t blob_flags = 0; if (flags & (FD_BO_SHARED | FD_BO_SCANOUT)) { - blob_flags = VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE | - VIRTGPU_BLOB_FLAG_USE_SHAREABLE; + blob_flags = VIRTGPU_BLOB_FLAG_USE_SHAREABLE; + if (virtio_dev->vdrm->supports_cross_device) + blob_flags |= VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE; } if (!(flags & FD_BO_NOMAP)) { diff --git a/src/freedreno/vulkan/tu_knl_drm_virtio.cc b/src/freedreno/vulkan/tu_knl_drm_virtio.cc index afb86d018b6..112cbbfcbae 100644 --- a/src/freedreno/vulkan/tu_knl_drm_virtio.cc +++ b/src/freedreno/vulkan/tu_knl_drm_virtio.cc @@ -667,8 +667,9 @@ virtio_bo_init(struct tu_device *dev, } if (!(mem_property & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)) { - blob_flags |= VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE | - VIRTGPU_BLOB_FLAG_USE_SHAREABLE; + blob_flags |= VIRTGPU_BLOB_FLAG_USE_SHAREABLE; + if (vdev->vdrm->supports_cross_device) + blob_flags |= VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE; } if (flags & TU_BO_ALLOC_GPU_READ_ONLY) diff --git a/src/virtio/vdrm/vdrm.h b/src/virtio/vdrm/vdrm.h index 3afb3ff0ef2..e7a5d3cb8bb 100644 --- a/src/virtio/vdrm/vdrm.h +++ b/src/virtio/vdrm/vdrm.h @@ -54,6 +54,7 @@ struct vdrm_device { const struct vdrm_device_funcs *funcs; struct virgl_renderer_capset_drm caps; + bool supports_cross_device; struct vdrm_shmem *shmem; uint8_t *rsp_mem; uint32_t rsp_mem_len; diff --git a/src/virtio/vdrm/vdrm_virtgpu.c b/src/virtio/vdrm/vdrm_virtgpu.c index 13c133ca749..fa7b4ebb4df 100644 --- a/src/virtio/vdrm/vdrm_virtgpu.c +++ b/src/virtio/vdrm/vdrm_virtgpu.c @@ -350,6 +350,20 @@ init_shmem(struct virtgpu_device *vgdev) return 0; } +static uint64_t +get_param(int fd, uint64_t param) +{ + /* val must be zeroed because kernel only writes the lower 32 bits */ + uint64_t val = 0; + struct drm_virtgpu_getparam args = { + .param = param, + .value = (uintptr_t)&val, + }; + + const int ret = virtgpu_ioctl(fd, VIRTGPU_GETPARAM, &args); + return ret ? 0 : val; +} + struct vdrm_device * vdrm_virtgpu_connect(int fd, uint32_t context_type); struct vdrm_device * @@ -395,5 +409,12 @@ vdrm_virtgpu_connect(int fd, uint32_t context_type) vdev->caps = caps; vdev->funcs = &funcs; + /* Cross-device feature is optional. It enables sharing dma-bufs + * with other virtio devices, like virtio-wl or virtio-video used + * by ChromeOS VMs. Qemu doesn't support cross-device sharing. + */ + if (get_param(fd, VIRTGPU_PARAM_CROSS_DEVICE)) + vdev->supports_cross_device = true; + return vdev; }