From: Ville Syrjälä <[email protected]> Currently DSB based commits don't leave any breadcrumbs via tracepoints. Add new intel_dsb_commit and intel_dsb_done tracepoints that at least indicates when the DSB does something.
We might want to improve this later somehow to have a slightly better idea what the DSB might end up doing. But at least this now shows that *something* is happening on the hardware. Signed-off-by: Ville Syrjälä <[email protected]> --- .../drm/i915/display/intel_display_trace.h | 51 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dsb.c | 5 ++ 2 files changed, 56 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_display_trace.h b/drivers/gpu/drm/i915/display/intel_display_trace.h index 27ebc32cb61a..f76c8432e155 100644 --- a/drivers/gpu/drm/i915/display/intel_display_trace.h +++ b/drivers/gpu/drm/i915/display/intel_display_trace.h @@ -22,6 +22,7 @@ #include "intel_display_core.h" #include "intel_display_limits.h" #include "intel_display_types.h" +#include "intel_dsb.h" #include "intel_vblank.h" #define __dev_name_display(display) dev_name((display)->drm->dev) @@ -681,6 +682,56 @@ TRACE_EVENT(intel_fbc_nuke, __entry->frame, __entry->scanline) ); +TRACE_EVENT(intel_dsb_commit, + TP_PROTO(struct intel_crtc *crtc, enum intel_dsb_id dsb_id), + TP_ARGS(crtc, dsb_id), + + TP_STRUCT__entry( + __string(dev, __dev_name_kms(crtc)) + __field(char, pipe_name) + __field(u32, dsb_id) + __field(u32, frame) + __field(u32, scanline) + ), + + TP_fast_assign( + __assign_str(dev); + __entry->pipe_name = pipe_name(crtc->pipe); + __entry->dsb_id = dsb_id; + __entry->frame = intel_crtc_get_vblank_counter(crtc); + __entry->scanline = intel_get_crtc_scanline(crtc); + ), + + TP_printk("dev %s, pipe %c, DSB %d, frame=%u, scanline=%u", + __get_str(dev), __entry->pipe_name, __entry->dsb_id, + __entry->frame, __entry->scanline) +); + +TRACE_EVENT(intel_dsb_done, + TP_PROTO(struct intel_crtc *crtc, enum intel_dsb_id dsb_id), + TP_ARGS(crtc, dsb_id), + + TP_STRUCT__entry( + __string(dev, __dev_name_kms(crtc)) + __field(char, pipe_name) + __field(u32, dsb_id) + __field(u32, frame) + __field(u32, scanline) + ), + + TP_fast_assign( + __assign_str(dev); + __entry->pipe_name = pipe_name(crtc->pipe); + __entry->dsb_id = dsb_id; + __entry->frame = intel_crtc_get_vblank_counter(crtc); + __entry->scanline = intel_get_crtc_scanline(crtc); + ), + + TP_printk("dev %s, pipe %c, DSB %d, frame=%u, scanline=%u", + __get_str(dev), __entry->pipe_name, __entry->dsb_id, + __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_dsb.c b/drivers/gpu/drm/i915/display/intel_dsb.c index ab176cb4e4bd..f1ad3b0630c7 100644 --- a/drivers/gpu/drm/i915/display/intel_dsb.c +++ b/drivers/gpu/drm/i915/display/intel_dsb.c @@ -13,6 +13,7 @@ #include "intel_de.h" #include "intel_display_regs.h" #include "intel_display_rpm.h" +#include "intel_display_trace.h" #include "intel_display_types.h" #include "intel_dsb.h" #include "intel_dsb_buffer.h" @@ -872,6 +873,8 @@ void intel_dsb_commit(struct intel_dsb *dsb) intel_de_write_fw(display, DSB_HEAD(pipe, dsb->id), intel_dsb_head(dsb)); + trace_intel_dsb_commit(crtc, dsb->id); + intel_de_write_fw(display, DSB_TAIL(pipe, dsb->id), intel_dsb_tail(dsb)); } @@ -1014,6 +1017,8 @@ void intel_dsb_irq_handler(struct intel_display *display, spin_lock(&display->drm->event_lock); if (crtc->dsb_event) { + trace_intel_dsb_done(crtc, dsb_id); + /* * Update vblank counter/timestamp in case it * hasn't been done yet for this frame. -- 2.51.2
