<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">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">Remove the sriov check, The patch can work on both vega10 and Raven under bare metal with tip firmware.</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Best Regards</p>
<p style="margin-top:0;margin-bottom:0">Rex<br>
</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<br>
<br>
<div style="color: rgb(0, 0, 0);">
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" color="#000000" face="Calibri, sans-serif"><b>From:</b> amd-gfx <amd-gfx-bounces@lists.freedesktop.org> on behalf of Christian König <christian.koenig@amd.com><br>
<b>Sent:</b> Wednesday, August 15, 2018 3:07 PM<br>
<b>To:</b> Deng, Emily; amd-gfx@lists.freedesktop.org<br>
<b>Subject:</b> Re: [PATCH v2] drm/amdgpu/sriov: For sriov runtime, use kiq to do invalidate tlb</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">> As need to let somebody to test all your bare metal test cases, such as vega10, and other asics, as I don't have those environments, and only could test sriov.<br>
That is not much of a problem. We have plenty of people on the mailing <br>
list (including me) who can test this on both Vega10 and Raven.<br>
<br>
Just remove the SRIOV check and send the patch out with a request for <br>
testing it on bare metal.<br>
<br>
Christian.<br>
<br>
Am 15.08.2018 um 04:28 schrieb Deng, Emily:<br>
> Thanks for your review, will send a patch to review again as your suggestion. I think it will be better to use the amdgpu_sriov_vf(adev).<br>
> As need to let somebody to test all your bare metal test cases, such as vega10, and other asics, as I don't have those environments, and only could test sriov.<br>
> If passed those bare metal test cases and fixed the bugs if occurs, then could remove the amdgpu_sriov_vf(adev). Do you think so?<br>
><br>
> Best wishes<br>
> Emily Deng<br>
>> -----Original Message-----<br>
>> From: Christian König <ckoenig.leichtzumerken@gmail.com><br>
>> Sent: Tuesday, August 14, 2018 8:46 PM<br>
>> To: Deng, Emily <Emily.Deng@amd.com>; amd-gfx@lists.freedesktop.org<br>
>> Subject: Re: [PATCH v2] drm/amdgpu/sriov: For sriov runtime, use kiq to do<br>
>> invalidate tlb<br>
>><br>
>> Am 14.08.2018 um 12:56 schrieb Emily Deng:<br>
>>> To avoid the tlb flush not interrupted by world switch, use kiq and<br>
>>> one command to do tlb invalidate.<br>
>>><br>
>>> v2:<br>
>>> Add firmware version checking.<br>
>>><br>
>>> SWDEV-161497<br>
>>><br>
>>> Signed-off-by: Emily Deng <Emily.Deng@amd.com><br>
>>> ---<br>
>>>    drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 63<br>
>> ++++++++++++++++++++++++++++++++<br>
>>>    drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h |  2 +<br>
>>>    drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c    |  7 ++++<br>
>>>    3 files changed, 72 insertions(+)<br>
>>><br>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c<br>
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c<br>
>>> index 21adb1b6..436030c 100644<br>
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c<br>
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c<br>
>>> @@ -233,6 +233,69 @@ void amdgpu_virt_kiq_wreg(struct amdgpu_device<br>
>> *adev, uint32_t reg, uint32_t v)<br>
>>>      pr_err("failed to write reg:%x\n", reg);<br>
>>>    }<br>
>>><br>
>>> +signed long  amdgpu_virt_kiq_invalidate_tlb(struct amdgpu_device *adev,<br>
>> struct amdgpu_vmhub *hub,<br>
>>> +           unsigned eng, u32 req, uint32_t vmid)<br>
>> Drop that function here. It is Vega specific and doesn't belong into common<br>
>> code.<br>
>><br>
>>> +{<br>
>>> +   signed long r, cnt = 0;<br>
>>> +   unsigned long flags;<br>
>>> +   uint32_t seq;<br>
>>> +   struct amdgpu_kiq *kiq = &adev->gfx.kiq;<br>
>>> +   struct amdgpu_ring *ring = &kiq->ring;<br>
>>> +   struct drm_amdgpu_info_firmware fw_info;<br>
>>> +<br>
>>> +   if (ring->me == 1) {<br>
>>> +           fw_info.ver = adev->gfx.mec_fw_version;<br>
>>> +           fw_info.feature = adev->gfx.mec_feature_version;<br>
>>> +   } else {<br>
>>> +           fw_info.ver = adev->gfx.mec2_fw_version;<br>
>>> +           fw_info.feature = adev->gfx.mec2_feature_version;<br>
>>> +   }<br>
>>> +<br>
>>> +   if (fw_info.ver <  0x00000190 || fw_info.feature < 42)<br>
>>> +           return -EPERM;<br>
>> Please move that check into gfx_v9_0_ring_emit_reg_write_reg_wait().<br>
>><br>
>>> +<br>
>>> +   BUG_ON(!ring->funcs->emit_reg_write_reg_wait);<br>
>> That check is superfluous.<br>
>><br>
>>> +<br>
>>> +   spin_lock_irqsave(&kiq->ring_lock, flags);<br>
>>> +   amdgpu_ring_alloc(ring, 32);<br>
>>> +   amdgpu_ring_emit_reg_write_reg_wait(ring, hub->vm_inv_eng0_req +<br>
>> eng,<br>
>>> +                                       hub->vm_inv_eng0_ack + eng,<br>
>>> +                                       req, 1 << vmid);<br>
>>> +   amdgpu_fence_emit_polling(ring, &seq);<br>
>>> +   amdgpu_ring_commit(ring);<br>
>>> +   spin_unlock_irqrestore(&kiq->ring_lock, flags);<br>
>>> +<br>
>>> +   r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);<br>
>>> +<br>
>>> +   /* don't wait anymore for gpu reset case because this way may<br>
>>> +    * block gpu_recover() routine forever, e.g. this virt_kiq_rreg<br>
>>> +    * is triggered in TTM and ttm_bo_lock_delayed_workqueue() will<br>
>>> +    * never return if we keep waiting in virt_kiq_rreg, which cause<br>
>>> +    * gpu_recover() hang there.<br>
>>> +    *<br>
>>> +    * also don't wait anymore for IRQ context<br>
>>> +    * */<br>
>>> +   if (r < 1 && (adev->in_gpu_reset || in_interrupt()))<br>
>>> +           goto failed_kiq;<br>
>>> +<br>
>>> +   if (in_interrupt())<br>
>>> +           might_sleep();<br>
>>> +<br>
>>> +   while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {<br>
>>> +           msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);<br>
>>> +           r = amdgpu_fence_wait_polling(ring, seq,<br>
>> MAX_KIQ_REG_WAIT);<br>
>>> +   }<br>
>>> +<br>
>>> +   if (cnt > MAX_KIQ_REG_TRY)<br>
>>> +           goto failed_kiq;<br>
>>> +<br>
>>> +   return 0;<br>
>>> +<br>
>>> +failed_kiq:<br>
>>> +   pr_err("failed to invalidate tlb with kiq\n");<br>
>>> +   return r;<br>
>>> +}<br>
>>> +<br>
>>>    /**<br>
>>>     * amdgpu_virt_request_full_gpu() - request full gpu access<br>
>>>     * @amdgpu:      amdgpu device.<br>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h<br>
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h<br>
>>> index 880ac11..8908ff9 100644<br>
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h<br>
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h<br>
>>> @@ -288,6 +288,8 @@ void amdgpu_free_static_csa(struct amdgpu_device<br>
>> *adev);<br>
>>>    void amdgpu_virt_init_setting(struct amdgpu_device *adev);<br>
>>>    uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg);<br>
>>>    void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg,<br>
>>> uint32_t v);<br>
>>> +signed long  amdgpu_virt_kiq_invalidate_tlb(struct amdgpu_device *adev,<br>
>> struct amdgpu_vmhub *hub,<br>
>>> +           unsigned eng, u32 req, uint32_t vmid);<br>
>>>    int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init);<br>
>>>    int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init);<br>
>>>    int amdgpu_virt_reset_gpu(struct amdgpu_device *adev); diff --git<br>
>>> a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c<br>
>>> b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c<br>
>>> index 6999042..812f71e 100644<br>
>>> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c<br>
>>> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c<br>
>>> @@ -331,6 +331,7 @@ static void gmc_v9_0_flush_gpu_tlb(struct<br>
>> amdgpu_device *adev,<br>
>>>      /* Use register 17 for GART */<br>
>>>      const unsigned eng = 17;<br>
>>>      unsigned i, j;<br>
>>> +   int r;<br>
>>><br>
>>>      spin_lock(&adev->gmc.invalidate_lock);<br>
>>><br>
>>> @@ -338,6 +339,12 @@ static void gmc_v9_0_flush_gpu_tlb(struct<br>
>> amdgpu_device *adev,<br>
>>>              struct amdgpu_vmhub *hub = &adev->vmhub[i];<br>
>>>              u32 tmp = gmc_v9_0_get_invalidate_req(vmid);<br>
>>><br>
>>> +           if (amdgpu_sriov_vf(adev) && amdgpu_sriov_runtime(adev)) {<br>
>>> +                   r = amdgpu_virt_kiq_invalidate_tlb(adev, hub, eng, tmp,<br>
>> vmid);<br>
>>> +                   if (!r)<br>
>>> +                           continue;<br>
>>> +           }<br>
>>> +<br>
>> Drop that SRIOV check here. We don't want specialized code path for SRIOV.<br>
>><br>
>> Christian.<br>
>><br>
>>>              WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp);<br>
>>><br>
>>>              /* Busy wait for ACK.*/<br>
<br>
_______________________________________________<br>
amd-gfx mailing list<br>
amd-gfx@lists.freedesktop.org<br>
<a href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx" id="LPlnk575449" class="OWAAutoLink" previewremoved="true">https://lists.freedesktop.org/mailman/listinfo/amd-gfx</a>
<div id="LPBorder_GT_15343271181480.00033885929112609237" style="margin-bottom: 20px; overflow: auto; width: 100%; text-indent: 0px;">
<table id="LPContainer_15343271181480.9816543027771137" style="width: 90%; background-color: rgb(255, 255, 255); position: relative; overflow: auto; padding-top: 20px; padding-bottom: 20px; margin-top: 20px; border-top: 1px dotted rgb(200, 200, 200); border-bottom: 1px dotted rgb(200, 200, 200);" role="presentation" cellspacing="0">
<tbody>
<tr style="border-spacing: 0px;" valign="top">
<td id="TextCell_15343271181480.9952248566073559" style="vertical-align: top; position: relative; padding: 0px; display: table-cell;" colspan="2">
<div id="LPRemovePreviewContainer_15343271181480.875376248828901"></div>
<div id="LPTitle_15343271181480.18428245518285646" style="top: 0px; color: rgb(0, 120, 215); font-weight: 400; font-size: 21px; font-family: "wf_segoe-ui_light", "Segoe UI Light", "Segoe WP Light", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif; line-height: 21px;">
<a id="LPUrlAnchor_15343271181480.9572732071652488" style="text-decoration: none;" href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx" target="_blank">amd-gfx Info Page - freedesktop.org</a></div>
<div id="LPMetadata_15343271181480.5649528060753035" style="margin: 10px 0px 16px; color: rgb(102, 102, 102); font-weight: 400; font-family: "wf_segoe-ui_normal", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif; font-size: 14px; line-height: 14px;">
lists.freedesktop.org</div>
<div id="LPDescription_15343271181480.30659632369144363" style="display: block; color: rgb(102, 102, 102); font-weight: 400; font-family: "wf_segoe-ui_normal", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif; font-size: 14px; line-height: 20px; max-height: 100px; overflow: hidden;">
Subscribing to amd-gfx: Subscribe to amd-gfx by filling out the following form. Use of all freedesktop.org lists is subject to our Code of Conduct.</div>
</td>
</tr>
</tbody>
</table>
</div>
<br>
</div>
</span></font></div>
</div>
</div>
</body>
</html>