diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdkfd/kfd_chardev.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 46 | 
1 files changed, 43 insertions, 3 deletions
| diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 505d39156acd..62c3d9cd6ef1 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -117,7 +117,7 @@ static int kfd_open(struct inode *inode, struct file *filep)  		return -EPERM;  	} -	process = kfd_create_process(current); +	process = kfd_create_process(filep);  	if (IS_ERR(process))  		return PTR_ERR(process); @@ -206,6 +206,7 @@ static int set_queue_properties_from_user(struct queue_properties *q_properties,  	q_properties->ctx_save_restore_area_address =  			args->ctx_save_restore_address;  	q_properties->ctx_save_restore_area_size = args->ctx_save_restore_size; +	q_properties->ctl_stack_size = args->ctl_stack_size;  	if (args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE ||  		args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE_AQL)  		q_properties->type = KFD_QUEUE_TYPE_COMPUTE; @@ -431,6 +432,38 @@ out:  	return err;  } +static int kfd_ioctl_set_trap_handler(struct file *filep, +					struct kfd_process *p, void *data) +{ +	struct kfd_ioctl_set_trap_handler_args *args = data; +	struct kfd_dev *dev; +	int err = 0; +	struct kfd_process_device *pdd; + +	dev = kfd_device_by_id(args->gpu_id); +	if (dev == NULL) +		return -EINVAL; + +	mutex_lock(&p->mutex); + +	pdd = kfd_bind_process_to_device(dev, p); +	if (IS_ERR(pdd)) { +		err = -ESRCH; +		goto out; +	} + +	if (dev->dqm->ops.set_trap_handler(dev->dqm, +					&pdd->qpd, +					args->tba_addr, +					args->tma_addr)) +		err = -EINVAL; + +out: +	mutex_unlock(&p->mutex); + +	return err; +} +  static int kfd_ioctl_dbg_register(struct file *filep,  				struct kfd_process *p, void *data)  { @@ -493,7 +526,7 @@ static int kfd_ioctl_dbg_unregister(struct file *filep,  	long status;  	dev = kfd_device_by_id(args->gpu_id); -	if (!dev) +	if (!dev || !dev->dbgmgr)  		return -EINVAL;  	if (dev->device_info->asic_family == CHIP_CARRIZO) { @@ -979,7 +1012,10 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {  			kfd_ioctl_set_scratch_backing_va, 0),  	AMDKFD_IOCTL_DEF(AMDKFD_IOC_GET_TILE_CONFIG, -			kfd_ioctl_get_tile_config, 0) +			kfd_ioctl_get_tile_config, 0), + +	AMDKFD_IOCTL_DEF(AMDKFD_IOC_SET_TRAP_HANDLER, +			kfd_ioctl_set_trap_handler, 0),  };  #define AMDKFD_CORE_IOCTL_COUNT	ARRAY_SIZE(amdkfd_ioctls) @@ -1088,6 +1124,10 @@ static int kfd_mmap(struct file *filp, struct vm_area_struct *vma)  			KFD_MMAP_EVENTS_MASK) {  		vma->vm_pgoff = vma->vm_pgoff ^ KFD_MMAP_EVENTS_MASK;  		return kfd_event_mmap(process, vma); +	} else if ((vma->vm_pgoff & KFD_MMAP_RESERVED_MEM_MASK) == +			KFD_MMAP_RESERVED_MEM_MASK) { +		vma->vm_pgoff = vma->vm_pgoff ^ KFD_MMAP_RESERVED_MEM_MASK; +		return kfd_reserved_mem_mmap(process, vma);  	}  	return -EFAULT; |