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