diff options
Diffstat (limited to 'drivers/gpu/drm/amd/scheduler/gpu_scheduler.h')
-rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 60 |
1 files changed, 21 insertions, 39 deletions
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h index 070095a9433c..7cbbbfb502ef 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | |||
@@ -27,8 +27,6 @@ | |||
27 | #include <linux/kfifo.h> | 27 | #include <linux/kfifo.h> |
28 | #include <linux/fence.h> | 28 | #include <linux/fence.h> |
29 | 29 | ||
30 | #define AMD_SCHED_FENCE_SCHEDULED_BIT FENCE_FLAG_USER_BITS | ||
31 | |||
32 | struct amd_gpu_scheduler; | 30 | struct amd_gpu_scheduler; |
33 | struct amd_sched_rq; | 31 | struct amd_sched_rq; |
34 | 32 | ||
@@ -68,36 +66,34 @@ struct amd_sched_rq { | |||
68 | }; | 66 | }; |
69 | 67 | ||
70 | struct amd_sched_fence { | 68 | struct amd_sched_fence { |
71 | struct fence base; | 69 | struct fence scheduled; |
70 | struct fence finished; | ||
72 | struct fence_cb cb; | 71 | struct fence_cb cb; |
73 | struct list_head scheduled_cb; | 72 | struct fence *parent; |
74 | struct amd_gpu_scheduler *sched; | 73 | struct amd_gpu_scheduler *sched; |
75 | spinlock_t lock; | 74 | spinlock_t lock; |
76 | void *owner; | 75 | void *owner; |
77 | struct amd_sched_job *s_job; | ||
78 | }; | 76 | }; |
79 | 77 | ||
80 | struct amd_sched_job { | 78 | struct amd_sched_job { |
81 | struct kref refcount; | ||
82 | struct amd_gpu_scheduler *sched; | 79 | struct amd_gpu_scheduler *sched; |
83 | struct amd_sched_entity *s_entity; | 80 | struct amd_sched_entity *s_entity; |
84 | struct amd_sched_fence *s_fence; | 81 | struct amd_sched_fence *s_fence; |
85 | bool use_sched; /* true if the job goes to scheduler */ | 82 | struct fence_cb finish_cb; |
86 | struct fence_cb cb_free_job; | 83 | struct work_struct finish_work; |
87 | struct work_struct work_free_job; | 84 | struct list_head node; |
88 | struct list_head node; | 85 | struct delayed_work work_tdr; |
89 | struct delayed_work work_tdr; | ||
90 | void (*timeout_callback) (struct work_struct *work); | ||
91 | void (*free_callback)(struct kref *refcount); | ||
92 | }; | 86 | }; |
93 | 87 | ||
94 | extern const struct fence_ops amd_sched_fence_ops; | 88 | extern const struct fence_ops amd_sched_fence_ops_scheduled; |
89 | extern const struct fence_ops amd_sched_fence_ops_finished; | ||
95 | static inline struct amd_sched_fence *to_amd_sched_fence(struct fence *f) | 90 | static inline struct amd_sched_fence *to_amd_sched_fence(struct fence *f) |
96 | { | 91 | { |
97 | struct amd_sched_fence *__f = container_of(f, struct amd_sched_fence, base); | 92 | if (f->ops == &amd_sched_fence_ops_scheduled) |
93 | return container_of(f, struct amd_sched_fence, scheduled); | ||
98 | 94 | ||
99 | if (__f->base.ops == &amd_sched_fence_ops) | 95 | if (f->ops == &amd_sched_fence_ops_finished) |
100 | return __f; | 96 | return container_of(f, struct amd_sched_fence, finished); |
101 | 97 | ||
102 | return NULL; | 98 | return NULL; |
103 | } | 99 | } |
@@ -109,8 +105,8 @@ static inline struct amd_sched_fence *to_amd_sched_fence(struct fence *f) | |||
109 | struct amd_sched_backend_ops { | 105 | struct amd_sched_backend_ops { |
110 | struct fence *(*dependency)(struct amd_sched_job *sched_job); | 106 | struct fence *(*dependency)(struct amd_sched_job *sched_job); |
111 | struct fence *(*run_job)(struct amd_sched_job *sched_job); | 107 | struct fence *(*run_job)(struct amd_sched_job *sched_job); |
112 | void (*begin_job)(struct amd_sched_job *sched_job); | 108 | void (*timedout_job)(struct amd_sched_job *sched_job); |
113 | void (*finish_job)(struct amd_sched_job *sched_job); | 109 | void (*free_job)(struct amd_sched_job *sched_job); |
114 | }; | 110 | }; |
115 | 111 | ||
116 | enum amd_sched_priority { | 112 | enum amd_sched_priority { |
@@ -152,25 +148,11 @@ void amd_sched_entity_push_job(struct amd_sched_job *sched_job); | |||
152 | struct amd_sched_fence *amd_sched_fence_create( | 148 | struct amd_sched_fence *amd_sched_fence_create( |
153 | struct amd_sched_entity *s_entity, void *owner); | 149 | struct amd_sched_entity *s_entity, void *owner); |
154 | void amd_sched_fence_scheduled(struct amd_sched_fence *fence); | 150 | void amd_sched_fence_scheduled(struct amd_sched_fence *fence); |
155 | void amd_sched_fence_signal(struct amd_sched_fence *fence); | 151 | void amd_sched_fence_finished(struct amd_sched_fence *fence); |
156 | int amd_sched_job_init(struct amd_sched_job *job, | 152 | int amd_sched_job_init(struct amd_sched_job *job, |
157 | struct amd_gpu_scheduler *sched, | 153 | struct amd_gpu_scheduler *sched, |
158 | struct amd_sched_entity *entity, | 154 | struct amd_sched_entity *entity, |
159 | void (*timeout_cb)(struct work_struct *work), | 155 | void *owner); |
160 | void (*free_cb)(struct kref* refcount), | 156 | void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched); |
161 | void *owner, struct fence **fence); | 157 | void amd_sched_job_recovery(struct amd_gpu_scheduler *sched); |
162 | void amd_sched_job_pre_schedule(struct amd_gpu_scheduler *sched , | ||
163 | struct amd_sched_job *s_job); | ||
164 | void amd_sched_job_finish(struct amd_sched_job *s_job); | ||
165 | void amd_sched_job_begin(struct amd_sched_job *s_job); | ||
166 | static inline void amd_sched_job_get(struct amd_sched_job *job) { | ||
167 | if (job) | ||
168 | kref_get(&job->refcount); | ||
169 | } | ||
170 | |||
171 | static inline void amd_sched_job_put(struct amd_sched_job *job) { | ||
172 | if (job) | ||
173 | kref_put(&job->refcount, job->free_callback); | ||
174 | } | ||
175 | |||
176 | #endif | 158 | #endif |