xref: /linux/drivers/gpu/drm/xe/xe_sched_job.h (revision 6af91e3d2cfc8bb579b1aa2d22cd91f8c34acdf6)
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2021 Intel Corporation
4  */
5 
6 #ifndef _XE_SCHED_JOB_H_
7 #define _XE_SCHED_JOB_H_
8 
9 #include "xe_sched_job_types.h"
10 
11 struct drm_printer;
12 struct xe_vm;
13 struct xe_sync_entry;
14 
15 #define XE_SCHED_HANG_LIMIT 1
16 #define XE_SCHED_JOB_TIMEOUT LONG_MAX
17 
18 int xe_sched_job_module_init(void);
19 void xe_sched_job_module_exit(void);
20 
21 struct xe_sched_job *xe_sched_job_create(struct xe_exec_queue *q,
22 					 u64 *batch_addr);
23 void xe_sched_job_destroy(struct kref *ref);
24 
25 /**
26  * xe_sched_job_get - get reference to XE schedule job
27  * @job: XE schedule job object
28  *
29  * Increment XE schedule job's reference count
30  */
31 static inline struct xe_sched_job *xe_sched_job_get(struct xe_sched_job *job)
32 {
33 	kref_get(&job->refcount);
34 	return job;
35 }
36 
37 /**
38  * xe_sched_job_put - put reference to XE schedule job
39  * @job: XE schedule job object
40  *
41  * Decrement XE schedule job's reference count, call xe_sched_job_destroy when
42  * reference count == 0.
43  */
44 static inline void xe_sched_job_put(struct xe_sched_job *job)
45 {
46 	kref_put(&job->refcount, xe_sched_job_destroy);
47 }
48 
49 void xe_sched_job_set_error(struct xe_sched_job *job, int error);
50 static inline bool xe_sched_job_is_error(struct xe_sched_job *job)
51 {
52 	return job->fence->error < 0;
53 }
54 
55 bool xe_sched_job_started(struct xe_sched_job *job);
56 bool xe_sched_job_completed(struct xe_sched_job *job);
57 
58 void xe_sched_job_arm(struct xe_sched_job *job);
59 void xe_sched_job_push(struct xe_sched_job *job);
60 
61 int xe_sched_job_last_fence_add_dep(struct xe_sched_job *job, struct xe_vm *vm);
62 void xe_sched_job_init_user_fence(struct xe_sched_job *job,
63 				  struct xe_sync_entry *sync);
64 
65 static inline struct xe_sched_job *
66 to_xe_sched_job(struct drm_sched_job *drm)
67 {
68 	return container_of(drm, struct xe_sched_job, drm);
69 }
70 
71 static inline u32 xe_sched_job_seqno(struct xe_sched_job *job)
72 {
73 	return job->fence ? job->fence->seqno : 0;
74 }
75 
76 static inline u32 xe_sched_job_lrc_seqno(struct xe_sched_job *job)
77 {
78 	return job->lrc_seqno;
79 }
80 
81 static inline void
82 xe_sched_job_add_migrate_flush(struct xe_sched_job *job, u32 flags)
83 {
84 	job->migrate_flush_flags = flags;
85 }
86 
87 bool xe_sched_job_is_migration(struct xe_exec_queue *q);
88 
89 struct xe_sched_job_snapshot *xe_sched_job_snapshot_capture(struct xe_sched_job *job);
90 void xe_sched_job_snapshot_free(struct xe_sched_job_snapshot *snapshot);
91 void xe_sched_job_snapshot_print(struct xe_sched_job_snapshot *snapshot, struct drm_printer *p);
92 
93 int xe_sched_job_add_deps(struct xe_sched_job *job, struct dma_resv *resv,
94 			  enum dma_resv_usage usage);
95 
96 #endif
97