drm/amdgpu: enable ih1 ih2 for Arcturus only
authorAlex Sierra <alex.sierra@amd.com>
Wed, 2 Sep 2020 04:24:56 +0000 (23:24 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 3 Sep 2020 18:47:48 +0000 (14:47 -0400)
Enable multi-ring ih1 and ih2 for Arcturus only.
For Navi10 family multi-ring has been disabled.
Apparently, having multi-ring enabled in Navi was causing
continus page fault interrupts.
Further investigation is needed to get to the root cause.
Related issue link:
https://gitlab.freedesktop.org/drm/amd/-/issues/1279

Signed-off-by: Alex Sierra <alex.sierra@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/navi10_ih.c

index 350f1bf063c61c2b55b28c31416ec3eda2060e51..74b1e7dc49a9c47c81b579894bd7cdada18ab8b6 100644 (file)
@@ -306,7 +306,8 @@ static int navi10_ih_irq_init(struct amdgpu_device *adev)
        } else {
                WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL, ih_rb_cntl);
        }
-       navi10_ih_reroute_ih(adev);
+       if (adev->irq.ih1.ring_size)
+               navi10_ih_reroute_ih(adev);
 
        if (unlikely(adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT)) {
                if (ih->use_bus_addr) {
@@ -668,19 +669,26 @@ static int navi10_ih_sw_init(void *handle)
        adev->irq.ih.use_doorbell = true;
        adev->irq.ih.doorbell_index = adev->doorbell_index.ih << 1;
 
-       r = amdgpu_ih_ring_init(adev, &adev->irq.ih1, PAGE_SIZE, true);
-       if (r)
-               return r;
+       adev->irq.ih1.ring_size = 0;
+       adev->irq.ih2.ring_size = 0;
 
-       adev->irq.ih1.use_doorbell = true;
-       adev->irq.ih1.doorbell_index = (adev->doorbell_index.ih + 1) << 1;
+       if (adev->asic_type < CHIP_NAVI10) {
+               r = amdgpu_ih_ring_init(adev, &adev->irq.ih1, PAGE_SIZE, true);
+               if (r)
+                       return r;
 
-       r = amdgpu_ih_ring_init(adev, &adev->irq.ih2, PAGE_SIZE, true);
-       if (r)
-               return r;
+               adev->irq.ih1.use_doorbell = true;
+               adev->irq.ih1.doorbell_index =
+                                       (adev->doorbell_index.ih + 1) << 1;
+
+               r = amdgpu_ih_ring_init(adev, &adev->irq.ih2, PAGE_SIZE, true);
+               if (r)
+                       return r;
 
-       adev->irq.ih2.use_doorbell = true;
-       adev->irq.ih2.doorbell_index = (adev->doorbell_index.ih + 2) << 1;
+               adev->irq.ih2.use_doorbell = true;
+               adev->irq.ih2.doorbell_index =
+                                       (adev->doorbell_index.ih + 2) << 1;
+       }
 
        r = amdgpu_irq_init(adev);