<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:DengXian;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Aptos;}
@font-face
{font-family:"\@DengXian";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:12.0pt;
font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#467886;
text-decoration:underline;}
span.EmailStyle20
{mso-style-type:personal-reply;
font-family:"Arial",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<p style="font-family:Calibri;font-size:10pt;color:#008000;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[Public]<br>
</p>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">In theory , I don’t see the problem to use kiq to reset the schq. But I think it’s more stable to let driver do the reset for both kiq and schq since these two queues are the
basic part for others parts to run normally . <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">Regards<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">Shaoyun.liu<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Chen, Michael <Michael.Chen@amd.com>
<br>
<b>Sent:</b> Thursday, May 8, 2025 2:32 PM<br>
<b>To:</b> Deucher, Alexander <Alexander.Deucher@amd.com>; amd-gfx@lists.freedesktop.org<br>
<b>Cc:</b> Liu, Shaoyun <Shaoyun.Liu@amd.com><br>
<b>Subject:</b> Re: [PATCH] drm/amdgpu/mes12: rework pipe selection for legacy queues<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p style="margin:5.0pt"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif;color:green">[Public]<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal"><span style="color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:black"><o:p> </o:p></span></p>
</div>
<div class="MsoNormal" align="center" style="text-align:center">
<hr size="2" width="98%" align="center">
</div>
<div id="divRplyFwdMsg">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> Deucher, Alexander <<a href="mailto:Alexander.Deucher@amd.com">Alexander.Deucher@amd.com</a>><br>
<b>Sent:</b> Thursday, May 8, 2025 1:24 PM<br>
<b>To:</b> <a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a> <<a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>><br>
<b>Cc:</b> Deucher, Alexander <<a href="mailto:Alexander.Deucher@amd.com">Alexander.Deucher@amd.com</a>>; Chen, Michael <<a href="mailto:Michael.Chen@amd.com">Michael.Chen@amd.com</a>>; Liu, Shaoyun <<a href="mailto:Shaoyun.Liu@amd.com">Shaoyun.Liu@amd.com</a>><br>
<b>Subject:</b> [PATCH] drm/amdgpu/mes12: rework pipe selection for legacy queues</span>
<o:p></o:p></p>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="font-size:11.0pt">Only use the KIQ pipe for the scheduler queue. For legacy<br>
kernel queues, use the scheduler pipe. This aligns with<br>
mes11.<br>
<br>
Cc: Michael Chen <<a href="mailto:Michael.Chen@amd.com">Michael.Chen@amd.com</a>><br>
Cc: Shaoyun Liu <<a href="mailto:Shaoyun.Liu@amd.com">Shaoyun.Liu@amd.com</a>><br>
Signed-off-by: Alex Deucher <<a href="mailto:alexander.deucher@amd.com">alexander.deucher@amd.com</a>><br>
---<br>
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 11 ++++++++++-<br>
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h | 4 +++-<br>
drivers/gpu/drm/amd/amdgpu/mes_v12_0.c | 18 +++++++++---------<br>
3 files changed, 22 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c<br>
index 2febb63ab2322..f665daf71780d 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c<br>
@@ -299,6 +299,9 @@ int amdgpu_mes_map_legacy_queue(struct amdgpu_device *adev,<br>
queue_input.queue_id = ring->queue;<br>
queue_input.mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj);<br>
queue_input.wptr_addr = ring->wptr_gpu_addr;<br>
+ /* need to use KIQ pipe to map the scheduler queue */<br>
+ if (ring == &adev->mes.ring[AMDGPU_MES_SCHED_PIPE])<br>
+ queue_input.use_kiq = true;<br>
<br>
r = adev->mes.funcs->map_legacy_queue(&adev->mes, &queue_input);<br>
if (r)<br>
@@ -323,6 +326,10 @@ int amdgpu_mes_unmap_legacy_queue(struct amdgpu_device *adev,<br>
queue_input.trail_fence_addr = gpu_addr;<br>
queue_input.trail_fence_data = seq;<br>
<br>
+ /* need to use KIQ pipe to unmap the scheduler queue */<br>
+ if (ring == &adev->mes.ring[AMDGPU_MES_SCHED_PIPE])<br>
+ queue_input.use_kiq = true;<br>
+<br>
r = adev->mes.funcs->unmap_legacy_queue(&adev->mes, &queue_input);<br>
if (r)<br>
DRM_ERROR("failed to unmap legacy queue\n");<br>
@@ -349,7 +356,9 @@ int amdgpu_mes_reset_legacy_queue(struct amdgpu_device *adev,<br>
queue_input.wptr_addr = ring->wptr_gpu_addr;<br>
queue_input.vmid = vmid;<br>
queue_input.use_mmio = use_mmio;<br>
- queue_input.is_kq = true;<br>
+ /* need to use KIQ pipe to reset the scheduler queue */<br>
+ if (ring == &adev->mes.ring[AMDGPU_MES_SCHED_PIPE])<br>
+ queue_input.use_kiq = true;<br>
if (ring->funcs->type == AMDGPU_RING_TYPE_GFX)<br>
queue_input.legacy_gfx = true;<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">We are not supposed to reset scheduler queue, so this change is not necessary. <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="font-size:11.0pt"><br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h<br>
index a41f65b4f733a..d1836ad93ccfe 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h<br>
@@ -242,6 +242,7 @@ struct mes_map_legacy_queue_input {<br>
uint32_t queue_id;<br>
uint64_t mqd_addr;<br>
uint64_t wptr_addr;<br>
+ bool use_kiq;<br>
};<br>
<br>
struct mes_unmap_legacy_queue_input {<br>
@@ -252,6 +253,7 @@ struct mes_unmap_legacy_queue_input {<br>
uint32_t queue_id;<br>
uint64_t trail_fence_addr;<br>
uint64_t trail_fence_data;<br>
+ bool use_kiq;<br>
};<br>
<br>
struct mes_suspend_gang_input {<br>
@@ -277,7 +279,7 @@ struct mes_reset_queue_input {<br>
uint64_t wptr_addr;<br>
uint32_t vmid;<br>
bool legacy_gfx;<br>
- bool is_kq;<br>
+ bool use_kiq;<br>
};<br>
<br>
enum mes_misc_opcode {<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c b/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c<br>
index b4f17332d4664..8f2e24ecf747f 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c<br>
@@ -515,7 +515,7 @@ static int mes_v12_0_map_legacy_queue(struct amdgpu_mes *mes,<br>
convert_to_mes_queue_type(input->queue_type);<br>
mes_add_queue_pkt.map_legacy_kq = 1;<br>
<br>
- if (mes->adev->enable_uni_mes)<br>
+ if (input->use_kiq)<br>
pipe = AMDGPU_MES_KIQ_PIPE;<br>
else<br>
pipe = AMDGPU_MES_SCHED_PIPE;<br>
@@ -554,7 +554,7 @@ static int mes_v12_0_unmap_legacy_queue(struct amdgpu_mes *mes,<br>
convert_to_mes_queue_type(input->queue_type);<br>
}<br>
<br>
- if (mes->adev->enable_uni_mes)<br>
+ if (input->use_kiq)<br>
pipe = AMDGPU_MES_KIQ_PIPE;<br>
else<br>
pipe = AMDGPU_MES_SCHED_PIPE;<br>
@@ -869,7 +869,7 @@ static int mes_v12_0_reset_hw_queue(struct amdgpu_mes *mes,<br>
mes_reset_queue_pkt.doorbell_offset = input->doorbell_offset;<br>
}<br>
<br>
- if (input->is_kq)<br>
+ if (input->use_kiq)<br>
pipe = AMDGPU_MES_KIQ_PIPE;<br>
else<br>
pipe = AMDGPU_MES_SCHED_PIPE;<br>
@@ -1339,7 +1339,7 @@ static int mes_v12_0_kiq_enable_queue(struct amdgpu_device *adev)<br>
return r;<br>
}<br>
<br>
- kiq->pmf->kiq_map_queues(kiq_ring, &adev->mes.ring[0]);<br>
+ kiq->pmf->kiq_map_queues(kiq_ring, &adev->mes.ring[AMDGPU_MES_SCHED_PIPE]);<br>
<br>
r = amdgpu_ring_test_ring(kiq_ring);<br>
if (r) {<br>
@@ -1608,7 +1608,7 @@ static void mes_v12_0_kiq_dequeue_sched(struct amdgpu_device *adev)<br>
soc21_grbm_select(adev, 0, 0, 0, 0);<br>
mutex_unlock(&adev->srbm_mutex);<br>
<br>
- adev->mes.ring[0].sched.ready = false;<br>
+ adev->mes.ring[AMDGPU_MES_SCHED_PIPE].sched.ready = false;<br>
}<br>
<br>
static void mes_v12_0_kiq_setting(struct amdgpu_ring *ring)<br>
@@ -1687,7 +1687,7 @@ static int mes_v12_0_kiq_hw_init(struct amdgpu_device *adev)<br>
<br>
static int mes_v12_0_kiq_hw_fini(struct amdgpu_device *adev)<br>
{<br>
- if (adev->mes.ring[0].sched.ready) {<br>
+ if (adev->mes.ring[AMDGPU_MES_SCHED_PIPE].sched.ready) {<br>
if (adev->enable_uni_mes)<br>
amdgpu_mes_unmap_legacy_queue(adev,<br>
&adev->mes.ring[AMDGPU_MES_SCHED_PIPE],<br>
@@ -1695,7 +1695,7 @@ static int mes_v12_0_kiq_hw_fini(struct amdgpu_device *adev)<br>
else<br>
mes_v12_0_kiq_dequeue_sched(adev);<br>
<br>
- adev->mes.ring[0].sched.ready = false;<br>
+ adev->mes.ring[AMDGPU_MES_SCHED_PIPE].sched.ready = false;<br>
}<br>
<br>
mes_v12_0_enable(adev, false);<br>
@@ -1708,7 +1708,7 @@ static int mes_v12_0_hw_init(struct amdgpu_ip_block *ip_block)<br>
int r;<br>
struct amdgpu_device *adev = ip_block->adev;<br>
<br>
- if (adev->mes.ring[0].sched.ready)<br>
+ if (adev->mes.ring[AMDGPU_MES_SCHED_PIPE].sched.ready)<br>
goto out;<br>
<br>
if (!adev->enable_mes_kiq) {<br>
@@ -1763,7 +1763,7 @@ static int mes_v12_0_hw_init(struct amdgpu_ip_block *ip_block)<br>
* with MES enabled.<br>
*/<br>
adev->gfx.kiq[0].ring.sched.ready = false;<br>
- adev->mes.ring[0].sched.ready = true;<br>
+ adev->mes.ring[AMDGPU_MES_SCHED_PIPE].sched.ready = true;<br>
<br>
return 0;<br>
<br>
--<br>
2.49.0<o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</body>
</html>