drm/msm: don't track fbdev's gem object separately
authorRob Clark <robdclark@gmail.com>
Tue, 11 Jul 2017 14:13:29 +0000 (10:13 -0400)
committerRob Clark <robdclark@gmail.com>
Tue, 22 Aug 2017 17:20:38 +0000 (13:20 -0400)
The drm_framebuffer is refcnt'd these days and will unref the underlying
bo as needed.  So we can simplify a little.

Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/msm_fbdev.c

index 5ecf4ff9a05982882691f0f76044c38d21790174..53dc3ee41177991c0c46960e9d532734fcc130d3 100644 (file)
@@ -35,7 +35,6 @@ static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma);
 struct msm_fbdev {
        struct drm_fb_helper base;
        struct drm_framebuffer *fb;
-       struct drm_gem_object *bo;
 };
 
 static struct fb_ops msm_fb_ops = {
@@ -57,16 +56,16 @@ static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
        struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par;
        struct msm_fbdev *fbdev = to_msm_fbdev(helper);
-       struct drm_gem_object *drm_obj = fbdev->bo;
+       struct drm_gem_object *bo = msm_framebuffer_bo(fbdev->fb, 0);
        int ret = 0;
 
-       ret = drm_gem_mmap_obj(drm_obj, drm_obj->size, vma);
+       ret = drm_gem_mmap_obj(bo, bo->size, vma);
        if (ret) {
                pr_err("%s:drm_gem_mmap_obj fail\n", __func__);
                return ret;
        }
 
-       return msm_gem_mmap_obj(drm_obj, vma);
+       return msm_gem_mmap_obj(bo, vma);
 }
 
 static int msm_fbdev_create(struct drm_fb_helper *helper,
@@ -76,6 +75,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
        struct drm_device *dev = helper->dev;
        struct msm_drm_private *priv = dev->dev_private;
        struct drm_framebuffer *fb = NULL;
+       struct drm_gem_object *bo;
        struct fb_info *fbi = NULL;
        struct drm_mode_fb_cmd2 mode_cmd = {0};
        uint64_t paddr;
@@ -97,26 +97,28 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
        /* allocate backing bo */
        size = mode_cmd.pitches[0] * mode_cmd.height;
        DBG("allocating %d bytes for fb %d", size, dev->primary->index);
-       fbdev->bo = msm_gem_new(dev, size, MSM_BO_SCANOUT |
+       bo = msm_gem_new(dev, size, MSM_BO_SCANOUT |
                        MSM_BO_WC | MSM_BO_STOLEN);
-       if (IS_ERR(fbdev->bo)) {
-               ret = PTR_ERR(fbdev->bo);
-               fbdev->bo = NULL;
+       if (IS_ERR(bo)) {
+               ret = PTR_ERR(bo);
+               bo = NULL;
                dev_err(dev->dev, "failed to allocate buffer object: %d\n", ret);
                goto fail;
        }
 
-       fb = msm_framebuffer_init(dev, &mode_cmd, &fbdev->bo);
+       fb = msm_framebuffer_init(dev, &mode_cmd, &bo);
        if (IS_ERR(fb)) {
                dev_err(dev->dev, "failed to allocate fb\n");
                /* note: if fb creation failed, we can't rely on fb destroy
                 * to unref the bo:
                 */
-               drm_gem_object_unreference_unlocked(fbdev->bo);
+               drm_gem_object_unreference_unlocked(bo);
                ret = PTR_ERR(fb);
                goto fail;
        }
 
+       bo = msm_framebuffer_bo(fb, 0);
+
        mutex_lock(&dev->struct_mutex);
 
        /*
@@ -124,7 +126,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
         * in panic (ie. lock-safe, etc) we could avoid pinning the
         * buffer now:
         */
-       ret = msm_gem_get_iova(fbdev->bo, priv->kms->aspace, &paddr);
+       ret = msm_gem_get_iova(bo, priv->kms->aspace, &paddr);
        if (ret) {
                dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret);
                goto fail_unlock;
@@ -153,14 +155,14 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
 
        dev->mode_config.fb_base = paddr;
 
-       fbi->screen_base = msm_gem_get_vaddr(fbdev->bo);
+       fbi->screen_base = msm_gem_get_vaddr(bo);
        if (IS_ERR(fbi->screen_base)) {
                ret = PTR_ERR(fbi->screen_base);
                goto fail_unlock;
        }
-       fbi->screen_size = fbdev->bo->size;
+       fbi->screen_size = bo->size;
        fbi->fix.smem_start = paddr;
-       fbi->fix.smem_len = fbdev->bo->size;
+       fbi->fix.smem_len = bo->size;
 
        DBG("par=%p, %dx%d", fbi->par, fbi->var.xres, fbi->var.yres);
        DBG("allocated %dx%d fb", fbdev->fb->width, fbdev->fb->height);
@@ -242,7 +244,9 @@ void msm_fbdev_free(struct drm_device *dev)
 
        /* this will free the backing object */
        if (fbdev->fb) {
-               msm_gem_put_vaddr(fbdev->bo);
+               struct drm_gem_object *bo =
+                       msm_framebuffer_bo(fbdev->fb, 0);
+               msm_gem_put_vaddr(bo);
                drm_framebuffer_remove(fbdev->fb);
        }