[PATCH v2] drm/fb-helper: Propagate errors from initial config failure

Christian König christian.koenig at amd.com
Fri Dec 19 02:39:16 PST 2014


Am 19.12.2014 um 11:21 schrieb Thierry Reding:
> From: Thierry Reding <treding at nvidia.com>
>
> Make drm_fb_helper_initial_config() return an int rather than a bool so
> that the error can be properly propagated. While at it, update drivers
> to propagate errors further rather than just ignore them.
>
> v2:
> - cirrus: No cleanup is required, the top-level cirrus_driver_load()
>    will do it as part of cirrus_driver_unload() in its cleanup path.
>    Reported-by: Fengguang Wu <fengguang.wu at intel.com>
>
> Cc: David Airlie <airlied at linux.ie>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> Cc: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
> Cc: Rob Clark <robdclark at gmail.com>
> Cc: Tomi Valkeinen <tomi.valkeinen at ti.com>
> Cc: Alex Deucher <alexander.deucher at amd.com>
> Cc: Christian König <christian.koenig at amd.com>
> Cc: Ben Skeggs <bskeggs at redhat.com>
> Signed-off-by: Thierry Reding <treding at nvidia.com>
> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Reviewed-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/ast/ast_fb.c            | 21 +++++++++++++++------
>   drivers/gpu/drm/bochs/bochs_fbdev.c     | 14 ++++++++++++--
>   drivers/gpu/drm/cirrus/cirrus_fbdev.c   | 14 +++++++++-----
>   drivers/gpu/drm/drm_fb_helper.c         |  2 +-
>   drivers/gpu/drm/gma500/framebuffer.c    | 22 ++++++++++++++++++----
>   drivers/gpu/drm/mgag200/mgag200_fb.c    | 12 ++++++++++--
>   drivers/gpu/drm/msm/msm_fbdev.c         | 10 ++++++++--
>   drivers/gpu/drm/nouveau/nouveau_fbcon.c | 21 +++++++++++++++------
>   drivers/gpu/drm/omapdrm/omap_fbdev.c    | 10 ++++++++--
>   drivers/gpu/drm/qxl/qxl_fb.c            | 22 ++++++++++++++++------
>   drivers/gpu/drm/radeon/radeon_fb.c      | 21 +++++++++++++++------
>   drivers/gpu/drm/udl/udl_fb.c            | 22 +++++++++++++++-------
>   include/drm/drm_fb_helper.h             |  2 +-
>   13 files changed, 143 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
> index 5c60ae524c45..ff68eefae273 100644
> --- a/drivers/gpu/drm/ast/ast_fb.c
> +++ b/drivers/gpu/drm/ast/ast_fb.c
> @@ -335,18 +335,27 @@ int ast_fbdev_init(struct drm_device *dev)
>   
>   	ret = drm_fb_helper_init(dev, &afbdev->helper,
>   				 1, 1);
> -	if (ret) {
> -		kfree(afbdev);
> -		return ret;
> -	}
> +	if (ret)
> +		goto free;
>   
> -	drm_fb_helper_single_add_all_connectors(&afbdev->helper);
> +	ret = drm_fb_helper_single_add_all_connectors(&afbdev->helper);
> +	if (ret)
> +		goto fini;
>   
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(dev);
>   
> -	drm_fb_helper_initial_config(&afbdev->helper, 32);
> +	ret = drm_fb_helper_initial_config(&afbdev->helper, 32);
> +	if (ret)
> +		goto fini;
> +
>   	return 0;
> +
> +fini:
> +	drm_fb_helper_fini(&afbdev->helper);
> +free:
> +	kfree(afbdev);
> +	return ret;
>   }
>   
>   void ast_fbdev_fini(struct drm_device *dev)
> diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
> index 61dbf09dff5d..976d9798dc99 100644
> --- a/drivers/gpu/drm/bochs/bochs_fbdev.c
> +++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
> @@ -207,12 +207,22 @@ int bochs_fbdev_init(struct bochs_device *bochs)
>   	if (ret)
>   		return ret;
>   
> -	drm_fb_helper_single_add_all_connectors(&bochs->fb.helper);
> +	ret = drm_fb_helper_single_add_all_connectors(&bochs->fb.helper);
> +	if (ret)
> +		goto fini;
> +
>   	drm_helper_disable_unused_functions(bochs->dev);
> -	drm_fb_helper_initial_config(&bochs->fb.helper, 32);
> +
> +	ret = drm_fb_helper_initial_config(&bochs->fb.helper, 32);
> +	if (ret)
> +		goto fini;
>   
>   	bochs->fb.initialized = true;
>   	return 0;
> +
> +fini:
> +	drm_fb_helper_fini(&bochs->fb.helper);
> +	return ret;
>   }
>   
>   void bochs_fbdev_fini(struct bochs_device *bochs)
> diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> index 502a89eb54b5..5f34d7e252d3 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> @@ -317,15 +317,19 @@ int cirrus_fbdev_init(struct cirrus_device *cdev)
>   
>   	ret = drm_fb_helper_init(cdev->dev, &gfbdev->helper,
>   				 cdev->num_crtc, CIRRUSFB_CONN_LIMIT);
> -	if (ret) {
> -		kfree(gfbdev);
> +	if (ret)
> +		return ret;
> +
> +	ret = drm_fb_helper_single_add_all_connectors(&gfbdev->helper);
> +	if (ret)
>   		return ret;
> -	}
> -	drm_fb_helper_single_add_all_connectors(&gfbdev->helper);
>   
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(cdev->dev);
> -	drm_fb_helper_initial_config(&gfbdev->helper, bpp_sel);
> +
> +	ret = drm_fb_helper_initial_config(&gfbdev->helper, bpp_sel);
> +	if (ret)
> +		return ret;
>   
>   	return 0;
>   }
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index 52ce26d6b4fb..876f1ef0acd1 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -1688,7 +1688,7 @@ out:
>    * RETURNS:
>    * Zero if everything went ok, nonzero otherwise.
>    */
> -bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
> +int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
>   {
>   	struct drm_device *dev = fb_helper->dev;
>   	int count = 0;
> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
> index ddd90ddbc200..2d42ce6d3757 100644
> --- a/drivers/gpu/drm/gma500/framebuffer.c
> +++ b/drivers/gpu/drm/gma500/framebuffer.c
> @@ -593,6 +593,7 @@ int psb_fbdev_init(struct drm_device *dev)
>   {
>   	struct psb_fbdev *fbdev;
>   	struct drm_psb_private *dev_priv = dev->dev_private;
> +	int ret;
>   
>   	fbdev = kzalloc(sizeof(struct psb_fbdev), GFP_KERNEL);
>   	if (!fbdev) {
> @@ -604,16 +605,29 @@ int psb_fbdev_init(struct drm_device *dev)
>   
>   	drm_fb_helper_prepare(dev, &fbdev->psb_fb_helper, &psb_fb_helper_funcs);
>   
> -	drm_fb_helper_init(dev, &fbdev->psb_fb_helper, dev_priv->ops->crtcs,
> -							INTELFB_CONN_LIMIT);
> +	ret = drm_fb_helper_init(dev, &fbdev->psb_fb_helper,
> +				 dev_priv->ops->crtcs, INTELFB_CONN_LIMIT);
> +	if (ret)
> +		goto free;
>   
> -	drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper);
> +	ret = drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper);
> +	if (ret)
> +		goto fini;
>   
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(dev);
>   
> -	drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32);
> +	ret = drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32);
> +	if (ret)
> +		goto fini;
> +
>   	return 0;
> +
> +fini:
> +	drm_fb_helper_fini(&fbdev->psb_fb_helper);
> +free:
> +	kfree(fbdev);
> +	return ret;
>   }
>   
>   static void psb_fbdev_fini(struct drm_device *dev)
> diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c
> index 4415af3666ab..c36b8304042b 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_fb.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_fb.c
> @@ -303,14 +303,22 @@ int mgag200_fbdev_init(struct mga_device *mdev)
>   	if (ret)
>   		return ret;
>   
> -	drm_fb_helper_single_add_all_connectors(&mfbdev->helper);
> +	ret = drm_fb_helper_single_add_all_connectors(&mfbdev->helper);
> +	if (ret)
> +		goto fini;
>   
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(mdev->dev);
>   
> -	drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel);
> +	ret = drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel);
> +	if (ret)
> +		goto fini;
>   
>   	return 0;
> +
> +fini:
> +	drm_fb_helper_fini(&mfbdev->helper);
> +	return ret;
>   }
>   
>   void mgag200_fbdev_fini(struct mga_device *mdev)
> diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c
> index 94d55e526b4e..4c9467d91add 100644
> --- a/drivers/gpu/drm/msm/msm_fbdev.c
> +++ b/drivers/gpu/drm/msm/msm_fbdev.c
> @@ -242,17 +242,23 @@ struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev)
>   		goto fail;
>   	}
>   
> -	drm_fb_helper_single_add_all_connectors(helper);
> +	ret = drm_fb_helper_single_add_all_connectors(helper);
> +	if (ret)
> +		goto fini;
>   
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(dev);
>   
> -	drm_fb_helper_initial_config(helper, 32);
> +	ret = drm_fb_helper_initial_config(helper, 32);
> +	if (ret)
> +		goto fini;
>   
>   	priv->fbdev = helper;
>   
>   	return helper;
>   
> +fini:
> +	drm_fb_helper_fini(helper);
>   fail:
>   	kfree(fbdev);
>   	return NULL;
> diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> index 3ed12a8cfc91..5a7705dcd67e 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> @@ -539,12 +539,12 @@ nouveau_fbcon_init(struct drm_device *dev)
>   
>   	ret = drm_fb_helper_init(dev, &fbcon->helper,
>   				 dev->mode_config.num_crtc, 4);
> -	if (ret) {
> -		kfree(fbcon);
> -		return ret;
> -	}
> +	if (ret)
> +		goto free;
>   
> -	drm_fb_helper_single_add_all_connectors(&fbcon->helper);
> +	ret = drm_fb_helper_single_add_all_connectors(&fbcon->helper);
> +	if (ret)
> +		goto fini;
>   
>   	if (drm->device.info.ram_size <= 32 * 1024 * 1024)
>   		preferred_bpp = 8;
> @@ -557,8 +557,17 @@ nouveau_fbcon_init(struct drm_device *dev)
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(dev);
>   
> -	drm_fb_helper_initial_config(&fbcon->helper, preferred_bpp);
> +	ret = drm_fb_helper_initial_config(&fbcon->helper, preferred_bpp);
> +	if (ret)
> +		goto fini;
> +
>   	return 0;
> +
> +fini:
> +	drm_fb_helper_fini(&fbcon->helper);
> +free:
> +	kfree(fbcon);
> +	return ret;
>   }
>   
>   void
> diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c
> index 8436c6857cda..d292d24b3a6e 100644
> --- a/drivers/gpu/drm/omapdrm/omap_fbdev.c
> +++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c
> @@ -334,17 +334,23 @@ struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev)
>   		goto fail;
>   	}
>   
> -	drm_fb_helper_single_add_all_connectors(helper);
> +	ret = drm_fb_helper_single_add_all_connectors(helper);
> +	if (ret)
> +		goto fini;
>   
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(dev);
>   
> -	drm_fb_helper_initial_config(helper, 32);
> +	ret = drm_fb_helper_initial_config(helper, 32);
> +	if (ret)
> +		goto fini;
>   
>   	priv->fbdev = helper;
>   
>   	return helper;
>   
> +fini:
> +	drm_fb_helper_fini(helper);
>   fail:
>   	kfree(fbdev);
>   	return NULL;
> diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
> index 3d7c1d00a424..f778c0e8ae3c 100644
> --- a/drivers/gpu/drm/qxl/qxl_fb.c
> +++ b/drivers/gpu/drm/qxl/qxl_fb.c
> @@ -686,14 +686,24 @@ int qxl_fbdev_init(struct qxl_device *qdev)
>   	ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper,
>   				 qxl_num_crtc /* num_crtc - QXL supports just 1 */,
>   				 QXLFB_CONN_LIMIT);
> -	if (ret) {
> -		kfree(qfbdev);
> -		return ret;
> -	}
> +	if (ret)
> +		goto free;
> +
> +	ret = drm_fb_helper_single_add_all_connectors(&qfbdev->helper);
> +	if (ret)
> +		goto fini;
> +
> +	ret = drm_fb_helper_initial_config(&qfbdev->helper, bpp_sel);
> +	if (ret)
> +		goto fini;
>   
> -	drm_fb_helper_single_add_all_connectors(&qfbdev->helper);
> -	drm_fb_helper_initial_config(&qfbdev->helper, bpp_sel);
>   	return 0;
> +
> +fini:
> +	drm_fb_helper_fini(&qfbdev->helper);
> +free:
> +	kfree(qfbdev);
> +	return ret;
>   }
>   
>   void qxl_fbdev_fini(struct qxl_device *qdev)
> diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
> index 29b9220ec399..3000bc4c136b 100644
> --- a/drivers/gpu/drm/radeon/radeon_fb.c
> +++ b/drivers/gpu/drm/radeon/radeon_fb.c
> @@ -390,18 +390,27 @@ int radeon_fbdev_init(struct radeon_device *rdev)
>   	ret = drm_fb_helper_init(rdev->ddev, &rfbdev->helper,
>   				 rdev->num_crtc,
>   				 RADEONFB_CONN_LIMIT);
> -	if (ret) {
> -		kfree(rfbdev);
> -		return ret;
> -	}
> +	if (ret)
> +		goto free;
>   
> -	drm_fb_helper_single_add_all_connectors(&rfbdev->helper);
> +	ret = drm_fb_helper_single_add_all_connectors(&rfbdev->helper);
> +	if (ret)
> +		goto fini;
>   
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(rdev->ddev);
>   
> -	drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel);
> +	ret = drm_fb_helper_initial_config(&rfbdev->helper, bpp_sel);
> +	if (ret)
> +		goto fini;
> +
>   	return 0;
> +
> +fini:
> +	drm_fb_helper_fini(&rfbdev->helper);
> +free:
> +	kfree(rfbdev);
> +	return ret;
>   }
>   
>   void radeon_fbdev_fini(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
> index 8cbcb4589bd3..5fc16cecd3ba 100644
> --- a/drivers/gpu/drm/udl/udl_fb.c
> +++ b/drivers/gpu/drm/udl/udl_fb.c
> @@ -589,19 +589,27 @@ int udl_fbdev_init(struct drm_device *dev)
>   
>   	ret = drm_fb_helper_init(dev, &ufbdev->helper,
>   				 1, 1);
> -	if (ret) {
> -		kfree(ufbdev);
> -		return ret;
> -
> -	}
> +	if (ret)
> +		goto free;
>   
> -	drm_fb_helper_single_add_all_connectors(&ufbdev->helper);
> +	ret = drm_fb_helper_single_add_all_connectors(&ufbdev->helper);
> +	if (ret)
> +		goto fini;
>   
>   	/* disable all the possible outputs/crtcs before entering KMS mode */
>   	drm_helper_disable_unused_functions(dev);
>   
> -	drm_fb_helper_initial_config(&ufbdev->helper, bpp_sel);
> +	ret = drm_fb_helper_initial_config(&ufbdev->helper, bpp_sel);
> +	if (ret)
> +		goto fini;
> +
>   	return 0;
> +
> +fini:
> +	drm_fb_helper_fini(&ufbdev->helper);
> +free:
> +	kfree(ufbdev);
> +	return ret;
>   }
>   
>   void udl_fbdev_cleanup(struct drm_device *dev)
> diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
> index b597068103aa..21b944c456f6 100644
> --- a/include/drm/drm_fb_helper.h
> +++ b/include/drm/drm_fb_helper.h
> @@ -125,7 +125,7 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
>   int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
>   
>   int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
> -bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
> +int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
>   int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
>   int drm_fb_helper_debug_enter(struct fb_info *info);
>   int drm_fb_helper_debug_leave(struct fb_info *info);



More information about the dri-devel mailing list