From 2d278f5414ae9cd535a7bdefaba2e2de38e116c7 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 5 Mar 2015 21:31:37 +0200 Subject: drm: omapdrm: Clean up #include's Use the <...> include style instead of "..." for DRM headers and sort the headers alphabetically to ease detection of duplicates. Signed-off-by: Laurent Pinchart Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/omap_fb.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_fb.c') diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c index b2c1a29cc12b..e505140a8782 100644 --- a/drivers/gpu/drm/omapdrm/omap_fb.c +++ b/drivers/gpu/drm/omapdrm/omap_fb.c @@ -17,11 +17,11 @@ * this program. If not, see . */ -#include "omap_drv.h" -#include "omap_dmm_tiler.h" +#include +#include -#include "drm_crtc.h" -#include "drm_crtc_helper.h" +#include "omap_dmm_tiler.h" +#include "omap_drv.h" /* * framebuffer funcs -- cgit v1.2.3-59-g8ed1b From f524ab7c070b39f4c8bd76fede6cacd17057ebc3 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 4 Jun 2015 10:56:33 +0300 Subject: 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 Acked-by: Laurent Pinchart --- drivers/gpu/drm/omapdrm/omap_fb.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/drm/omapdrm/omap_fb.c') 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 { int pin_count; const struct format *format; struct plane planes[4]; + /* lock for pinning (pin_count and planes.paddr) */ + struct mutex lock; }; static int omap_framebuffer_create_handle(struct drm_framebuffer *fb, @@ -250,8 +252,11 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb) struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); int ret, i, n = drm_format_num_planes(fb->pixel_format); + mutex_lock(&omap_fb->lock); + if (omap_fb->pin_count > 0) { omap_fb->pin_count++; + mutex_unlock(&omap_fb->lock); return 0; } @@ -265,6 +270,8 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb) omap_fb->pin_count++; + mutex_unlock(&omap_fb->lock); + return 0; fail: @@ -274,6 +281,8 @@ fail: plane->paddr = 0; } + mutex_unlock(&omap_fb->lock); + return ret; } @@ -283,10 +292,14 @@ int omap_framebuffer_unpin(struct drm_framebuffer *fb) struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); int ret, i, n = drm_format_num_planes(fb->pixel_format); + mutex_lock(&omap_fb->lock); + omap_fb->pin_count--; - if (omap_fb->pin_count > 0) + if (omap_fb->pin_count > 0) { + mutex_unlock(&omap_fb->lock); return 0; + } for (i = 0; i < n; i++) { struct plane *plane = &omap_fb->planes[i]; @@ -296,9 +309,12 @@ int omap_framebuffer_unpin(struct drm_framebuffer *fb) plane->paddr = 0; } + mutex_unlock(&omap_fb->lock); + return 0; fail: + mutex_unlock(&omap_fb->lock); return ret; } @@ -411,6 +427,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, fb = &omap_fb->base; omap_fb->format = format; + mutex_init(&omap_fb->lock); for (i = 0; i < n; i++) { struct plane *plane = &omap_fb->planes[i]; -- cgit v1.2.3-59-g8ed1b