Skip to content

Commit

Permalink
drm/fb-helper: Automatically clean up fb_info
Browse files Browse the repository at this point in the history
Noticed that everyone duplicates the same logic here and we could safe
a few lines per driver. Yay for lots of drivers to make such tiny
refactors worth-while!

v2: Forgot to git add everything :(

v3: Actually remove release_fbi (Sean, Emil, Chris) ...

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Sean Paul <seanpaul@chromium.org>
Cc: Noralf Trønnes <noralf@tronnes.org>
Cc: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170207161603.17611-1-daniel.vetter@ffwll.ch
  • Loading branch information
Daniel Vetter committed Feb 7, 2017
1 parent ed84e25 commit da7bdda
Show file tree
Hide file tree
Showing 22 changed files with 39 additions and 104 deletions.
11 changes: 4 additions & 7 deletions drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
info = drm_fb_helper_alloc_fbi(helper);
if (IS_ERR(info)) {
ret = PTR_ERR(info);
goto out_unref;
goto out;
}

info->par = rfbdev;
Expand All @@ -233,7 +233,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
ret = amdgpu_framebuffer_init(adev->ddev, &rfbdev->rfb, &mode_cmd, gobj);
if (ret) {
DRM_ERROR("failed to initialize framebuffer %d\n", ret);
goto out_destroy_fbi;
goto out;
}

fb = &rfbdev->rfb.base;
Expand Down Expand Up @@ -266,7 +266,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,

if (info->screen_base == NULL) {
ret = -ENOSPC;
goto out_destroy_fbi;
goto out;
}

DRM_INFO("fb mappable at 0x%lX\n", info->fix.smem_start);
Expand All @@ -278,9 +278,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
vga_switcheroo_client_fb_set(adev->ddev->pdev, info);
return 0;

out_destroy_fbi:
drm_fb_helper_release_fbi(helper);
out_unref:
out:
if (abo) {

}
Expand All @@ -304,7 +302,6 @@ static int amdgpu_fbdev_destroy(struct drm_device *dev, struct amdgpu_fbdev *rfb
struct amdgpu_framebuffer *rfb = &rfbdev->rfb;

drm_fb_helper_unregister_fbi(&rfbdev->helper);
drm_fb_helper_release_fbi(&rfbdev->helper);

if (rfb->obj) {
amdgpufb_destroy_pinned_object(rfb->obj);
Expand Down
2 changes: 0 additions & 2 deletions drivers/gpu/drm/armada/armada_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ int armada_fbdev_init(struct drm_device *dev)

return 0;
err_fb_setup:
drm_fb_helper_release_fbi(fbh);
drm_fb_helper_fini(fbh);
err_fb_helper:
priv->fbdev = NULL;
Expand All @@ -179,7 +178,6 @@ void armada_fbdev_fini(struct drm_device *dev)

if (fbh) {
drm_fb_helper_unregister_fbi(fbh);
drm_fb_helper_release_fbi(fbh);

drm_fb_helper_fini(fbh);

Expand Down
9 changes: 3 additions & 6 deletions drivers/gpu/drm/ast/ast_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,13 +215,13 @@ static int astfb_create(struct drm_fb_helper *helper,
info = drm_fb_helper_alloc_fbi(helper);
if (IS_ERR(info)) {
ret = PTR_ERR(info);
goto err_free_vram;
goto out;
}
info->par = afbdev;

ret = ast_framebuffer_init(dev, &afbdev->afb, &mode_cmd, gobj);
if (ret)
goto err_release_fbi;
goto out;

afbdev->sysram = sysram;
afbdev->size = size;
Expand Down Expand Up @@ -250,9 +250,7 @@ static int astfb_create(struct drm_fb_helper *helper,

return 0;

err_release_fbi:
drm_fb_helper_release_fbi(helper);
err_free_vram:
out:
vfree(sysram);
return ret;
}
Expand Down Expand Up @@ -287,7 +285,6 @@ static void ast_fbdev_destroy(struct drm_device *dev,
struct ast_framebuffer *afb = &afbdev->afb;

drm_fb_helper_unregister_fbi(&afbdev->helper);
drm_fb_helper_release_fbi(&afbdev->helper);

if (afb->obj) {
drm_gem_object_unreference_unlocked(afb->obj);
Expand Down
5 changes: 1 addition & 4 deletions drivers/gpu/drm/bochs/bochs_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,8 @@ static int bochsfb_create(struct drm_fb_helper *helper,
info->par = &bochs->fb.helper;

ret = bochs_framebuffer_init(bochs->dev, &bochs->fb.gfb, &mode_cmd, gobj);
if (ret) {
drm_fb_helper_release_fbi(helper);
if (ret)
return ret;
}

bochs->fb.size = size;

Expand Down Expand Up @@ -144,7 +142,6 @@ static int bochs_fbdev_destroy(struct bochs_device *bochs)
DRM_DEBUG_DRIVER("\n");

drm_fb_helper_unregister_fbi(&bochs->fb.helper);
drm_fb_helper_release_fbi(&bochs->fb.helper);

if (gfb->obj) {
drm_gem_object_unreference_unlocked(gfb->obj);
Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/cirrus/cirrus_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,6 @@ static int cirrus_fbdev_destroy(struct drm_device *dev,
struct cirrus_framebuffer *gfb = &gfbdev->gfb;

drm_fb_helper_unregister_fbi(&gfbdev->helper);
drm_fb_helper_release_fbi(&gfbdev->helper);

if (gfb->obj) {
drm_gem_object_unreference_unlocked(gfb->obj);
Expand Down
3 changes: 1 addition & 2 deletions drivers/gpu/drm/drm_fb_cma_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ drm_fbdev_cma_create(struct drm_fb_helper *helper,
err_cma_destroy:
drm_framebuffer_remove(&fbdev_cma->fb->fb);
err_fb_info_destroy:
drm_fb_helper_release_fbi(helper);
drm_fb_helper_fini(helper);
err_gem_free_object:
drm_gem_object_unreference_unlocked(&obj->base);
return ret;
Expand Down Expand Up @@ -570,7 +570,6 @@ void drm_fbdev_cma_fini(struct drm_fbdev_cma *fbdev_cma)
drm_fb_helper_unregister_fbi(&fbdev_cma->fb_helper);
if (fbdev_cma->fb_helper.fbdev)
drm_fbdev_cma_defio_fini(fbdev_cma->fb_helper.fbdev);
drm_fb_helper_release_fbi(&fbdev_cma->fb_helper);

if (fbdev_cma->fb)
drm_framebuffer_remove(&fbdev_cma->fb->fb);
Expand Down
39 changes: 14 additions & 25 deletions drivers/gpu/drm/drm_fb_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -781,7 +781,9 @@ EXPORT_SYMBOL(drm_fb_helper_init);
* @fb_helper: driver-allocated fbdev helper
*
* A helper to alloc fb_info and the members cmap and apertures. Called
* by the driver within the fb_probe fb_helper callback function.
* by the driver within the fb_probe fb_helper callback function. Drivers do not
* need to release the allocated fb_info structure themselves, this is
* automatically done when calling drm_fb_helper_fini().
*
* RETURNS:
* fb_info pointer if things went okay, pointer containing error code
Expand Down Expand Up @@ -834,29 +836,6 @@ void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper)
}
EXPORT_SYMBOL(drm_fb_helper_unregister_fbi);

/**
* drm_fb_helper_release_fbi - dealloc fb_info and its members
* @fb_helper: driver-allocated fbdev helper
*
* A helper to free memory taken by fb_info and the members cmap and
* apertures
*/
void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper)
{
if (fb_helper) {
struct fb_info *info = fb_helper->fbdev;

if (info) {
if (info->cmap.len)
fb_dealloc_cmap(&info->cmap);
framebuffer_release(info);
}

fb_helper->fbdev = NULL;
}
}
EXPORT_SYMBOL(drm_fb_helper_release_fbi);

/**
* drm_fb_helper_fini - finialize a &struct drm_fb_helper
* @fb_helper: driver-allocated fbdev helper
Expand All @@ -866,9 +845,19 @@ EXPORT_SYMBOL(drm_fb_helper_release_fbi);
*/
void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
{
if (!drm_fbdev_emulation)
struct fb_info *info;

if (!drm_fbdev_emulation || !fb_helper)
return;

info = fb_helper->fbdev;
if (info) {
if (info->cmap.len)
fb_dealloc_cmap(&info->cmap);
framebuffer_release(info);
}
fb_helper->fbdev = NULL;

mutex_lock(&kernel_fb_helper_lock);
if (!list_empty(&fb_helper->kernel_fb_list)) {
list_del(&fb_helper->kernel_fb_list);
Expand Down
2 changes: 0 additions & 2 deletions drivers/gpu/drm/exynos/exynos_drm_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
VM_MAP, pgprot_writecombine(PAGE_KERNEL));
if (!exynos_gem->kvaddr) {
DRM_ERROR("failed to map pages to kernel space.\n");
drm_fb_helper_release_fbi(helper);
return -EIO;
}

Expand Down Expand Up @@ -272,7 +271,6 @@ static void exynos_drm_fbdev_destroy(struct drm_device *dev,
}

drm_fb_helper_unregister_fbi(fb_helper);
drm_fb_helper_release_fbi(fb_helper);

drm_fb_helper_fini(fb_helper);
}
Expand Down
9 changes: 3 additions & 6 deletions drivers/gpu/drm/gma500/framebuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -392,15 +392,15 @@ static int psbfb_create(struct psb_fbdev *fbdev,
info = drm_fb_helper_alloc_fbi(&fbdev->psb_fb_helper);
if (IS_ERR(info)) {
ret = PTR_ERR(info);
goto err_free_range;
goto out;
}
info->par = fbdev;

mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth);

ret = psb_framebuffer_init(dev, psbfb, &mode_cmd, backing);
if (ret)
goto err_release;
goto out;

fb = &psbfb->base;
psbfb->fbdev = info;
Expand Down Expand Up @@ -445,9 +445,7 @@ static int psbfb_create(struct psb_fbdev *fbdev,
psbfb->base.width, psbfb->base.height);

return 0;
err_release:
drm_fb_helper_release_fbi(&fbdev->psb_fb_helper);
err_free_range:
out:
psb_gtt_free_range(dev, backing);
return ret;
}
Expand Down Expand Up @@ -536,7 +534,6 @@ static int psb_fbdev_destroy(struct drm_device *dev, struct psb_fbdev *fbdev)
struct psb_framebuffer *psbfb = &fbdev->pfb;

drm_fb_helper_unregister_fbi(&fbdev->psb_fb_helper);
drm_fb_helper_release_fbi(&fbdev->psb_fb_helper);

drm_fb_helper_fini(&fbdev->psb_fb_helper);
drm_framebuffer_unregister_private(&psbfb->base);
Expand Down
2 changes: 0 additions & 2 deletions drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ static int hibmc_drm_fb_create(struct drm_fb_helper *helper,
return 0;

out_release_fbi:
drm_fb_helper_release_fbi(helper);
ret1 = ttm_bo_reserve(&bo->bo, true, false, NULL);
if (ret1) {
DRM_ERROR("failed to rsv ttm_bo when release fbi: %d\n", ret1);
Expand All @@ -170,7 +169,6 @@ static void hibmc_fbdev_destroy(struct hibmc_fbdev *fbdev)
struct drm_fb_helper *fbh = &fbdev->helper;

drm_fb_helper_unregister_fbi(fbh);
drm_fb_helper_release_fbi(fbh);

drm_fb_helper_fini(fbh);

Expand Down
5 changes: 1 addition & 4 deletions drivers/gpu/drm/i915/intel_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
if (IS_ERR(vaddr)) {
DRM_ERROR("Failed to remap framebuffer into virtual memory\n");
ret = PTR_ERR(vaddr);
goto out_destroy_fbi;
goto out_unpin;
}
info->screen_base = vaddr;
info->screen_size = vma->node.size;
Expand Down Expand Up @@ -281,8 +281,6 @@ static int intelfb_create(struct drm_fb_helper *helper,
vga_switcheroo_client_fb_set(pdev, info);
return 0;

out_destroy_fbi:
drm_fb_helper_release_fbi(helper);
out_unpin:
intel_unpin_fb_vma(vma);
out_unlock:
Expand Down Expand Up @@ -543,7 +541,6 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
*/

drm_fb_helper_unregister_fbi(&ifbdev->helper);
drm_fb_helper_release_fbi(&ifbdev->helper);

drm_fb_helper_fini(&ifbdev->helper);

Expand Down
5 changes: 1 addition & 4 deletions drivers/gpu/drm/mgag200/mgag200_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ static int mgag200fb_create(struct drm_fb_helper *helper,

ret = mgag200_framebuffer_init(dev, &mfbdev->mfb, &mode_cmd, gobj);
if (ret)
goto err_framebuffer_init;
goto err_alloc_fbi;

mfbdev->sysram = sysram;
mfbdev->size = size;
Expand Down Expand Up @@ -230,8 +230,6 @@ static int mgag200fb_create(struct drm_fb_helper *helper,

return 0;

err_framebuffer_init:
drm_fb_helper_release_fbi(helper);
err_alloc_fbi:
vfree(sysram);
err_sysram:
Expand All @@ -246,7 +244,6 @@ static int mga_fbdev_destroy(struct drm_device *dev,
struct mga_framebuffer *mfb = &mfbdev->mfb;

drm_fb_helper_unregister_fbi(&mfbdev->helper);
drm_fb_helper_release_fbi(&mfbdev->helper);

if (mfb->obj) {
drm_gem_object_unreference_unlocked(mfb->obj);
Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/msm/msm_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,6 @@ void msm_fbdev_free(struct drm_device *dev)
DBG();

drm_fb_helper_unregister_fbi(helper);
drm_fb_helper_release_fbi(helper);

drm_fb_helper_fini(helper);

Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/nouveau/nouveau_fbcon.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,6 @@ nouveau_fbcon_destroy(struct drm_device *dev, struct nouveau_fbdev *fbcon)
struct nouveau_framebuffer *nouveau_fb = nouveau_framebuffer(fbcon->helper.fb);

drm_fb_helper_unregister_fbi(&fbcon->helper);
drm_fb_helper_release_fbi(&fbcon->helper);
drm_fb_helper_fini(&fbcon->helper);

if (nouveau_fb->nvbo) {
Expand Down
4 changes: 0 additions & 4 deletions drivers/gpu/drm/omapdrm/omap_fbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,9 +222,6 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
fail:

if (ret) {

drm_fb_helper_release_fbi(helper);

if (fb)
drm_framebuffer_remove(fb);
}
Expand Down Expand Up @@ -301,7 +298,6 @@ void omap_fbdev_free(struct drm_device *dev)
DBG();

drm_fb_helper_unregister_fbi(helper);
drm_fb_helper_release_fbi(helper);

drm_fb_helper_fini(helper);

Expand Down
5 changes: 1 addition & 4 deletions drivers/gpu/drm/qxl/qxl_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ static int qxlfb_create(struct qxl_fbdev *qfbdev,

if (info->screen_base == NULL) {
ret = -ENOSPC;
goto out_destroy_fbi;
goto out_unref;
}

#ifdef CONFIG_DRM_FBDEV_EMULATION
Expand All @@ -320,8 +320,6 @@ static int qxlfb_create(struct qxl_fbdev *qfbdev,
fb->format->depth, fb->pitches[0], fb->width, fb->height);
return 0;

out_destroy_fbi:
drm_fb_helper_release_fbi(&qfbdev->helper);
out_unref:
if (qbo) {
ret = qxl_bo_reserve(qbo, false);
Expand Down Expand Up @@ -363,7 +361,6 @@ static int qxl_fbdev_destroy(struct drm_device *dev, struct qxl_fbdev *qfbdev)
struct qxl_framebuffer *qfb = &qfbdev->qfb;

drm_fb_helper_unregister_fbi(&qfbdev->helper);
drm_fb_helper_release_fbi(&qfbdev->helper);

if (qfb->obj) {
qxlfb_destroy_pinned_object(qfb->obj);
Expand Down
Loading

0 comments on commit da7bdda

Please sign in to comment.