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 24433409d7def831a9098b70ae78e05c2edfe7f1..8c75f7510880cff1fc895c818854353471d43c3a 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 099f94b6107cff21ff7958a704e9d9f13e81ac4f..bb3fe162dd93f9ae660c42b14c3adacd3abf9e0b 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 08c017cff43c46c2b91602aded85185bdc96a245..6a1571ffeaf9133bad09f4fedfe9d02dada3148f 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,
 };
 
 /**