diff options
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 @@ | |||
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 | */ |
132 | int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih) | 131 | int 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 | ||