drm/cirrus: Place GEM BOs in drm_framebuffer
authorDaniel Stone <daniels@collabora.com>
Fri, 30 Mar 2018 14:11:15 +0000 (15:11 +0100)
committerDaniel Stone <daniels@collabora.com>
Fri, 18 May 2018 13:52:18 +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-1-daniels@collabora.com
drivers/gpu/drm/cirrus/cirrus_drv.h
drivers/gpu/drm/cirrus/cirrus_fbdev.c
drivers/gpu/drm/cirrus/cirrus_main.c
drivers/gpu/drm/cirrus/cirrus_mode.c

index be2d7e4880621a075b4d0f900d14cc204e86c262..70b23629be0a9dd5b82d6a53b734c959d0cf3978 100644 (file)
@@ -119,7 +119,6 @@ struct cirrus_connector {
 
 struct cirrus_framebuffer {
        struct drm_framebuffer          base;
-       struct drm_gem_object *obj;
 };
 
 struct cirrus_mc {
index 32fbfba2c623a7ddbb43d68534316b5a8485d950..a74d328469589d6c28816804cecb3dcb8733d635 100644 (file)
@@ -29,7 +29,7 @@ static void cirrus_dirty_update(struct cirrus_fbdev *afbdev,
        int x2, y2;
        unsigned long flags;
 
-       obj = afbdev->gfb.obj;
+       obj = afbdev->gfb.base.obj[0];
        bo = gem_to_cirrus_bo(obj);
 
        /*
@@ -250,9 +250,9 @@ static int cirrus_fbdev_destroy(struct drm_device *dev,
 
        drm_fb_helper_unregister_fbi(&gfbdev->helper);
 
-       if (gfb->obj) {
-               drm_gem_object_put_unlocked(gfb->obj);
-               gfb->obj = NULL;
+       if (gfb->base.obj[0]) {
+               drm_gem_object_put_unlocked(gfb->base.obj[0]);
+               gfb->base.obj[0] = NULL;
        }
 
        vfree(gfbdev->sysram);
index 26df1e8cd490d57f9fd3af3624f484a588114735..f1ee4139ff19321dd45c7fec1d219e76dc81bd17 100644 (file)
  */
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 
 #include "cirrus_drv.h"
 
-static int cirrus_create_handle(struct drm_framebuffer *fb,
-                               struct drm_file* file_priv,
-                               unsigned int* handle)
-{
-       struct cirrus_framebuffer *cirrus_fb = to_cirrus_framebuffer(fb);
-
-       return drm_gem_handle_create(file_priv, cirrus_fb->obj, handle);
-}
-
-static void cirrus_user_framebuffer_destroy(struct drm_framebuffer *fb)
-{
-       struct cirrus_framebuffer *cirrus_fb = to_cirrus_framebuffer(fb);
-
-       drm_gem_object_put_unlocked(cirrus_fb->obj);
-       drm_framebuffer_cleanup(fb);
-       kfree(fb);
-}
-
 static const struct drm_framebuffer_funcs cirrus_fb_funcs = {
-       .create_handle = cirrus_create_handle,
-       .destroy = cirrus_user_framebuffer_destroy,
+       .create_handle = drm_gem_fb_create_handle,
+       .destroy = drm_gem_fb_destroy,
 };
 
 int cirrus_framebuffer_init(struct drm_device *dev,
@@ -44,7 +27,7 @@ int cirrus_framebuffer_init(struct drm_device *dev,
        int ret;
 
        drm_helper_mode_fill_fb_struct(dev, &gfb->base, mode_cmd);
-       gfb->obj = obj;
+       gfb->base.obj[0] = obj;
        ret = drm_framebuffer_init(dev, &gfb->base, &cirrus_fb_funcs);
        if (ret) {
                DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
index c91b9b054e3f77805bd3ae00b0db3bf74144f6d1..91b9c42013fffdfd22c4075a3997372c5b303b9a 100644 (file)
@@ -110,7 +110,7 @@ static int cirrus_crtc_do_set_base(struct drm_crtc *crtc,
        /* push the previous fb to system ram */
        if (!atomic && fb) {
                cirrus_fb = to_cirrus_framebuffer(fb);
-               obj = cirrus_fb->obj;
+               obj = cirrus_fb->base.obj[0];
                bo = gem_to_cirrus_bo(obj);
                ret = cirrus_bo_reserve(bo, false);
                if (ret)
@@ -120,7 +120,7 @@ static int cirrus_crtc_do_set_base(struct drm_crtc *crtc,
        }
 
        cirrus_fb = to_cirrus_framebuffer(crtc->primary->fb);
-       obj = cirrus_fb->obj;
+       obj = cirrus_fb->base.obj[0];
        bo = gem_to_cirrus_bo(obj);
 
        ret = cirrus_bo_reserve(bo, false);