diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_fb.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fb.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c index b2c1a29cc12b..51b1219af87f 100644 --- a/drivers/gpu/drm/omapdrm/omap_fb.c +++ b/drivers/gpu/drm/omapdrm/omap_fb.c | |||
@@ -17,11 +17,11 @@ | |||
17 | * this program. If not, see <http://www.gnu.org/licenses/>. | 17 | * this program. If not, see <http://www.gnu.org/licenses/>. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include "omap_drv.h" | 20 | #include <drm/drm_crtc.h> |
21 | #include "omap_dmm_tiler.h" | 21 | #include <drm/drm_crtc_helper.h> |
22 | 22 | ||
23 | #include "drm_crtc.h" | 23 | #include "omap_dmm_tiler.h" |
24 | #include "drm_crtc_helper.h" | 24 | #include "omap_drv.h" |
25 | 25 | ||
26 | /* | 26 | /* |
27 | * framebuffer funcs | 27 | * framebuffer funcs |
@@ -89,6 +89,8 @@ struct omap_framebuffer { | |||
89 | int pin_count; | 89 | int pin_count; |
90 | const struct format *format; | 90 | const struct format *format; |
91 | struct plane planes[4]; | 91 | struct plane planes[4]; |
92 | /* lock for pinning (pin_count and planes.paddr) */ | ||
93 | struct mutex lock; | ||
92 | }; | 94 | }; |
93 | 95 | ||
94 | static int omap_framebuffer_create_handle(struct drm_framebuffer *fb, | 96 | static int omap_framebuffer_create_handle(struct drm_framebuffer *fb, |
@@ -250,8 +252,11 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb) | |||
250 | struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); | 252 | struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); |
251 | int ret, i, n = drm_format_num_planes(fb->pixel_format); | 253 | int ret, i, n = drm_format_num_planes(fb->pixel_format); |
252 | 254 | ||
255 | mutex_lock(&omap_fb->lock); | ||
256 | |||
253 | if (omap_fb->pin_count > 0) { | 257 | if (omap_fb->pin_count > 0) { |
254 | omap_fb->pin_count++; | 258 | omap_fb->pin_count++; |
259 | mutex_unlock(&omap_fb->lock); | ||
255 | return 0; | 260 | return 0; |
256 | } | 261 | } |
257 | 262 | ||
@@ -265,6 +270,8 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb) | |||
265 | 270 | ||
266 | omap_fb->pin_count++; | 271 | omap_fb->pin_count++; |
267 | 272 | ||
273 | mutex_unlock(&omap_fb->lock); | ||
274 | |||
268 | return 0; | 275 | return 0; |
269 | 276 | ||
270 | fail: | 277 | fail: |
@@ -274,32 +281,33 @@ fail: | |||
274 | plane->paddr = 0; | 281 | plane->paddr = 0; |
275 | } | 282 | } |
276 | 283 | ||
284 | mutex_unlock(&omap_fb->lock); | ||
285 | |||
277 | return ret; | 286 | return ret; |
278 | } | 287 | } |
279 | 288 | ||
280 | /* unpin, no longer being scanned out: */ | 289 | /* unpin, no longer being scanned out: */ |
281 | int omap_framebuffer_unpin(struct drm_framebuffer *fb) | 290 | void omap_framebuffer_unpin(struct drm_framebuffer *fb) |
282 | { | 291 | { |
283 | struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); | 292 | struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); |
284 | int ret, i, n = drm_format_num_planes(fb->pixel_format); | 293 | int i, n = drm_format_num_planes(fb->pixel_format); |
294 | |||
295 | mutex_lock(&omap_fb->lock); | ||
285 | 296 | ||
286 | omap_fb->pin_count--; | 297 | omap_fb->pin_count--; |
287 | 298 | ||
288 | if (omap_fb->pin_count > 0) | 299 | if (omap_fb->pin_count > 0) { |
289 | return 0; | 300 | mutex_unlock(&omap_fb->lock); |
301 | return; | ||
302 | } | ||
290 | 303 | ||
291 | for (i = 0; i < n; i++) { | 304 | for (i = 0; i < n; i++) { |
292 | struct plane *plane = &omap_fb->planes[i]; | 305 | struct plane *plane = &omap_fb->planes[i]; |
293 | ret = omap_gem_put_paddr(plane->bo); | 306 | omap_gem_put_paddr(plane->bo); |
294 | if (ret) | ||
295 | goto fail; | ||
296 | plane->paddr = 0; | 307 | plane->paddr = 0; |
297 | } | 308 | } |
298 | 309 | ||
299 | return 0; | 310 | mutex_unlock(&omap_fb->lock); |
300 | |||
301 | fail: | ||
302 | return ret; | ||
303 | } | 311 | } |
304 | 312 | ||
305 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p) | 313 | struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p) |
@@ -411,6 +419,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, | |||
411 | 419 | ||
412 | fb = &omap_fb->base; | 420 | fb = &omap_fb->base; |
413 | omap_fb->format = format; | 421 | omap_fb->format = format; |
422 | mutex_init(&omap_fb->lock); | ||
414 | 423 | ||
415 | for (i = 0; i < n; i++) { | 424 | for (i = 0; i < n; i++) { |
416 | struct plane *plane = &omap_fb->planes[i]; | 425 | struct plane *plane = &omap_fb->planes[i]; |