drm/i915: Add pipe crc tracepoint
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 6 Feb 2019 20:49:07 +0000 (22:49 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 15 Feb 2019 18:57:33 +0000 (20:57 +0200)
Add a tracepoint for pipe crc. Makes life much simpler when staring at
traces when hunting for fifo underruns and other issues which cause
corrupted frames. We'll add the tracepoint before filtering out any
potentially bogus crcs during modeset (should actually verify if that
filtering is even correct anymore...)

v2: s/crcs[5]/*crcs/ in the function argument because something
    in the macros wants to do sizeof(crcs) and gcc likes to
    warn us it's not an actual array so the size may not be
    as expected. The silly bugger even does that for 'crcs[]'
    causing us to lose any helpful syntactic hint that we
    are in fact dealing with an array (kbuild test robot)

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190206204910.13965-1-ville.syrjala@linux.intel.com
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_trace.h

index eab085686a2a742e93d15341e5dd9f605a6540b0..292e31cb8fb141b063daaa92ef02300e4022b01d 100644 (file)
@@ -1691,7 +1691,9 @@ static void display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
 {
        struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe];
        struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
-       u32 crcs[5];
+       u32 crcs[5] = { crc0, crc1, crc2, crc3, crc4 };
+
+       trace_intel_pipe_crc(crtc, crcs);
 
        spin_lock(&pipe_crc->lock);
        /*
@@ -1710,11 +1712,6 @@ static void display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
        }
        spin_unlock(&pipe_crc->lock);
 
-       crcs[0] = crc0;
-       crcs[1] = crc1;
-       crcs[2] = crc2;
-       crcs[3] = crc3;
-       crcs[4] = crc4;
        drm_crtc_add_crc_entry(&crtc->base, true,
                                drm_crtc_accurate_vblank_count(&crtc->base),
                                crcs);
index cb5bc65d575d70cabda2edf33738d4526dfb2157..d1c3d720157362da167396c04dfef84baf6a8d73 100644 (file)
 
 /* watermark/fifo updates */
 
+TRACE_EVENT(intel_pipe_crc,
+           TP_PROTO(struct intel_crtc *crtc, const u32 *crcs),
+           TP_ARGS(crtc, crcs),
+
+           TP_STRUCT__entry(
+                            __field(enum pipe, pipe)
+                            __field(u32, frame)
+                            __field(u32, scanline)
+                            __array(u32, crcs, 5)
+                            ),
+
+           TP_fast_assign(
+                          __entry->pipe = crtc->pipe;
+                          __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
+                                                                                      crtc->pipe);
+                          __entry->scanline = intel_get_crtc_scanline(crtc);
+                          memcpy(__entry->crcs, crcs, sizeof(__entry->crcs));
+                          ),
+
+           TP_printk("pipe %c, frame=%u, scanline=%u crc=%08x %08x %08x %08x %08x",
+                     pipe_name(__entry->pipe), __entry->frame, __entry->scanline,
+                     __entry->crcs[0], __entry->crcs[1], __entry->crcs[2],
+                     __entry->crcs[3], __entry->crcs[4])
+);
+
 TRACE_EVENT(intel_cpu_fifo_underrun,
            TP_PROTO(struct drm_i915_private *dev_priv, enum pipe pipe),
            TP_ARGS(dev_priv, pipe),