aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-13 17:38:38 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-01-20 09:29:24 -0500
commitc7d73f6a8ad71f9d9f58c86981322c6e48093a4f (patch)
tree5710889ea53df0cb695f96175708a91e430e8e45 /drivers
parent065a50ed3ef75cb265e12e3e1b615db0835150bc (diff)
drm/<drivers>: reorder framebuffer init sequence
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. Reviewed-by: Rob Clark <rob@ti.com> (core + omapdrm) Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/ast/ast_main.c4
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_main.c4
-rw-r--r--drivers/gpu/drm/drm_fb_cma_helper.c10
-rw-r--r--drivers/gpu/drm/gma500/framebuffer.c4
-rw-r--r--drivers/gpu/drm/i915/intel_display.c5
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_main.c8
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_display.c10
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c2
-rw-r--r--drivers/gpu/drm/udl/udl_fb.c2
-rw-r--r--drivers/staging/omapdrm/omap_fb.c16
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 f668e6cc0f7a..d5ba7097e5b5 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,
266{ 266{
267 int ret; 267 int ret;
268 268
269 drm_helper_mode_fill_fb_struct(&ast_fb->base, mode_cmd);
270 ast_fb->obj = obj;
269 ret = drm_framebuffer_init(dev, &ast_fb->base, &ast_fb_funcs); 271 ret = drm_framebuffer_init(dev, &ast_fb->base, &ast_fb_funcs);
270 if (ret) { 272 if (ret) {
271 DRM_ERROR("framebuffer init failed %d\n", ret); 273 DRM_ERROR("framebuffer init failed %d\n", ret);
272 return ret; 274 return ret;
273 } 275 }
274 drm_helper_mode_fill_fb_struct(&ast_fb->base, mode_cmd);
275 ast_fb->obj = obj;
276 return 0; 276 return 0;
277} 277}
278 278
diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c
index 6a9b12e88d46..364474c66202 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,
42{ 42{
43 int ret; 43 int ret;
44 44
45 drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
46 gfb->obj = obj;
45 ret = drm_framebuffer_init(dev, &gfb->base, &cirrus_fb_funcs); 47 ret = drm_framebuffer_init(dev, &gfb->base, &cirrus_fb_funcs);
46 if (ret) { 48 if (ret) {
47 DRM_ERROR("drm_framebuffer_init failed: %d\n", ret); 49 DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
48 return ret; 50 return ret;
49 } 51 }
50 drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
51 gfb->obj = obj;
52 return 0; 52 return 0;
53} 53}
54 54
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
index fd9d0af4d536..e1e0cb0d531a 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,
85 if (!fb_cma) 85 if (!fb_cma)
86 return ERR_PTR(-ENOMEM); 86 return ERR_PTR(-ENOMEM);
87 87
88 drm_helper_mode_fill_fb_struct(&fb_cma->fb, mode_cmd);
89
90 for (i = 0; i < num_planes; i++)
91 fb_cma->obj[i] = obj[i];
92
88 ret = drm_framebuffer_init(dev, &fb_cma->fb, &drm_fb_cma_funcs); 93 ret = drm_framebuffer_init(dev, &fb_cma->fb, &drm_fb_cma_funcs);
89 if (ret) { 94 if (ret) {
90 dev_err(dev->dev, "Failed to initalize framebuffer: %d\n", ret); 95 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,
92 return ERR_PTR(ret); 97 return ERR_PTR(ret);
93 } 98 }
94 99
95 drm_helper_mode_fill_fb_struct(&fb_cma->fb, mode_cmd);
96
97 for (i = 0; i < num_planes; i++)
98 fb_cma->obj[i] = obj[i];
99
100 return fb_cma; 100 return fb_cma;
101} 101}
102 102
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
index afded54dbb10..38e7e7597de2 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,
260 default: 260 default:
261 return -EINVAL; 261 return -EINVAL;
262 } 262 }
263 drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd);
264 fb->gtt = gt;
263 ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs); 265 ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs);
264 if (ret) { 266 if (ret) {
265 dev_err(dev->dev, "framebuffer init failed: %d\n", ret); 267 dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
266 return ret; 268 return ret;
267 } 269 }
268 drm_helper_mode_fill_fb_struct(&fb->base, mode_cmd);
269 fb->gtt = gt;
270 return 0; 270 return 0;
271} 271}
272 272
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index da1ad9c80bb5..26fa6a795afe 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -8666,14 +8666,15 @@ int intel_framebuffer_init(struct drm_device *dev,
8666 if (mode_cmd->offsets[0] != 0) 8666 if (mode_cmd->offsets[0] != 0)
8667 return -EINVAL; 8667 return -EINVAL;
8668 8668
8669 drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
8670 intel_fb->obj = obj;
8671
8669 ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs); 8672 ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs);
8670 if (ret) { 8673 if (ret) {
8671 DRM_ERROR("framebuffer init failed %d\n", ret); 8674 DRM_ERROR("framebuffer init failed %d\n", ret);
8672 return ret; 8675 return ret;
8673 } 8676 }
8674 8677
8675 drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
8676 intel_fb->obj = obj;
8677 return 0; 8678 return 0;
8678} 8679}
8679 8680
diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
index 70dd3c5529d4..266438af61ea 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,
40 struct drm_mode_fb_cmd2 *mode_cmd, 40 struct drm_mode_fb_cmd2 *mode_cmd,
41 struct drm_gem_object *obj) 41 struct drm_gem_object *obj)
42{ 42{
43 int ret = drm_framebuffer_init(dev, &gfb->base, &mga_fb_funcs); 43 int ret;
44
45 drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
46 gfb->obj = obj;
47 ret = drm_framebuffer_init(dev, &gfb->base, &mga_fb_funcs);
44 if (ret) { 48 if (ret) {
45 DRM_ERROR("drm_framebuffer_init failed: %d\n", ret); 49 DRM_ERROR("drm_framebuffer_init failed: %d\n", ret);
46 return ret; 50 return ret;
47 } 51 }
48 drm_helper_mode_fill_fb_struct(&gfb->base, mode_cmd);
49 gfb->obj = obj;
50 return 0; 52 return 0;
51} 53}
52 54
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index 508b00a2ce0d..d42c9e860c16 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,
78 struct drm_framebuffer *fb = &nv_fb->base; 78 struct drm_framebuffer *fb = &nv_fb->base;
79 int ret; 79 int ret;
80 80
81 ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
82 if (ret) {
83 return ret;
84 }
85
86 drm_helper_mode_fill_fb_struct(fb, mode_cmd); 81 drm_helper_mode_fill_fb_struct(fb, mode_cmd);
87 nv_fb->nvbo = nvbo; 82 nv_fb->nvbo = nvbo;
88 83
@@ -125,6 +120,11 @@ nouveau_framebuffer_init(struct drm_device *dev,
125 } 120 }
126 } 121 }
127 122
123 ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
124 if (ret) {
125 return ret;
126 }
127
128 return 0; 128 return 0;
129} 129}
130 130
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 1da2386d7cf7..12ec3effb409 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,
1089{ 1089{
1090 int ret; 1090 int ret;
1091 rfb->obj = obj; 1091 rfb->obj = obj;
1092 drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd);
1092 ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); 1093 ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs);
1093 if (ret) { 1094 if (ret) {
1094 rfb->obj = NULL; 1095 rfb->obj = NULL;
1095 return ret; 1096 return ret;
1096 } 1097 }
1097 drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd);
1098 return 0; 1098 return 0;
1099} 1099}
1100 1100
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index d4ab3beaada0..829c4a76938c 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,
435 int ret; 435 int ret;
436 436
437 ufb->obj = obj; 437 ufb->obj = obj;
438 ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs);
439 drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd); 438 drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd);
439 ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs);
440 return ret; 440 return ret;
441} 441}
442 442
diff --git a/drivers/staging/omapdrm/omap_fb.c b/drivers/staging/omapdrm/omap_fb.c
index 09028e9c1093..bf6421f26c40 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,
424 } 424 }
425 425
426 fb = &omap_fb->base; 426 fb = &omap_fb->base;
427 ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs);
428 if (ret) {
429 dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
430 goto fail;
431 }
432
433 DBG("create: FB ID: %d (%p)", fb->base.id, fb);
434
435 omap_fb->format = format; 427 omap_fb->format = format;
436 428
437 for (i = 0; i < n; i++) { 429 for (i = 0; i < n; i++) {
@@ -462,6 +454,14 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
462 454
463 drm_helper_mode_fill_fb_struct(fb, mode_cmd); 455 drm_helper_mode_fill_fb_struct(fb, mode_cmd);
464 456
457 ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs);
458 if (ret) {
459 dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
460 goto fail;
461 }
462
463 DBG("create: FB ID: %d (%p)", fb->base.id, fb);
464
465 return fb; 465 return fb;
466 466
467fail: 467fail: