[PATCH] drm/fb-helper: don't disable everything in initial_config

Rob Clark robdclark at gmail.com
Mon Feb 11 16:49:42 PST 2013


On Sun, Jan 27, 2013 at 11:41 AM, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> This should be done in the drivers for two reasons:
> - it gets in the way of fastboot efforts
> - it links the fb helpers with the crtc helpers instead of going
>   through the real interface vfuncs, forcing i915 to fake all the
>   ->disable callbacks used by the crtc helper to avoid ugly Oopsen
>
> v2: Resolve conflicts since drivers still call
> drm_fb_helper_single_add_all_connectors.
>

Reviewed-by: Rob Clark <robdclark at gmail.com>

> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
>  drivers/gpu/drm/ast/ast_fb.c              |    5 +++++
>  drivers/gpu/drm/cirrus/cirrus_fbdev.c     |    4 ++++
>  drivers/gpu/drm/drm_fb_cma_helper.c       |    3 +++
>  drivers/gpu/drm/drm_fb_helper.c           |    3 ---
>  drivers/gpu/drm/exynos/exynos_drm_fbdev.c |    3 +++
>  drivers/gpu/drm/gma500/framebuffer.c      |    4 ++++
>  drivers/gpu/drm/i915/intel_fb.c           |    3 +++
>  drivers/gpu/drm/mgag200/mgag200_fb.c      |    5 +++++
>  drivers/gpu/drm/nouveau/nouveau_fbcon.c   |    3 +++
>  drivers/gpu/drm/radeon/radeon_fb.c        |    4 ++++
>  drivers/gpu/drm/udl/udl_fb.c              |    4 ++++
>  drivers/staging/omapdrm/omap_fbdev.c      |    4 ++++
>  12 files changed, 42 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
> index 3e6584b..81763ca 100644
> --- a/drivers/gpu/drm/ast/ast_fb.c
> +++ b/drivers/gpu/drm/ast/ast_fb.c
> @@ -40,6 +40,7 @@
>  #include <drm/drmP.h>
>  #include <drm/drm_crtc.h>
>  #include <drm/drm_fb_helper.h>
> +#include <drm/drm_crtc_helper.h>
>  #include "ast_drv.h"
>
>  static void ast_dirty_update(struct ast_fbdev *afbdev,
> @@ -314,6 +315,10 @@ int ast_fbdev_init(struct drm_device *dev)
>         }
>
>         drm_fb_helper_single_add_all_connectors(&afbdev->helper);
> +
> +       /* disable all the possible outputs/crtcs before entering KMS mode */
> +       drm_helper_disable_unused_functions(dev);
> +
>         drm_fb_helper_initial_config(&afbdev->helper, 32);
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> index 3daea0f..b96605c 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> @@ -11,6 +11,7 @@
>  #include <linux/module.h>
>  #include <drm/drmP.h>
>  #include <drm/drm_fb_helper.h>
> +#include <drm/drm_crtc_helper.h>
>
>  #include <linux/fb.h>
>
> @@ -291,6 +292,9 @@ int cirrus_fbdev_init(struct cirrus_device *cdev)
>                 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);
>
>         return 0;
> diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
> index 1b6ba2d..ef3d33a 100644
> --- a/drivers/gpu/drm/drm_fb_cma_helper.c
> +++ b/drivers/gpu/drm/drm_fb_cma_helper.c
> @@ -333,6 +333,9 @@ struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
>
>         }
>
> +       /* disable all the possible outputs/crtcs before entering KMS mode */
> +       drm_helper_disable_unused_functions(dev);
> +
>         ret = drm_fb_helper_initial_config(helper, preferred_bpp);
>         if (ret < 0) {
>                 dev_err(dev->dev, "Failed to set inital hw configuration.\n");
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index 3132d8a..f188344 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -1357,9 +1357,6 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
>         struct drm_device *dev = fb_helper->dev;
>         int count = 0;
>
> -       /* disable all the possible outputs/crtcs before entering KMS mode */
> -       drm_helper_disable_unused_functions(fb_helper->dev);
> -
>         drm_fb_helper_parse_command_line(fb_helper);
>
>         count = drm_fb_helper_probe_connector_modes(fb_helper,
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> index 086d0f7..fe2a0f0 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
> @@ -295,6 +295,9 @@ int exynos_drm_fbdev_init(struct drm_device *dev)
>
>         }
>
> +       /* disable all the possible outputs/crtcs before entering KMS mode */
> +       drm_helper_disable_unused_functions(dev);
> +
>         ret = drm_fb_helper_initial_config(helper, PREFERRED_BPP);
>         if (ret < 0) {
>                 DRM_ERROR("failed to set up hw configuration.\n");
> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
> index c1ef37e..fee3bf8 100644
> --- a/drivers/gpu/drm/gma500/framebuffer.c
> +++ b/drivers/gpu/drm/gma500/framebuffer.c
> @@ -616,6 +616,10 @@ int psb_fbdev_init(struct drm_device *dev)
>                                                         INTELFB_CONN_LIMIT);
>
>         drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper);
> +
> +       /* 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);
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
> index 33c4f1b..69b5b3c 100644
> --- a/drivers/gpu/drm/i915/intel_fb.c
> +++ b/drivers/gpu/drm/i915/intel_fb.c
> @@ -258,6 +258,9 @@ void intel_fbdev_initial_config(struct drm_device *dev)
>  {
>         drm_i915_private_t *dev_priv = dev->dev_private;
>
> +       /* disable all the possible outputs/crtcs before entering KMS mode */
> +       drm_helper_disable_unused_functions(dev);
> +
>         /* Due to peculiar init order wrt to hpd handling this is separate. */
>         drm_fb_helper_initial_config(&dev_priv->fbdev->helper, 32);
>  }
> diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c
> index 5c69b43..5bded5b 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_fb.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_fb.c
> @@ -13,6 +13,7 @@
>  #include <linux/module.h>
>  #include <drm/drmP.h>
>  #include <drm/drm_fb_helper.h>
> +#include <drm/drm_crtc_helper.h>
>
>  #include <linux/fb.h>
>
> @@ -278,6 +279,10 @@ int mgag200_fbdev_init(struct mga_device *mdev)
>                 return ret;
>         }
>         drm_fb_helper_single_add_all_connectors(&mfbdev->helper);
> +
> +       /* disable all the possible outputs/crtcs before entering KMS mode */
> +       drm_helper_disable_unused_functions(mdev->dev);
> +
>         drm_fb_helper_initial_config(&mfbdev->helper, 32);
>
>         return 0;
> diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> index d4ecb4d..b1ebfe3 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
> @@ -491,6 +491,9 @@ nouveau_fbcon_init(struct drm_device *dev)
>         else
>                 preferred_bpp = 32;
>
> +       /* 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);
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
> index 515e5ee..b48d1c8 100644
> --- a/drivers/gpu/drm/radeon/radeon_fb.c
> +++ b/drivers/gpu/drm/radeon/radeon_fb.c
> @@ -379,6 +379,10 @@ int radeon_fbdev_init(struct radeon_device *rdev)
>         }
>
>         drm_fb_helper_single_add_all_connectors(&rfbdev->helper);
> +
> +       /* 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);
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
> index caa84f1..b610c3c 100644
> --- a/drivers/gpu/drm/udl/udl_fb.c
> +++ b/drivers/gpu/drm/udl/udl_fb.c
> @@ -583,6 +583,10 @@ int udl_fbdev_init(struct drm_device *dev)
>         }
>
>         drm_fb_helper_single_add_all_connectors(&ufbdev->helper);
> +
> +       /* 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);
>         return 0;
>  }
> diff --git a/drivers/staging/omapdrm/omap_fbdev.c b/drivers/staging/omapdrm/omap_fbdev.c
> index 2728e37..7e66eb1 100644
> --- a/drivers/staging/omapdrm/omap_fbdev.c
> +++ b/drivers/staging/omapdrm/omap_fbdev.c
> @@ -369,6 +369,10 @@ struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev)
>         }
>
>         drm_fb_helper_single_add_all_connectors(helper);
> +
> +       /* disable all the possible outputs/crtcs before entering KMS mode */
> +       drm_helper_disable_unused_functions(dev);
> +
>         drm_fb_helper_initial_config(helper, 32);
>
>         priv->fbdev = helper;
> --
> 1.7.10.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list