<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:Arial;font-size:10pt;color:#0000FF;margin:5pt;" align="Left">
[AMD Official Use Only - General]<br>
</p>
<br>
<div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
Reviewed-by: Jack Xiao <Jack.Xiao@amd.com><br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
Regards,</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0 ContentPasted1">
Jack</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> amd-gfx <amd-gfx-bounces@lists.freedesktop.org> on behalf of YuBiao Wang <YuBiao.Wang@amd.com><br>
<b>Sent:</b> Tuesday, 18 October 2022 13:37<br>
<b>To:</b> amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org><br>
<b>Cc:</b> Wang, YuBiao <YuBiao.Wang@amd.com>; Grodzovsky, Andrey <Andrey.Grodzovsky@amd.com>; Xiao, Jack <Jack.Xiao@amd.com>; Xu, Feifei <Feifei.Xu@amd.com>; Chen, Horace <Horace.Chen@amd.com>; Wang, Yang(Kevin) <KevinYang.Wang@amd.com>; Tuikov, Luben <Luben.Tuikov@amd.com>;
 Deucher, Alexander <Alexander.Deucher@amd.com>; Quan, Evan <Evan.Quan@amd.com>; Koenig, Christian <Christian.Koenig@amd.com>; Liu, Monk <Monk.Liu@amd.com>; Zhang, Hawking <Hawking.Zhang@amd.com><br>
<b>Subject:</b> [PATCH v3] drm/amdgpu: dequeue mes scheduler during fini</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">[Why]<br>
If mes is not dequeued during fini, mes will be in an uncleaned state<br>
during reload, then mes couldn't receive some commands which leads to<br>
reload failure.<br>
<br>
[How]<br>
Perform MES dequeue via MMIO after all the unmap jobs are done by mes<br>
and before kiq fini.<br>
<br>
v3: Move the dequeue operation inside kiq_hw_fini.<br>
<br>
Signed-off-by: YuBiao Wang <YuBiao.Wang@amd.com><br>
---<br>
 drivers/gpu/drm/amd/amdgpu/mes_v11_0.c | 42 ++++++++++++++++++++++++--<br>
 1 file changed, 39 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c b/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c<br>
index 1174dcc88db5..b477bed40d61 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c<br>
@@ -1151,6 +1151,42 @@ static int mes_v11_0_sw_fini(void *handle)<br>
         return 0;<br>
 }<br>
 <br>
+static void mes_v11_0_kiq_dequeue_sched(struct amdgpu_device *adev)<br>
+{<br>
+       uint32_t data;<br>
+       int i;<br>
+<br>
+       mutex_lock(&adev->srbm_mutex);<br>
+       soc21_grbm_select(adev, 3, AMDGPU_MES_SCHED_PIPE, 0, 0);<br>
+<br>
+       /* disable the queue if it's active */<br>
+       if (RREG32_SOC15(GC, 0, regCP_HQD_ACTIVE) & 1) {<br>
+               WREG32_SOC15(GC, 0, regCP_HQD_DEQUEUE_REQUEST, 1);<br>
+               for (i = 0; i < adev->usec_timeout; i++) {<br>
+                       if (!(RREG32_SOC15(GC, 0, regCP_HQD_ACTIVE) & 1))<br>
+                               break;<br>
+                       udelay(1);<br>
+               }<br>
+       }<br>
+       data = RREG32_SOC15(GC, 0, regCP_HQD_PQ_DOORBELL_CONTROL);<br>
+       data = REG_SET_FIELD(data, CP_HQD_PQ_DOORBELL_CONTROL,<br>
+                               DOORBELL_EN, 0);<br>
+       data = REG_SET_FIELD(data, CP_HQD_PQ_DOORBELL_CONTROL,<br>
+                               DOORBELL_HIT, 1);<br>
+       WREG32_SOC15(GC, 0, regCP_HQD_PQ_DOORBELL_CONTROL, data);<br>
+<br>
+       WREG32_SOC15(GC, 0, regCP_HQD_PQ_DOORBELL_CONTROL, 0);<br>
+<br>
+       WREG32_SOC15(GC, 0, regCP_HQD_PQ_WPTR_LO, 0);<br>
+       WREG32_SOC15(GC, 0, regCP_HQD_PQ_WPTR_HI, 0);<br>
+       WREG32_SOC15(GC, 0, regCP_HQD_PQ_RPTR, 0);<br>
+<br>
+       soc21_grbm_select(adev, 0, 0, 0, 0);<br>
+       mutex_unlock(&adev->srbm_mutex);<br>
+<br>
+       adev->mes.ring.sched.ready = false;<br>
+}<br>
+<br>
 static void mes_v11_0_kiq_setting(struct amdgpu_ring *ring)<br>
 {<br>
         uint32_t tmp;<br>
@@ -1202,6 +1238,9 @@ static int mes_v11_0_kiq_hw_init(struct amdgpu_device *adev)<br>
 <br>
 static int mes_v11_0_kiq_hw_fini(struct amdgpu_device *adev)<br>
 {<br>
+       if (adev->mes.ring.sched.ready)<br>
+               mes_v11_0_kiq_dequeue_sched(adev);<br>
+<br>
         mes_v11_0_enable(adev, false);<br>
         return 0;<br>
 }<br>
@@ -1257,9 +1296,6 @@ static int mes_v11_0_hw_init(void *handle)<br>
 <br>
 static int mes_v11_0_hw_fini(void *handle)<br>
 {<br>
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;<br>
-<br>
-       adev->mes.ring.sched.ready = false;<br>
         return 0;<br>
 }<br>
 <br>
-- <br>
2.25.1<br>
<br>
</div>
</span></font></div>
</div>
</body>
</html>