diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gem_submit.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 25 | 
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 5281d4bc37f..cd0554f6831 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -23,7 +23,6 @@   * Cmdstream submission:   */ -#define BO_INVALID_FLAGS ~(MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE)  /* make sure these don't conflict w/ MSM_SUBMIT_BO_x */  #define BO_VALID    0x8000  #define BO_LOCKED   0x4000 @@ -77,7 +76,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,  			goto out_unlock;  		} -		if (submit_bo.flags & BO_INVALID_FLAGS) { +		if (submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS) {  			DRM_ERROR("invalid flags: %x\n", submit_bo.flags);  			ret = -EINVAL;  			goto out_unlock; @@ -163,7 +162,7 @@ retry:  		/* if locking succeeded, pin bo: */ -		ret = msm_gem_get_iova(&msm_obj->base, +		ret = msm_gem_get_iova_locked(&msm_obj->base,  				submit->gpu->id, &iova);  		/* this would break the logic in the fail path.. there is no @@ -247,7 +246,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob  	/* For now, just map the entire thing.  Eventually we probably  	 * to do it page-by-page, w/ kmap() if not vmap()d..  	 */ -	ptr = msm_gem_vaddr(&obj->base); +	ptr = msm_gem_vaddr_locked(&obj->base);  	if (IS_ERR(ptr)) {  		ret = PTR_ERR(ptr); @@ -307,14 +306,12 @@ static void submit_cleanup(struct msm_gem_submit *submit, bool fail)  {  	unsigned i; -	mutex_lock(&submit->dev->struct_mutex);  	for (i = 0; i < submit->nr_bos; i++) {  		struct msm_gem_object *msm_obj = submit->bos[i].obj;  		submit_unlock_unpin_bo(submit, i);  		list_del_init(&msm_obj->submit_entry);  		drm_gem_object_unreference(&msm_obj->base);  	} -	mutex_unlock(&submit->dev->struct_mutex);  	ww_acquire_fini(&submit->ticket);  	kfree(submit); @@ -342,6 +339,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	if (args->nr_cmds > MAX_CMDS)  		return -EINVAL; +	mutex_lock(&dev->struct_mutex); +  	submit = submit_create(dev, gpu, args->nr_bos);  	if (!submit) {  		ret = -ENOMEM; @@ -369,6 +368,18 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  			goto out;  		} +		/* validate input from userspace: */ +		switch (submit_cmd.type) { +		case MSM_SUBMIT_CMD_BUF: +		case MSM_SUBMIT_CMD_IB_TARGET_BUF: +		case MSM_SUBMIT_CMD_CTX_RESTORE_BUF: +			break; +		default: +			DRM_ERROR("invalid type: %08x\n", submit_cmd.type); +			ret = -EINVAL; +			goto out; +		} +  		ret = submit_bo(submit, submit_cmd.submit_idx,  				&msm_obj, &iova, NULL);  		if (ret) @@ -391,6 +402,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  		submit->cmd[i].type = submit_cmd.type;  		submit->cmd[i].size = submit_cmd.size / 4;  		submit->cmd[i].iova = iova + submit_cmd.submit_offset; +		submit->cmd[i].idx  = submit_cmd.submit_idx;  		if (submit->valid)  			continue; @@ -410,5 +422,6 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  out:  	if (submit)  		submit_cleanup(submit, !!ret); +	mutex_unlock(&dev->struct_mutex);  	return ret;  }  | 
