This source file includes following definitions.
- i915_vma_is_active
- i915_vma_is_ggtt
- i915_vma_has_ggtt_write
- i915_vma_set_ggtt_write
- i915_vma_unset_ggtt_write
- i915_vma_is_map_and_fenceable
- i915_vma_set_userfault
- i915_vma_unset_userfault
- i915_vma_has_userfault
- i915_vma_is_closed
- i915_ggtt_offset
- i915_ggtt_pin_bias
- i915_vma_get
- i915_vma_tryget
- i915_vma_put
- i915_vma_compare
- i915_vma_lock
- i915_vma_unlock
- i915_vma_pin
- i915_vma_pin_count
- i915_vma_is_pinned
- __i915_vma_pin
- __i915_vma_unpin
- i915_vma_unpin
- i915_vma_is_bound
- i915_vma_first_page
- __i915_vma_unpin_fence
- i915_vma_unpin_fence
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #ifndef __I915_VMA_H__
26 #define __I915_VMA_H__
27
28 #include <linux/io-mapping.h>
29 #include <linux/rbtree.h>
30
31 #include <drm/drm_mm.h>
32
33 #include "i915_gem_gtt.h"
34 #include "i915_gem_fence_reg.h"
35 #include "gem/i915_gem_object.h"
36
37 #include "i915_active.h"
38 #include "i915_request.h"
39
40 enum i915_cache_level;
41
42
43
44
45
46
47
48
49
50
51
52 struct i915_vma {
53 struct drm_mm_node node;
54 struct drm_i915_gem_object *obj;
55 struct i915_address_space *vm;
56 const struct i915_vma_ops *ops;
57 struct i915_fence_reg *fence;
58 struct dma_resv *resv;
59 struct sg_table *pages;
60 void __iomem *iomap;
61 void *private;
62 u64 size;
63 u64 display_alignment;
64 struct i915_page_sizes page_sizes;
65
66 u32 fence_size;
67 u32 fence_alignment;
68
69
70
71
72
73
74 atomic_t open_count;
75 unsigned long flags;
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 #define I915_VMA_PIN_MASK 0xff
100 #define I915_VMA_PIN_OVERFLOW BIT(8)
101
102
103 #define I915_VMA_GLOBAL_BIND BIT(9)
104 #define I915_VMA_LOCAL_BIND BIT(10)
105 #define I915_VMA_BIND_MASK (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND | I915_VMA_PIN_OVERFLOW)
106
107 #define I915_VMA_GGTT BIT(11)
108 #define I915_VMA_CAN_FENCE BIT(12)
109 #define I915_VMA_USERFAULT_BIT 13
110 #define I915_VMA_USERFAULT BIT(I915_VMA_USERFAULT_BIT)
111 #define I915_VMA_GGTT_WRITE BIT(14)
112
113 struct i915_active active;
114
115
116
117
118
119
120
121
122 struct i915_ggtt_view ggtt_view;
123
124
125 struct list_head vm_link;
126
127 struct list_head obj_link;
128 struct rb_node obj_node;
129 struct hlist_node obj_hash;
130
131
132 struct list_head exec_link;
133 struct list_head reloc_link;
134
135
136 struct list_head evict_link;
137
138 struct list_head closed_link;
139
140
141
142
143 unsigned int *exec_flags;
144 struct hlist_node exec_node;
145 u32 exec_handle;
146 };
147
148 struct i915_vma *
149 i915_vma_instance(struct drm_i915_gem_object *obj,
150 struct i915_address_space *vm,
151 const struct i915_ggtt_view *view);
152
153 void i915_vma_unpin_and_release(struct i915_vma **p_vma, unsigned int flags);
154 #define I915_VMA_RELEASE_MAP BIT(0)
155
156 static inline bool i915_vma_is_active(const struct i915_vma *vma)
157 {
158 return !i915_active_is_idle(&vma->active);
159 }
160
161 int __must_check i915_vma_move_to_active(struct i915_vma *vma,
162 struct i915_request *rq,
163 unsigned int flags);
164
165 static inline bool i915_vma_is_ggtt(const struct i915_vma *vma)
166 {
167 return vma->flags & I915_VMA_GGTT;
168 }
169
170 static inline bool i915_vma_has_ggtt_write(const struct i915_vma *vma)
171 {
172 return vma->flags & I915_VMA_GGTT_WRITE;
173 }
174
175 static inline void i915_vma_set_ggtt_write(struct i915_vma *vma)
176 {
177 GEM_BUG_ON(!i915_vma_is_ggtt(vma));
178 vma->flags |= I915_VMA_GGTT_WRITE;
179 }
180
181 static inline void i915_vma_unset_ggtt_write(struct i915_vma *vma)
182 {
183 vma->flags &= ~I915_VMA_GGTT_WRITE;
184 }
185
186 void i915_vma_flush_writes(struct i915_vma *vma);
187
188 static inline bool i915_vma_is_map_and_fenceable(const struct i915_vma *vma)
189 {
190 return vma->flags & I915_VMA_CAN_FENCE;
191 }
192
193 static inline bool i915_vma_set_userfault(struct i915_vma *vma)
194 {
195 GEM_BUG_ON(!i915_vma_is_map_and_fenceable(vma));
196 return __test_and_set_bit(I915_VMA_USERFAULT_BIT, &vma->flags);
197 }
198
199 static inline void i915_vma_unset_userfault(struct i915_vma *vma)
200 {
201 return __clear_bit(I915_VMA_USERFAULT_BIT, &vma->flags);
202 }
203
204 static inline bool i915_vma_has_userfault(const struct i915_vma *vma)
205 {
206 return test_bit(I915_VMA_USERFAULT_BIT, &vma->flags);
207 }
208
209 static inline bool i915_vma_is_closed(const struct i915_vma *vma)
210 {
211 return !list_empty(&vma->closed_link);
212 }
213
214 static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
215 {
216 GEM_BUG_ON(!i915_vma_is_ggtt(vma));
217 GEM_BUG_ON(!vma->node.allocated);
218 GEM_BUG_ON(upper_32_bits(vma->node.start));
219 GEM_BUG_ON(upper_32_bits(vma->node.start + vma->node.size - 1));
220 return lower_32_bits(vma->node.start);
221 }
222
223 static inline u32 i915_ggtt_pin_bias(struct i915_vma *vma)
224 {
225 return i915_vm_to_ggtt(vma->vm)->pin_bias;
226 }
227
228 static inline struct i915_vma *i915_vma_get(struct i915_vma *vma)
229 {
230 i915_gem_object_get(vma->obj);
231 return vma;
232 }
233
234 static inline struct i915_vma *i915_vma_tryget(struct i915_vma *vma)
235 {
236 if (likely(kref_get_unless_zero(&vma->obj->base.refcount)))
237 return vma;
238
239 return NULL;
240 }
241
242 static inline void i915_vma_put(struct i915_vma *vma)
243 {
244 i915_gem_object_put(vma->obj);
245 }
246
247 static __always_inline ptrdiff_t ptrdiff(const void *a, const void *b)
248 {
249 return a - b;
250 }
251
252 static inline long
253 i915_vma_compare(struct i915_vma *vma,
254 struct i915_address_space *vm,
255 const struct i915_ggtt_view *view)
256 {
257 ptrdiff_t cmp;
258
259 GEM_BUG_ON(view && !i915_is_ggtt(vm));
260
261 cmp = ptrdiff(vma->vm, vm);
262 if (cmp)
263 return cmp;
264
265 BUILD_BUG_ON(I915_GGTT_VIEW_NORMAL != 0);
266 cmp = vma->ggtt_view.type;
267 if (!view)
268 return cmp;
269
270 cmp -= view->type;
271 if (cmp)
272 return cmp;
273
274 assert_i915_gem_gtt_types();
275
276
277
278
279
280
281
282
283
284
285
286 BUILD_BUG_ON(I915_GGTT_VIEW_NORMAL >= I915_GGTT_VIEW_PARTIAL);
287 BUILD_BUG_ON(I915_GGTT_VIEW_PARTIAL >= I915_GGTT_VIEW_ROTATED);
288 BUILD_BUG_ON(I915_GGTT_VIEW_ROTATED >= I915_GGTT_VIEW_REMAPPED);
289 BUILD_BUG_ON(offsetof(typeof(*view), rotated) !=
290 offsetof(typeof(*view), partial));
291 BUILD_BUG_ON(offsetof(typeof(*view), rotated) !=
292 offsetof(typeof(*view), remapped));
293 return memcmp(&vma->ggtt_view.partial, &view->partial, view->type);
294 }
295
296 int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
297 u32 flags);
298 bool i915_gem_valid_gtt_space(struct i915_vma *vma, unsigned long cache_level);
299 bool i915_vma_misplaced(const struct i915_vma *vma,
300 u64 size, u64 alignment, u64 flags);
301 void __i915_vma_set_map_and_fenceable(struct i915_vma *vma);
302 void i915_vma_revoke_mmap(struct i915_vma *vma);
303 int __must_check i915_vma_unbind(struct i915_vma *vma);
304 void i915_vma_unlink_ctx(struct i915_vma *vma);
305 void i915_vma_close(struct i915_vma *vma);
306 void i915_vma_reopen(struct i915_vma *vma);
307 void i915_vma_destroy(struct i915_vma *vma);
308
309 #define assert_vma_held(vma) dma_resv_assert_held((vma)->resv)
310
311 static inline void i915_vma_lock(struct i915_vma *vma)
312 {
313 dma_resv_lock(vma->resv, NULL);
314 }
315
316 static inline void i915_vma_unlock(struct i915_vma *vma)
317 {
318 dma_resv_unlock(vma->resv);
319 }
320
321 int __i915_vma_do_pin(struct i915_vma *vma,
322 u64 size, u64 alignment, u64 flags);
323 static inline int __must_check
324 i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
325 {
326 BUILD_BUG_ON(PIN_MBZ != I915_VMA_PIN_OVERFLOW);
327 BUILD_BUG_ON(PIN_GLOBAL != I915_VMA_GLOBAL_BIND);
328 BUILD_BUG_ON(PIN_USER != I915_VMA_LOCAL_BIND);
329
330
331
332
333 if (likely(((++vma->flags ^ flags) & I915_VMA_BIND_MASK) == 0)) {
334 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
335 GEM_BUG_ON(i915_vma_misplaced(vma, size, alignment, flags));
336 return 0;
337 }
338
339 return __i915_vma_do_pin(vma, size, alignment, flags);
340 }
341
342 static inline int i915_vma_pin_count(const struct i915_vma *vma)
343 {
344 return vma->flags & I915_VMA_PIN_MASK;
345 }
346
347 static inline bool i915_vma_is_pinned(const struct i915_vma *vma)
348 {
349 return i915_vma_pin_count(vma);
350 }
351
352 static inline void __i915_vma_pin(struct i915_vma *vma)
353 {
354 vma->flags++;
355 GEM_BUG_ON(vma->flags & I915_VMA_PIN_OVERFLOW);
356 }
357
358 static inline void __i915_vma_unpin(struct i915_vma *vma)
359 {
360 vma->flags--;
361 }
362
363 static inline void i915_vma_unpin(struct i915_vma *vma)
364 {
365 GEM_BUG_ON(!i915_vma_is_pinned(vma));
366 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
367 __i915_vma_unpin(vma);
368 }
369
370 static inline bool i915_vma_is_bound(const struct i915_vma *vma,
371 unsigned int where)
372 {
373 return vma->flags & where;
374 }
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389 void __iomem *i915_vma_pin_iomap(struct i915_vma *vma);
390 #define IO_ERR_PTR(x) ((void __iomem *)ERR_PTR(x))
391
392
393
394
395
396
397
398
399
400
401 void i915_vma_unpin_iomap(struct i915_vma *vma);
402
403 static inline struct page *i915_vma_first_page(struct i915_vma *vma)
404 {
405 GEM_BUG_ON(!vma->pages);
406 return sg_page(vma->pages->sgl);
407 }
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424 int __must_check i915_vma_pin_fence(struct i915_vma *vma);
425 int __must_check i915_vma_revoke_fence(struct i915_vma *vma);
426
427 static inline void __i915_vma_unpin_fence(struct i915_vma *vma)
428 {
429 GEM_BUG_ON(atomic_read(&vma->fence->pin_count) <= 0);
430 atomic_dec(&vma->fence->pin_count);
431 }
432
433
434
435
436
437
438
439
440
441 static inline void
442 i915_vma_unpin_fence(struct i915_vma *vma)
443 {
444
445 if (vma->fence)
446 __i915_vma_unpin_fence(vma);
447 }
448
449 void i915_vma_parked(struct drm_i915_private *i915);
450
451 #define for_each_until(cond) if (cond) break; else
452
453
454
455
456
457
458
459
460
461
462 #define for_each_ggtt_vma(V, OBJ) \
463 list_for_each_entry(V, &(OBJ)->vma.list, obj_link) \
464 for_each_until(!i915_vma_is_ggtt(V))
465
466 struct i915_vma *i915_vma_alloc(void);
467 void i915_vma_free(struct i915_vma *vma);
468
469 struct i915_vma *i915_vma_make_unshrinkable(struct i915_vma *vma);
470 void i915_vma_make_shrinkable(struct i915_vma *vma);
471 void i915_vma_make_purgeable(struct i915_vma *vma);
472
473 #endif