diff options
| author | Christian König <christian.koenig@amd.com> | 2018-09-26 11:08:32 +0200 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2018-12-07 18:14:07 -0500 | 
| commit | 2026057736e9134c524ad85b526005944034e00f (patch) | |
| tree | 8283c01edb7d2d2ab300220e468e700811c85f37 /drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | |
| parent | b408a548846f2343716351d55a6c9af9e73ec32c (diff) | |
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>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 38 | 
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,  	if (!amdgpu_ih_prescreen_iv(adev))  		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];  	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 src_id = entry->src_id;  	struct amdgpu_irq_src *src; +	bool handled = false;  	int r;  	trace_amdgpu_iv(entry);  	if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) {  		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); -		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)); -	} 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]; -		if (!src) { -			DRM_DEBUG("Unhandled interrupt src_id: %d\n", src_id); -			return; -		} +	} else if (!adev->irq.client[client_id].sources) { +		DRM_DEBUG("Unregistered interrupt client_id: %d src_id: %d\n", +			  client_id, src_id); +	} else if ((src = adev->irq.client[client_id].sources[src_id])) {  		r = src->funcs->process(adev, src, entry); -		if (r) +		if (r < 0)  			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);  }  /** | 
