Commit e2fb6e0a authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/amdgpu: cleanup amdgpu_ih_process a bit more

Remove the callback and call the dispatcher directly.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 16065fcd
...@@ -140,9 +140,7 @@ void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih) ...@@ -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. * Interrupt hander (VI), walk the IH ring.
* Returns irq process return code. * Returns irq process return code.
*/ */
int amdgpu_ih_process(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))
{ {
u32 wptr; u32 wptr;
...@@ -162,7 +160,7 @@ int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, ...@@ -162,7 +160,7 @@ int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
rmb(); rmb();
while (ih->rptr != wptr) { while (ih->rptr != wptr) {
callback(adev, ih); amdgpu_irq_dispatch(adev, ih);
ih->rptr &= ih->ptr_mask; ih->rptr &= ih->ptr_mask;
} }
......
...@@ -69,8 +69,6 @@ struct amdgpu_ih_funcs { ...@@ -69,8 +69,6 @@ struct amdgpu_ih_funcs {
int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
unsigned ring_size, bool use_bus_addr); unsigned ring_size, bool use_bus_addr);
void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih); 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, int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);
void (*callback)(struct amdgpu_device *adev,
struct amdgpu_ih_ring *ih));
#endif #endif
...@@ -130,29 +130,6 @@ void amdgpu_irq_disable_all(struct amdgpu_device *adev) ...@@ -130,29 +130,6 @@ void amdgpu_irq_disable_all(struct amdgpu_device *adev)
spin_unlock_irqrestore(&adev->irq.lock, irqflags); spin_unlock_irqrestore(&adev->irq.lock, irqflags);
} }
/**
* 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 * amdgpu_irq_handler - IRQ handler
* *
...@@ -170,7 +147,7 @@ irqreturn_t amdgpu_irq_handler(int irq, void *arg) ...@@ -170,7 +147,7 @@ irqreturn_t amdgpu_irq_handler(int irq, void *arg)
struct amdgpu_device *adev = dev->dev_private; struct amdgpu_device *adev = dev->dev_private;
irqreturn_t ret; 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) if (ret == IRQ_HANDLED)
pm_runtime_mark_last_busy(dev->dev); pm_runtime_mark_last_busy(dev->dev);
return ret; return ret;
...@@ -188,7 +165,7 @@ static void amdgpu_irq_handle_ih1(struct work_struct *work) ...@@ -188,7 +165,7 @@ static void amdgpu_irq_handle_ih1(struct work_struct *work)
struct amdgpu_device *adev = container_of(work, struct amdgpu_device, struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
irq.ih1_work); 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) ...@@ -203,7 +180,7 @@ static void amdgpu_irq_handle_ih2(struct work_struct *work)
struct amdgpu_device *adev = container_of(work, struct amdgpu_device, struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
irq.ih2_work); 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, ...@@ -394,14 +371,23 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev,
* Dispatches IRQ to IP blocks. * Dispatches IRQ to IP blocks.
*/ */
void amdgpu_irq_dispatch(struct amdgpu_device *adev, void amdgpu_irq_dispatch(struct amdgpu_device *adev,
struct amdgpu_iv_entry *entry) struct amdgpu_ih_ring *ih)
{ {
unsigned client_id = entry->client_id; u32 ring_index = ih->rptr >> 2;
unsigned src_id = entry->src_id; struct amdgpu_iv_entry entry;
unsigned client_id, src_id;
struct amdgpu_irq_src *src; struct amdgpu_irq_src *src;
bool handled = false; bool handled = false;
int r; 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) { if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) {
DRM_DEBUG("Invalid client_id in IV: %d\n", client_id); DRM_DEBUG("Invalid client_id in IV: %d\n", client_id);
...@@ -416,7 +402,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev, ...@@ -416,7 +402,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
client_id, src_id); client_id, src_id);
} else if ((src = adev->irq.client[client_id].sources[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) if (r < 0)
DRM_ERROR("error processing interrupt (%d)\n", r); DRM_ERROR("error processing interrupt (%d)\n", r);
else if (r) else if (r)
...@@ -428,7 +414,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev, ...@@ -428,7 +414,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
/* Send it to amdkfd as well if it isn't already handled */ /* Send it to amdkfd as well if it isn't already handled */
if (!handled) if (!handled)
amdgpu_amdkfd_interrupt(adev, entry->iv_entry); amdgpu_amdkfd_interrupt(adev, entry.iv_entry);
} }
/** /**
......
...@@ -108,7 +108,7 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev, ...@@ -108,7 +108,7 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev,
unsigned client_id, unsigned src_id, unsigned client_id, unsigned src_id,
struct amdgpu_irq_src *source); struct amdgpu_irq_src *source);
void amdgpu_irq_dispatch(struct amdgpu_device *adev, 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, int amdgpu_irq_update(struct amdgpu_device *adev, struct amdgpu_irq_src *src,
unsigned type); unsigned type);
int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src, int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment