mirror of https://gitee.com/openkylin/linux.git
drm/amdgpu: send IVs to the KFD only after processing them v3
This allows us to filter out VM faults in the GMC code. v2: don't filter out all faults v3: fix copy&paste typo, send all IV to the KFD, don't change message level 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
b408a54884
commit
2026057736
|
@ -149,9 +149,6 @@ static void amdgpu_irq_callback(struct amdgpu_device *adev,
|
||||||
if (!amdgpu_ih_prescreen_iv(adev))
|
if (!amdgpu_ih_prescreen_iv(adev))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* 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];
|
entry.iv_entry = (const uint32_t *)&ih->ring[ring_index];
|
||||||
amdgpu_ih_decode_iv(adev, &entry);
|
amdgpu_ih_decode_iv(adev, &entry);
|
||||||
|
|
||||||
|
@ -371,39 +368,38 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,
|
||||||
unsigned client_id = entry->client_id;
|
unsigned client_id = entry->client_id;
|
||||||
unsigned src_id = entry->src_id;
|
unsigned src_id = entry->src_id;
|
||||||
struct amdgpu_irq_src *src;
|
struct amdgpu_irq_src *src;
|
||||||
|
bool handled = false;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
trace_amdgpu_iv(entry);
|
trace_amdgpu_iv(entry);
|
||||||
|
|
||||||
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);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (src_id >= AMDGPU_MAX_IRQ_SRC_ID) {
|
} else if (src_id >= AMDGPU_MAX_IRQ_SRC_ID) {
|
||||||
DRM_DEBUG("Invalid src_id in IV: %d\n", src_id);
|
DRM_DEBUG("Invalid src_id in IV: %d\n", src_id);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adev->irq.virq[src_id]) {
|
} else if (adev->irq.virq[src_id]) {
|
||||||
generic_handle_irq(irq_find_mapping(adev->irq.domain, src_id));
|
generic_handle_irq(irq_find_mapping(adev->irq.domain, src_id));
|
||||||
} else {
|
|
||||||
if (!adev->irq.client[client_id].sources) {
|
|
||||||
DRM_DEBUG("Unregistered interrupt client_id: %d src_id: %d\n",
|
|
||||||
client_id, src_id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
src = adev->irq.client[client_id].sources[src_id];
|
} else if (!adev->irq.client[client_id].sources) {
|
||||||
if (!src) {
|
DRM_DEBUG("Unregistered interrupt client_id: %d src_id: %d\n",
|
||||||
DRM_DEBUG("Unhandled interrupt src_id: %d\n", src_id);
|
client_id, src_id);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
} 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)
|
if (r < 0)
|
||||||
DRM_ERROR("error processing interrupt (%d)\n", r);
|
DRM_ERROR("error processing interrupt (%d)\n", r);
|
||||||
|
else if (r)
|
||||||
|
handled = true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
DRM_DEBUG("Unhandled interrupt src_id: %d\n", src_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Send it to amdkfd as well if it isn't already handled */
|
||||||
|
if (!handled)
|
||||||
|
amdgpu_amdkfd_interrupt(adev, entry->iv_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue