diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 30 | 
1 files changed, 30 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c index 74385e4b45c4..07ddf7bf6a3b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c @@ -416,3 +416,33 @@ clean_up:  	mutex_unlock(&adev->mes.mutex);  	return r;  } + +int amdgpu_mes_remove_gang(struct amdgpu_device *adev, int gang_id) +{ +	struct amdgpu_mes_gang *gang; + +	mutex_lock(&adev->mes.mutex); + +	gang = idr_find(&adev->mes.gang_id_idr, gang_id); +	if (!gang) { +		DRM_ERROR("gang id %d doesn't exist\n", gang_id); +		mutex_unlock(&adev->mes.mutex); +		return -EINVAL; +	} + +	if (!list_empty(&gang->queue_list)) { +		DRM_ERROR("queue list is not empty\n"); +		mutex_unlock(&adev->mes.mutex); +		return -EBUSY; +	} + +	idr_remove(&adev->mes.gang_id_idr, gang->gang_id); +	amdgpu_bo_free_kernel(&gang->gang_ctx_bo, +			      &gang->gang_ctx_gpu_addr, +			      &gang->gang_ctx_cpu_ptr); +	list_del(&gang->list); +	kfree(gang); + +	mutex_unlock(&adev->mes.mutex); +	return 0; +} | 
