diff options
author | Christian König <christian.koenig@amd.com> | 2018-09-17 15:18:37 +0200 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-09-26 21:09:22 -0500 |
commit | 1f8969463bca23327eedadab0fef0d28c9b6f29f (patch) | |
tree | 0b2d16d6ed8a7da61b1e8594f104fb6f9d2271d9 /drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c | |
parent | 95d7fc4a412aabd3f5b2e1123c3b8faf1a3d8da7 (diff) | |
download | linux-1f8969463bca23327eedadab0fef0d28c9b6f29f.tar.bz2 |
drm/amdgpu: move more interrupt processing into amdgpu_irq.c
Add a callback to amdgpu_ih_process to remove most of the IV logic.
Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c index 15fb0f9738ab..8af67f649660 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c @@ -24,7 +24,6 @@ #include <drm/drmP.h> #include "amdgpu.h" #include "amdgpu_ih.h" -#include "amdgpu_amdkfd.h" /** * amdgpu_ih_ring_init - initialize the IH state @@ -129,9 +128,10 @@ 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) +int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, + void (*callback)(struct amdgpu_device *adev, + struct amdgpu_ih_ring *ih)) { - struct amdgpu_iv_entry entry; u32 wptr; if (!ih->enabled || adev->shutdown) @@ -150,24 +150,10 @@ restart_ih: rmb(); while (ih->rptr != wptr) { - u32 ring_index = ih->rptr >> 2; - - /* Prescreening of high-frequency interrupts */ - if (!amdgpu_ih_prescreen_iv(adev)) { - ih->rptr &= ih->ptr_mask; - continue; - } - - /* Before dispatching irq to IP blocks, send it to amdkfd */ - amdgpu_amdkfd_interrupt(adev, - (const void *) &ih->ring[ring_index]); - - entry.iv_entry = (const uint32_t *)&ih->ring[ring_index]; - amdgpu_ih_decode_iv(adev, &entry); + callback(adev, ih); ih->rptr &= ih->ptr_mask; - - amdgpu_irq_dispatch(adev, &entry); } + amdgpu_ih_set_rptr(adev); atomic_set(&ih->lock, 0); |