aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 6b6524f04ce0..79b6f456f2c5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -149,9 +149,6 @@ static void amdgpu_irq_callback(struct amdgpu_device *adev,
149 if (!amdgpu_ih_prescreen_iv(adev)) 149 if (!amdgpu_ih_prescreen_iv(adev))
150 return; 150 return;
151 151
152 /* Before dispatching irq to IP blocks, send it to amdkfd */
153 amdgpu_amdkfd_interrupt(adev, (const void *) &ih->ring[ring_index]);
154
155 entry.iv_entry = (const uint32_t *)&ih->ring[ring_index]; 152 entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
156 amdgpu_ih_decode_iv(adev, &entry); 153 amdgpu_ih_decode_iv(adev, &entry);
157 154
@@ -371,39 +368,38 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
371 unsigned client_id = entry->client_id; 368 unsigned client_id = entry->client_id;
372 unsigned src_id = entry->src_id; 369 unsigned src_id = entry->src_id;
373 struct amdgpu_irq_src *src; 370 struct amdgpu_irq_src *src;
371 bool handled = false;
374 int r; 372 int r;
375 373
376 trace_amdgpu_iv(entry); 374 trace_amdgpu_iv(entry);
377 375
378 if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) { 376 if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) {
379 DRM_DEBUG("Invalid client_id in IV: %d\n", client_id); 377 DRM_DEBUG("Invalid client_id in IV: %d\n", client_id);
380 return;
381 }
382 378
383 if (src_id >= AMDGPU_MAX_IRQ_SRC_ID) { 379 } else if (src_id >= AMDGPU_MAX_IRQ_SRC_ID) {
384 DRM_DEBUG("Invalid src_id in IV: %d\n", src_id); 380 DRM_DEBUG("Invalid src_id in IV: %d\n", src_id);
385 return;
386 }
387 381
388 if (adev->irq.virq[src_id]) { 382 } else if (adev->irq.virq[src_id]) {
389 generic_handle_irq(irq_find_mapping(adev->irq.domain, src_id)); 383 generic_handle_irq(irq_find_mapping(adev->irq.domain, src_id));
390 } else {
391 if (!adev->irq.client[client_id].sources) {
392 DRM_DEBUG("Unregistered interrupt client_id: %d src_id: %d\n",
393 client_id, src_id);
394 return;
395 }
396 384
397 src = adev->irq.client[client_id].sources[src_id]; 385 } else if (!adev->irq.client[client_id].sources) {
398 if (!src) { 386 DRM_DEBUG("Unregistered interrupt client_id: %d src_id: %d\n",
399 DRM_DEBUG("Unhandled interrupt src_id: %d\n", src_id); 387 client_id, src_id);
400 return;
401 }
402 388
389 } else if ((src = adev->irq.client[client_id].sources[src_id])) {
403 r = src->funcs->process(adev, src, entry); 390 r = src->funcs->process(adev, src, entry);
404 if (r) 391 if (r < 0)
405 DRM_ERROR("error processing interrupt (%d)\n", r); 392 DRM_ERROR("error processing interrupt (%d)\n", r);
393 else if (r)
394 handled = true;
395
396 } else {
397 DRM_DEBUG("Unhandled interrupt src_id: %d\n", src_id);
406 } 398 }
399
400 /* Send it to amdkfd as well if it isn't already handled */
401 if (!handled)
402 amdgpu_amdkfd_interrupt(adev, entry->iv_entry);
407} 403}
408 404
409/** 405/**