drm/i915: Reset sched_engine.no_priolist immediately after dequeue
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / i915_scheduler.h
index 4501e5a..713c38c 100644 (file)
 
 struct drm_printer;
 
-#define priolist_for_each_request(it, plist, idx) \
-       for (idx = 0; idx < ARRAY_SIZE((plist)->requests); idx++) \
-               list_for_each_entry(it, &(plist)->requests[idx], sched.link)
-
-#define priolist_for_each_request_consume(it, n, plist, idx) \
-       for (; \
-            (plist)->used ? (idx = __ffs((plist)->used)), 1 : 0; \
-            (plist)->used &= ~BIT(idx)) \
-               list_for_each_entry_safe(it, n, \
-                                        &(plist)->requests[idx], \
-                                        sched.link)
+#define priolist_for_each_request(it, plist) \
+       list_for_each_entry(it, &(plist)->requests, sched.link)
+
+#define priolist_for_each_request_consume(it, n, plist) \
+       list_for_each_entry_safe(it, n, &(plist)->requests, sched.link)
 
 void i915_sched_node_init(struct i915_sched_node *node);
 void i915_sched_node_reinit(struct i915_sched_node *node);
@@ -44,8 +38,6 @@ void i915_sched_node_fini(struct i915_sched_node *node);
 void i915_schedule(struct i915_request *request,
                   const struct i915_sched_attr *attr);
 
-void i915_schedule_bump_priority(struct i915_request *rq, unsigned int bump);
-
 struct list_head *
 i915_sched_lookup_priolist(struct intel_engine_cs *engine, int prio);
 
@@ -56,6 +48,37 @@ static inline void i915_priolist_free(struct i915_priolist *p)
                __i915_priolist_free(p);
 }
 
+struct i915_sched_engine *
+i915_sched_engine_create(unsigned int subclass);
+
+void i915_sched_engine_free(struct kref *kref);
+
+static inline struct i915_sched_engine *
+i915_sched_engine_get(struct i915_sched_engine *sched_engine)
+{
+       kref_get(&sched_engine->ref);
+       return sched_engine;
+}
+
+static inline void
+i915_sched_engine_put(struct i915_sched_engine *sched_engine)
+{
+       kref_put(&sched_engine->ref, i915_sched_engine_free);
+}
+
+static inline bool
+i915_sched_engine_is_empty(struct i915_sched_engine *sched_engine)
+{
+       return RB_EMPTY_ROOT(&sched_engine->queue.rb_root);
+}
+
+static inline void
+i915_sched_engine_reset_on_empty(struct i915_sched_engine *sched_engine)
+{
+       if (i915_sched_engine_is_empty(sched_engine))
+               sched_engine->no_priolist = false;
+}
+
 void i915_request_show_with_schedule(struct drm_printer *m,
                                     const struct i915_request *rq,
                                     const char *prefix,