<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<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:#0078D7;margin:15pt;" align="Left">
[AMD Official Use Only - Internal Distribution Only]<br>
</p>
<br>
<div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
The problem happens when we want to reuse the same function for ASICs which have fewer SDMA engines. Some pointers on which <span style="font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; font-size: 14.6667px; background-color: rgb(255, 255, 255); display: inline !important">SOC15_REG_OFFSET
 depends for some higher index SDMA engines are 0, causing NULL pointer. </span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; font-size: 14.6667px; background-color: rgb(255, 255, 255); display: inline !important"><br>
</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; font-size: 14.6667px; background-color: rgb(255, 255, 255); display: inline !important">I will fix the
 default case in switch.</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; font-size: 14.6667px; background-color: rgb(255, 255, 255); display: inline !important"><br>
</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; font-size: 14.6667px; background-color: rgb(255, 255, 255); display: inline !important">Yong</span></div>
<div id="appendonsend"></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Kuehling, Felix <Felix.Kuehling@amd.com><br>
<b>Sent:</b> Monday, December 16, 2019 2:39 PM<br>
<b>To:</b> Zhao, Yong <Yong.Zhao@amd.com>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org><br>
<b>Subject:</b> Re: [PATCH] drm/amdkfd: Improve function get_sdma_rlc_reg_offset()</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">On 2019-12-13 8:38, Yong Zhao wrote:<br>
> This prevents the NULL pointer access when there are fewer than 8 sdma<br>
> engines.<br>
<br>
I don't see where you got a NULL pointer in the old code. Also this <br>
change is in an Arcturus-specific source file. AFAIK Arcturus always has <br>
8 SDMA engines.<br>
<br>
The new code is much longer than the old code. I don't see how that's an <br>
improvement. See one more comment inline.<br>
<br>
<br>
><br>
> Change-Id: Iabae9bff7546b344720905d5d4a5cfc066a79d25<br>
> Signed-off-by: Yong Zhao <Yong.Zhao@amd.com><br>
> ---<br>
>   .../drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c   | 64 ++++++++++++-------<br>
>   1 file changed, 42 insertions(+), 22 deletions(-)<br>
><br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c<br>
> index 3c119407dc34..2ad088f10493 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c<br>
> @@ -71,32 +71,52 @@ static uint32_t get_sdma_rlc_reg_offset(struct amdgpu_device *adev,<br>
>                                unsigned int engine_id,<br>
>                                unsigned int queue_id)<br>
>   {<br>
> -     uint32_t sdma_engine_reg_base[8] = {<br>
> -             SOC15_REG_OFFSET(SDMA0, 0,<br>
> -                              mmSDMA0_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL,<br>
> -             SOC15_REG_OFFSET(SDMA1, 0,<br>
> -                              mmSDMA1_RLC0_RB_CNTL) - mmSDMA1_RLC0_RB_CNTL,<br>
> -             SOC15_REG_OFFSET(SDMA2, 0,<br>
> -                              mmSDMA2_RLC0_RB_CNTL) - mmSDMA2_RLC0_RB_CNTL,<br>
> -             SOC15_REG_OFFSET(SDMA3, 0,<br>
> -                              mmSDMA3_RLC0_RB_CNTL) - mmSDMA3_RLC0_RB_CNTL,<br>
> -             SOC15_REG_OFFSET(SDMA4, 0,<br>
> -                              mmSDMA4_RLC0_RB_CNTL) - mmSDMA4_RLC0_RB_CNTL,<br>
> -             SOC15_REG_OFFSET(SDMA5, 0,<br>
> -                              mmSDMA5_RLC0_RB_CNTL) - mmSDMA5_RLC0_RB_CNTL,<br>
> -             SOC15_REG_OFFSET(SDMA6, 0,<br>
> -                              mmSDMA6_RLC0_RB_CNTL) - mmSDMA6_RLC0_RB_CNTL,<br>
> -             SOC15_REG_OFFSET(SDMA7, 0,<br>
> -                              mmSDMA7_RLC0_RB_CNTL) - mmSDMA7_RLC0_RB_CNTL<br>
> -     };<br>
> -<br>
> -     uint32_t retval = sdma_engine_reg_base[engine_id]<br>
<br>
I'm not sure where you were getting a NULL pointer, but I guess this <br>
could have used a range check to make sure engine_id is < 8 before <br>
indexing into the array. The equivalent in the switch statement would be <br>
a default case. See below.<br>
<br>
<br>
> +     uint32_t sdma_engine_reg_base;<br>
> +     uint32_t sdma_rlc_reg_offset;<br>
> +<br>
> +     switch (engine_id) {<br>
> +     case 0:<br>
> +             sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0,<br>
> +                             mmSDMA0_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL;<br>
> +             break;<br>
> +     case 1:<br>
> +             sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA1, 0,<br>
> +                             mmSDMA1_RLC0_RB_CNTL) - mmSDMA1_RLC0_RB_CNTL;<br>
> +             break;<br>
> +     case 2:<br>
> +             sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA2, 0,<br>
> +                             mmSDMA2_RLC0_RB_CNTL) - mmSDMA2_RLC0_RB_CNTL;<br>
> +             break;<br>
> +     case 3:<br>
> +             sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA3, 0,<br>
> +                             mmSDMA3_RLC0_RB_CNTL) - mmSDMA3_RLC0_RB_CNTL;<br>
> +             break;<br>
> +     case 4:<br>
> +             sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA4, 0,<br>
> +                             mmSDMA4_RLC0_RB_CNTL) - mmSDMA4_RLC0_RB_CNTL;<br>
> +             break;<br>
> +     case 5:<br>
> +             sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA5, 0,<br>
> +                             mmSDMA5_RLC0_RB_CNTL) - mmSDMA5_RLC0_RB_CNTL;<br>
> +             break;<br>
> +     case 6:<br>
> +             sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA6, 0,<br>
> +                             mmSDMA6_RLC0_RB_CNTL) - mmSDMA6_RLC0_RB_CNTL;<br>
> +             break;<br>
> +     case 7:<br>
> +             sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA7, 0,<br>
> +                             mmSDMA7_RLC0_RB_CNTL) - mmSDMA7_RLC0_RB_CNTL;<br>
> +             break;<br>
> +<br>
<br>
Do you need a default case for the switch statement? I think you get a <br>
compiler warning without one.<br>
<br>
Regards,<br>
   Felix<br>
<br>
<br>
> +     }<br>
> +<br>
> +     sdma_rlc_reg_offset = sdma_engine_reg_base<br>
>                + queue_id * (mmSDMA0_RLC1_RB_CNTL - mmSDMA0_RLC0_RB_CNTL);<br>
>   <br>
>        pr_debug("RLC register offset for SDMA%d RLC%d: 0x%x\n", engine_id,<br>
> -                     queue_id, retval);<br>
> +                     queue_id, sdma_rlc_reg_offset);<br>
>   <br>
> -     return retval;<br>
> +     return sdma_rlc_reg_offset;<br>
>   }<br>
>   <br>
>   static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd,<br>
</div>
</span></font></div>
</div>
</body>
</html>