From d6f36224eb6cc53f5948df87626cd17ec730fc6b Mon Sep 17 00:00:00 2001 From: Dmitry Osipenko Date: Mon, 17 Nov 2025 03:52:05 +0300 Subject: [PATCH] iris: Support virtio-gpu native context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add virtio-gpu native context support to Iris driver. Acked-by: Alyssa Rosenzweig Reviewed-by: José Roberto de Souza Signed-off-by: Dmitry Osipenko Part-of: --- .../auxiliary/target-helpers/drm_helper.h | 3 +- .../drivers/iris/i915/iris_kmd_backend.c | 10 ++++-- src/gallium/drivers/iris/iris_bufmgr.c | 5 +++ src/gallium/drivers/iris/iris_screen.c | 4 +++ src/gallium/drivers/iris/iris_screen.h | 1 + src/gallium/winsys/iris/drm/iris_drm_public.h | 6 ++++ src/gallium/winsys/iris/drm/iris_drm_winsys.c | 34 +++++++++++++++++++ src/gallium/winsys/iris/drm/meson.build | 3 +- 8 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/gallium/auxiliary/target-helpers/drm_helper.h b/src/gallium/auxiliary/target-helpers/drm_helper.h index 236b68f8c0e..9700b474812 100644 --- a/src/gallium/auxiliary/target-helpers/drm_helper.h +++ b/src/gallium/auxiliary/target-helpers/drm_helper.h @@ -92,7 +92,8 @@ pipe_iris_create_screen(int fd, const struct pipe_screen_config *config) const driOptionDescription iris_driconf[] = { #include "iris/driinfo_iris.h" }; -DRM_DRIVER_DESCRIPTOR(iris, iris_driconf, ARRAY_SIZE(iris_driconf)) +DRM_DRIVER_DESCRIPTOR(iris, iris_driconf, ARRAY_SIZE(iris_driconf), + .probe_nctx = iris_drm_probe_nctx) #else DRM_DRIVER_DESCRIPTOR_STUB(iris) diff --git a/src/gallium/drivers/iris/i915/iris_kmd_backend.c b/src/gallium/drivers/iris/i915/iris_kmd_backend.c index 65beb19118c..d0c3a775afd 100644 --- a/src/gallium/drivers/iris/i915/iris_kmd_backend.c +++ b/src/gallium/drivers/iris/i915/iris_kmd_backend.c @@ -215,9 +215,15 @@ i915_gem_mmap_offset(struct iris_bufmgr *bufmgr, struct iris_bo *bo) return NULL; } + void *map; + /* And map it */ - void *map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, - iris_bufmgr_get_fd(bufmgr), mmap_arg.offset); + if (iris_bufmgr_get_device_info(bufmgr)->is_virtio) + map = intel_virtio_bo_mmap(iris_bufmgr_get_fd(bufmgr), + bo->gem_handle, bo->size, NULL); + else + map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, + iris_bufmgr_get_fd(bufmgr), mmap_arg.offset); if (map == MAP_FAILED) { DBG("%s:%d: Error mapping buffer %d (%s): %s .\n", __FILE__, __LINE__, bo->gem_handle, bo->name, strerror(errno)); diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c index a78057659b8..a2020239c82 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.c +++ b/src/gallium/drivers/iris/iris_bufmgr.c @@ -1928,6 +1928,8 @@ iris_bufmgr_destroy(struct iris_bufmgr *bufmgr) iris_bufmgr_destroy_global_vm(bufmgr); + intel_virtio_unref_fd(bufmgr->fd); + close(bufmgr->fd); simple_mtx_unlock(&bufmgr->lock); @@ -2424,6 +2426,8 @@ iris_bufmgr_create(struct intel_device_info *devinfo, int fd, bool bo_reuse) if (bufmgr->fd == -1) goto error_dup; + intel_virtio_ref_fd(bufmgr->fd); + p_atomic_set(&bufmgr->refcount, 1); simple_mtx_init(&bufmgr->lock, mtx_plain); @@ -2591,6 +2595,7 @@ error_bucket_cache: util_vma_heap_finish(&bufmgr->vma_allocator[i]); iris_bufmgr_destroy_global_vm(bufmgr); error_init_vm: + intel_virtio_unref_fd(bufmgr->fd); close(bufmgr->fd); error_dup: free(bufmgr); diff --git a/src/gallium/drivers/iris/iris_screen.c b/src/gallium/drivers/iris/iris_screen.c index 00f3760bffc..2f8c3b0378c 100644 --- a/src/gallium/drivers/iris/iris_screen.c +++ b/src/gallium/drivers/iris/iris_screen.c @@ -523,6 +523,7 @@ iris_screen_destroy(struct iris_screen *screen) u_transfer_helper_destroy(screen->base.transfer_helper); iris_bufmgr_unref(screen->bufmgr); disk_cache_destroy(screen->disk_cache); + intel_virtio_unref_fd(screen->winsys_fd); close(screen->winsys_fd); ralloc_free(screen); } @@ -667,6 +668,9 @@ iris_screen_create(int fd, const struct pipe_screen_config *config) break; } + if (intel_virtio_init_fd(fd) < 0) + return NULL; + process_intel_debug_variable(); screen->bufmgr = iris_bufmgr_get_for_fd(fd, bo_reuse); diff --git a/src/gallium/drivers/iris/iris_screen.h b/src/gallium/drivers/iris/iris_screen.h index a35b19cebc8..646ebc14cc4 100644 --- a/src/gallium/drivers/iris/iris_screen.h +++ b/src/gallium/drivers/iris/iris_screen.h @@ -11,6 +11,7 @@ #include "util/slab.h" #include "util/u_screen.h" #include "intel/dev/intel_device_info.h" +#include "intel/dev/virtio/intel_virtio.h" #include "intel/isl/isl.h" #include "iris_bufmgr.h" #include "iris_binder.h" diff --git a/src/gallium/winsys/iris/drm/iris_drm_public.h b/src/gallium/winsys/iris/drm/iris_drm_public.h index f942e05ad8b..2a740091691 100644 --- a/src/gallium/winsys/iris/drm/iris_drm_public.h +++ b/src/gallium/winsys/iris/drm/iris_drm_public.h @@ -24,10 +24,16 @@ #ifndef IRIS_DRM_PUBLIC_H #define IRIS_DRM_PUBLIC_H +#include + struct pipe_screen; struct pipe_screen_config; +struct virgl_renderer_capset_drm; struct pipe_screen * iris_drm_screen_create(int drm_fd, const struct pipe_screen_config *config); +bool +iris_drm_probe_nctx(int fd, const struct virgl_renderer_capset_drm *caps); + #endif /* IRIS_DRM_PUBLIC_H */ diff --git a/src/gallium/winsys/iris/drm/iris_drm_winsys.c b/src/gallium/winsys/iris/drm/iris_drm_winsys.c index 15095e2d3fa..54e99716b0f 100644 --- a/src/gallium/winsys/iris/drm/iris_drm_winsys.c +++ b/src/gallium/winsys/iris/drm/iris_drm_winsys.c @@ -21,11 +21,16 @@ * IN THE SOFTWARE. */ +#include #include #include +#include "intel/dev/intel_device_info.h" + #include "util/os_file.h" +#include "virtio/virtio-gpu/drm_hw.h" + #include "iris_drm_public.h" extern struct pipe_screen *iris_screen_create(int fd, const struct pipe_screen_config *config); @@ -34,3 +39,32 @@ iris_drm_screen_create(int fd, const struct pipe_screen_config *config) { return iris_screen_create(fd, config); } + +/** + * Check if the native-context type exposed by virtgpu is one we + * support, and that we support the underlying device. + */ +bool +iris_drm_probe_nctx(int fd, const struct virgl_renderer_capset_drm *caps) +{ +#ifdef HAVE_INTEL_VIRTIO + if (caps->context_type != VIRTGPU_DRM_CONTEXT_I915) + return false; + + if (debug_get_bool_option("INTEL_VIRTIO_DISABLE", false)) + return false; + + struct intel_device_info devinfo; + + if (!intel_get_device_info_from_pci_id(caps->u.intel.pci_device_id, + &devinfo)) + return false; + + if (devinfo.ver < 8 || devinfo.platform == INTEL_PLATFORM_CHV) + return false; + + return true; +#else + return false; +#endif +} diff --git a/src/gallium/winsys/iris/drm/meson.build b/src/gallium/winsys/iris/drm/meson.build index 1ed56b2e8cd..02de60245ee 100644 --- a/src/gallium/winsys/iris/drm/meson.build +++ b/src/gallium/winsys/iris/drm/meson.build @@ -9,5 +9,6 @@ libiriswinsys = static_library( inc_gallium, inc_gallium_aux, inc_gallium_drivers, ], gnu_symbol_visibility : 'hidden', - dependencies: idep_mesautil, + dependencies: [idep_intel_dev, idep_mesautil], + link_with : [libintel_dev], )