Commit 72259536 authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm/i915: Add plane update/disable tracepoints



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: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170302171508.1666-16-ville.syrjala@linux.intel.com
parent 7373728d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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;
+56 −0
Original line number Diff line number Diff line
@@ -14,6 +14,62 @@
#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,
+9 −2
Original line number Diff line number Diff line
@@ -231,13 +231,20 @@ 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 = {
	.prepare_fb = intel_prepare_plane_fb,
+12 −3
Original line number Diff line number Diff line
@@ -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,12 +3448,16 @@ 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);
		}
	}
}

static int
__intel_display_resume(struct drm_device *dev,
@@ -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);
		}
	}