drm/i915: Reduce the time we hold struct mutex in intel_pipe_set_base()

We don't need to hold struct_mutex all through intel_pipe_set_base(),
just need to hold it while pinning/unpinning the buffers.

So reduce the struct_mutext usage in intel_pipe_set_base() just like we
did for the sprite code in:
 commit 82284b6bec
 Author: Ville Syrjälä <ville.syrjala@linux.intel.com>
 Date:   Tue Oct 1 18:02:12 2013 +0300

    drm/i915: Reduce the time we hold struct mutex in sprite update_plane code

The FBC and PSR locking is still entirely fubar. That stuff was
previouly done while holding struct_mutex, so leave it there for now.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
Ville Syrjälä 2014-03-11 19:37:33 +02:00 committed by Daniel Vetter
parent 02f6a1e750
commit 8ac36ec1e3
1 changed files with 5 additions and 1 deletions

View File

@ -2477,8 +2477,8 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
ret = intel_pin_and_fence_fb_obj(dev, ret = intel_pin_and_fence_fb_obj(dev,
to_intel_framebuffer(fb)->obj, to_intel_framebuffer(fb)->obj,
NULL); NULL);
mutex_unlock(&dev->struct_mutex);
if (ret != 0) { if (ret != 0) {
mutex_unlock(&dev->struct_mutex);
DRM_ERROR("pin & fence failed\n"); DRM_ERROR("pin & fence failed\n");
return ret; return ret;
} }
@ -2516,6 +2516,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
ret = dev_priv->display.update_plane(crtc, fb, x, y); ret = dev_priv->display.update_plane(crtc, fb, x, y);
if (ret) { if (ret) {
mutex_lock(&dev->struct_mutex);
intel_unpin_fb_obj(to_intel_framebuffer(fb)->obj); intel_unpin_fb_obj(to_intel_framebuffer(fb)->obj);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
DRM_ERROR("failed to update base address\n"); DRM_ERROR("failed to update base address\n");
@ -2530,9 +2531,12 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
if (old_fb) { if (old_fb) {
if (intel_crtc->active && old_fb != fb) if (intel_crtc->active && old_fb != fb)
intel_wait_for_vblank(dev, intel_crtc->pipe); intel_wait_for_vblank(dev, intel_crtc->pipe);
mutex_lock(&dev->struct_mutex);
intel_unpin_fb_obj(to_intel_framebuffer(old_fb)->obj); intel_unpin_fb_obj(to_intel_framebuffer(old_fb)->obj);
mutex_unlock(&dev->struct_mutex);
} }
mutex_lock(&dev->struct_mutex);
intel_update_fbc(dev); intel_update_fbc(dev);
intel_edp_psr_update(dev); intel_edp_psr_update(dev);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);