/* If atomic, assume fb object is pinned & idle & fenced and
         * just update base pointers
         */
-       obj = radeon_fb->obj;
+       obj = radeon_fb->base.obj[0];
        rbo = gem_to_radeon_bo(obj);
        r = radeon_bo_reserve(rbo, false);
        if (unlikely(r != 0))
 
        if (!atomic && fb && fb != crtc->primary->fb) {
                radeon_fb = to_radeon_framebuffer(fb);
-               rbo = gem_to_radeon_bo(radeon_fb->obj);
+               rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
                r = radeon_bo_reserve(rbo, false);
                if (unlikely(r != 0))
                        return r;
                target_fb = crtc->primary->fb;
        }
 
-       obj = radeon_fb->obj;
+       obj = radeon_fb->base.obj[0];
        rbo = gem_to_radeon_bo(obj);
        r = radeon_bo_reserve(rbo, false);
        if (unlikely(r != 0))
 
        if (!atomic && fb && fb != crtc->primary->fb) {
                radeon_fb = to_radeon_framebuffer(fb);
-               rbo = gem_to_radeon_bo(radeon_fb->obj);
+               rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
                r = radeon_bo_reserve(rbo, false);
                if (unlikely(r != 0))
                        return r;
                struct radeon_bo *rbo;
 
                radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
-               rbo = gem_to_radeon_bo(radeon_fb->obj);
+               rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
                r = radeon_bo_reserve(rbo, false);
                if (unlikely(r))
                        DRM_ERROR("failed to reserve rbo before unpin\n");
 
                        }
                }
 
-               if (rfb == NULL || rfb->obj == NULL) {
+               if (rfb == NULL || rfb->base.obj[0] == NULL) {
                        continue;
                }
-               robj = gem_to_radeon_bo(rfb->obj);
+               robj = gem_to_radeon_bo(rfb->base.obj[0]);
                /* don't unpin kernel fb objects */
                if (!radeon_fbdev_robj_is_fb(rdev, robj)) {
                        r = radeon_bo_reserve(robj, false);
 
 
 #include <linux/pm_runtime.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_edid.h>
 
        /* schedule unpin of the old buffer */
        old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
-       obj = old_radeon_fb->obj;
+       obj = old_radeon_fb->base.obj[0];
 
        /* take a reference to the old object */
        drm_gem_object_get(obj);
        work->old_rbo = gem_to_radeon_bo(obj);
 
        new_radeon_fb = to_radeon_framebuffer(fb);
-       obj = new_radeon_fb->obj;
+       obj = new_radeon_fb->base.obj[0];
        new_rbo = gem_to_radeon_bo(obj);
 
        /* pin the new buffer */
 
 }
 
-static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
-{
-       struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb);
-
-       drm_gem_object_put_unlocked(radeon_fb->obj);
-       drm_framebuffer_cleanup(fb);
-       kfree(radeon_fb);
-}
-
-static int radeon_user_framebuffer_create_handle(struct drm_framebuffer *fb,
-                                                 struct drm_file *file_priv,
-                                                 unsigned int *handle)
-{
-       struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb);
-
-       return drm_gem_handle_create(file_priv, radeon_fb->obj, handle);
-}
-
 static const struct drm_framebuffer_funcs radeon_fb_funcs = {
-       .destroy = radeon_user_framebuffer_destroy,
-       .create_handle = radeon_user_framebuffer_create_handle,
+       .destroy = drm_gem_fb_destroy,
+       .create_handle = drm_gem_fb_create_handle,
 };
 
 int
                        struct drm_gem_object *obj)
 {
        int ret;
-       rfb->obj = obj;
+       rfb->base.obj[0] = obj;
        drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd);
        ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs);
        if (ret) {
-               rfb->obj = NULL;
+               rfb->base.obj[0] = NULL;
                return ret;
        }
        return 0;
 
 
        drm_fb_helper_unregister_fbi(&rfbdev->helper);
 
-       if (rfb->obj) {
-               radeonfb_destroy_pinned_object(rfb->obj);
-               rfb->obj = NULL;
+       if (rfb->base.obj[0]) {
+               radeonfb_destroy_pinned_object(rfb->base.obj[0]);
+               rfb->base.obj[0] = NULL;
                drm_framebuffer_unregister_private(&rfb->base);
                drm_framebuffer_cleanup(&rfb->base);
        }
        if (!rdev->mode_info.rfbdev)
                return false;
 
-       if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj))
+       if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.base.obj[0]))
                return true;
        return false;
 }
 
        }
 
        /* Pin framebuffer & get tilling informations */
-       obj = radeon_fb->obj;
+       obj = radeon_fb->base.obj[0];
        rbo = gem_to_radeon_bo(obj);
 retry:
        r = radeon_bo_reserve(rbo, false);
                        struct radeon_bo *old_rbo;
                        unsigned long nsize, osize;
 
-                       old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj);
+                       old_rbo = gem_to_radeon_bo(fb->obj[0]);
                        osize = radeon_bo_size(old_rbo);
                        nsize = radeon_bo_size(rbo);
                        if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
        WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
 
        if (!atomic && fb && fb != crtc->primary->fb) {
-               radeon_fb = to_radeon_framebuffer(fb);
-               rbo = gem_to_radeon_bo(radeon_fb->obj);
+               rbo = gem_to_radeon_bo(fb->obj[0]);
                r = radeon_bo_reserve(rbo, false);
                if (unlikely(r != 0))
                        return r;
        radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
        if (crtc->primary->fb) {
                int r;
-               struct radeon_framebuffer *radeon_fb;
                struct radeon_bo *rbo;
 
-               radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
-               rbo = gem_to_radeon_bo(radeon_fb->obj);
+               rbo = gem_to_radeon_bo(crtc->primary->fb->obj[0]);
                r = radeon_bo_reserve(rbo, false);
                if (unlikely(r))
                        DRM_ERROR("failed to reserve rbo before unpin\n");
 
 
 struct radeon_framebuffer {
        struct drm_framebuffer base;
-       struct drm_gem_object *obj;
 };
 
 #define ENCODER_MODE_IS_DP(em) (((em) == ATOM_ENCODER_MODE_DP) || \