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

Reply via email to