<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from rtf -->
<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<font face="Calibri" size="2"><span style="font-size:10pt;">
<div style="padding-right:5pt;padding-left:5pt;"><font color="blue">[AMD Official Use Only - AMD Internal Distribution Only]<br>

</font></div>
<div style="margin-top:5pt;"><font face="Times New Roman" size="3"><span style="font-size:12pt;"><br>

</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+ <a href="mailto:KevinYang.Wang@amd.com"><font color="#2B579A"><span style="background-color:#E1DFDD;">@Wang, Yang(Kevin)</span></font></a>/<a href="mailto:Tao.Zhou1@amd.com"><font color="#2B579A"><span style="background-color:#E1DFDD;">@Zhou1,
Tao</span></font></a>/<a href="mailto:YiPeng.Chai@amd.com"><font color="#2B579A"><span style="background-color:#E1DFDD;">@Chai, Thomas</span></font></a> for the review.</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">Regards,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">Hawking</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-----Original Message-----<br>

From: Liu, Xiang(Dean) <Xiang.Liu@amd.com> <br>

Sent: Tuesday, March 18, 2025 17:15<br>

To: amd-gfx@lists.freedesktop.org<br>

Cc: Zhang, Hawking <Hawking.Zhang@amd.com>; Liu, Xiang(Dean) <Xiang.Liu@amd.com><br>

Subject: [PATCH] drm/amdgpu: Use correct aca handle to validate aca bank</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">The aca handle is introduced by upper caller, it's inappropriate to poll aca handle to match and validate aca bank, which will cause unexcepted ras error report.</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">Signed-off-by: Xiang Liu <<a href="mailto:xiang.liu@amd.com">xiang.liu@amd.com</a>></span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">---</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c | 122 ++++++++++--------------</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h |   2 +-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c |  10 +-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> 3 files changed, 58 insertions(+), 76 deletions(-)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">index ffd4c64e123c..b07e101c545d 100644</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -122,6 +122,25 @@ static void aca_smu_bank_dump(struct amdgpu_device *adev, int idx, int total, st</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                               idx + 1, total, aca_regs[i].name, bank->regs[aca_regs[i].reg_idx]);  }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+static bool aca_bank_should_dump(struct amdgpu_device *adev, enum </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+aca_smu_type type) {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       struct amdgpu_aca *aca = &adev->aca;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       bool ret = true;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       /*</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+        * Because the UE Valid MCA count will only be cleared after reset,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+        * the aca bank is only dumped once during the gpu recovery stage.</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+        */</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       if (type == ACA_SMU_TYPE_UE) {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               if (amdgpu_ras_intr_triggered())</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+                       ret = atomic_cmpxchg(&aca->ue_dump_flag, 0, 1) == 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               else</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+                       atomic_set(&aca->ue_dump_flag, 0);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+}</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> static int aca_smu_get_valid_aca_banks(struct amdgpu_device *adev, enum aca_smu_type type,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                                        int start, int count,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                                        struct aca_banks *banks, struct ras_query_context *qctx) @@ -130,6 +149,7 @@ static int aca_smu_get_valid_aca_banks(struct amdgpu_device *adev, enum aca_smu_</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         const struct aca_smu_funcs *smu_funcs = aca->smu_funcs;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct aca_bank bank;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         int i, max_count, ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       struct aca_bank_node *node;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         if (!count)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -159,14 +179,16 @@ static int aca_smu_get_valid_aca_banks(struct amdgpu_device *adev, enum aca_smu_</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                         return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 bank.smu_err_type = type;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               aca_smu_bank_dump(adev, i, count, &bank, qctx);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 ret = aca_banks_add_bank(banks, &bank);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                         return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       i = 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       if (aca_bank_should_dump(adev, type))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               list_for_each_entry(node, &banks->list, node)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+                       aca_smu_bank_dump(adev, i++, count, &bank, qctx);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -318,72 +340,29 @@ static int handler_aca_log_bank_error(struct aca_handle *handle, struct aca_bank</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-static int aca_dispatch_bank(struct aca_handle_manager *mgr, struct aca_bank *bank,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                            enum aca_smu_type type, bank_handler_t handler, void *data)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-{</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       struct aca_handle *handle;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       int ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       if (list_empty(&mgr->list))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       list_for_each_entry(handle, &mgr->list, node) {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               if (!aca_bank_is_valid(handle, bank, type))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                       continue;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               ret = handler(handle, bank, type, data);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                       return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-}</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-static int aca_dispatch_banks(struct aca_handle_manager *mgr, struct aca_banks *banks,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+static int aca_dispatch_banks(struct aca_handle *handle, struct </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+aca_banks *banks,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                               enum aca_smu_type type, bank_handler_t handler, void *data)  {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct aca_bank_node *node;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct aca_bank *bank;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       int ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       if (!mgr || !banks)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       if (!handle || !banks)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 return -EINVAL;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         /* pre check to avoid unnecessary operations */</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       if (list_empty(&mgr->list) || list_empty(&banks->list))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       if (list_empty(&banks->list))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         list_for_each_entry(node, &banks->list, node) {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 bank = &node->bank;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               ret = aca_dispatch_bank(mgr, bank, type, handler, data);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                       return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               if (aca_bank_is_valid(handle, bank, type))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+                       handler(handle, bank, type, data);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-static bool aca_bank_should_update(struct amdgpu_device *adev, enum aca_smu_type type) -{</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       struct amdgpu_aca *aca = &adev->aca;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       bool ret = true;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       /*</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-        * Because the UE Valid MCA count will only be cleared after reset,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-        * in order to avoid repeated counting of the error count,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-        * the aca bank is only updated once during the gpu recovery stage.</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-        */</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       if (type == ACA_SMU_TYPE_UE) {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               if (amdgpu_ras_intr_triggered())</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                       ret = atomic_cmpxchg(&aca->ue_update_flag, 0, 1) == 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               else</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                       atomic_set(&aca->ue_update_flag, 0);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-}</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> static void aca_banks_generate_cper(struct amdgpu_device *adev,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                                     enum aca_smu_type type,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                                     struct aca_banks *banks,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -417,20 +396,14 @@ static void aca_banks_generate_cper(struct amdgpu_device *adev,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-static int aca_banks_update(struct amdgpu_device *adev, enum aca_smu_type type,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                           bank_handler_t handler, struct ras_query_context *qctx, void *data)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+static int aca_banks_update(struct amdgpu_device *adev, struct aca_handle *handle,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+                           enum aca_smu_type type, bank_handler_t handler,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+                           struct ras_query_context *qctx, void *data)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       struct amdgpu_aca *aca = &adev->aca;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct aca_banks banks;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         u32 count = 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         int ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       if (list_empty(&aca->mgr.list))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       if (!aca_bank_should_update(adev, type))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         ret = aca_smu_get_valid_aca_count(adev, type, &count);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -442,15 +415,12 @@ static int aca_banks_update(struct amdgpu_device *adev, enum aca_smu_type type,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         ret = aca_smu_get_valid_aca_banks(adev, type, 0, count, &banks, qctx);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               goto err_release_banks;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       if (list_empty(&banks.list)) {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               ret = 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               goto err_release_banks;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       if (list_empty(&banks.list))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       ret = aca_dispatch_banks(&aca->mgr, &banks, type,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                                handler, data);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       ret = aca_dispatch_banks(handle, &banks, type, handler, data);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 goto err_release_banks;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -537,7 +507,7 @@ static int __aca_get_error_data(struct amdgpu_device *adev, struct aca_handle *h</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         /* update aca bank to aca source error_cache first */</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       ret = aca_banks_update(adev, smu_type, handler_aca_log_bank_error, qctx, NULL);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       ret = aca_banks_update(adev, handle, smu_type, </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+handler_aca_log_bank_error, qctx, NULL);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -730,7 +700,7 @@ int amdgpu_aca_init(struct amdgpu_device *adev)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct amdgpu_aca *aca = &adev->aca;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         int ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       atomic_set(&aca->ue_update_flag, 0);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       atomic_set(&aca->ue_dump_flag, 0);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         ret = aca_manager_init(&aca->mgr);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -745,14 +715,14 @@ void amdgpu_aca_fini(struct amdgpu_device *adev)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         aca_manager_fini(&aca->mgr);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       atomic_set(&aca->ue_update_flag, 0);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       atomic_set(&aca->ue_dump_flag, 0);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> int amdgpu_aca_reset(struct amdgpu_device *adev)  {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct amdgpu_aca *aca = &adev->aca;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       atomic_set(&aca->ue_update_flag, 0);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       atomic_set(&aca->ue_dump_flag, 0);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -880,12 +850,20 @@ static int handler_aca_bank_dump(struct aca_handle *handle, struct aca_bank *ban  static int aca_dump_show(struct seq_file *m, enum aca_smu_type type)  {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct amdgpu_device *adev = (struct amdgpu_device *)m->private;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       struct aca_handle_manager *mgr = &adev->aca.mgr;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       struct aca_handle *handle;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct aca_dump_context context = {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 .m = m,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 .idx = 0,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         };</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       return aca_banks_update(adev, type, handler_aca_bank_dump, NULL, (void *)&context);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       if (list_empty(&mgr->list))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       list_for_each_entry(handle, &mgr->list, node)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               aca_banks_update(adev, handle, type, handler_aca_bank_dump, NULL, </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+(void *)&context);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> }</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> static int aca_dump_ce_show(struct seq_file *m, void *unused) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">index 6f62e5d80ed6..e71d6f5afaec 100644</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -202,7 +202,7 @@ struct aca_smu_funcs {  struct amdgpu_aca {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct aca_handle_manager mgr;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         const struct aca_smu_funcs *smu_funcs;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       atomic_t ue_update_flag;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       atomic_t ue_dump_flag;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         bool is_enabled;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> };</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">index c0de682b7774..a4038e92c59e 100644</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -876,10 +876,14 @@ static int gfx_v9_4_3_aca_bank_parser(struct aca_handle *handle,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                                       void *data)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         struct aca_bank_info info;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-       u64 misc0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       u64 misc0, status;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         u32 instlo;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         int ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       status = bank->regs[ACA_REG_IDX_STATUS];</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+       if (!ACA_REG__STATUS__VAL(status))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               return 0;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         ret = aca_bank_info_decode(bank, &info);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         if (ret)</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 return ret;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">@@ -894,8 +898,8 @@ static int gfx_v9_4_3_aca_bank_parser(struct aca_handle *handle,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         switch (type) {</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         case ACA_SMU_TYPE_UE:</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 bank->aca_err_type = ACA_ERROR_TYPE_UE;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-               ret = aca_error_cache_log_bank_error(handle, &info,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">-                                                    ACA_ERROR_TYPE_UE, 1ULL);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+               if (ACA_REG__STATUS__UC(status) && ACA_REG__STATUS__PCC(status))</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+                       ret = aca_error_cache_log_bank_error(handle, &info, </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">+ACA_ERROR_TYPE_UE, 1);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 break;</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">         case ACA_SMU_TYPE_CE:</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">                 bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">--</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">2.34.1</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;"> </span></font></div>
</span></font>
</body>
</html>