1*24f90d66SChris Wilson /* SPDX-License-Identifier: MIT */
2f0c02c1bSTvrtko Ursulin /*
3f0c02c1bSTvrtko Ursulin  * Copyright © 2016 Intel Corporation
4f0c02c1bSTvrtko Ursulin  */
5f0c02c1bSTvrtko Ursulin 
6f0c02c1bSTvrtko Ursulin #ifndef I915_TIMELINE_H
7f0c02c1bSTvrtko Ursulin #define I915_TIMELINE_H
8f0c02c1bSTvrtko Ursulin 
9f0c02c1bSTvrtko Ursulin #include <linux/lockdep.h>
10f0c02c1bSTvrtko Ursulin 
11f0c02c1bSTvrtko Ursulin #include "i915_active.h"
12f0c02c1bSTvrtko Ursulin #include "i915_syncmap.h"
13d1bf5dd8SChris Wilson #include "intel_timeline_types.h"
14f0c02c1bSTvrtko Ursulin 
150986317aSChris Wilson struct drm_printer;
160986317aSChris Wilson 
17f0c02c1bSTvrtko Ursulin struct intel_timeline *
18d1bf5dd8SChris Wilson __intel_timeline_create(struct intel_gt *gt,
19d1bf5dd8SChris Wilson 			struct i915_vma *global_hwsp,
20d1bf5dd8SChris Wilson 			unsigned int offset);
21d1bf5dd8SChris Wilson 
22d1bf5dd8SChris Wilson static inline struct intel_timeline *
intel_timeline_create(struct intel_gt * gt)23d1bf5dd8SChris Wilson intel_timeline_create(struct intel_gt *gt)
24d1bf5dd8SChris Wilson {
25d1bf5dd8SChris Wilson 	return __intel_timeline_create(gt, NULL, 0);
26d1bf5dd8SChris Wilson }
27d1bf5dd8SChris Wilson 
28b436a5f8SChris Wilson struct intel_timeline *
29d1bf5dd8SChris Wilson intel_timeline_create_from_engine(struct intel_engine_cs *engine,
30b436a5f8SChris Wilson 				  unsigned int offset);
31f0c02c1bSTvrtko Ursulin 
32f0c02c1bSTvrtko Ursulin static inline struct intel_timeline *
intel_timeline_get(struct intel_timeline * timeline)33f0c02c1bSTvrtko Ursulin intel_timeline_get(struct intel_timeline *timeline)
34f0c02c1bSTvrtko Ursulin {
35f0c02c1bSTvrtko Ursulin 	kref_get(&timeline->kref);
36f0c02c1bSTvrtko Ursulin 	return timeline;
37f0c02c1bSTvrtko Ursulin }
38f0c02c1bSTvrtko Ursulin 
39f0c02c1bSTvrtko Ursulin void __intel_timeline_free(struct kref *kref);
intel_timeline_put(struct intel_timeline * timeline)40f0c02c1bSTvrtko Ursulin static inline void intel_timeline_put(struct intel_timeline *timeline)
41f0c02c1bSTvrtko Ursulin {
42f0c02c1bSTvrtko Ursulin 	kref_put(&timeline->kref, __intel_timeline_free);
43f0c02c1bSTvrtko Ursulin }
44f0c02c1bSTvrtko Ursulin 
__intel_timeline_sync_set(struct intel_timeline * tl,u64 context,u32 seqno)45f0c02c1bSTvrtko Ursulin static inline int __intel_timeline_sync_set(struct intel_timeline *tl,
46f0c02c1bSTvrtko Ursulin 					    u64 context, u32 seqno)
47f0c02c1bSTvrtko Ursulin {
48f0c02c1bSTvrtko Ursulin 	return i915_syncmap_set(&tl->sync, context, seqno);
49f0c02c1bSTvrtko Ursulin }
50f0c02c1bSTvrtko Ursulin 
intel_timeline_sync_set(struct intel_timeline * tl,const struct dma_fence * fence)51f0c02c1bSTvrtko Ursulin static inline int intel_timeline_sync_set(struct intel_timeline *tl,
52f0c02c1bSTvrtko Ursulin 					  const struct dma_fence *fence)
53f0c02c1bSTvrtko Ursulin {
54f0c02c1bSTvrtko Ursulin 	return __intel_timeline_sync_set(tl, fence->context, fence->seqno);
55f0c02c1bSTvrtko Ursulin }
56f0c02c1bSTvrtko Ursulin 
__intel_timeline_sync_is_later(struct intel_timeline * tl,u64 context,u32 seqno)57f0c02c1bSTvrtko Ursulin static inline bool __intel_timeline_sync_is_later(struct intel_timeline *tl,
58f0c02c1bSTvrtko Ursulin 						  u64 context, u32 seqno)
59f0c02c1bSTvrtko Ursulin {
60f0c02c1bSTvrtko Ursulin 	return i915_syncmap_is_later(&tl->sync, context, seqno);
61f0c02c1bSTvrtko Ursulin }
62f0c02c1bSTvrtko Ursulin 
intel_timeline_sync_is_later(struct intel_timeline * tl,const struct dma_fence * fence)63f0c02c1bSTvrtko Ursulin static inline bool intel_timeline_sync_is_later(struct intel_timeline *tl,
64f0c02c1bSTvrtko Ursulin 						const struct dma_fence *fence)
65f0c02c1bSTvrtko Ursulin {
66f0c02c1bSTvrtko Ursulin 	return __intel_timeline_sync_is_later(tl, fence->context, fence->seqno);
67f0c02c1bSTvrtko Ursulin }
68f0c02c1bSTvrtko Ursulin 
6947b08693SMaarten Lankhorst void __intel_timeline_pin(struct intel_timeline *tl);
7047b08693SMaarten Lankhorst int intel_timeline_pin(struct intel_timeline *tl, struct i915_gem_ww_ctx *ww);
71531958f6SChris Wilson void intel_timeline_enter(struct intel_timeline *tl);
72f0c02c1bSTvrtko Ursulin int intel_timeline_get_seqno(struct intel_timeline *tl,
73f0c02c1bSTvrtko Ursulin 			     struct i915_request *rq,
74f0c02c1bSTvrtko Ursulin 			     u32 *seqno);
75531958f6SChris Wilson void intel_timeline_exit(struct intel_timeline *tl);
76f0c02c1bSTvrtko Ursulin void intel_timeline_unpin(struct intel_timeline *tl);
77f0c02c1bSTvrtko Ursulin 
78bd3ec9e7SChris Wilson void intel_timeline_reset_seqno(const struct intel_timeline *tl);
79bd3ec9e7SChris Wilson 
80f0c02c1bSTvrtko Ursulin int intel_timeline_read_hwsp(struct i915_request *from,
81f0c02c1bSTvrtko Ursulin 			     struct i915_request *until,
82f0c02c1bSTvrtko Ursulin 			     u32 *hwsp_offset);
83f0c02c1bSTvrtko Ursulin 
844605bb73SChris Wilson void intel_gt_init_timelines(struct intel_gt *gt);
854605bb73SChris Wilson void intel_gt_fini_timelines(struct intel_gt *gt);
86f0c02c1bSTvrtko Ursulin 
870986317aSChris Wilson void intel_gt_show_timelines(struct intel_gt *gt,
880986317aSChris Wilson 			     struct drm_printer *m,
890986317aSChris Wilson 			     void (*show_request)(struct drm_printer *m,
900986317aSChris Wilson 						  const struct i915_request *rq,
910986317aSChris Wilson 						  const char *prefix,
920986317aSChris Wilson 						  int indent));
930986317aSChris Wilson 
94b1ad5f6dSChris Wilson static inline bool
intel_timeline_is_last(const struct intel_timeline * tl,const struct i915_request * rq)95b1ad5f6dSChris Wilson intel_timeline_is_last(const struct intel_timeline *tl,
96b1ad5f6dSChris Wilson 		       const struct i915_request *rq)
97b1ad5f6dSChris Wilson {
98b1ad5f6dSChris Wilson 	return list_is_last_rcu(&rq->link, &tl->requests);
99b1ad5f6dSChris Wilson }
100b1ad5f6dSChris Wilson 
101f0c02c1bSTvrtko Ursulin I915_SELFTEST_DECLARE(int intel_timeline_pin_map(struct intel_timeline *tl));
102 
103 #endif
104