]> Gentwo Git Trees - linux/.git/commitdiff
drm/amdgpu/cik_ih: Enable soft IRQ handler ring
authorTimur Kristóf <timur.kristof@gmail.com>
Wed, 26 Nov 2025 13:29:44 +0000 (14:29 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 2 Dec 2025 16:02:06 +0000 (11:02 -0500)
We are going to use the soft IRQ handler ring on GMC v7 (CIK)
to process interrupts from VM faults.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/cik_ih.c

index 41f4705bdbbdc163d28a00963ed40db574f92d2f..876a3256dba41cc253b622ad6a9602e2bb7a8f84 100644 (file)
@@ -156,6 +156,9 @@ static int cik_ih_irq_init(struct amdgpu_device *adev)
        /* enable irqs */
        cik_ih_enable_interrupts(adev);
 
+       if (adev->irq.ih_soft.ring_size)
+               adev->irq.ih_soft.enabled = true;
+
        return 0;
 }
 
@@ -192,6 +195,9 @@ static u32 cik_ih_get_wptr(struct amdgpu_device *adev,
 
        wptr = le32_to_cpu(*ih->wptr_cpu);
 
+       if (ih == &adev->irq.ih_soft)
+               goto out;
+
        if (wptr & IH_RB_WPTR__RB_OVERFLOW_MASK) {
                wptr &= ~IH_RB_WPTR__RB_OVERFLOW_MASK;
                /* When a ring buffer overflow happen start parsing interrupt
@@ -211,6 +217,8 @@ static u32 cik_ih_get_wptr(struct amdgpu_device *adev,
                tmp &= ~IH_RB_CNTL__WPTR_OVERFLOW_CLEAR_MASK;
                WREG32(mmIH_RB_CNTL, tmp);
        }
+
+out:
        return (wptr & ih->ptr_mask);
 }
 
@@ -306,6 +314,10 @@ static int cik_ih_sw_init(struct amdgpu_ip_block *ip_block)
        if (r)
                return r;
 
+       r = amdgpu_ih_ring_init(adev, &adev->irq.ih_soft, IH_SW_RING_SIZE, true);
+       if (r)
+               return r;
+
        r = amdgpu_irq_init(adev);
 
        return r;