diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2013-12-04 07:13:58 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-12-17 19:49:08 -0500 |
commit | 73e9efd4bddbf42d2938a150ba680b73b6126b77 (patch) | |
tree | 146a8b66778c04efcd05f7b22c4fcb13c859ff7f | |
parent | ee61c7303f84e2ef978aaed9b9640476c63ba586 (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.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fb.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_display.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/udl/udl_fb.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 18 |
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 | ||