diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2015-06-04 03:56:33 -0400 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2015-06-12 15:52:51 -0400 |
commit | f524ab7c070b39f4c8bd76fede6cacd17057ebc3 (patch) | |
tree | 023c263bb84ca62c897de1d75875a5ca5ba36283 /drivers/gpu/drm/omapdrm/omap_fb.c | |
parent | 794a65ffba77f63ecfc7d23ca6406cc23deab202 (diff) |
drm: omapdrm: add lock for fb pinning
Before atomic modesetting omap_framebuffer_pin() and
omap_framebuffer_unpin() were always called with modesetting locks
taken. With atomic modesetting support this is no longer the case, and
we need locking to protect the pin_count and the paddr, as multiple
threads may pin the same fb concurrently.
This patch adds a mutex to struct omap_framebuffer, and uses it in
omap_framebuffer_pin() and omap_framebuffer_unpin().
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_fb.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fb.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c index e505140a8782..0b967e76df1a 100644 --- a/drivers/gpu/drm/omapdrm/omap_fb.c +++ b/drivers/gpu/drm/omapdrm/omap_fb.c | |||
@@ -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,6 +281,8 @@ 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 | ||
@@ -283,10 +292,14 @@ int omap_framebuffer_unpin(struct drm_framebuffer *fb) | |||
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 ret, i, n = drm_format_num_planes(fb->pixel_format); |
285 | 294 | ||
295 | mutex_lock(&omap_fb->lock); | ||
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) { |
300 | mutex_unlock(&omap_fb->lock); | ||
289 | return 0; | 301 | return 0; |
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]; |
@@ -296,9 +309,12 @@ int omap_framebuffer_unpin(struct drm_framebuffer *fb) | |||
296 | plane->paddr = 0; | 309 | plane->paddr = 0; |
297 | } | 310 | } |
298 | 311 | ||
312 | mutex_unlock(&omap_fb->lock); | ||
313 | |||
299 | return 0; | 314 | return 0; |
300 | 315 | ||
301 | fail: | 316 | fail: |
317 | mutex_unlock(&omap_fb->lock); | ||
302 | return ret; | 318 | return ret; |
303 | } | 319 | } |
304 | 320 | ||
@@ -411,6 +427,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, | |||
411 | 427 | ||
412 | fb = &omap_fb->base; | 428 | fb = &omap_fb->base; |
413 | omap_fb->format = format; | 429 | omap_fb->format = format; |
430 | mutex_init(&omap_fb->lock); | ||
414 | 431 | ||
415 | for (i = 0; i < n; i++) { | 432 | for (i = 0; i < n; i++) { |
416 | struct plane *plane = &omap_fb->planes[i]; | 433 | struct plane *plane = &omap_fb->planes[i]; |