mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 00:28:52 +02:00 
			
		
		
		
	 2956554823
			
		
	
	
		2956554823
		
	
	
	
	
		
			
			This will be used in a later commit to trace the drm client_id in some of the gpu_scheduler trace events. This requires changing all the users of drm_sched_job_init to add an extra parameter. The newly added drm_client_id field in the drm_sched_fence is a bit of a duplicate of the owner one. One suggestion I received was to merge those 2 fields - this can't be done right now as amdgpu uses some special values (AMDGPU_FENCE_OWNER_*) that can't really be translated into a client id. Christian is working on getting rid of those; when it's done we should be able to squash owner/drm_client_id together. Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Signed-off-by: Philipp Stanner <phasta@kernel.org> Link: https://lore.kernel.org/r/20250526125505.2360-3-pierre-eric.pelloux-prayer@amd.com
		
			
				
	
	
		
			91 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: MIT */
 | |
| 
 | |
| #ifndef _DRM_GPU_SCHEDULER_INTERNAL_H_
 | |
| #define _DRM_GPU_SCHEDULER_INTERNAL_H_
 | |
| 
 | |
| 
 | |
| /* Used to choose between FIFO and RR job-scheduling */
 | |
| extern int drm_sched_policy;
 | |
| 
 | |
| #define DRM_SCHED_POLICY_RR    0
 | |
| #define DRM_SCHED_POLICY_FIFO  1
 | |
| 
 | |
| void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
 | |
| 
 | |
| void drm_sched_rq_add_entity(struct drm_sched_rq *rq,
 | |
| 			     struct drm_sched_entity *entity);
 | |
| void drm_sched_rq_remove_entity(struct drm_sched_rq *rq,
 | |
| 				struct drm_sched_entity *entity);
 | |
| 
 | |
| void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity,
 | |
| 				     struct drm_sched_rq *rq, ktime_t ts);
 | |
| 
 | |
| void drm_sched_entity_select_rq(struct drm_sched_entity *entity);
 | |
| struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity);
 | |
| 
 | |
| struct drm_sched_fence *drm_sched_fence_alloc(struct drm_sched_entity *s_entity,
 | |
| 					      void *owner, u64 drm_client_id);
 | |
| void drm_sched_fence_init(struct drm_sched_fence *fence,
 | |
| 			  struct drm_sched_entity *entity);
 | |
| void drm_sched_fence_free(struct drm_sched_fence *fence);
 | |
| 
 | |
| void drm_sched_fence_scheduled(struct drm_sched_fence *fence,
 | |
| 			       struct dma_fence *parent);
 | |
| void drm_sched_fence_finished(struct drm_sched_fence *fence, int result);
 | |
| 
 | |
| /**
 | |
|  * drm_sched_entity_queue_pop - Low level helper for popping queued jobs
 | |
|  *
 | |
|  * @entity: scheduler entity
 | |
|  *
 | |
|  * Low level helper for popping queued jobs.
 | |
|  *
 | |
|  * Returns: The job dequeued or NULL.
 | |
|  */
 | |
| static inline struct drm_sched_job *
 | |
| drm_sched_entity_queue_pop(struct drm_sched_entity *entity)
 | |
| {
 | |
| 	struct spsc_node *node;
 | |
| 
 | |
| 	node = spsc_queue_pop(&entity->job_queue);
 | |
| 	if (!node)
 | |
| 		return NULL;
 | |
| 
 | |
| 	return container_of(node, struct drm_sched_job, queue_node);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * drm_sched_entity_queue_peek - Low level helper for peeking at the job queue
 | |
|  *
 | |
|  * @entity: scheduler entity
 | |
|  *
 | |
|  * Low level helper for peeking at the job queue
 | |
|  *
 | |
|  * Returns: The job at the head of the queue or NULL.
 | |
|  */
 | |
| static inline struct drm_sched_job *
 | |
| drm_sched_entity_queue_peek(struct drm_sched_entity *entity)
 | |
| {
 | |
| 	struct spsc_node *node;
 | |
| 
 | |
| 	node = spsc_queue_peek(&entity->job_queue);
 | |
| 	if (!node)
 | |
| 		return NULL;
 | |
| 
 | |
| 	return container_of(node, struct drm_sched_job, queue_node);
 | |
| }
 | |
| 
 | |
| /* Return true if entity could provide a job. */
 | |
| static inline bool
 | |
| drm_sched_entity_is_ready(struct drm_sched_entity *entity)
 | |
| {
 | |
| 	if (!spsc_queue_count(&entity->job_queue))
 | |
| 		return false;
 | |
| 
 | |
| 	if (READ_ONCE(entity->dependency))
 | |
| 		return false;
 | |
| 
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| #endif
 |