drm/amdgpu: Add a check to avoid panic because of unexpected irqs
authorxinhui pan <xinhui.pan@amd.com>
Tue, 9 Apr 2019 08:53:08 +0000 (16:53 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 10 Apr 2019 18:49:40 +0000 (13:49 -0500)
IP initialize ras in late_init, because of the BUGs of PSP or any
other components, driver receives unexpected irqs. It is ok to add such
check anyway.

Signed-off-by: xinhui pan <xinhui.pan@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c

index 58f5b10..107756d 100644 (file)
@@ -4840,10 +4840,16 @@ static int gfx_v9_0_cp_ecc_error_irq(struct amdgpu_device *adev,
                                  struct amdgpu_irq_src *source,
                                  struct amdgpu_iv_entry *entry)
 {
+       struct ras_common_if *ras_if = adev->gfx.ras_if;
        struct ras_dispatch_if ih_data = {
-               .head = *adev->gfx.ras_if,
                .entry = entry,
        };
+
+       if (!ras_if)
+               return 0;
+
+       ih_data.head = *ras_if;
+
        DRM_ERROR("CP ECC ERROR IRQ\n");
        amdgpu_ras_interrupt_dispatch(adev, &ih_data);
        return 0;
index f7de533..3fd79e0 100644 (file)
@@ -248,10 +248,16 @@ static int gmc_v9_0_process_ecc_irq(struct amdgpu_device *adev,
                struct amdgpu_irq_src *source,
                struct amdgpu_iv_entry *entry)
 {
+       struct ras_common_if *ras_if = adev->gmc.ras_if;
        struct ras_dispatch_if ih_data = {
-               .head = *adev->gmc.ras_if,
                .entry = entry,
        };
+
+       if (!ras_if)
+               return 0;
+
+       ih_data.head = *ras_if;
+
        amdgpu_ras_interrupt_dispatch(adev, &ih_data);
        return 0;
 }
index 31d5b3f..1ec60f5 100644 (file)
@@ -1865,10 +1865,16 @@ static int sdma_v4_0_process_ecc_irq(struct amdgpu_device *adev,
                                      struct amdgpu_irq_src *source,
                                      struct amdgpu_iv_entry *entry)
 {
+       struct ras_common_if *ras_if = adev->sdma.ras_if;
        struct ras_dispatch_if ih_data = {
-               .head = *adev->sdma.ras_if,
                .entry = entry,
        };
+
+       if (!ras_if)
+               return 0;
+
+       ih_data.head = *ras_if;
+
        amdgpu_ras_interrupt_dispatch(adev, &ih_data);
        return 0;
 }