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