<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<p style="font-family:Calibri;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - AMD Internal Distribution Only]<br>
</p>
<br>
<div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; color: rgb(0, 0, 0);">
<span style="font-size: 12pt;">Hi </span><span style="font-size: 11pt;">Kevin,</span></div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
Thanks for the comments.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
Each ras block should collect their errors by calling amdgpu_ras_query_error_status_helper() in turns. In the case of ACA mode, amdgpu_aca_log_ras_error_data() should be called with ras block specified to collect corresponding errors.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
However, in current code, the first ras block call amdgpu_aca_log_ras_error_data() and collect all the errors for all the ras blocks by not using the introduced ras block parameter but poll an appropriate aca handle to match and validate each bank entry, which
is inappropriate because the polling is matched by HWIP. </div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
With above condition, the other ras block call will do nothing and return.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
Best Regards,</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
Dean</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Wang, Yang(Kevin) <KevinYang.Wang@amd.com><br>
<b>Sent:</b> Tuesday, March 18, 2025 9:13 PM<br>
<b>To:</b> Zhang, Hawking <Hawking.Zhang@amd.com>; Liu, Xiang(Dean) <Xiang.Liu@amd.com>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org>; Zhou1, Tao <Tao.Zhou1@amd.com>; Chai, Thomas <YiPeng.Chai@amd.com><br>
<b>Subject:</b> RE: [PATCH] drm/amdgpu: Use correct aca handle to validate aca bank</font>
<div> </div>
</div>
<div class="BodyFragment"><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="Times New Roman" 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="Times New Roman" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">The aca bank set returned by the SMU may contain banks of different ip types, which may result in incorrect statistics of aca bank information of some RAS ip blocks.</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">e.g: </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">The SMU returned 6 banks in total, including 3 umc aca banks, 2 xgmi banks, and 1 unsupported bank.</span></font></div>
<div><font face="Times New Roman" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Times New Roman" size="2"><span style="font-size:11pt;"> </span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">Best Regards,</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">Kevin</span></font></div>
<div><font face="Calibri" size="2"><span style="font-size:11pt;">_____________________________________________<br>
<b>From:</b> Zhang, Hawking <Hawking.Zhang@amd.com> <br>
<b>Sent:</b> Tuesday, March 18, 2025 17:19<br>
<b>To:</b> Liu, Xiang(Dean) <Xiang.Liu@amd.com>; amd-gfx@lists.freedesktop.org; Wang, Yang(Kevin) <KevinYang.Wang@amd.com>; Zhou1, Tao <Tao.Zhou1@amd.com>; Chai, Thomas <YiPeng.Chai@amd.com><br>
<b>Subject:</b> RE: [PATCH] drm/amdgpu: Use correct aca handle to validate aca bank</span></font></div>
<div><font face="Times New Roman" size="3"><span style="font-size:12pt;"> </span></font></div>
<div><font face="Times New Roman" size="3"><span style="font-size:12pt;"> </span></font></div>
<div style="padding-right:5pt;padding-left:5pt;"><font face="Calibri" color="blue">[AMD Official Use Only - AMD Internal Distribution Only]<br>
</font></div>
<div><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">
</a><a name="_@_E4FE03D7BCDD4D2F8A3A6894796390C8"></a><font color="#2B579A"><span style="background-color:#E1DFDD;">@Wang, Yang(Kevin)</span></font>/<a href="mailto:Tao.Zhou1@amd.com"></a><a name="_@_8E1C3F2B43BE42FB961F426A9DAAD333"></a><font color="#2B579A"><span style="background-color:#E1DFDD;">@Zhou1,
Tao</span></font>/<a href="mailto:YiPeng.Chai@amd.com"></a><a name="_@_EBB3A0FDE65C4FD2A2B1D70885B5F9DF"></a><font color="#2B579A"><span style="background-color:#E1DFDD;">@Chai, Thomas</span></font> 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) <<a href="mailto:Xiang.Liu@amd.com"><font color="#467886"><u>Xiang.Liu@amd.com</u></font></a>>
<br>
Sent: Tuesday, March 18, 2025 17:15<br>
To: <a href="mailto:amd-gfx@lists.freedesktop.org"><font color="#467886"><u>amd-gfx@lists.freedesktop.org</u></font></a><br>
Cc: Zhang, Hawking <<a href="mailto:Hawking.Zhang@amd.com"><font color="#467886"><u>Hawking.Zhang@amd.com</u></font></a>>; Liu, Xiang(Dean) <<a href="mailto:Xiang.Liu@amd.com"><font color="#467886"><u>Xiang.Liu@amd.com</u></font></a>><br>
Subject: [PATCH] drm/amdgpu: Use correct aca handle to validate aca bank</span></font></div>
<div><font face="Times New Roman" 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="Times New Roman" size="2"><span style="font-size:11pt;"> </span></font></div>
</span></font></div>
</div>
</body>
</html>