diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gem_submit.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 40 | 
1 files changed, 17 insertions, 23 deletions
| diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index fdc5367aecaa..3cb029f10925 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -46,14 +46,12 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,  	if (!submit)  		return ERR_PTR(-ENOMEM); -	ret = drm_sched_job_init(&submit->base, &queue->entity, queue); +	ret = drm_sched_job_init(&submit->base, queue->entity, queue);  	if (ret) {  		kfree(submit);  		return ERR_PTR(ret);  	} -	xa_init_flags(&submit->deps, XA_FLAGS_ALLOC); -  	kref_init(&submit->ref);  	submit->dev = dev;  	submit->aspace = queue->ctx->aspace; @@ -72,8 +70,6 @@ void __msm_gem_submit_destroy(struct kref *kref)  {  	struct msm_gem_submit *submit =  			container_of(kref, struct msm_gem_submit, ref); -	unsigned long index; -	struct dma_fence *fence;  	unsigned i;  	if (submit->fence_id) { @@ -82,12 +78,6 @@ void __msm_gem_submit_destroy(struct kref *kref)  		mutex_unlock(&submit->queue->lock);  	} -	xa_for_each (&submit->deps, index, fence) { -		dma_fence_put(fence); -	} - -	xa_destroy(&submit->deps); -  	dma_fence_put(submit->user_fence);  	dma_fence_put(submit->hw_fence); @@ -171,7 +161,8 @@ out:  static int submit_lookup_cmds(struct msm_gem_submit *submit,  		struct drm_msm_gem_submit *args, struct drm_file *file)  { -	unsigned i, sz; +	unsigned i; +	size_t sz;  	int ret = 0;  	for (i = 0; i < args->nr_cmds; i++) { @@ -340,11 +331,13 @@ static int submit_fence_sync(struct msm_gem_submit *submit, bool no_implicit)  				return ret;  		} -		if (no_implicit) +		/* exclusive fences must be ordered */ +		if (no_implicit && !write)  			continue; -		ret = drm_gem_fence_array_add_implicit(&submit->deps, obj, -			write); +		ret = drm_sched_job_add_implicit_dependencies(&submit->base, +							      obj, +							      write);  		if (ret)  			break;  	} @@ -588,7 +581,7 @@ static struct drm_syncobj **msm_parse_deps(struct msm_gem_submit *submit,  		if (ret)  			break; -		ret = drm_gem_fence_array_add(&submit->deps, fence); +		ret = drm_sched_job_add_dependency(&submit->base, fence);  		if (ret)  			break; @@ -798,7 +791,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  			goto out_unlock;  		} -		ret = drm_gem_fence_array_add(&submit->deps, in_fence); +		ret = drm_sched_job_add_dependency(&submit->base, in_fence);  		if (ret)  			goto out_unlock;  	} @@ -878,6 +871,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	submit->nr_cmds = i; +	drm_sched_job_arm(&submit->base); +  	submit->user_fence = dma_fence_get(&submit->base.s_fence->finished);  	/* @@ -889,17 +884,16 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	if (submit->fence_id < 0) {  		ret = submit->fence_id = 0;  		submit->fence_id = 0; -		goto out;  	} -	if (args->flags & MSM_SUBMIT_FENCE_FD_OUT) { +	if (ret == 0 && args->flags & MSM_SUBMIT_FENCE_FD_OUT) {  		struct sync_file *sync_file = sync_file_create(submit->user_fence);  		if (!sync_file) {  			ret = -ENOMEM; -			goto out; +		} else { +			fd_install(out_fence_fd, sync_file->file); +			args->fence_fd = out_fence_fd;  		} -		fd_install(out_fence_fd, sync_file->file); -		args->fence_fd = out_fence_fd;  	}  	submit_attach_object_fences(submit); @@ -907,7 +901,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	/* The scheduler owns a ref now: */  	msm_gem_submit_get(submit); -	drm_sched_entity_push_job(&submit->base, &queue->entity); +	drm_sched_entity_push_job(&submit->base);  	args->fence = submit->fence_id; |