From: Ville Syrjälä <[email protected]> Currently flip queue based commits don't leave any breadcrumbs via tracepoints. Add new intel_flipq_add and intel_flipq_done tracepoints that at least indicates when we something happens via the flip queeu.
We might want to improve this later somehow to have a slightly better idea what the flip queue might end up doing. But at least this now shows that *something* is going on. Signed-off-by: Ville Syrjälä <[email protected]> --- .../drm/i915/display/intel_display_trace.h | 60 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dmc.c | 3 + drivers/gpu/drm/i915/display/intel_flipq.c | 7 ++- 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_display_trace.h b/drivers/gpu/drm/i915/display/intel_display_trace.h index f76c8432e155..a2d1bc83c715 100644 --- a/drivers/gpu/drm/i915/display/intel_display_trace.h +++ b/drivers/gpu/drm/i915/display/intel_display_trace.h @@ -23,6 +23,7 @@ #include "intel_display_limits.h" #include "intel_display_types.h" #include "intel_dsb.h" +#include "intel_flipq.h" #include "intel_vblank.h" #define __dev_name_display(display) dev_name((display)->drm->dev) @@ -732,6 +733,65 @@ TRACE_EVENT(intel_dsb_done, __entry->frame, __entry->scanline) ); +TRACE_EVENT(intel_flipq_add, + TP_PROTO(struct intel_crtc *crtc, + enum intel_flipq_id flipq_id, + enum intel_dsb_id dsb_id, + u32 pts, u32 curr_pts), + TP_ARGS(crtc, flipq_id, dsb_id, pts, curr_pts), + + TP_STRUCT__entry( + __string(dev, __dev_name_kms(crtc)) + __field(char, pipe_name) + __field(u32, flipq_id) + __field(u32, dsb_id) + __field(u32, pts) + __field(u32, curr_pts) + __field(u32, frame) + __field(u32, scanline) + ), + + TP_fast_assign( + __assign_str(dev); + __entry->pipe_name = pipe_name(crtc->pipe); + __entry->flipq_id = flipq_id; + __entry->dsb_id = dsb_id; + __entry->pts = pts; + __entry->curr_pts = curr_pts; + __entry->frame = intel_crtc_get_vblank_counter(crtc); + __entry->scanline = intel_get_crtc_scanline(crtc); + ), + + TP_printk("dev %s, pipe %c, FQ %d, DSB %d, PTS %u, current PTS %u, frame=%u, scanline=%u", + __get_str(dev), __entry->pipe_name, + __entry->flipq_id, __entry->dsb_id, + __entry->pts, __entry->curr_pts, + __entry->frame, __entry->scanline) +); + +TRACE_EVENT(intel_flipq_done, + TP_PROTO(struct intel_crtc *crtc), + TP_ARGS(crtc), + + TP_STRUCT__entry( + __string(dev, __dev_name_kms(crtc)) + __field(char, pipe_name) + __field(u32, frame) + __field(u32, scanline) + ), + + TP_fast_assign( + __assign_str(dev); + __entry->pipe_name = pipe_name(crtc->pipe); + __entry->frame = intel_crtc_get_vblank_counter(crtc); + __entry->scanline = intel_get_crtc_scanline(crtc); + ), + + TP_printk("dev %s, pipe %c, frame=%u, scanline=%u", + __get_str(dev), __entry->pipe_name, + __entry->frame, __entry->scanline) +); + TRACE_EVENT(intel_crtc_vblank_work_start, TP_PROTO(struct intel_crtc *crtc), TP_ARGS(crtc), diff --git a/drivers/gpu/drm/i915/display/intel_dmc.c b/drivers/gpu/drm/i915/display/intel_dmc.c index 2fb6fec6dc99..4cfa3920fbad 100644 --- a/drivers/gpu/drm/i915/display/intel_dmc.c +++ b/drivers/gpu/drm/i915/display/intel_dmc.c @@ -35,6 +35,7 @@ #include "intel_display_power_well.h" #include "intel_display_regs.h" #include "intel_display_rpm.h" +#include "intel_display_trace.h" #include "intel_display_types.h" #include "intel_display_utils.h" #include "intel_dmc.h" @@ -1699,6 +1700,8 @@ void intel_pipedmc_irq_handler(struct intel_display *display, enum pipe pipe) spin_lock(&display->drm->event_lock); if (crtc->flipq_event) { + trace_intel_flipq_done(crtc); + /* * Update vblank counter/timestamp in case it * hasn't been done yet for this frame. diff --git a/drivers/gpu/drm/i915/display/intel_flipq.c b/drivers/gpu/drm/i915/display/intel_flipq.c index a07b3ec4242c..2a0d947184a3 100644 --- a/drivers/gpu/drm/i915/display/intel_flipq.c +++ b/drivers/gpu/drm/i915/display/intel_flipq.c @@ -10,6 +10,7 @@ #include "intel_crtc.h" #include "intel_de.h" #include "intel_display_core.h" +#include "intel_display_trace.h" #include "intel_display_types.h" #include "intel_display_utils.h" #include "intel_dmc.h" @@ -429,11 +430,13 @@ void intel_flipq_add(struct intel_crtc *crtc, { struct intel_display *display = to_intel_display(crtc); struct intel_flipq *flipq = &crtc->flipq[flipq_id]; + unsigned int curr_pts; if (!assert_flipq_has_room(crtc, flipq_id)) return; - pts += intel_de_read(display, PIPEDMC_FPQ_TS(crtc->pipe)); + curr_pts = intel_de_read(display, PIPEDMC_FPQ_TS(crtc->pipe)); + pts += curr_pts; intel_flipq_preempt(crtc, true); @@ -445,6 +448,8 @@ void intel_flipq_add(struct intel_crtc *crtc, flipq->tail = (flipq->tail + 1) % intel_flipq_size_entries(flipq->flipq_id); intel_flipq_write_tail(crtc); + trace_intel_flipq_add(crtc, flipq_id, dsb_id, pts, curr_pts); + intel_flipq_preempt(crtc, false); intel_flipq_sw_dmc_wake(crtc); -- 2.51.2
