mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

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
92 lines
2.4 KiB
C
92 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
|