Commit 07bcd99b authored by Dhinakaran Pandiyan's avatar Dhinakaran Pandiyan Committed by Rodrigo Vivi

drm/i915/frontbuffer: Pull frontbuffer_flush out of gem_obj_pin_to_display

i915_gem_obj_pin_to_display() calls frontbuffer_flush with origin set to
DIRTYFB. The callers however are at a vantage point to decide if hardware
frontbuffer tracking can do the flush for us. For example, legacy cursor
updates, like flips, write to MMIO registers, which then triggers PSR flush
by the hardware. Moving frontbuffer_flush out will enable us to skip a
software initiated flush by setting origin to FLIP. Thanks to Chris for the
idea.

v2:
Rebased due to Ville adding intel_plane_pin_fb().
Minor code reordering as fb_obj_flush doesn't need struct_mutex (Chris)

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: default avatarDhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180307033420.3086-1-dhinakaran.pandiyan@intel.com
parent c7fb3c6c
...@@ -4094,9 +4094,10 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, ...@@ -4094,9 +4094,10 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
} }
/* /*
* Prepare buffer for display plane (scanout, cursors, etc). * Prepare buffer for display plane (scanout, cursors, etc). Can be called from
* Can be called from an uninterruptible phase (modesetting) and allows * an uninterruptible phase (modesetting) and allows any flushes to be pipelined
* any flushes to be pipelined (for pageflips). * (for pageflips). We only flush the caches while preparing the buffer for
* display, the callers are responsible for frontbuffer flush.
*/ */
struct i915_vma * struct i915_vma *
i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
...@@ -4152,9 +4153,7 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, ...@@ -4152,9 +4153,7 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
vma->display_alignment = max_t(u64, vma->display_alignment, alignment); vma->display_alignment = max_t(u64, vma->display_alignment, alignment);
/* Treat this as an end-of-frame, like intel_user_framebuffer_dirty() */
__i915_gem_object_flush_for_display(obj); __i915_gem_object_flush_for_display(obj);
intel_fb_obj_flush(obj, ORIGIN_DIRTYFB);
/* It should now be out of any other write domains, and we can update /* It should now be out of any other write domains, and we can update
* the domain values for our changes. * the domain values for our changes.
......
...@@ -2858,6 +2858,9 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, ...@@ -2858,6 +2858,9 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
return; return;
} }
obj = intel_fb_obj(fb);
intel_fb_obj_flush(obj, ORIGIN_DIRTYFB);
plane_state->src_x = 0; plane_state->src_x = 0;
plane_state->src_y = 0; plane_state->src_y = 0;
plane_state->src_w = fb->width << 16; plane_state->src_w = fb->width << 16;
...@@ -2871,7 +2874,6 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, ...@@ -2871,7 +2874,6 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
intel_state->base.src = drm_plane_state_src(plane_state); intel_state->base.src = drm_plane_state_src(plane_state);
intel_state->base.dst = drm_plane_state_dest(plane_state); intel_state->base.dst = drm_plane_state_dest(plane_state);
obj = intel_fb_obj(fb);
if (i915_gem_object_is_tiled(obj)) if (i915_gem_object_is_tiled(obj))
dev_priv->preserve_bios_swizzle = true; dev_priv->preserve_bios_swizzle = true;
...@@ -12793,6 +12795,8 @@ intel_prepare_plane_fb(struct drm_plane *plane, ...@@ -12793,6 +12795,8 @@ intel_prepare_plane_fb(struct drm_plane *plane,
if (ret) if (ret)
return ret; return ret;
intel_fb_obj_flush(obj, ORIGIN_DIRTYFB);
if (!new_state->fence) { /* implicit fencing */ if (!new_state->fence) { /* implicit fencing */
struct dma_fence *fence; struct dma_fence *fence;
...@@ -13186,8 +13190,9 @@ intel_legacy_cursor_update(struct drm_plane *plane, ...@@ -13186,8 +13190,9 @@ intel_legacy_cursor_update(struct drm_plane *plane,
if (ret) if (ret)
goto out_unlock; goto out_unlock;
old_fb = old_plane_state->fb; intel_fb_obj_flush(intel_fb_obj(fb), ORIGIN_DIRTYFB);
old_fb = old_plane_state->fb;
i915_gem_track_fb(intel_fb_obj(old_fb), intel_fb_obj(fb), i915_gem_track_fb(intel_fb_obj(old_fb), intel_fb_obj(fb),
intel_plane->frontbuffer_bit); intel_plane->frontbuffer_bit);
......
...@@ -221,6 +221,9 @@ static int intelfb_create(struct drm_fb_helper *helper, ...@@ -221,6 +221,9 @@ static int intelfb_create(struct drm_fb_helper *helper,
goto out_unlock; goto out_unlock;
} }
fb = &ifbdev->fb->base;
intel_fb_obj_flush(intel_fb_obj(fb), ORIGIN_DIRTYFB);
info = drm_fb_helper_alloc_fbi(helper); info = drm_fb_helper_alloc_fbi(helper);
if (IS_ERR(info)) { if (IS_ERR(info)) {
DRM_ERROR("Failed to allocate fb_info\n"); DRM_ERROR("Failed to allocate fb_info\n");
...@@ -230,8 +233,6 @@ static int intelfb_create(struct drm_fb_helper *helper, ...@@ -230,8 +233,6 @@ static int intelfb_create(struct drm_fb_helper *helper,
info->par = helper; info->par = helper;
fb = &ifbdev->fb->base;
ifbdev->helper.fb = fb; ifbdev->helper.fb = fb;
strcpy(info->fix.id, "inteldrmfb"); strcpy(info->fix.id, "inteldrmfb");
......
...@@ -807,6 +807,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay, ...@@ -807,6 +807,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
ret = PTR_ERR(vma); ret = PTR_ERR(vma);
goto out_pin_section; goto out_pin_section;
} }
intel_fb_obj_flush(new_bo, ORIGIN_DIRTYFB);
ret = i915_vma_put_fence(vma); ret = i915_vma_put_fence(vma);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment