xref: /openbsd-src/sys/dev/pci/drm/i915/gt/intel_timeline.h (revision 5ca02815211fc20fa71222bf4e6148b043e505b3)
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