OSDN Git Service

drm/amd/display: Add interface to enable DPIA trace
authorStylon Wang <stylon.wang@amd.com>
Fri, 30 Jun 2023 08:31:58 +0000 (16:31 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 7 Aug 2023 21:14:08 +0000 (17:14 -0400)
[Why]
DPIA traces from DMUB is not enabled by default, which is
less convenient to debug DPIA related issues because we have
to resort to other debug tools to enable DPIA trace.

[How]
Exposes interfaces to update trace mask from the DMUB GPINT commands.
Also provides DC implementations to enable DPIA trace.

Reviewed-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Stylon Wang <stylon.wang@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h
drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h

index 2443340..8c75f75 100644 (file)
@@ -1021,3 +1021,32 @@ bool dc_dmub_check_min_version(struct dmub_srv *srv)
                return true;
        return srv->hw_funcs.is_psrsu_supported(srv);
 }
+
+void dc_dmub_srv_enable_dpia_trace(const struct dc *dc)
+{
+       struct dc_dmub_srv *dc_dmub_srv = dc->ctx->dmub_srv;
+       struct dmub_srv *dmub;
+       enum dmub_status status;
+       static const uint32_t timeout_us = 30;
+
+       if (!dc_dmub_srv || !dc_dmub_srv->dmub) {
+               DC_LOG_ERROR("%s: invalid parameters.", __func__);
+               return;
+       }
+
+       dmub = dc_dmub_srv->dmub;
+
+       status = dmub_srv_send_gpint_command(dmub, DMUB_GPINT__SET_TRACE_BUFFER_MASK_WORD1, 0x0010, timeout_us);
+       if (status != DMUB_STATUS_OK) {
+               DC_LOG_ERROR("timeout updating trace buffer mask word\n");
+               return;
+       }
+
+       status = dmub_srv_send_gpint_command(dmub, DMUB_GPINT__UPDATE_TRACE_BUFFER_MASK, 0x0000, timeout_us);
+       if (status != DMUB_STATUS_OK) {
+               DC_LOG_ERROR("timeout updating trace buffer mask word\n");
+               return;
+       }
+
+       DC_LOG_DEBUG("Enabled DPIA trace\n");
+}
\ No newline at end of file
index 099f94b..bb3fe16 100644 (file)
@@ -87,4 +87,7 @@ void dc_dmub_srv_log_diagnostic_data(struct dc_dmub_srv *dc_dmub_srv);
 
 void dc_send_update_cursor_info_to_dmu(struct pipe_ctx *pCtx, uint8_t pipe_idx);
 bool dc_dmub_check_min_version(struct dmub_srv *srv);
+
+void dc_dmub_srv_enable_dpia_trace(const struct dc *dc);
+
 #endif /* _DMUB_DC_SRV_H_ */
index 08c017c..6a1571f 100644 (file)
@@ -779,6 +779,24 @@ enum dmub_gpint_command {
         * DESC: Notifies DMCUB detection is done so detection required can be cleared.
         */
        DMUB_GPINT__NOTIFY_DETECTION_DONE = 12,
+       /**
+        * DESC: Updates the trace buffer lower 32-bit mask.
+        * ARGS: The new mask
+        * RETURN: Lower 32-bit mask.
+        */
+       DMUB_GPINT__UPDATE_TRACE_BUFFER_MASK = 101,
+       /**
+        * DESC: Updates the trace buffer lower 32-bit mask.
+        * ARGS: The new mask
+        * RETURN: Lower 32-bit mask.
+        */
+       DMUB_GPINT__SET_TRACE_BUFFER_MASK_WORD0 = 102,
+       /**
+        * DESC: Updates the trace buffer mask bi0~bit15.
+        * ARGS: The new mask
+        * RETURN: Lower 32-bit mask.
+        */
+       DMUB_GPINT__SET_TRACE_BUFFER_MASK_WORD1 = 103,
 };
 
 /**