drm/amdgpu: add support for processing IH ring 1 & 2
authorChristian König <christian.koenig@amd.com>
Wed, 26 Sep 2018 11:45:38 +0000 (13:45 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 25 Jan 2019 21:15:35 +0000 (16:15 -0500)
Previously we only added the ring buffer memory, now add the handling as
well.

Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h

index b8e543e23166dd5ecb0d3907ca679fd3edf8f60e..8bfb3dab46f711029018729db41bbf808c34261e 100644 (file)
@@ -176,6 +176,36 @@ irqreturn_t amdgpu_irq_handler(int irq, void *arg)
        return ret;
 }
 
+/**
+ * amdgpu_irq_handle_ih1 - kick of processing for IH1
+ *
+ * @work: work structure in struct amdgpu_irq
+ *
+ * Kick of processing IH ring 1.
+ */
+static void amdgpu_irq_handle_ih1(struct work_struct *work)
+{
+       struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
+                                                 irq.ih1_work);
+
+       amdgpu_ih_process(adev, &adev->irq.ih1, amdgpu_irq_callback);
+}
+
+/**
+ * amdgpu_irq_handle_ih2 - kick of processing for IH2
+ *
+ * @work: work structure in struct amdgpu_irq
+ *
+ * Kick of processing IH ring 2.
+ */
+static void amdgpu_irq_handle_ih2(struct work_struct *work)
+{
+       struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
+                                                 irq.ih2_work);
+
+       amdgpu_ih_process(adev, &adev->irq.ih2, amdgpu_irq_callback);
+}
+
 /**
  * amdgpu_msi_ok - check whether MSI functionality is enabled
  *
@@ -240,6 +270,9 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
                                amdgpu_hotplug_work_func);
        }
 
+       INIT_WORK(&adev->irq.ih1_work, amdgpu_irq_handle_ih1);
+       INIT_WORK(&adev->irq.ih2_work, amdgpu_irq_handle_ih2);
+
        adev->irq.installed = true;
        r = drm_irq_install(adev->ddev, adev->ddev->pdev->irq);
        if (r) {
index 7e06fa64321a46137a5613c00ad719b47d20f923..c27decfda494d7f6caaa430225ec584f74b30240 100644 (file)
@@ -89,7 +89,9 @@ struct amdgpu_irq {
 
        /* interrupt rings */
        struct amdgpu_ih_ring           ih, ih1, ih2;
-       const struct amdgpu_ih_funcs    *ih_funcs;
+       const struct amdgpu_ih_funcs    *ih_funcs;
+       struct work_struct              ih1_work, ih2_work;
+       struct amdgpu_irq_src           self_irq;
 
        /* gen irq stuff */
        struct irq_domain               *domain; /* GPU irq controller domain */