Commit 38958bab authored by Rob Clark's avatar Rob Clark

drm/msm: don't track fbdev's gem object separately

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: default avatarRob Clark <robdclark@gmail.com>
parent ba4dd718
...@@ -35,7 +35,6 @@ static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma); ...@@ -35,7 +35,6 @@ static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma);
struct msm_fbdev { struct msm_fbdev {
struct drm_fb_helper base; struct drm_fb_helper base;
struct drm_framebuffer *fb; struct drm_framebuffer *fb;
struct drm_gem_object *bo;
}; };
static struct fb_ops msm_fb_ops = { 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) ...@@ -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 drm_fb_helper *helper = (struct drm_fb_helper *)info->par;
struct msm_fbdev *fbdev = to_msm_fbdev(helper); 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; 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) { if (ret) {
pr_err("%s:drm_gem_mmap_obj fail\n", __func__); pr_err("%s:drm_gem_mmap_obj fail\n", __func__);
return ret; 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, static int msm_fbdev_create(struct drm_fb_helper *helper,
...@@ -76,6 +75,7 @@ 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 drm_device *dev = helper->dev;
struct msm_drm_private *priv = dev->dev_private; struct msm_drm_private *priv = dev->dev_private;
struct drm_framebuffer *fb = NULL; struct drm_framebuffer *fb = NULL;
struct drm_gem_object *bo;
struct fb_info *fbi = NULL; struct fb_info *fbi = NULL;
struct drm_mode_fb_cmd2 mode_cmd = {0}; struct drm_mode_fb_cmd2 mode_cmd = {0};
uint64_t paddr; uint64_t paddr;
...@@ -97,26 +97,28 @@ static int msm_fbdev_create(struct drm_fb_helper *helper, ...@@ -97,26 +97,28 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
/* allocate backing bo */ /* allocate backing bo */
size = mode_cmd.pitches[0] * mode_cmd.height; size = mode_cmd.pitches[0] * mode_cmd.height;
DBG("allocating %d bytes for fb %d", size, dev->primary->index); 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); MSM_BO_WC | MSM_BO_STOLEN);
if (IS_ERR(fbdev->bo)) { if (IS_ERR(bo)) {
ret = PTR_ERR(fbdev->bo); ret = PTR_ERR(bo);
fbdev->bo = NULL; bo = NULL;
dev_err(dev->dev, "failed to allocate buffer object: %d\n", ret); dev_err(dev->dev, "failed to allocate buffer object: %d\n", ret);
goto fail; goto fail;
} }
fb = msm_framebuffer_init(dev, &mode_cmd, &fbdev->bo); fb = msm_framebuffer_init(dev, &mode_cmd, &bo);
if (IS_ERR(fb)) { if (IS_ERR(fb)) {
dev_err(dev->dev, "failed to allocate fb\n"); dev_err(dev->dev, "failed to allocate fb\n");
/* note: if fb creation failed, we can't rely on fb destroy /* note: if fb creation failed, we can't rely on fb destroy
* to unref the bo: * to unref the bo:
*/ */
drm_gem_object_unreference_unlocked(fbdev->bo); drm_gem_object_unreference_unlocked(bo);
ret = PTR_ERR(fb); ret = PTR_ERR(fb);
goto fail; goto fail;
} }
bo = msm_framebuffer_bo(fb, 0);
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
/* /*
...@@ -124,7 +126,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper, ...@@ -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 * in panic (ie. lock-safe, etc) we could avoid pinning the
* buffer now: * 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) { if (ret) {
dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret); dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret);
goto fail_unlock; goto fail_unlock;
...@@ -153,14 +155,14 @@ static int msm_fbdev_create(struct drm_fb_helper *helper, ...@@ -153,14 +155,14 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
dev->mode_config.fb_base = paddr; 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)) { if (IS_ERR(fbi->screen_base)) {
ret = PTR_ERR(fbi->screen_base); ret = PTR_ERR(fbi->screen_base);
goto fail_unlock; goto fail_unlock;
} }
fbi->screen_size = fbdev->bo->size; fbi->screen_size = bo->size;
fbi->fix.smem_start = paddr; 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("par=%p, %dx%d", fbi->par, fbi->var.xres, fbi->var.yres);
DBG("allocated %dx%d fb", fbdev->fb->width, fbdev->fb->height); DBG("allocated %dx%d fb", fbdev->fb->width, fbdev->fb->height);
...@@ -242,7 +244,9 @@ void msm_fbdev_free(struct drm_device *dev) ...@@ -242,7 +244,9 @@ void msm_fbdev_free(struct drm_device *dev)
/* this will free the backing object */ /* this will free the backing object */
if (fbdev->fb) { 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); drm_framebuffer_remove(fbdev->fb);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment