diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/tonga_ih.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/tonga_ih.c | 29 | 
1 files changed, 29 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c index 923df2c0e535..aa4e320e31f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c @@ -219,6 +219,34 @@ static u32 tonga_ih_get_wptr(struct amdgpu_device *adev)  }  /** + * tonga_ih_prescreen_iv - prescreen an interrupt vector + * + * @adev: amdgpu_device pointer + * + * Returns true if the interrupt vector should be further processed. + */ +static bool tonga_ih_prescreen_iv(struct amdgpu_device *adev) +{ +	u32 ring_index = adev->irq.ih.rptr >> 2; +	u16 pasid; + +	switch (le32_to_cpu(adev->irq.ih.ring[ring_index]) & 0xff) { +	case 146: +	case 147: +		pasid = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]) >> 16; +		if (!pasid || amdgpu_vm_pasid_fault_credit(adev, pasid)) +			return true; +		break; +	default: +		/* Not a VM fault */ +		return true; +	} + +	adev->irq.ih.rptr += 16; +	return false; +} + +/**   * tonga_ih_decode_iv - decode an interrupt vector   *   * @adev: amdgpu_device pointer @@ -478,6 +506,7 @@ static const struct amd_ip_funcs tonga_ih_ip_funcs = {  static const struct amdgpu_ih_funcs tonga_ih_funcs = {  	.get_wptr = tonga_ih_get_wptr, +	.prescreen_iv = tonga_ih_prescreen_iv,  	.decode_iv = tonga_ih_decode_iv,  	.set_rptr = tonga_ih_set_rptr  }; |