drm/amdgpu: make sure retry faults are handled in a work item on Vega
authorChristian König <christian.koenig@amd.com>
Sat, 31 Oct 2020 17:46:59 +0000 (18:46 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 24 Nov 2020 17:06:49 +0000 (12:06 -0500)
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.koenig@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c

index 030272eeb71d2062d78ad541fe3d1cd25ce952d5..d03792d270c2efebc5bdbabfb9851e25a1e30182 100644 (file)
@@ -525,14 +525,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;