drm/amdgpu: cleanup amdgpu_ih_process a bit more
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>
This commit is contained in:
parent
16065fcdd1
commit
e2fb6e0a7a
@ -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 @@ restart_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 {
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
|
|
||||||
/* 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,
|
|||||||
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user