]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/virtio: Add fences for Guest blobs
authorVivek Kasireddy <vivek.kasireddy@intel.com>
Thu, 10 Jun 2021 23:24:54 +0000 (16:24 -0700)
committerGerd Hoffmann <kraxel@redhat.com>
Wed, 23 Jun 2021 10:11:59 +0000 (12:11 +0200)
Add prepare and cleanup routines for primary planes as well
where a fence is added only if the BO/FB associated with the
plane is a guest blob.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20210610232456.671905-2-vivek.kasireddy@intel.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
drivers/gpu/drm/virtio/virtgpu_plane.c

index 4e1b175480073863a7f59ca619b27988165f1d03..dd7a1f2db9ad6389fcbce548b451820048a4d943 100644 (file)
@@ -206,8 +206,8 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
        virtio_gpu_notify(vgdev);
 }
 
-static int virtio_gpu_cursor_prepare_fb(struct drm_plane *plane,
-                                       struct drm_plane_state *new_state)
+static int virtio_gpu_plane_prepare_fb(struct drm_plane *plane,
+                                      struct drm_plane_state *new_state)
 {
        struct drm_device *dev = plane->dev;
        struct virtio_gpu_device *vgdev = dev->dev_private;
@@ -219,7 +219,10 @@ static int virtio_gpu_cursor_prepare_fb(struct drm_plane *plane,
 
        vgfb = to_virtio_gpu_framebuffer(new_state->fb);
        bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
-       if (bo && bo->dumb && (plane->state->fb != new_state->fb)) {
+       if (!bo || (plane->type == DRM_PLANE_TYPE_PRIMARY && !bo->guest_blob))
+               return 0;
+
+       if (bo->dumb && (plane->state->fb != new_state->fb)) {
                vgfb->fence = virtio_gpu_fence_alloc(vgdev);
                if (!vgfb->fence)
                        return -ENOMEM;
@@ -228,8 +231,8 @@ static int virtio_gpu_cursor_prepare_fb(struct drm_plane *plane,
        return 0;
 }
 
-static void virtio_gpu_cursor_cleanup_fb(struct drm_plane *plane,
-                                        struct drm_plane_state *old_state)
+static void virtio_gpu_plane_cleanup_fb(struct drm_plane *plane,
+                                       struct drm_plane_state *old_state)
 {
        struct virtio_gpu_framebuffer *vgfb;
 
@@ -321,13 +324,15 @@ static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
 }
 
 static const struct drm_plane_helper_funcs virtio_gpu_primary_helper_funcs = {
+       .prepare_fb             = virtio_gpu_plane_prepare_fb,
+       .cleanup_fb             = virtio_gpu_plane_cleanup_fb,
        .atomic_check           = virtio_gpu_plane_atomic_check,
        .atomic_update          = virtio_gpu_primary_plane_update,
 };
 
 static const struct drm_plane_helper_funcs virtio_gpu_cursor_helper_funcs = {
-       .prepare_fb             = virtio_gpu_cursor_prepare_fb,
-       .cleanup_fb             = virtio_gpu_cursor_cleanup_fb,
+       .prepare_fb             = virtio_gpu_plane_prepare_fb,
+       .cleanup_fb             = virtio_gpu_plane_cleanup_fb,
        .atomic_check           = virtio_gpu_plane_atomic_check,
        .atomic_update          = virtio_gpu_cursor_plane_update,
 };