diff options
| author | Christian König <christian.koenig@amd.com> | 2019-01-09 15:36:29 +0100 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2019-02-13 17:47:11 -0500 | 
| commit | e2fb6e0a7a2194f5ef1fada737217aad71e29e4d (patch) | |
| tree | b3670f22105227b195bf5a38d2cdda1482b73e03 /drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | |
| parent | 16065fcdd19ddb9e093192914ac863884f308766 (diff) | |
drm/amdgpu: cleanup amdgpu_ih_process a bit more
Remove the callback and call the dispatcher directly.
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 | 48 | 
1 files changed, 17 insertions, 31 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c index 8bfb3dab46f7..af4c3b1af322 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c @@ -131,29 +131,6 @@ void amdgpu_irq_disable_all(struct amdgpu_device *adev)  }  /** - * amdgpu_irq_callback - callback from the IH ring - * - * @adev: amdgpu device pointer - * @ih: amdgpu ih ring - * - * Callback from IH ring processing to handle the entry at the current position - * and advance the read pointer. - */ -static void amdgpu_irq_callback(struct amdgpu_device *adev, -				struct amdgpu_ih_ring *ih) -{ -	u32 ring_index = ih->rptr >> 2; -	struct amdgpu_iv_entry entry; - -	entry.iv_entry = (const uint32_t *)&ih->ring[ring_index]; -	amdgpu_ih_decode_iv(adev, &entry); - -	trace_amdgpu_iv(ih - &adev->irq.ih, &entry); - -	amdgpu_irq_dispatch(adev, &entry); -} - -/**   * amdgpu_irq_handler - IRQ handler   *   * @irq: IRQ number (unused) @@ -170,7 +147,7 @@ irqreturn_t amdgpu_irq_handler(int irq, void *arg)  	struct amdgpu_device *adev = dev->dev_private;  	irqreturn_t ret; -	ret = amdgpu_ih_process(adev, &adev->irq.ih, amdgpu_irq_callback); +	ret = amdgpu_ih_process(adev, &adev->irq.ih);  	if (ret == IRQ_HANDLED)  		pm_runtime_mark_last_busy(dev->dev);  	return ret; @@ -188,7 +165,7 @@ static void amdgpu_irq_handle_ih1(struct work_struct *work)  	struct amdgpu_device *adev = container_of(work, struct amdgpu_device,  						  irq.ih1_work); -	amdgpu_ih_process(adev, &adev->irq.ih1, amdgpu_irq_callback); +	amdgpu_ih_process(adev, &adev->irq.ih1);  }  /** @@ -203,7 +180,7 @@ static void amdgpu_irq_handle_ih2(struct work_struct *work)  	struct amdgpu_device *adev = container_of(work, struct amdgpu_device,  						  irq.ih2_work); -	amdgpu_ih_process(adev, &adev->irq.ih2, amdgpu_irq_callback); +	amdgpu_ih_process(adev, &adev->irq.ih2);  }  /** @@ -394,14 +371,23 @@ int amdgpu_irq_add_id(struct amdgpu_device *adev,   * Dispatches IRQ to IP blocks.   */  void amdgpu_irq_dispatch(struct amdgpu_device *adev, -			 struct amdgpu_iv_entry *entry) +			 struct amdgpu_ih_ring *ih)  { -	unsigned client_id = entry->client_id; -	unsigned src_id = entry->src_id; +	u32 ring_index = ih->rptr >> 2; +	struct amdgpu_iv_entry entry; +	unsigned client_id, src_id;  	struct amdgpu_irq_src *src;  	bool handled = false;  	int r; +	entry.iv_entry = (const uint32_t *)&ih->ring[ring_index]; +	amdgpu_ih_decode_iv(adev, &entry); + +	trace_amdgpu_iv(ih - &adev->irq.ih, &entry); + +	client_id = entry.client_id; +	src_id = entry.src_id; +  	if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) {  		DRM_DEBUG("Invalid client_id in IV: %d\n", client_id); @@ -416,7 +402,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,  			  client_id, src_id);  	} 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 < 0)  			DRM_ERROR("error processing interrupt (%d)\n", r);  		else if (r) @@ -428,7 +414,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,  	/* Send it to amdkfd as well if it isn't already handled */  	if (!handled) -		amdgpu_amdkfd_interrupt(adev, entry->iv_entry); +		amdgpu_amdkfd_interrupt(adev, entry.iv_entry);  }  /** | 
