diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 60 | 
1 files changed, 50 insertions, 10 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index b4fcad0e62f7..df633e9ce920 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -226,16 +226,6 @@ void amdgpu_amdkfd_suspend(struct amdgpu_device *adev, bool run_pm)  		kgd2kfd_suspend(adev->kfd.dev, run_pm);  } -int amdgpu_amdkfd_resume_iommu(struct amdgpu_device *adev) -{ -	int r = 0; - -	if (adev->kfd.dev) -		r = kgd2kfd_resume_iommu(adev->kfd.dev); - -	return r; -} -  int amdgpu_amdkfd_resume(struct amdgpu_device *adev, bool run_pm)  {  	int r = 0; @@ -830,3 +820,53 @@ u64 amdgpu_amdkfd_xcp_memory_size(struct amdgpu_device *adev, int xcp_id)  		return adev->gmc.real_vram_size;  	}  } + +int amdgpu_amdkfd_unmap_hiq(struct amdgpu_device *adev, u32 doorbell_off, +			    u32 inst) +{ +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[inst]; +	struct amdgpu_ring *kiq_ring = &kiq->ring; +	struct amdgpu_ring_funcs *ring_funcs; +	struct amdgpu_ring *ring; +	int r = 0; + +	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues) +		return -EINVAL; + +	ring_funcs = kzalloc(sizeof(*ring_funcs), GFP_KERNEL); +	if (!ring_funcs) +		return -ENOMEM; + +	ring = kzalloc(sizeof(*ring), GFP_KERNEL); +	if (!ring) { +		r = -ENOMEM; +		goto free_ring_funcs; +	} + +	ring_funcs->type = AMDGPU_RING_TYPE_COMPUTE; +	ring->doorbell_index = doorbell_off; +	ring->funcs = ring_funcs; + +	spin_lock(&kiq->ring_lock); + +	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) { +		spin_unlock(&kiq->ring_lock); +		r = -ENOMEM; +		goto free_ring; +	} + +	kiq->pmf->kiq_unmap_queues(kiq_ring, ring, RESET_QUEUES, 0, 0); + +	if (kiq_ring->sched.ready && !adev->job_hang) +		r = amdgpu_ring_test_helper(kiq_ring); + +	spin_unlock(&kiq->ring_lock); + +free_ring: +	kfree(ring); + +free_ring_funcs: +	kfree(ring_funcs); + +	return r; +} | 
