diff options
Diffstat (limited to 'drivers/gpu/drm/scheduler/sched_main.c')
| -rw-r--r-- | drivers/gpu/drm/scheduler/sched_main.c | 43 | 
1 files changed, 32 insertions, 11 deletions
diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c index 4e6ad6e122bc..aea5a90ff98b 100644 --- a/drivers/gpu/drm/scheduler/sched_main.c +++ b/drivers/gpu/drm/scheduler/sched_main.c @@ -53,6 +53,7 @@  #include <drm/drm_print.h>  #include <drm/drm_gem.h> +#include <drm/drm_syncobj.h>  #include <drm/gpu_scheduler.h>  #include <drm/spsc_queue.h> @@ -308,7 +309,8 @@ static void drm_sched_start_timeout(struct drm_gpu_scheduler *sched)   */  void drm_sched_fault(struct drm_gpu_scheduler *sched)  { -	mod_delayed_work(sched->timeout_wq, &sched->work_tdr, 0); +	if (sched->timeout_wq) +		mod_delayed_work(sched->timeout_wq, &sched->work_tdr, 0);  }  EXPORT_SYMBOL(drm_sched_fault); @@ -719,6 +721,34 @@ int drm_sched_job_add_dependency(struct drm_sched_job *job,  EXPORT_SYMBOL(drm_sched_job_add_dependency);  /** + * drm_sched_job_add_syncobj_dependency - adds a syncobj's fence as a job dependency + * @job: scheduler job to add the dependencies to + * @file: drm file private pointer + * @handle: syncobj handle to lookup + * @point: timeline point + * + * This adds the fence matching the given syncobj to @job. + * + * Returns: + * 0 on success, or an error on failing to expand the array. + */ +int drm_sched_job_add_syncobj_dependency(struct drm_sched_job *job, +					 struct drm_file *file, +					 u32 handle, +					 u32 point) +{ +	struct dma_fence *fence; +	int ret; + +	ret = drm_syncobj_find_fence(file, handle, point, 0, &fence); +	if (ret) +		return ret; + +	return drm_sched_job_add_dependency(job, fence); +} +EXPORT_SYMBOL(drm_sched_job_add_syncobj_dependency); + +/**   * drm_sched_job_add_resv_dependencies - add all fences from the resv to the job   * @job: scheduler job to add the dependencies to   * @resv: the dma_resv object to get the fences from @@ -906,12 +936,6 @@ drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched)  	spin_unlock(&sched->job_list_lock); -	if (job) { -		job->entity->elapsed_ns += ktime_to_ns( -			ktime_sub(job->s_fence->finished.timestamp, -				  job->s_fence->scheduled.timestamp)); -	} -  	return job;  } @@ -1019,7 +1043,7 @@ static int drm_sched_main(void *param)  		drm_sched_fence_scheduled(s_fence);  		if (!IS_ERR_OR_NULL(fence)) { -			s_fence->parent = dma_fence_get(fence); +			drm_sched_fence_set_parent(s_fence, fence);  			/* Drop for original kref_init of the fence */  			dma_fence_put(fence); @@ -1117,9 +1141,6 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched)  	for (i = DRM_SCHED_PRIORITY_COUNT - 1; i >= DRM_SCHED_PRIORITY_MIN; i--) {  		struct drm_sched_rq *rq = &sched->sched_rq[i]; -		if (!rq) -			continue; -  		spin_lock(&rq->lock);  		list_for_each_entry(s_entity, &rq->entities, list)  			/*  |