xref: /openbsd/sys/dev/pci/drm/i915/gt/intel_breadcrumbs.h (revision 5ca02815)
1ad8b1aafSjsg /* SPDX-License-Identifier: MIT */
2ad8b1aafSjsg /*
3ad8b1aafSjsg  * Copyright © 2019 Intel Corporation
4ad8b1aafSjsg  */
5ad8b1aafSjsg 
6ad8b1aafSjsg #ifndef __INTEL_BREADCRUMBS__
7ad8b1aafSjsg #define __INTEL_BREADCRUMBS__
8ad8b1aafSjsg 
9*5ca02815Sjsg #include <linux/atomic.h>
10ad8b1aafSjsg #include <linux/irq_work.h>
11ad8b1aafSjsg 
12*5ca02815Sjsg #include "intel_breadcrumbs_types.h"
13ad8b1aafSjsg 
14ad8b1aafSjsg struct drm_printer;
15ad8b1aafSjsg struct i915_request;
16ad8b1aafSjsg struct intel_breadcrumbs;
17ad8b1aafSjsg 
18ad8b1aafSjsg struct intel_breadcrumbs *
19ad8b1aafSjsg intel_breadcrumbs_create(struct intel_engine_cs *irq_engine);
20*5ca02815Sjsg void intel_breadcrumbs_free(struct kref *kref);
21ad8b1aafSjsg 
22ad8b1aafSjsg void intel_breadcrumbs_reset(struct intel_breadcrumbs *b);
23*5ca02815Sjsg void __intel_breadcrumbs_park(struct intel_breadcrumbs *b);
24*5ca02815Sjsg 
intel_breadcrumbs_unpark(struct intel_breadcrumbs * b)25*5ca02815Sjsg static inline void intel_breadcrumbs_unpark(struct intel_breadcrumbs *b)
26*5ca02815Sjsg {
27*5ca02815Sjsg 	atomic_inc(&b->active);
28*5ca02815Sjsg }
29*5ca02815Sjsg 
intel_breadcrumbs_park(struct intel_breadcrumbs * b)30*5ca02815Sjsg static inline void intel_breadcrumbs_park(struct intel_breadcrumbs *b)
31*5ca02815Sjsg {
32*5ca02815Sjsg 	if (atomic_dec_and_test(&b->active))
33*5ca02815Sjsg 		__intel_breadcrumbs_park(b);
34*5ca02815Sjsg }
35ad8b1aafSjsg 
36ad8b1aafSjsg static inline void
intel_engine_signal_breadcrumbs(struct intel_engine_cs * engine)37ad8b1aafSjsg intel_engine_signal_breadcrumbs(struct intel_engine_cs *engine)
38ad8b1aafSjsg {
39ad8b1aafSjsg 	irq_work_queue(&engine->breadcrumbs->irq_work);
40ad8b1aafSjsg }
41ad8b1aafSjsg 
42ad8b1aafSjsg void intel_engine_print_breadcrumbs(struct intel_engine_cs *engine,
43ad8b1aafSjsg 				    struct drm_printer *p);
44ad8b1aafSjsg 
45ad8b1aafSjsg bool i915_request_enable_breadcrumb(struct i915_request *request);
46ad8b1aafSjsg void i915_request_cancel_breadcrumb(struct i915_request *request);
47ad8b1aafSjsg 
48*5ca02815Sjsg void intel_context_remove_breadcrumbs(struct intel_context *ce,
49*5ca02815Sjsg 				      struct intel_breadcrumbs *b);
50*5ca02815Sjsg 
51*5ca02815Sjsg static inline struct intel_breadcrumbs *
intel_breadcrumbs_get(struct intel_breadcrumbs * b)52*5ca02815Sjsg intel_breadcrumbs_get(struct intel_breadcrumbs *b)
53*5ca02815Sjsg {
54*5ca02815Sjsg 	kref_get(&b->ref);
55*5ca02815Sjsg 	return b;
56*5ca02815Sjsg }
57*5ca02815Sjsg 
intel_breadcrumbs_put(struct intel_breadcrumbs * b)58*5ca02815Sjsg static inline void intel_breadcrumbs_put(struct intel_breadcrumbs *b)
59*5ca02815Sjsg {
60*5ca02815Sjsg 	kref_put(&b->ref, intel_breadcrumbs_free);
61*5ca02815Sjsg }
62*5ca02815Sjsg 
63ad8b1aafSjsg #endif /* __INTEL_BREADCRUMBS__ */
64