[PATCH] Experimental patch: Check how much intel_crtc_get_scanline and get_vblank_counter functions contribute to "evasion time > 250 us" warning.

Stanislav Lisovskiy stanislav.lisovskiy at intel.com
Tue Oct 27 15:32:25 UTC 2020


---
 drivers/gpu/drm/i915/display/intel_sprite.c | 2 +-
 drivers/gpu/drm/i915/i915_irq.c             | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
index b6deeb338477..6b7b139d5fef 100644
--- a/drivers/gpu/drm/i915/display/intel_sprite.c
+++ b/drivers/gpu/drm/i915/display/intel_sprite.c
@@ -199,7 +199,7 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state)
 {
 	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
 	enum pipe pipe = crtc->pipe;
-	int scanline_end = intel_get_crtc_scanline(crtc);
+	int scanline_end = 1;/*intel_get_crtc_scanline(crtc);*/
 	u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc);
 	ktime_t end_vbl_time = ktime_get();
 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index dc33c96d741d..7968d5442314 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -629,6 +629,7 @@ u32 i915_get_vblank_counter(struct drm_crtc *crtc)
 	i915_reg_t high_frame, low_frame;
 	u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
 	unsigned long irqflags;
+	ktime_t start;
 
 	/*
 	 * On i965gm TV output the frame counter only works up to
@@ -661,6 +662,8 @@ u32 i915_get_vblank_counter(struct drm_crtc *crtc)
 
 	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
+	start = ktime_get();
+
 	/*
 	 * High & low register fields aren't synchronized, so make sure
 	 * we get a low value that's stable across two reads of the high
@@ -670,6 +673,10 @@ u32 i915_get_vblank_counter(struct drm_crtc *crtc)
 		high1 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
 		low   = intel_de_read_fw(dev_priv, low_frame);
 		high2 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
+
+		if (ktime_us_delta(ktime_get(), start) >= 60)
+			break;
+
 	} while (high1 != high2);
 
 	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
-- 
2.24.1.485.gad05a3d8e5



More information about the Intel-gfx-trybot mailing list