aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4725-drm-amdgpu-Add-RAS-dbg-print-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4725-drm-amdgpu-Add-RAS-dbg-print-support.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4725-drm-amdgpu-Add-RAS-dbg-print-support.patch124
1 files changed, 124 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4725-drm-amdgpu-Add-RAS-dbg-print-support.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4725-drm-amdgpu-Add-RAS-dbg-print-support.patch
new file mode 100644
index 00000000..59455bdc
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4725-drm-amdgpu-Add-RAS-dbg-print-support.patch
@@ -0,0 +1,124 @@
+From eaa700cb57a23278d319c888d78d597db3a35a24 Mon Sep 17 00:00:00 2001
+From: John Clements <john.clements@amd.com>
+Date: Tue, 3 Dec 2019 11:12:34 +0800
+Subject: [PATCH 4725/4736] drm/amdgpu: Add RAS dbg print support
+
+Leverage host to TA shared memory to capture dbg log information from RAS TA
+
+Change-Id: I5e287560a6d493edf9bc6ac9ebbcbaeca0017dc8
+Signed-off-by: John Clements <john.clements@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 34 +++++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h | 2 +-
+ drivers/gpu/drm/amd/amdgpu/ta_ras_if.h | 16 ++++++++++++
+ 3 files changed, 51 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+index 9b869fa9b594..f91da0b43e8c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+@@ -616,6 +616,36 @@ static int psp_xgmi_initialize(struct psp_context *psp)
+ }
+
+ // ras begin
++void psp_ras_print_dbg_msg(struct psp_context *psp)
++{
++ struct ta_ras_shared_memory *ras_cmd;
++ struct ta_dbg_msg_list *dbg_msgs;
++ struct ta_dbg_msg* msg;
++ uint32_t mem_offset;
++ int i, sec, m_sec;
++
++ ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
++ dbg_msgs = &ras_cmd->debug_messages;
++ msg = &dbg_msgs->msg;
++
++ for (i = 0; i < dbg_msgs->msg_cnt; i++)
++ {
++ mem_offset = (uint8_t*)msg - (uint8_t*)ras_cmd;
++
++ /* Validate memory access does not overflow shared region */
++ if (mem_offset >= PSP_RAS_SHARED_MEM_SIZE)
++ break;
++
++ /* Time stamp = seconds*1000000 + milli-seconds*1000 */
++ sec = (int)msg->time_stamp/1000000;
++ m_sec = ((int)msg->time_stamp - sec*1000000) / 1000;
++
++ DRM_INFO("[RAS] %d.%d : %s\n", sec, m_sec, msg->msg);
++
++ msg = (struct ta_dbg_msg*)((uint8_t*)msg + SIZE_OF_MSG_STRUCT(msg));
++ }
++}
++
+ static void psp_prep_ras_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
+ uint64_t ras_ta_mc, uint64_t ras_mc_shared,
+ uint32_t ras_ta_size, uint32_t shared_size)
+@@ -679,6 +709,8 @@ static int psp_ras_load(struct psp_context *psp)
+
+ kfree(cmd);
+
++ psp_ras_print_dbg_msg(psp);
++
+ return ret;
+ }
+
+@@ -747,6 +779,8 @@ int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
+
+ kfree(cmd);
+
++ psp_ras_print_dbg_msg(psp);
++
+ return ret;
+ }
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+index 5f8fd3e3535b..a4d7690ea577 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+@@ -33,7 +33,7 @@
+ #define PSP_FENCE_BUFFER_SIZE 0x1000
+ #define PSP_CMD_BUFFER_SIZE 0x1000
+ #define PSP_XGMI_SHARED_MEM_SIZE 0x4000
+-#define PSP_RAS_SHARED_MEM_SIZE 0x4000
++#define PSP_RAS_SHARED_MEM_SIZE 0x8000
+ #define PSP_1_MEG 0x100000
+ #define PSP_TMR_SIZE 0x400000
+ #define PSP_HDCP_SHARED_MEM_SIZE 0x4000
+diff --git a/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h b/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h
+index ca7d05993ca2..bf1c4c55ce58 100644
+--- a/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h
++++ b/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h
+@@ -97,6 +97,21 @@ struct ta_ras_trigger_error_input {
+ uint64_t value; // method if error injection. i.e persistent, coherent etc.
+ };
+
++#define SIZE_OF_MSG_STRUCT(msg_ptr) ((msg_ptr)->msg_size + sizeof(struct ta_dbg_msg) - sizeof(char))
++struct __attribute__((__packed__)) ta_dbg_msg
++{
++ uint16_t msg_size; // Not including string terminator
++ uint64_t time_stamp;
++ char msg[1]; // string of size determined by msg_size
++};
++
++struct ta_dbg_msg_list
++{
++ uint32_t total_buf_size;
++ uint32_t msg_cnt;
++ struct ta_dbg_msg msg;
++};
++
+ /* Common input structure for RAS callbacks */
+ /**********************************************************/
+ union ta_ras_cmd_input {
+@@ -113,6 +128,7 @@ struct ta_ras_shared_memory {
+ enum ta_ras_status ras_status;
+ uint32_t reserved;
+ union ta_ras_cmd_input ras_in_message;
++ struct ta_dbg_msg_list debug_messages;
+ };
+
+ #endif // TL_RAS_IF_H_
+--
+2.17.1
+