diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gem_submit.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 24 | 
1 files changed, 18 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 5d0a75d4b249..93535cac0676 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -221,7 +221,7 @@ fail:  	return ret;  } -static int submit_fence_sync(struct msm_gem_submit *submit) +static int submit_fence_sync(struct msm_gem_submit *submit, bool no_implicit)  {  	int i, ret = 0; @@ -229,6 +229,20 @@ static int submit_fence_sync(struct msm_gem_submit *submit)  		struct msm_gem_object *msm_obj = submit->bos[i].obj;  		bool write = submit->bos[i].flags & MSM_SUBMIT_BO_WRITE; +		if (!write) { +			/* NOTE: _reserve_shared() must happen before +			 * _add_shared_fence(), which makes this a slightly +			 * strange place to call it.  OTOH this is a +			 * convenient can-fail point to hook it in. +			 */ +			ret = reservation_object_reserve_shared(msm_obj->resv); +			if (ret) +				return ret; +		} + +		if (no_implicit) +			continue; +  		ret = msm_gem_sync_object(&msm_obj->base, submit->gpu->fctx, write);  		if (ret)  			break; @@ -451,11 +465,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	if (ret)  		goto out; -	if (!(args->flags & MSM_SUBMIT_NO_IMPLICIT)) { -		ret = submit_fence_sync(submit); -		if (ret) -			goto out; -	} +	ret = submit_fence_sync(submit, !!(args->flags & MSM_SUBMIT_NO_IMPLICIT)); +	if (ret) +		goto out;  	ret = submit_pin_objects(submit);  	if (ret) | 
