drm/virtio: Place GEM BOs in drm_framebuffer
authorDaniel Stone <daniels@collabora.com>
Fri, 30 Mar 2018 14:11:17 +0000 (15:11 +0100)
committerDaniel Stone <daniels@collabora.com>
Fri, 18 May 2018 13:52:33 +0000 (14:52 +0100)
Since drm_framebuffer can now store GEM objects directly, place them
there rather than in our own subclass. As this makes the framebuffer
create_handle and destroy functions the same as the GEM framebuffer
helper, we can reuse those.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Thierry Reding <treding@nvidia.com>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: virtualization@lists.linux-foundation.org
Link: https://patchwork.freedesktop.org/patch/msgid/20180330141138.28987-3-daniels@collabora.com
drivers/gpu/drm/virtio/virtgpu_display.c
drivers/gpu/drm/virtio/virtgpu_drv.h
drivers/gpu/drm/virtio/virtgpu_fb.c
drivers/gpu/drm/virtio/virtgpu_plane.c

index a5edd86603d9ee3321a5cba885f753cc318ff338..d6dd769a7ad3f0be7a5cf8b57dd262004c26a2c1 100644 (file)
@@ -28,6 +28,7 @@
 #include "virtgpu_drv.h"
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 
 #define XRES_MIN    32
 #define YRES_MIN    32
@@ -48,16 +49,6 @@ static const struct drm_crtc_funcs virtio_gpu_crtc_funcs = {
        .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
 };
 
-static void virtio_gpu_user_framebuffer_destroy(struct drm_framebuffer *fb)
-{
-       struct virtio_gpu_framebuffer *virtio_gpu_fb
-               = to_virtio_gpu_framebuffer(fb);
-
-       drm_gem_object_put_unlocked(virtio_gpu_fb->obj);
-       drm_framebuffer_cleanup(fb);
-       kfree(virtio_gpu_fb);
-}
-
 static int
 virtio_gpu_framebuffer_surface_dirty(struct drm_framebuffer *fb,
                                     struct drm_file *file_priv,
@@ -71,20 +62,9 @@ virtio_gpu_framebuffer_surface_dirty(struct drm_framebuffer *fb,
        return virtio_gpu_surface_dirty(virtio_gpu_fb, clips, num_clips);
 }
 
-static int
-virtio_gpu_framebuffer_create_handle(struct drm_framebuffer *fb,
-                                    struct drm_file *file_priv,
-                                    unsigned int *handle)
-{
-       struct virtio_gpu_framebuffer *virtio_gpu_fb =
-               to_virtio_gpu_framebuffer(fb);
-
-       return drm_gem_handle_create(file_priv, virtio_gpu_fb->obj, handle);
-}
-
 static const struct drm_framebuffer_funcs virtio_gpu_fb_funcs = {
-       .create_handle = virtio_gpu_framebuffer_create_handle,
-       .destroy = virtio_gpu_user_framebuffer_destroy,
+       .create_handle = drm_gem_fb_create_handle,
+       .destroy = drm_gem_fb_destroy,
        .dirty = virtio_gpu_framebuffer_surface_dirty,
 };
 
@@ -97,7 +77,7 @@ virtio_gpu_framebuffer_init(struct drm_device *dev,
        int ret;
        struct virtio_gpu_object *bo;
 
-       vgfb->obj = obj;
+       vgfb->base.obj[0] = obj;
 
        bo = gem_to_virtio_gpu_obj(obj);
 
@@ -105,7 +85,7 @@ virtio_gpu_framebuffer_init(struct drm_device *dev,
 
        ret = drm_framebuffer_init(dev, &vgfb->base, &virtio_gpu_fb_funcs);
        if (ret) {
-               vgfb->obj = NULL;
+               vgfb->base.obj[0] = NULL;
                return ret;
        }
 
index d25c8ca224aa12c58fae5d58a7ac726685d1bacf..65605e207bbe88028c76a19fb2e4eb1e4d216401 100644 (file)
@@ -124,7 +124,6 @@ struct virtio_gpu_output {
 
 struct virtio_gpu_framebuffer {
        struct drm_framebuffer base;
-       struct drm_gem_object *obj;
        int x1, y1, x2, y2; /* dirty rect */
        spinlock_t dirty_lock;
        uint32_t hw_res_handle;
index 8af69ab58b89ffb27fe2ebb27fb2948c7d8b18f5..a121b1c79522fbf37dd79f51b0f2006bbfc517de 100644 (file)
@@ -46,7 +46,7 @@ static int virtio_gpu_dirty_update(struct virtio_gpu_framebuffer *fb,
        int bpp = fb->base.format->cpp[0];
        int x2, y2;
        unsigned long flags;
-       struct virtio_gpu_object *obj = gem_to_virtio_gpu_obj(fb->obj);
+       struct virtio_gpu_object *obj = gem_to_virtio_gpu_obj(fb->base.obj[0]);
 
        if ((width <= 0) ||
            (x + width > fb->base.width) ||
@@ -121,7 +121,7 @@ int virtio_gpu_surface_dirty(struct virtio_gpu_framebuffer *vgfb,
                             unsigned int num_clips)
 {
        struct virtio_gpu_device *vgdev = vgfb->base.dev->dev_private;
-       struct virtio_gpu_object *obj = gem_to_virtio_gpu_obj(vgfb->obj);
+       struct virtio_gpu_object *obj = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
        struct drm_clip_rect norect;
        struct drm_clip_rect *clips_ptr;
        int left, right, top, bottom;
@@ -305,8 +305,8 @@ static int virtio_gpu_fbdev_destroy(struct drm_device *dev,
 
        drm_fb_helper_unregister_fbi(&vgfbdev->helper);
 
-       if (vgfb->obj)
-               vgfb->obj = NULL;
+       if (vgfb->base.obj[0])
+               vgfb->base.obj[0] = NULL;
        drm_fb_helper_fini(&vgfbdev->helper);
        drm_framebuffer_cleanup(&vgfb->base);
 
index 71ba455af915b78298662ee5daf588bd554984b0..dc5b5b2b7aab3f470ed9c3035cc7edc62790d478 100644 (file)
@@ -154,7 +154,7 @@ static void virtio_gpu_primary_plane_update(struct drm_plane *plane,
 
        if (plane->state->fb) {
                vgfb = to_virtio_gpu_framebuffer(plane->state->fb);
-               bo = gem_to_virtio_gpu_obj(vgfb->obj);
+               bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
                handle = bo->hw_res_handle;
                if (bo->dumb) {
                        virtio_gpu_cmd_transfer_to_host_2d
@@ -208,7 +208,7 @@ static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,
 
        if (plane->state->fb) {
                vgfb = to_virtio_gpu_framebuffer(plane->state->fb);
-               bo = gem_to_virtio_gpu_obj(vgfb->obj);
+               bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]);
                handle = bo->hw_res_handle;
        } else {
                handle = 0;