Looks like we can't enabled the IH1/IH2 feature for Vega20, make sure
retry faults are handled on a separate ring anyway.

Signed-off-by: Christian König <christian.koe...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 31 ++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 0c3421d587e8..32a6c15c2e08 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -524,14 +524,29 @@ static int gmc_v9_0_process_interrupt(struct 
amdgpu_device *adev,
        addr = (u64)entry->src_data[0] << 12;
        addr |= ((u64)entry->src_data[1] & 0xf) << 44;
 
-       if (retry_fault && amdgpu_gmc_filter_faults(adev, addr, entry->pasid,
-                                                   entry->timestamp))
-               return 1; /* This also prevents sending it to KFD */
-
-       /* If it's the first fault for this address, process it normally */
-       if (retry_fault && !in_interrupt() &&
-           amdgpu_vm_handle_fault(adev, entry->pasid, addr))
-               return 1; /* This also prevents sending it to KFD */
+       if (retry_fault) {
+               /* Returning 1 here also prevents sending the IV to the KFD */
+
+               /* Process it onyl if it's the first fault for this address */
+               if (entry->ih != &adev->irq.ih_soft &&
+                   amdgpu_gmc_filter_faults(adev, addr, entry->pasid,
+                                            entry->timestamp))
+                       return 1;
+
+               /* Delegate it to a different ring if the hardware hasn't
+                * already done it.
+                */
+               if (in_interrupt()) {
+                       amdgpu_irq_delegate(adev, entry, 8);
+                       return 1;
+               }
+
+               /* Try to handle the recoverable page faults by filling page
+                * tables
+                */
+               if (amdgpu_vm_handle_fault(adev, entry->pasid, addr))
+                       return 1;
+       }
 
        if (!printk_ratelimit())
                return 0;
-- 
2.25.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to