aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4490-drm-amd-display-Add-debug-trace-for-dmcub-FW-autoloa.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4490-drm-amd-display-Add-debug-trace-for-dmcub-FW-autoloa.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4490-drm-amd-display-Add-debug-trace-for-dmcub-FW-autoloa.patch163
1 files changed, 163 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4490-drm-amd-display-Add-debug-trace-for-dmcub-FW-autoloa.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4490-drm-amd-display-Add-debug-trace-for-dmcub-FW-autoloa.patch
new file mode 100644
index 00000000..1dec9bea
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4490-drm-amd-display-Add-debug-trace-for-dmcub-FW-autoloa.patch
@@ -0,0 +1,163 @@
+From f5b00cee7af647b42e233533666123bdc6024de3 Mon Sep 17 00:00:00 2001
+From: Yongqiang Sun <yongqiang.sun@amd.com>
+Date: Sat, 26 Oct 2019 10:19:40 -0400
+Subject: [PATCH 4490/4736] drm/amd/display: Add debug trace for dmcub FW
+ autoload.
+
+[Why & How]
+1. Add trace code enum for easy debugging.
+2. Add trace during uC boot up, including loading phy FW
+ and dmcu FW.
+3. Change cache memory type back to write back,
+ since write through has issue when resume from S0i3 100% hang after
+ 3.2ms.
+4. Change CW3 base address to hard code value to avoid memory overlap
+ with cw1.
+5. Change polling phy init done to infinite loop to avoid dcn hang when
+ dmcub uC stalled.
+6. Add dmcub FW dis-assembly file to repositatory for debug purpose.
+
+Signed-off-by: Yongqiang Sun <yongqiang.sun@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+---
+ .../amd/display/dmub/inc/dmub_trace_buffer.h | 21 +++++++++++++++++--
+ .../gpu/drm/amd/display/dmub/src/dmub_dcn20.c | 2 +-
+ .../gpu/drm/amd/display/dmub/src/dmub_srv.c | 20 +++++++++++-------
+ 3 files changed, 33 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_trace_buffer.h b/drivers/gpu/drm/amd/display/dmub/inc/dmub_trace_buffer.h
+index 9707706ba8ce..b0ee099d8a6e 100644
+--- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_trace_buffer.h
++++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_trace_buffer.h
+@@ -30,8 +30,25 @@
+ #define LOAD_DMCU_FW 1
+ #define LOAD_PHY_FW 2
+
++
++enum dmucb_trace_code {
++ DMCUB__UNKNOWN,
++ DMCUB__MAIN_BEGIN,
++ DMCUB__PHY_INIT_BEGIN,
++ DMCUB__PHY_FW_SRAM_LOAD_BEGIN,
++ DMCUB__PHY_FW_SRAM_LOAD_END,
++ DMCUB__PHY_INIT_POLL_DONE,
++ DMCUB__PHY_INIT_END,
++ DMCUB__DMCU_ERAM_LOAD_BEGIN,
++ DMCUB__DMCU_ERAM_LOAD_END,
++ DMCUB__DMCU_ISR_LOAD_BEGIN,
++ DMCUB__DMCU_ISR_LOAD_END,
++ DMCUB__MAIN_IDLE,
++ DMCUB__PERF_TRACE,
++};
++
+ struct dmcub_trace_buf_entry {
+- uint32_t trace_code;
++ enum dmucb_trace_code trace_code;
+ uint32_t tick_count;
+ uint32_t param0;
+ uint32_t param1;
+@@ -40,6 +57,7 @@ struct dmcub_trace_buf_entry {
+ #define TRACE_BUF_SIZE (1024) //1 kB
+ #define PERF_TRACE_MAX_ENTRY ((TRACE_BUF_SIZE - 8)/sizeof(struct dmcub_trace_buf_entry))
+
++
+ struct dmcub_trace_buf {
+ uint32_t entry_count;
+ uint32_t clk_freq;
+@@ -47,5 +65,4 @@ struct dmcub_trace_buf {
+ };
+
+
+-
+ #endif /* _DMUB_TRACE_BUFFER_H_ */
+diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c
+index 89fd27758dd5..e2b2cf2e01fd 100644
+--- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c
++++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c
+@@ -138,5 +138,5 @@ bool dmub_dcn20_is_supported(struct dmub_srv *dmub)
+
+ bool dmub_dcn20_is_phy_init(struct dmub_srv *dmub)
+ {
+- return REG_READ(DMCUB_SCRATCH10) != 0;
++ return REG_READ(DMCUB_SCRATCH10) == 0;
+ }
+diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c
+index 0dd32edbbcb3..5ae1906ff1b1 100644
+--- a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c
++++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c
+@@ -26,6 +26,8 @@
+ #include "../inc/dmub_srv.h"
+ #include "dmub_dcn20.h"
+ #include "dmub_dcn21.h"
++#include "dmub_trace_buffer.h"
++#include "os_types.h"
+ /*
+ * Note: the DMUB service is standalone. No additional headers should be
+ * added below or above this line unless they reside within the DMUB
+@@ -44,8 +46,6 @@
+ /* Mailbox size */
+ #define DMUB_MAILBOX_SIZE (DMUB_RB_SIZE)
+
+-/* Tracebuffer size */
+-#define DMUB_TRACEBUFF_SIZE (1024) //1kB buffer
+
+ /* Number of windows in use. */
+ #define DMUB_NUM_WINDOWS (DMUB_WINDOW_5_TRACEBUFF + 1)
+@@ -53,6 +53,7 @@
+
+ #define DMUB_CW0_BASE (0x60000000)
+ #define DMUB_CW1_BASE (0x61000000)
++#define DMUB_CW3_BASE (0x63000000)
+ #define DMUB_CW5_BASE (0x65000000)
+
+ static inline uint32_t dmub_align(uint32_t val, uint32_t factor)
+@@ -181,7 +182,7 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
+ mail->top = mail->base + DMUB_MAILBOX_SIZE;
+
+ trace_buff->base = dmub_align(mail->top, 256);
+- trace_buff->top = trace_buff->base + DMUB_TRACEBUFF_SIZE;
++ trace_buff->top = trace_buff->base + TRACE_BUF_SIZE;
+
+ out->fb_size = dmub_align(trace_buff->top, 4096);
+
+@@ -291,7 +292,7 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
+ cw2.region.top = cw2.region.base + data_fb->size;
+
+ cw3.offset.quad_part = bios_fb->gpu_addr;
+- cw3.region.base = DMUB_CW1_BASE + stack_fb->size;
++ cw3.region.base = DMUB_CW3_BASE;
+ cw3.region.top = cw3.region.base + bios_fb->size;
+
+ cw4.offset.quad_part = mail_fb->gpu_addr;
+@@ -394,19 +395,24 @@ enum dmub_status dmub_srv_wait_for_auto_load(struct dmub_srv *dmub,
+ enum dmub_status dmub_srv_wait_for_phy_init(struct dmub_srv *dmub,
+ uint32_t timeout_us)
+ {
+- uint32_t i;
++ uint32_t i = 0;
+
+ if (!dmub->hw_init || !dmub->hw_funcs.is_phy_init)
+ return DMUB_STATUS_INVALID;
+
+- for (i = 0; i <= timeout_us; i += 10) {
++/* for (i = 0; i <= timeout_us; i += 10) {
+ if (dmub->hw_funcs.is_phy_init(dmub))
+ return DMUB_STATUS_OK;
+
+ udelay(10);
++ }*/
++ while (!dmub->hw_funcs.is_phy_init(dmub)) {
++ ASSERT(i <= timeout_us);
++ i += 10;
++ udelay(10);
+ }
+
+- return DMUB_STATUS_TIMEOUT;
++ return DMUB_STATUS_OK;
+ }
+
+ enum dmub_status dmub_srv_wait_for_idle(struct dmub_srv *dmub,
+--
+2.17.1
+