diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdkfd/kfd_chardev.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 55 | 
1 files changed, 52 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 0ec5f25adf56..cf0017f4d9d5 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -215,6 +215,7 @@ static int set_queue_properties_from_user(struct queue_properties *q_properties,  	}  	q_properties->is_interop = false; +	q_properties->is_gws = false;  	q_properties->queue_percent = args->queue_percentage;  	q_properties->priority = args->queue_priority;  	q_properties->queue_address = args->ring_base_address; @@ -1322,6 +1323,10 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,  		goto err_free;  	} +	/* Update the VRAM usage count */ +	if (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) +		WRITE_ONCE(pdd->vram_usage, pdd->vram_usage + args->size); +  	mutex_unlock(&p->mutex);  	args->handle = MAKE_HANDLE(args->gpu_id, idr_handle); @@ -1337,7 +1342,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,  	return 0;  err_free: -	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem); +	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem, NULL);  err_unlock:  	mutex_unlock(&p->mutex);  	return err; @@ -1351,6 +1356,7 @@ static int kfd_ioctl_free_memory_of_gpu(struct file *filep,  	void *mem;  	struct kfd_dev *dev;  	int ret; +	uint64_t size = 0;  	dev = kfd_device_by_id(GET_GPU_ID(args->handle));  	if (!dev) @@ -1373,7 +1379,7 @@ static int kfd_ioctl_free_memory_of_gpu(struct file *filep,  	}  	ret = amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, -						(struct kgd_mem *)mem); +						(struct kgd_mem *)mem, &size);  	/* If freeing the buffer failed, leave the handle in place for  	 * clean-up during process tear-down. @@ -1382,6 +1388,8 @@ static int kfd_ioctl_free_memory_of_gpu(struct file *filep,  		kfd_process_device_remove_obj_handle(  			pdd, GET_IDR_HANDLE(args->handle)); +	WRITE_ONCE(pdd->vram_usage, pdd->vram_usage - size); +  err_unlock:  	mutex_unlock(&p->mutex);  	return ret; @@ -1584,6 +1592,45 @@ copy_from_user_failed:  	return err;  } +static int kfd_ioctl_alloc_queue_gws(struct file *filep, +		struct kfd_process *p, void *data) +{ +	int retval; +	struct kfd_ioctl_alloc_queue_gws_args *args = data; +	struct queue *q; +	struct kfd_dev *dev; + +	mutex_lock(&p->mutex); +	q = pqm_get_user_queue(&p->pqm, args->queue_id); + +	if (q) { +		dev = q->device; +	} else { +		retval = -EINVAL; +		goto out_unlock; +	} + +	if (!dev->gws) { +		retval = -ENODEV; +		goto out_unlock; +	} + +	if (dev->dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) { +		retval = -ENODEV; +		goto out_unlock; +	} + +	retval = pqm_set_gws(&p->pqm, args->queue_id, args->num_gws ? dev->gws : NULL); +	mutex_unlock(&p->mutex); + +	args->first_gws = 0; +	return retval; + +out_unlock: +	mutex_unlock(&p->mutex); +	return retval; +} +  static int kfd_ioctl_get_dmabuf_info(struct file *filep,  		struct kfd_process *p, void *data)  { @@ -1687,7 +1734,7 @@ static int kfd_ioctl_import_dmabuf(struct file *filep,  	return 0;  err_free: -	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem); +	amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem, NULL);  err_unlock:  	mutex_unlock(&p->mutex);  	return r; @@ -1786,6 +1833,8 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {  	AMDKFD_IOCTL_DEF(AMDKFD_IOC_IMPORT_DMABUF,  				kfd_ioctl_import_dmabuf, 0), +	AMDKFD_IOCTL_DEF(AMDKFD_IOC_ALLOC_QUEUE_GWS, +			kfd_ioctl_alloc_queue_gws, 0),  };  #define AMDKFD_CORE_IOCTL_COUNT	ARRAY_SIZE(amdkfd_ioctls)  |