]> Gentwo Git Trees - linux/.git/commitdiff
drm/amdgpu/gmc11: add amdgpu_vm_handle_fault() handling
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 13 Nov 2025 20:55:19 +0000 (15:55 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 2 Dec 2025 16:02:07 +0000 (11:02 -0500)
We need to call amdgpu_vm_handle_fault() on page fault
on all gfx9 and newer parts to properly update the
page tables, not just for recoverable page faults.

Cc: stable@vger.kernel.org
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c

index 7bc389d9f5c487097bef1b7867574aae434df900..8acc912e7e4cb3877fabf94e78dd203428631e72 100644 (file)
@@ -103,12 +103,39 @@ static int gmc_v11_0_process_interrupt(struct amdgpu_device *adev,
        uint32_t vmhub_index = entry->client_id == SOC21_IH_CLIENTID_VMC ?
                               AMDGPU_MMHUB0(0) : AMDGPU_GFXHUB(0);
        struct amdgpu_vmhub *hub = &adev->vmhub[vmhub_index];
+       bool retry_fault = !!(entry->src_data[1] & 0x80);
+       bool write_fault = !!(entry->src_data[1] & 0x20);
        uint32_t status = 0;
        u64 addr;
 
        addr = (u64)entry->src_data[0] << 12;
        addr |= ((u64)entry->src_data[1] & 0xf) << 44;
 
+       if (retry_fault) {
+               /* Returning 1 here also prevents sending the IV to the KFD */
+
+               /* Process it only if it's the first fault for this address */
+               if (entry->ih != &adev->irq.ih_soft &&
+                   amdgpu_gmc_filter_faults(adev, entry->ih, addr, entry->pasid,
+                                            entry->timestamp))
+                       return 1;
+
+               /* Delegate it to a different ring if the hardware hasn't
+                * already done it.
+                */
+               if (entry->ih == &adev->irq.ih) {
+                       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, 0, 0, addr,
+                                          entry->timestamp, write_fault))
+                       return 1;
+       }
+
        if (!amdgpu_sriov_vf(adev)) {
                /*
                 * Issue a dummy read to wait for the status register to