Skip to content

Commit

Permalink
drm: Push dirtyfb ioctl kms locking down to drivers
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ville Syrjälä authored and Dave Airlie committed Dec 18, 2013
1 parent ee61c73 commit 73e9efd
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 8 deletions.
2 changes: 0 additions & 2 deletions drivers/gpu/drm/drm_crtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2767,10 +2767,8 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
}

if (fb->funcs->dirty) {
drm_modeset_lock_all(dev);
ret = fb->funcs->dirty(fb, file_priv, flags, r->color,
clips, num_clips);
drm_modeset_unlock_all(dev);
} else {
ret = -ENOSYS;
}
Expand Down
4 changes: 4 additions & 0 deletions drivers/gpu/drm/omapdrm/omap_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,16 @@ static int omap_framebuffer_dirty(struct drm_framebuffer *fb,
{
int i;

drm_modeset_lock_all(fb->dev);

for (i = 0; i < num_clips; i++) {
omap_framebuffer_flush(fb, clips[i].x1, clips[i].y1,
clips[i].x2 - clips[i].x1,
clips[i].y2 - clips[i].y1);
}

drm_modeset_unlock_all(fb->dev);

return 0;
}

Expand Down
9 changes: 8 additions & 1 deletion drivers/gpu/drm/qxl/qxl_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,10 +399,14 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,
struct qxl_bo *qobj;
int inc = 1;

drm_modeset_lock_all(fb->dev);

qobj = gem_to_qxl_bo(qxl_fb->obj);
/* if we aren't primary surface ignore this */
if (!qobj->is_primary)
if (!qobj->is_primary) {
drm_modeset_unlock_all(fb->dev);
return 0;
}

if (!num_clips) {
num_clips = 1;
Expand All @@ -417,6 +421,9 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb,

qxl_draw_dirty_fb(qdev, qxl_fb, qobj, flags, color,
clips, num_clips, inc);

drm_modeset_unlock_all(fb->dev);

return 0;
}

Expand Down
12 changes: 9 additions & 3 deletions drivers/gpu/drm/udl/udl_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -403,30 +403,36 @@ static int udl_user_framebuffer_dirty(struct drm_framebuffer *fb,
int i;
int ret = 0;

drm_modeset_lock_all(fb->dev);

if (!ufb->active_16)
return 0;
goto unlock;

if (ufb->obj->base.import_attach) {
ret = dma_buf_begin_cpu_access(ufb->obj->base.import_attach->dmabuf,
0, ufb->obj->base.size,
DMA_FROM_DEVICE);
if (ret)
return ret;
goto unlock;
}

for (i = 0; i < num_clips; i++) {
ret = udl_handle_damage(ufb, clips[i].x1, clips[i].y1,
clips[i].x2 - clips[i].x1,
clips[i].y2 - clips[i].y1);
if (ret)
break;
goto unlock;
}

if (ufb->obj->base.import_attach) {
dma_buf_end_cpu_access(ufb->obj->base.import_attach->dmabuf,
0, ufb->obj->base.size,
DMA_FROM_DEVICE);
}

unlock:
drm_modeset_unlock_all(fb->dev);

return ret;
}

Expand Down
18 changes: 16 additions & 2 deletions drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
Original file line number Diff line number Diff line change
Expand Up @@ -609,9 +609,13 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
if (!dev_priv->sou_priv)
return -EINVAL;

drm_modeset_lock_all(dev_priv->dev);

ret = ttm_read_lock(&vmaster->lock, true);
if (unlikely(ret != 0))
if (unlikely(ret != 0)) {
drm_modeset_unlock_all(dev_priv->dev);
return ret;
}

if (!num_clips) {
num_clips = 1;
Expand All @@ -629,6 +633,9 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
clips, num_clips, inc, NULL);

ttm_read_unlock(&vmaster->lock);

drm_modeset_unlock_all(dev_priv->dev);

return 0;
}

Expand Down Expand Up @@ -953,9 +960,13 @@ int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
struct drm_clip_rect norect;
int ret, increment = 1;

drm_modeset_lock_all(dev_priv->dev);

ret = ttm_read_lock(&vmaster->lock, true);
if (unlikely(ret != 0))
if (unlikely(ret != 0)) {
drm_modeset_unlock_all(dev_priv->dev);
return ret;
}

if (!num_clips) {
num_clips = 1;
Expand All @@ -979,6 +990,9 @@ int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
}

ttm_read_unlock(&vmaster->lock);

drm_modeset_unlock_all(dev_priv->dev);

return ret;
}

Expand Down

0 comments on commit 73e9efd

Please sign in to comment.