OSDN Git Service

drm/amdgpu: cleanup amdgpu_ih_process a bit more
authorChristian König <christian.koenig@amd.com>
Wed, 9 Jan 2019 14:36:29 +0000 (15:36 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 13 Feb 2019 22:47:11 +0000 (17:47 -0500)
Remove the callback and call the dispatcher directly.

Signed-off-by: Christian König <christian.koenig@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_ih.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h

index d0a5db7..1c50be3 100644 (file)
@@ -140,9 +140,7 @@ void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
  * Interrupt hander (VI), walk the IH ring.
  * Returns irq process return code.
  */
-int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
-                     void (*callback)(struct amdgpu_device *adev,
-                                      struct amdgpu_ih_ring *ih))
+int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
 {
        u32 wptr;
 
@@ -162,7 +160,7 @@ restart_ih:
        rmb();
 
        while (ih->rptr != wptr) {
-               callback(adev, ih);
+               amdgpu_irq_dispatch(adev, ih);
                ih->rptr &= ih->ptr_mask;
        }
 
index 1ccb183..113a1ba 100644 (file)
@@ -69,8 +69,6 @@ struct amdgpu_ih_funcs {
 int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
                        unsigned ring_size, bool use_bus_addr);
 void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
-int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
-                     void (*callback)(struct amdgpu_device *adev,
-                                      struct amdgpu_ih_ring *ih));
+int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
 
 #endif
index 8bfb3da..af4c3b1 100644 (file)
@@ -131,29 +131,6 @@ void amdgpu_irq_disable_all(struct amdgpu_device *adev)
 }
 
 /**
- * amdgpu_irq_callback - callback from the IH ring
- *
- * @adev: amdgpu device pointer
- * @ih: amdgpu ih ring
- *
- * Callback from IH ring processing to handle the entry at the current position
- * and advance the read pointer.
- */
-static void amdgpu_irq_callback(struct amdgpu_device *adev,
-                               struct amdgpu_ih_ring *ih)
-{
-       u32 ring_index = ih->rptr >> 2;
-       struct amdgpu_iv_entry entry;
-
-       entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
-       amdgpu_ih_decode_iv(adev, &entry);
-
-       trace_amdgpu_iv(ih - &adev->irq.ih, &entry);
-
-       amdgpu_irq_dispatch(adev, &entry);
-}
-
-/**
  * amdgpu_irq_handler - IRQ handler
  *
  * @irq: IRQ number (unused)
@@ -170,7 +147,7 @@ irqreturn_t amdgpu_irq_handler(int irq, void *arg)
        struct amdgpu_device *adev = dev->dev_private;
        irqreturn_t ret;
 
-       ret = amdgpu_ih_process(adev, &adev->irq.ih, amdgpu_irq_callback);
+       ret = amdgpu_ih_process(adev, &adev->irq.ih);
        if (ret == IRQ_HANDLED)
                pm_runtime_mark_last_busy(dev->dev);
        return ret;
@@ -188,7 +165,7 @@ 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_ih_process(adev, &adev->irq.ih1);
 }
 
 /**
@@ -203,7 +180,7 @@ 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_ih_process(adev, &adev->irq.ih2);
 }
 
 /**
@@ -394,14 +371,23 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev,
  * Dispatches IRQ to IP blocks.
  */
 void amdgpu_irq_dispatch(struct amdgpu_device *adev,
-                        struct amdgpu_iv_entry *entry)
+                        struct amdgpu_ih_ring *ih)
 {
-       unsigned client_id = entry->client_id;
-       unsigned src_id = entry->src_id;
+       u32 ring_index = ih->rptr >> 2;
+       struct amdgpu_iv_entry entry;
+       unsigned client_id, src_id;
        struct amdgpu_irq_src *src;
        bool handled = false;
        int r;
 
+       entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
+       amdgpu_ih_decode_iv(adev, &entry);
+
+       trace_amdgpu_iv(ih - &adev->irq.ih, &entry);
+
+       client_id = entry.client_id;
+       src_id = entry.src_id;
+
        if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) {
                DRM_DEBUG("Invalid client_id in IV: %d\n", client_id);
 
@@ -416,7 +402,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
                          client_id, src_id);
 
        } else if ((src = adev->irq.client[client_id].sources[src_id])) {
-               r = src->funcs->process(adev, src, entry);
+               r = src->funcs->process(adev, src, &entry);
                if (r < 0)
                        DRM_ERROR("error processing interrupt (%d)\n", r);
                else if (r)
@@ -428,7 +414,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
 
        /* Send it to amdkfd as well if it isn't already handled */
        if (!handled)
-               amdgpu_amdkfd_interrupt(adev, entry->iv_entry);
+               amdgpu_amdkfd_interrupt(adev, entry.iv_entry);
 }
 
 /**
index c27decf..c718e94 100644 (file)
@@ -108,7 +108,7 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev,
                      unsigned client_id, unsigned src_id,
                      struct amdgpu_irq_src *source);
 void amdgpu_irq_dispatch(struct amdgpu_device *adev,
-                        struct amdgpu_iv_entry *entry);
+                        struct amdgpu_ih_ring *ih);
 int amdgpu_irq_update(struct amdgpu_device *adev, struct amdgpu_irq_src *src,
                      unsigned type);
 int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src,