aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-12-04 07:13:58 -0500
committerDave Airlie <airlied@redhat.com>2013-12-17 19:49:08 -0500
commit73e9efd4bddbf42d2938a150ba680b73b6126b77 (patch)
tree146a8b66778c04efcd05f7b22c4fcb13c859ff7f
parentee61c7303f84e2ef978aaed9b9640476c63ba586 (diff)
drm: Push dirtyfb ioctl kms locking down to drivers
Not all drivers will need take all the modeset locks for dirtyfb, so push the locking down to the drivers. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/drm_crtc.c2
-rw-r--r--drivers/gpu/drm/omapdrm/omap_fb.c4
-rw-r--r--drivers/gpu/drm/qxl/qxl_display.c9
-rw-r--r--drivers/gpu/drm/udl/udl_fb.c12
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_kms.c18
5 files changed, 37 insertions, 8 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index d6cf77c472e7..266a01d7f635 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -2767,10 +2767,8 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
2767 } 2767 }
2768 2768
2769 if (fb->funcs->dirty) { 2769 if (fb->funcs->dirty) {
2770 drm_modeset_lock_all(dev);
2771 ret = fb->funcs->dirty(fb, file_priv, flags, r->color, 2770 ret = fb->funcs->dirty(fb, file_priv, flags, r->color,
2772 clips, num_clips); 2771 clips, num_clips);
2773 drm_modeset_unlock_all(dev);
2774 } else { 2772 } else {
2775 ret = -ENOSYS; 2773 ret = -ENOSYS;
2776 } 2774 }
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
index f2b8f0668c0c..f466c4aaee94 100644
--- a/drivers/gpu/drm/omapdrm/omap_fb.c
+++ b/drivers/gpu/drm/omapdrm/omap_fb.c
@@ -123,12 +123,16 @@ static int omap_framebuffer_dirty(struct drm_framebuffer *fb,
123{ 123{
124 int i; 124 int i;
125 125
126 drm_modeset_lock_all(fb->dev);
127
126 for (i = 0; i < num_clips; i++) { 128 for (i = 0; i < num_clips; i++) {
127 omap_framebuffer_flush(fb, clips[i].x1, clips[i].y1, 129 omap_framebuffer_flush(fb, clips[i].x1, clips[i].y1,
128 clips[i].x2 - clips[i].x1, 130 clips[i].x2 - clips[i].x1,
129 clips[i].y2 - clips[i].y1); 131 clips[i].y2 - clips[i].y1);
130 } 132 }
131 133
134 drm_modeset_unlock_all(fb->dev);
135
132 return 0; 136 return 0;
133} 137}
134 138
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
index 5e827c29d194..b8f3bc7cf8f0 100644
--- a/drivers/gpu/drm/qxl/qxl_display.c
+++ b/drivers/gpu/drm/qxl/qxl_display.c
@@ -399,10 +399,14 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,
399 struct qxl_bo *qobj; 399 struct qxl_bo *qobj;
400 int inc = 1; 400 int inc = 1;
401 401
402 drm_modeset_lock_all(fb->dev);
403
402 qobj = gem_to_qxl_bo(qxl_fb->obj); 404 qobj = gem_to_qxl_bo(qxl_fb->obj);
403 /* if we aren't primary surface ignore this */ 405 /* if we aren't primary surface ignore this */
404 if (!qobj->is_primary) 406 if (!qobj->is_primary) {
407 drm_modeset_unlock_all(fb->dev);
405 return 0; 408 return 0;
409 }
406 410
407 if (!num_clips) { 411 if (!num_clips) {
408 num_clips = 1; 412 num_clips = 1;
@@ -417,6 +421,9 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,
417 421
418 qxl_draw_dirty_fb(qdev, qxl_fb, qobj, flags, color, 422 qxl_draw_dirty_fb(qdev, qxl_fb, qobj, flags, color,
419 clips, num_clips, inc); 423 clips, num_clips, inc);
424
425 drm_modeset_unlock_all(fb->dev);
426
420 return 0; 427 return 0;
421} 428}
422 429
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index 97e9d614700f..dbadd49e4c4a 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -403,15 +403,17 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
403 int i; 403 int i;
404 int ret = 0; 404 int ret = 0;
405 405
406 drm_modeset_lock_all(fb->dev);
407
406 if (!ufb->active_16) 408 if (!ufb->active_16)
407 return 0; 409 goto unlock;
408 410
409 if (ufb->obj->base.import_attach) { 411 if (ufb->obj->base.import_attach) {
410 ret = dma_buf_begin_cpu_access(ufb->obj->base.import_attach->dmabuf, 412 ret = dma_buf_begin_cpu_access(ufb->obj->base.import_attach->dmabuf,
411 0, ufb->obj->base.size, 413 0, ufb->obj->base.size,
412 DMA_FROM_DEVICE); 414 DMA_FROM_DEVICE);
413 if (ret) 415 if (ret)
414 return ret; 416 goto unlock;
415 } 417 }
416 418
417 for (i = 0; i < num_clips; i++) { 419 for (i = 0; i < num_clips; i++) {
@@ -419,7 +421,7 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
419 clips[i].x2 - clips[i].x1, 421 clips[i].x2 - clips[i].x1,
420 clips[i].y2 - clips[i].y1); 422 clips[i].y2 - clips[i].y1);
421 if (ret) 423 if (ret)
422 break; 424 goto unlock;
423 } 425 }
424 426
425 if (ufb->obj->base.import_attach) { 427 if (ufb->obj->base.import_attach) {
@@ -427,6 +429,10 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
427 0, ufb->obj->base.size, 429 0, ufb->obj->base.size,
428 DMA_FROM_DEVICE); 430 DMA_FROM_DEVICE);
429 } 431 }
432
433 unlock:
434 drm_modeset_unlock_all(fb->dev);
435
430 return ret; 436 return ret;
431} 437}
432 438
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index 03f1c2038631..9f307e0f3603 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -609,9 +609,13 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
609 if (!dev_priv->sou_priv) 609 if (!dev_priv->sou_priv)
610 return -EINVAL; 610 return -EINVAL;
611 611
612 drm_modeset_lock_all(dev_priv->dev);
613
612 ret = ttm_read_lock(&vmaster->lock, true); 614 ret = ttm_read_lock(&vmaster->lock, true);
613 if (unlikely(ret != 0)) 615 if (unlikely(ret != 0)) {
616 drm_modeset_unlock_all(dev_priv->dev);
614 return ret; 617 return ret;
618 }
615 619
616 if (!num_clips) { 620 if (!num_clips) {
617 num_clips = 1; 621 num_clips = 1;
@@ -629,6 +633,9 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
629 clips, num_clips, inc, NULL); 633 clips, num_clips, inc, NULL);
630 634
631 ttm_read_unlock(&vmaster->lock); 635 ttm_read_unlock(&vmaster->lock);
636
637 drm_modeset_unlock_all(dev_priv->dev);
638
632 return 0; 639 return 0;
633} 640}
634 641
@@ -953,9 +960,13 @@ int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
953 struct drm_clip_rect norect; 960 struct drm_clip_rect norect;
954 int ret, increment = 1; 961 int ret, increment = 1;
955 962
963 drm_modeset_lock_all(dev_priv->dev);
964
956 ret = ttm_read_lock(&vmaster->lock, true); 965 ret = ttm_read_lock(&vmaster->lock, true);
957 if (unlikely(ret != 0)) 966 if (unlikely(ret != 0)) {
967 drm_modeset_unlock_all(dev_priv->dev);
958 return ret; 968 return ret;
969 }
959 970
960 if (!num_clips) { 971 if (!num_clips) {
961 num_clips = 1; 972 num_clips = 1;
@@ -979,6 +990,9 @@ int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
979 } 990 }
980 991
981 ttm_read_unlock(&vmaster->lock); 992 ttm_read_unlock(&vmaster->lock);
993
994 drm_modeset_unlock_all(dev_priv->dev);
995
982 return ret; 996 return ret;
983} 997}
984 998