Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1732434

[PATCH for 4.9 04/59] drm/i915: Fix the overlay frontbuffer tracking

From "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com>
Newsgroups linux.kernel
Subject [PATCH for 4.9 04/59] drm/i915: Fix the overlay frontbuffer tracking
Date 2017-09-14 18:30 +0200
Message-ID <upFbA-7nG-19@gated-at.bofh.it> (permalink)
References <upEIx-6V9-7@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Ville Syrjälä <ville.syrjala@linux.intel.com>

[ Upstream commit 58d09ebdb4edf5d3ab3a2aee851ab0168bc83ec6 ]

Do the overlay frontbuffer tracking properly so that it matches
the state of the overlay on/off/continue requests.

One slight problem is that intel_frontbuffer_flip_complete()
may get delayed by an arbitrarily liong time due to the fact that
the overlay code likes to bail out when a signal occurs. So the
flip may not get completed until the ioctl is restarted. But fixing
that would require bigger surgery, so I decided to ignore it for now.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1481131693-27993-5-git-send-email-ville.syrjala@linux.intel.com
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
---
 drivers/gpu/drm/i915/intel_overlay.c | 64 +++++++++++++++++++++++-------------
 1 file changed, 41 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index a2655cd5a84e..8ab6f30dc23c 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -272,8 +272,30 @@ static int intel_overlay_on(struct intel_overlay *overlay)
 	return intel_overlay_do_wait_request(overlay, req, NULL);
 }
 
+static void intel_overlay_flip_prepare(struct intel_overlay *overlay,
+				       struct i915_vma *vma)
+{
+	enum pipe pipe = overlay->crtc->pipe;
+
+	WARN_ON(overlay->old_vma);
+
+	i915_gem_track_fb(overlay->vma ? overlay->vma->obj : NULL,
+			  vma ? vma->obj : NULL,
+			  INTEL_FRONTBUFFER_OVERLAY(pipe));
+
+	intel_frontbuffer_flip_prepare(overlay->i915,
+				       INTEL_FRONTBUFFER_OVERLAY(pipe));
+
+	overlay->old_vma = overlay->vma;
+	if (vma)
+		overlay->vma = i915_vma_get(vma);
+	else
+		overlay->vma = NULL;
+}
+
 /* overlay needs to be enabled in OCMD reg */
 static int intel_overlay_continue(struct intel_overlay *overlay,
+				  struct i915_vma *vma,
 				  bool load_polyphase_filter)
 {
 	struct drm_i915_private *dev_priv = overlay->i915;
@@ -308,43 +330,44 @@ static int intel_overlay_continue(struct intel_overlay *overlay,
 	intel_ring_emit(ring, flip_addr);
 	intel_ring_advance(ring);
 
+	intel_overlay_flip_prepare(overlay, vma);
+
 	intel_overlay_submit_request(overlay, req, NULL);
 
 	return 0;
 }
 
-static void intel_overlay_release_old_vid_tail(struct i915_gem_active *active,
-					       struct drm_i915_gem_request *req)
+static void intel_overlay_release_old_vma(struct intel_overlay *overlay)
 {
-	struct intel_overlay *overlay =
-		container_of(active, typeof(*overlay), last_flip);
 	struct i915_vma *vma;
 
 	vma = fetch_and_zero(&overlay->old_vma);
 	if (WARN_ON(!vma))
 		return;
 
-	i915_gem_track_fb(vma->obj, NULL,
-			  INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe));
+	intel_frontbuffer_flip_complete(overlay->i915,
+					INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe));
 
 	i915_gem_object_unpin_from_display_plane(vma);
 	i915_vma_put(vma);
 }
 
+static void intel_overlay_release_old_vid_tail(struct i915_gem_active *active,
+					       struct drm_i915_gem_request *req)
+{
+	struct intel_overlay *overlay =
+		container_of(active, typeof(*overlay), last_flip);
+
+	intel_overlay_release_old_vma(overlay);
+}
+
 static void intel_overlay_off_tail(struct i915_gem_active *active,
 				   struct drm_i915_gem_request *req)
 {
 	struct intel_overlay *overlay =
 		container_of(active, typeof(*overlay), last_flip);
-	struct i915_vma *vma;
-
-	/* never have the overlay hw on without showing a frame */
-	vma = fetch_and_zero(&overlay->vma);
-	if (WARN_ON(!vma))
-		return;
 
-	i915_gem_object_unpin_from_display_plane(vma);
-	i915_vma_put(vma);
+	intel_overlay_release_old_vma(overlay);
 
 	overlay->crtc->overlay = NULL;
 	overlay->crtc = NULL;
@@ -398,6 +421,8 @@ static int intel_overlay_off(struct intel_overlay *overlay)
 	}
 	intel_ring_advance(ring);
 
+	intel_overlay_flip_prepare(overlay, NULL);
+
 	return intel_overlay_do_wait_request(overlay, req,
 					     intel_overlay_off_tail);
 }
@@ -836,18 +861,10 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
 
 	intel_overlay_unmap_regs(overlay, regs);
 
-	ret = intel_overlay_continue(overlay, scale_changed);
+	ret = intel_overlay_continue(overlay, vma, scale_changed);
 	if (ret)
 		goto out_unpin;
 
-	i915_gem_track_fb(overlay->vma ? overlay->vma->obj : NULL,
-			  vma->obj, INTEL_FRONTBUFFER_OVERLAY(pipe));
-
-	overlay->old_vma = overlay->vma;
-	overlay->vma = vma;
-
-	intel_frontbuffer_flip(dev_priv, INTEL_FRONTBUFFER_OVERLAY(pipe));
-
 	return 0;
 
 out_unpin:
@@ -1215,6 +1232,7 @@ int intel_overlay_put_image_ioctl(struct drm_device *dev, void *data,
 
 	mutex_unlock(&dev->struct_mutex);
 	drm_modeset_unlock_all(dev);
+	i915_gem_object_put(new_bo);
 
 	kfree(params);
 
-- 
2.11.0

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH for 4.9 01/59] drm_fourcc: Fix DRM_FORMAT_MOD_LINEAR #define "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 12/59] MIPS: kexec: Do not reserve invalid crashkernel  memory on boot "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 20/59] reset: ti_syscon: fix a ti_syscon_reset_status  issue "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 04/59] drm/i915: Fix the overlay frontbuffer tracking "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 24/59] usb: make the MTK XHCI driver compile for older  MIPS SoCs "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 18/59] igb: re-assign hw address pointer on reset  after PCI error "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 19/59] extcon: axp288: Use vbus-valid instead of  -present to determine cable presence "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 15/59] power: supply: axp288_fuel_gauge: Fix  fuel_gauge_reg_readb return on error "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 11/59] MIPS: fix mem=X@Y commandline processing "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
    Re: [PATCH for 4.9 11/59] MIPS: fix mem=X@Y commandline processing Mathieu Malaterre <malat@debian.org> - 2017-09-14 21:00 +0200
      Re: [PATCH for 4.9 11/59] MIPS: fix mem=X@Y commandline processing "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 21:20 +0200
        Re: [PATCH for 4.9 11/59] MIPS: fix mem=X@Y commandline processing Mathieu Malaterre <malat@debian.org> - 2017-09-14 21:20 +0200
          Re: [PATCH for 4.9 11/59] MIPS: fix mem=X@Y commandline processing Marcin Nowakowski <marcin.nowakowski@imgtec.com> - 2017-09-15 07:50 +0200
            Re: [PATCH for 4.9 11/59] MIPS: fix mem=X@Y commandline processing Paul Burton <paul.burton@imgtec.com> - 2017-09-15 19:10 +0200
  [PATCH for 4.9 08/59] RDS: RDMA: Fix the composite message user  notification "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 23/59] clk: wm831x: fix usleep_range with bad range "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 16/59] scsi: be2iscsi: Add checks to validate CID  alloc/free "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 22/59] clk/axs10x: Clear init field in driver probe "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 17/59] ARM: dts: am335x-chilisom: Wakeup from RTC-only  state by power on event "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200
  [PATCH for 4.9 21/59] sh_eth: use correct name for ECMR_MPDE bit "Levin, Alexander (Sasha Levin)" <alexander.levin@verizon.com> - 2017-09-14 18:30 +0200

csiph-web