aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/scheduler/gpu_scheduler.h')
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.h60
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
32struct amd_gpu_scheduler; 30struct amd_gpu_scheduler;
33struct amd_sched_rq; 31struct amd_sched_rq;
34 32
@@ -68,36 +66,34 @@ struct amd_sched_rq {
68}; 66};
69 67
70struct amd_sched_fence { 68struct 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
80struct amd_sched_job { 78struct 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
94extern const struct fence_ops amd_sched_fence_ops; 88extern const struct fence_ops amd_sched_fence_ops_scheduled;
89extern const struct fence_ops amd_sched_fence_ops_finished;
95static inline struct amd_sched_fence *to_amd_sched_fence(struct fence *f) 90static 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)
109struct amd_sched_backend_ops { 105struct 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
116enum amd_sched_priority { 112enum amd_sched_priority {
@@ -152,25 +148,11 @@ void amd_sched_entity_push_job(struct amd_sched_job *sched_job);
152struct amd_sched_fence *amd_sched_fence_create( 148struct 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);
154void amd_sched_fence_scheduled(struct amd_sched_fence *fence); 150void amd_sched_fence_scheduled(struct amd_sched_fence *fence);
155void amd_sched_fence_signal(struct amd_sched_fence *fence); 151void amd_sched_fence_finished(struct amd_sched_fence *fence);
156int amd_sched_job_init(struct amd_sched_job *job, 152int 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), 156void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched);
161 void *owner, struct fence **fence); 157void amd_sched_job_recovery(struct amd_gpu_scheduler *sched);
162void amd_sched_job_pre_schedule(struct amd_gpu_scheduler *sched ,
163 struct amd_sched_job *s_job);
164void amd_sched_job_finish(struct amd_sched_job *s_job);
165void amd_sched_job_begin(struct amd_sched_job *s_job);
166static inline void amd_sched_job_get(struct amd_sched_job *job) {
167 if (job)
168 kref_get(&job->refcount);
169}
170
171static 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