drm/amdgpu: skip GFX FED error in page fault handling
authorTao Zhou <tao.zhou1@amd.com>
Mon, 19 Feb 2024 08:03:17 +0000 (16:03 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 20 Mar 2024 17:37:36 +0000 (13:37 -0400)
Let kfd interrupt handler process it.

v2: return 0 instead of 1 for fed error.
drop the usage of strcmp in interrupt handler.

Signed-off-by: Tao Zhou <tao.zhou1@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c

index 47b63a4ce68b330156637fc4717fd9c1a42ce7fd..05d52b9274a9d18c921a13d93d026165af487211 100644 (file)
@@ -548,7 +548,7 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,
 {
        bool retry_fault = !!(entry->src_data[1] & 0x80);
        bool write_fault = !!(entry->src_data[1] & 0x20);
-       uint32_t status = 0, cid = 0, rw = 0;
+       uint32_t status = 0, cid = 0, rw = 0, fed = 0;
        struct amdgpu_task_info *task_info;
        struct amdgpu_vmhub *hub;
        const char *mmhub_cid;
@@ -664,6 +664,14 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,
        status = RREG32(hub->vm_l2_pro_fault_status);
        cid = REG_GET_FIELD(status, VM_L2_PROTECTION_FAULT_STATUS, CID);
        rw = REG_GET_FIELD(status, VM_L2_PROTECTION_FAULT_STATUS, RW);
+       fed = REG_GET_FIELD(status, VM_L2_PROTECTION_FAULT_STATUS, FED);
+
+       /* for gfx fed error, kfd will handle it, return directly */
+       if (fed && amdgpu_ras_is_poison_mode_supported(adev) &&
+           (amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(9, 4, 2)) &&
+           (vmhub < AMDGPU_MMHUB0_START))
+               return 0;
+
        WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1);
 
        amdgpu_vm_update_fault_cache(adev, entry->pasid, addr, status, vmhub);