]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/i915: Add plane update/disable tracepoints
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 2 Mar 2017 17:15:05 +0000 (19:15 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 3 Mar 2017 14:50:10 +0000 (16:50 +0200)
Add tracepoints for plane programming. The tracepoints will dump
the frame and scanline counters, so this can be used to verify eg. that
the plane gets reprogrammed at the right time with respect to watermark
programming (if we have appropriate tracepoints for that as well).

v2: Rebase due to legacy cursor changes

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170302171508.1666-16-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_trace.h
drivers/gpu/drm/i915/intel_atomic_plane.c
drivers/gpu/drm/i915/intel_display.c

index e0aa686f9c68d7774081158910c15abd580492c9..675c28d5465867319862e543dd98be9d6d7f4098 100644 (file)
@@ -783,6 +783,9 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
        enum pipe pipe = crtc->pipe;
        int position, vtotal;
 
+       if (!crtc->active)
+               return -1;
+
        vtotal = mode->crtc_vtotal;
        if (mode->flags & DRM_MODE_FLAG_INTERLACE)
                vtotal /= 2;
index 2dbef3147a60031f9b5530285304f7d25bece71c..6cb03bd40aefc541454bd9938263f3ff9d73e138 100644 (file)
 #define TRACE_SYSTEM i915
 #define TRACE_INCLUDE_FILE i915_trace
 
+/* plane updates */
+
+TRACE_EVENT(intel_update_plane,
+           TP_PROTO(struct drm_plane *plane, struct intel_crtc *crtc),
+           TP_ARGS(plane, crtc),
+
+           TP_STRUCT__entry(
+                            __field(enum pipe, pipe)
+                            __field(const char *, name)
+                            __field(u32, frame)
+                            __field(u32, scanline)
+                            __array(int, src, 4)
+                            __array(int, dst, 4)
+                            ),
+
+           TP_fast_assign(
+                          __entry->pipe = crtc->pipe;
+                          __entry->name = plane->name;
+                          __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
+                                                                                      crtc->pipe);
+                          __entry->scanline = intel_get_crtc_scanline(crtc);
+                          memcpy(__entry->src, &plane->state->src, sizeof(__entry->src));
+                          memcpy(__entry->dst, &plane->state->dst, sizeof(__entry->dst));
+                          ),
+
+           TP_printk("pipe %c, plane %s, frame=%u, scanline=%u, " DRM_RECT_FP_FMT " -> " DRM_RECT_FMT,
+                     pipe_name(__entry->pipe), __entry->name,
+                     __entry->frame, __entry->scanline,
+                     DRM_RECT_FP_ARG((const struct drm_rect *)__entry->src),
+                     DRM_RECT_ARG((const struct drm_rect *)__entry->dst))
+);
+
+TRACE_EVENT(intel_disable_plane,
+           TP_PROTO(struct drm_plane *plane, struct intel_crtc *crtc),
+           TP_ARGS(plane, crtc),
+
+           TP_STRUCT__entry(
+                            __field(enum pipe, pipe)
+                            __field(const char *, name)
+                            __field(u32, frame)
+                            __field(u32, scanline)
+                            ),
+
+           TP_fast_assign(
+                          __entry->pipe = crtc->pipe;
+                          __entry->name = plane->name;
+                          __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
+                                                                                      crtc->pipe);
+                          __entry->scanline = intel_get_crtc_scanline(crtc);
+                          ),
+
+           TP_printk("pipe %c, plane %s, frame=%u, scanline=%u",
+                     pipe_name(__entry->pipe), __entry->name,
+                     __entry->frame, __entry->scanline)
+);
+
 /* pipe updates */
 
 TRACE_EVENT(i915_pipe_update_start,
index 1eaf840cf9ff220fae023e4cca1990e802a71ebd..cfb47293fd53cf93563aa8e159758b8275e30b9e 100644 (file)
@@ -231,12 +231,19 @@ static void intel_plane_atomic_update(struct drm_plane *plane,
                to_intel_plane_state(plane->state);
        struct drm_crtc *crtc = plane->state->crtc ?: old_state->crtc;
 
-       if (intel_state->base.visible)
+       if (intel_state->base.visible) {
+               trace_intel_update_plane(plane,
+                                        to_intel_crtc(crtc));
+
                intel_plane->update_plane(plane,
                                          to_intel_crtc_state(crtc->state),
                                          intel_state);
-       else
+       } else {
+               trace_intel_disable_plane(plane,
+                                         to_intel_crtc(crtc));
+
                intel_plane->disable_plane(plane, crtc);
+       }
 }
 
 const struct drm_plane_helper_funcs intel_plane_helper_funcs = {
index 1c22f8639b288af5e7624103005bd64645c265b1..72e2c91707d48373d1c931ffdf76c4bcb49ca4d2 100644 (file)
@@ -2754,6 +2754,7 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
                                to_intel_plane_state(plane_state),
                                false);
        intel_pre_disable_primary_noatomic(&intel_crtc->base);
+       trace_intel_disable_plane(primary, intel_crtc);
        intel_plane->disable_plane(primary, &intel_crtc->base);
 
        return;
@@ -3447,10 +3448,14 @@ static void intel_update_primary_planes(struct drm_device *dev)
                struct intel_plane_state *plane_state =
                        to_intel_plane_state(plane->base.state);
 
-               if (plane_state->base.visible)
+               if (plane_state->base.visible) {
+                       trace_intel_update_plane(&plane->base,
+                                                to_intel_crtc(crtc));
+
                        plane->update_plane(&plane->base,
                                            to_intel_crtc_state(crtc->state),
                                            plane_state);
+               }
        }
 }
 
@@ -13491,12 +13496,15 @@ intel_legacy_cursor_update(struct drm_plane *plane,
        new_plane_state->fb = old_fb;
        to_intel_plane_state(new_plane_state)->vma = old_vma;
 
-       if (plane->state->visible)
+       if (plane->state->visible) {
+               trace_intel_update_plane(plane, to_intel_crtc(crtc));
                intel_plane->update_plane(plane,
                                          to_intel_crtc_state(crtc->state),
                                          to_intel_plane_state(plane->state));
-       else
+       } else {
+               trace_intel_disable_plane(plane, to_intel_crtc(crtc));
                intel_plane->disable_plane(plane, crtc);
+       }
 
        intel_cleanup_plane_fb(plane, new_plane_state);
 
@@ -15145,6 +15153,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
                        if (plane->base.type == DRM_PLANE_TYPE_PRIMARY)
                                continue;
 
+                       trace_intel_disable_plane(&plane->base, crtc);
                        plane->disable_plane(&plane->base, &crtc->base);
                }
        }