0001
0002
0003
0004
0005
0006 #ifndef __INTEL_BREADCRUMBS__
0007 #define __INTEL_BREADCRUMBS__
0008
0009 #include <linux/atomic.h>
0010 #include <linux/irq_work.h>
0011
0012 #include "intel_breadcrumbs_types.h"
0013
0014 struct drm_printer;
0015 struct i915_request;
0016 struct intel_breadcrumbs;
0017
0018 struct intel_breadcrumbs *
0019 intel_breadcrumbs_create(struct intel_engine_cs *irq_engine);
0020 void intel_breadcrumbs_free(struct kref *kref);
0021
0022 void intel_breadcrumbs_reset(struct intel_breadcrumbs *b);
0023 void __intel_breadcrumbs_park(struct intel_breadcrumbs *b);
0024
0025 static inline void intel_breadcrumbs_unpark(struct intel_breadcrumbs *b)
0026 {
0027 atomic_inc(&b->active);
0028 }
0029
0030 static inline void intel_breadcrumbs_park(struct intel_breadcrumbs *b)
0031 {
0032 if (atomic_dec_and_test(&b->active))
0033 __intel_breadcrumbs_park(b);
0034 }
0035
0036 static inline void
0037 intel_engine_signal_breadcrumbs(struct intel_engine_cs *engine)
0038 {
0039 irq_work_queue(&engine->breadcrumbs->irq_work);
0040 }
0041
0042 void intel_engine_print_breadcrumbs(struct intel_engine_cs *engine,
0043 struct drm_printer *p);
0044
0045 bool i915_request_enable_breadcrumb(struct i915_request *request);
0046 void i915_request_cancel_breadcrumb(struct i915_request *request);
0047
0048 void intel_context_remove_breadcrumbs(struct intel_context *ce,
0049 struct intel_breadcrumbs *b);
0050
0051 static inline struct intel_breadcrumbs *
0052 intel_breadcrumbs_get(struct intel_breadcrumbs *b)
0053 {
0054 kref_get(&b->ref);
0055 return b;
0056 }
0057
0058 static inline void intel_breadcrumbs_put(struct intel_breadcrumbs *b)
0059 {
0060 kref_put(&b->ref, intel_breadcrumbs_free);
0061 }
0062
0063 #endif