aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c24
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 @@
24#include <drm/drmP.h> 24#include <drm/drmP.h>
25#include "amdgpu.h" 25#include "amdgpu.h"
26#include "amdgpu_ih.h" 26#include "amdgpu_ih.h"
27#include "amdgpu_amdkfd.h"
28 27
29/** 28/**
30 * amdgpu_ih_ring_init - initialize the IH state 29 * 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)
129 * Interrupt hander (VI), walk the IH ring. 128 * Interrupt hander (VI), walk the IH ring.
130 * Returns irq process return code. 129 * Returns irq process return code.
131 */ 130 */
132int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih) 131int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,
132 void (*callback)(struct amdgpu_device *adev,
133 struct amdgpu_ih_ring *ih))
133{ 134{
134 struct amdgpu_iv_entry entry;
135 u32 wptr; 135 u32 wptr;
136 136
137 if (!ih->enabled || adev->shutdown) 137 if (!ih->enabled || adev->shutdown)
@@ -150,24 +150,10 @@ restart_ih:
150 rmb(); 150 rmb();
151 151
152 while (ih->rptr != wptr) { 152 while (ih->rptr != wptr) {
153 u32 ring_index = ih->rptr >> 2; 153 callback(adev, ih);
154
155 /* Prescreening of high-frequency interrupts */
156 if (!amdgpu_ih_prescreen_iv(adev)) {
157 ih->rptr &= ih->ptr_mask;
158 continue;
159 }
160
161 /* Before dispatching irq to IP blocks, send it to amdkfd */
162 amdgpu_amdkfd_interrupt(adev,
163 (const void *) &ih->ring[ring_index]);
164
165 entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
166 amdgpu_ih_decode_iv(adev, &entry);
167 ih->rptr &= ih->ptr_mask; 154 ih->rptr &= ih->ptr_mask;
168
169 amdgpu_irq_dispatch(adev, &entry);
170 } 155 }
156
171 amdgpu_ih_set_rptr(adev); 157 amdgpu_ih_set_rptr(adev);
172 atomic_set(&ih->lock, 0); 158 atomic_set(&ih->lock, 0);
173 159