[PATCH 03/35] drm/<drivers>: reorder framebuffer init sequence
Rob Clark
robdclark at gmail.com
Fri Jan 11 13:06:00 PST 2013
On Thu, Jan 10, 2013 at 2:47 PM, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> With more fine-grained locking we can no longer rely on the big
> mode_config lock to prevent concurrent access to mode resources
> like framebuffers. Instead a framebuffer becomes accessible to
> other threads as soon as it is added to the relevant lookup
> structures. Hence it needs to be fully set up by the time drivers
> call drm_framebuffer_init.
>
> This patch here is the drivers part of that reorg. Nothing really fancy
> going on safe for three special cases.
>
> - exynos needs to be careful to properly unref all handles.
> - nouveau gets a resource leak fixed for free: one of the error
> cases didn't cleanup the framebuffer, which is now moot since
> the framebuffer is only registered once it is fully set up.
> - vmwgfx requires a slight reordering of operations, I'm hoping I didn't
> break anything (but it's refcount management only, so should be safe).
>
> v2: Split out exynos, since it's a bit more hairy than expected.
>
> v3: Drop bogus cirrus hunk noticed by Richard Wilbur.
>
> v4: Split out vmwgfx since there's a small change in return values.
>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
for the omapdrm part:
Reviewed-by: Rob Clark <rob at ti.com>
> ---
> drivers/gpu/drm/ast/ast_main.c | 4 ++--
> drivers/gpu/drm/cirrus/cirrus_main.c | 4 ++--
> drivers/gpu/drm/drm_fb_cma_helper.c | 10 +++++-----
> drivers/gpu/drm/gma500/framebuffer.c | 4 ++--
> drivers/gpu/drm/i915/intel_display.c | 5 +++--
> drivers/gpu/drm/mgag200/mgag200_main.c | 8 +++++---
> drivers/gpu/drm/nouveau/nouveau_display.c | 10 +++++-----
> drivers/gpu/drm/radeon/radeon_display.c | 2 +-
> drivers/gpu/drm/udl/udl_fb.c | 2 +-
> drivers/staging/omapdrm/omap_fb.c | 16 ++++++++--------
> 10 files changed, 34 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
> index f668e6c..d5ba709 100644
> --- a/drivers/gpu/drm/ast/ast_main.c
> +++ b/drivers/gpu/drm/ast/ast_main.c
> @@ -266,13 +266,13 @@ int ast_framebuffer_init(struct drm_device *dev,
> {
> int ret;
>
> + drm_helper_mode_fill_fb_struct(&ast_fb->base, mode_cmd);
> + ast_fb->obj = obj;
> ret = drm_framebuffer_init(dev, &ast_fb->base, &ast_fb_funcs);
> if (ret) {
> DRM_ERROR("framebuffer init failed %d\n", ret);
> return ret;
> }
> - drm_helper_mode_fill_fb_struct(&ast_fb->base, mode_cmd);
> - ast_fb->obj = obj;
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c
> index 6a9b12e..364474c 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_main.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_main.c
> @@ -42,13 +42,13 @@ int cirrus_framebuffer_init(struct drm_device *dev,
> {
> int ret;
>
> + drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
> + gfb->obj = obj;
> ret = drm_framebuffer_init(dev, &gfb->base, &cirrus_fb_funcs);
> if (ret) {
> DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
> return ret;
> }
> - drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
> - gfb->obj = obj;
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
> index fd9d0af..e1e0cb0 100644
> --- a/drivers/gpu/drm/drm_fb_cma_helper.c
> +++ b/drivers/gpu/drm/drm_fb_cma_helper.c
> @@ -85,6 +85,11 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
> if (!fb_cma)
> return ERR_PTR(-ENOMEM);
>
> + drm_helper_mode_fill_fb_struct(&fb_cma->fb, mode_cmd);
> +
> + for (i = 0; i < num_planes; i++)
> + fb_cma->obj[i] = obj[i];
> +
> ret = drm_framebuffer_init(dev, &fb_cma->fb, &drm_fb_cma_funcs);
> if (ret) {
> dev_err(dev->dev, "Failed to initalize framebuffer: %d\n", ret);
> @@ -92,11 +97,6 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
> return ERR_PTR(ret);
> }
>
> - drm_helper_mode_fill_fb_struct(&fb_cma->fb, mode_cmd);
> -
> - for (i = 0; i < num_planes; i++)
> - fb_cma->obj[i] = obj[i];
> -
> return fb_cma;
> }
>
> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
> index afded54..38e7e75 100644
> --- a/drivers/gpu/drm/gma500/framebuffer.c
> +++ b/drivers/gpu/drm/gma500/framebuffer.c
> @@ -260,13 +260,13 @@ static int psb_framebuffer_init(struct drm_device *dev,
> default:
> return -EINVAL;
> }
> + drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd);
> + fb->gtt = gt;
> ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs);
> if (ret) {
> dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
> return ret;
> }
> - drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd);
> - fb->gtt = gt;
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index cf0c713..b2af790 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -8387,14 +8387,15 @@ int intel_framebuffer_init(struct drm_device *dev,
> if (mode_cmd->offsets[0] != 0)
> return -EINVAL;
>
> + drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
> + intel_fb->obj = obj;
> +
> ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs);
> if (ret) {
> DRM_ERROR("framebuffer init failed %d\n", ret);
> return ret;
> }
>
> - drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
> - intel_fb->obj = obj;
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
> index 70dd3c5..266438a 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_main.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_main.c
> @@ -40,13 +40,15 @@ int mgag200_framebuffer_init(struct drm_device *dev,
> struct drm_mode_fb_cmd2 *mode_cmd,
> struct drm_gem_object *obj)
> {
> - int ret = drm_framebuffer_init(dev, &gfb->base, &mga_fb_funcs);
> + int ret;
> +
> + drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
> + gfb->obj = obj;
> + ret = drm_framebuffer_init(dev, &gfb->base, &mga_fb_funcs);
> if (ret) {
> DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
> return ret;
> }
> - drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
> - gfb->obj = obj;
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
> index e4188f2..2591ff2 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_display.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_display.c
> @@ -78,11 +78,6 @@ nouveau_framebuffer_init(struct drm_device *dev,
> struct drm_framebuffer *fb = &nv_fb->base;
> int ret;
>
> - ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
> - if (ret) {
> - return ret;
> - }
> -
> drm_helper_mode_fill_fb_struct(fb, mode_cmd);
> nv_fb->nvbo = nvbo;
>
> @@ -125,6 +120,11 @@ nouveau_framebuffer_init(struct drm_device *dev,
> }
> }
>
> + ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
> + if (ret) {
> + return ret;
> + }
> +
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
> index 1da2386..12ec3ef 100644
> --- a/drivers/gpu/drm/radeon/radeon_display.c
> +++ b/drivers/gpu/drm/radeon/radeon_display.c
> @@ -1089,12 +1089,12 @@ radeon_framebuffer_init(struct drm_device *dev,
> {
> int ret;
> rfb->obj = obj;
> + drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd);
> ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs);
> if (ret) {
> rfb->obj = NULL;
> return ret;
> }
> - drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd);
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
> index d4ab3be..829c4a7 100644
> --- a/drivers/gpu/drm/udl/udl_fb.c
> +++ b/drivers/gpu/drm/udl/udl_fb.c
> @@ -435,8 +435,8 @@ udl_framebuffer_init(struct drm_device *dev,
> int ret;
>
> ufb->obj = obj;
> - ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs);
> drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd);
> + ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs);
> return ret;
> }
>
> diff --git a/drivers/staging/omapdrm/omap_fb.c b/drivers/staging/omapdrm/omap_fb.c
> index 09028e9..bf6421f 100644
> --- a/drivers/staging/omapdrm/omap_fb.c
> +++ b/drivers/staging/omapdrm/omap_fb.c
> @@ -424,14 +424,6 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
> }
>
> fb = &omap_fb->base;
> - ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs);
> - if (ret) {
> - dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
> - goto fail;
> - }
> -
> - DBG("create: FB ID: %d (%p)", fb->base.id, fb);
> -
> omap_fb->format = format;
>
> for (i = 0; i < n; i++) {
> @@ -462,6 +454,14 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
>
> drm_helper_mode_fill_fb_struct(fb, mode_cmd);
>
> + ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs);
> + if (ret) {
> + dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
> + goto fail;
> + }
> +
> + DBG("create: FB ID: %d (%p)", fb->base.id, fb);
> +
> return fb;
>
> fail:
> --
> 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