OSDN Git Service

drm/amd/display: Add refresh rate trace
authorRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Wed, 10 Mar 2021 15:04:56 +0000 (10:04 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Apr 2021 20:47:57 +0000 (16:47 -0400)
When we have to debug VRR issues, we usually want to know the current
refresh rate; for this reason, it is handy to have a way to check in
real-time the refresh rate value. This commit introduces a kernel trace
that can provide such information.

Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
Acked-by: Anson Jacob <Anson.Jacob@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_trace.h

index 49f963b..10efd53 100644 (file)
@@ -460,6 +460,9 @@ static void dm_vupdate_high_irq(void *interrupt_params)
        struct common_irq_params *irq_params = interrupt_params;
        struct amdgpu_device *adev = irq_params->adev;
        struct amdgpu_crtc *acrtc;
+       struct drm_device *drm_dev;
+       struct drm_vblank_crtc *vblank;
+       ktime_t frame_duration_ns, previous_timestamp;
        unsigned long flags;
        int vrr_active;
 
@@ -467,6 +470,17 @@ static void dm_vupdate_high_irq(void *interrupt_params)
 
        if (acrtc) {
                vrr_active = amdgpu_dm_vrr_active_irq(acrtc);
+               drm_dev = acrtc->base.dev;
+               vblank = &drm_dev->vblank[acrtc->base.index];
+               previous_timestamp = atomic64_read(&irq_params->previous_timestamp);
+               frame_duration_ns = vblank->time - previous_timestamp;
+
+               if (frame_duration_ns > 0) {
+                       trace_amdgpu_refresh_rate_track(acrtc->base.index,
+                                               frame_duration_ns,
+                                               ktime_divns(NSEC_PER_SEC, frame_duration_ns));
+                       atomic64_set(&irq_params->previous_timestamp, vblank->time);
+               }
 
                DRM_DEBUG_VBL("crtc:%d, vupdate-vrr:%d\n",
                              acrtc->crtc_id,
index 3ec3369..32f9c34 100644 (file)
@@ -66,6 +66,7 @@ struct dc_plane_state;
 struct common_irq_params {
        struct amdgpu_device *adev;
        enum dc_irq_source irq_src;
+       atomic64_t previous_timestamp;
 };
 
 /**
index ac8bcd1..46a33f6 100644 (file)
@@ -618,6 +618,25 @@ TRACE_EVENT(amdgpu_dmub_trace_high_irq,
                  __entry->param0, __entry->param1)
 );
 
+TRACE_EVENT(amdgpu_refresh_rate_track,
+       TP_PROTO(int crtc_index, ktime_t refresh_rate_ns, uint32_t refresh_rate_hz),
+       TP_ARGS(crtc_index, refresh_rate_ns, refresh_rate_hz),
+       TP_STRUCT__entry(
+               __field(int, crtc_index)
+               __field(ktime_t, refresh_rate_ns)
+               __field(uint32_t, refresh_rate_hz)
+               ),
+       TP_fast_assign(
+               __entry->crtc_index = crtc_index;
+               __entry->refresh_rate_ns = refresh_rate_ns;
+               __entry->refresh_rate_hz = refresh_rate_hz;
+       ),
+       TP_printk("crtc_index=%d refresh_rate=%dHz (%lld)",
+                 __entry->crtc_index,
+                 __entry->refresh_rate_hz,
+                 __entry->refresh_rate_ns)
+);
+
 #endif /* _AMDGPU_DM_TRACE_H_ */
 
 #undef TRACE_INCLUDE_PATH