hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/include/drm/ttm/ttm_bo_api.h
....@@ -31,6 +31,7 @@
3131 #ifndef _TTM_BO_API_H_
3232 #define _TTM_BO_API_H_
3333
34
+#include <drm/drm_gem.h>
3435 #include <drm/drm_hashtab.h>
3536 #include <drm/drm_vma_manager.h>
3637 #include <linux/kref.h>
....@@ -39,7 +40,9 @@
3940 #include <linux/mutex.h>
4041 #include <linux/mm.h>
4142 #include <linux/bitmap.h>
42
-#include <linux/reservation.h>
43
+#include <linux/dma-resv.h>
44
+
45
+#include "ttm_resource.h"
4346
4447 struct ttm_bo_global;
4548
....@@ -51,54 +54,7 @@
5154
5255 struct ttm_place;
5356
54
-/**
55
- * struct ttm_bus_placement
56
- *
57
- * @addr: mapped virtual address
58
- * @base: bus base address
59
- * @is_iomem: is this io memory ?
60
- * @size: size in byte
61
- * @offset: offset from the base address
62
- * @io_reserved_vm: The VM system has a refcount in @io_reserved_count
63
- * @io_reserved_count: Refcounting the numbers of callers to ttm_mem_io_reserve
64
- *
65
- * Structure indicating the bus placement of an object.
66
- */
67
-struct ttm_bus_placement {
68
- void *addr;
69
- phys_addr_t base;
70
- unsigned long size;
71
- unsigned long offset;
72
- bool is_iomem;
73
- bool io_reserved_vm;
74
- uint64_t io_reserved_count;
75
-};
76
-
77
-
78
-/**
79
- * struct ttm_mem_reg
80
- *
81
- * @mm_node: Memory manager node.
82
- * @size: Requested size of memory region.
83
- * @num_pages: Actual size of memory region in pages.
84
- * @page_alignment: Page alignment.
85
- * @placement: Placement flags.
86
- * @bus: Placement on io bus accessible to the CPU
87
- *
88
- * Structure indicating the placement and space resources used by a
89
- * buffer object.
90
- */
91
-
92
-struct ttm_mem_reg {
93
- void *mm_node;
94
- unsigned long start;
95
- unsigned long size;
96
- unsigned long num_pages;
97
- uint32_t page_alignment;
98
- uint32_t mem_type;
99
- uint32_t placement;
100
- struct ttm_bus_placement bus;
101
-};
57
+struct ttm_lru_bulk_move;
10258
10359 /**
10460 * enum ttm_bo_type
....@@ -125,34 +81,28 @@
12581 /**
12682 * struct ttm_buffer_object
12783 *
84
+ * @base: drm_gem_object superclass data.
12885 * @bdev: Pointer to the buffer object device structure.
12986 * @type: The bo type.
13087 * @destroy: Destruction function. If NULL, kfree is used.
13188 * @num_pages: Actual number of pages.
13289 * @acc_size: Accounted size for this object.
13390 * @kref: Reference count of this buffer object. When this refcount reaches
134
- * zero, the object is put on the delayed delete list.
135
- * @list_kref: List reference count of this buffer object. This member is
136
- * used to avoid destruction while the buffer object is still on a list.
137
- * Lru lists may keep one refcount, the delayed delete list, and kref != 0
138
- * keeps one refcount. When this refcount reaches zero,
139
- * the object is destroyed.
91
+ * zero, the object is destroyed or put on the delayed delete list.
14092 * @mem: structure describing current placement.
14193 * @persistent_swap_storage: Usually the swap storage is deleted for buffers
14294 * pinned in physical memory. If this behaviour is not desired, this member
14395 * holds a pointer to a persistent shmem object.
14496 * @ttm: TTM structure holding system pages.
14597 * @evicted: Whether the object was evicted without user-space knowing.
146
- * @cpu_writes: For synchronization. Number of cpu writers.
98
+ * @deleted: True if the object is only a zombie and already deleted.
14799 * @lru: List head for the lru list.
148100 * @ddestroy: List head for the delayed destroy list.
149101 * @swap: List head for swap LRU list.
150102 * @moving: Fence set when BO is moving
151
- * @vma_node: Address space manager node.
152103 * @offset: The current GPU offset, which can have different meanings
153104 * depending on the memory type. For SYSTEM type memory, it should be 0.
154105 * @cur_placement: Hint of current placement.
155
- * @wu_mutex: Wait unreserved mutex.
156106 *
157107 * Base class for TTM buffer object, that deals with data placement and CPU
158108 * mappings. GPU mappings are really up to the driver, but for simpler GPUs
....@@ -167,6 +117,8 @@
167117 */
168118
169119 struct ttm_buffer_object {
120
+ struct drm_gem_object base;
121
+
170122 /**
171123 * Members constant at init.
172124 */
....@@ -180,24 +132,16 @@
180132 /**
181133 * Members not needing protection.
182134 */
183
-
184135 struct kref kref;
185
- struct kref list_kref;
186136
187137 /**
188138 * Members protected by the bo::resv::reserved lock.
189139 */
190140
191
- struct ttm_mem_reg mem;
141
+ struct ttm_resource mem;
192142 struct file *persistent_swap_storage;
193143 struct ttm_tt *ttm;
194
- bool evicted;
195
-
196
- /**
197
- * Members protected by the bo::reserved lock only when written to.
198
- */
199
-
200
- atomic_t cpu_writers;
144
+ bool deleted;
201145
202146 /**
203147 * Members protected by the bdev::lru_lock.
....@@ -206,16 +150,12 @@
206150 struct list_head lru;
207151 struct list_head ddestroy;
208152 struct list_head swap;
209
- struct list_head io_reserve_lru;
210153
211154 /**
212155 * Members protected by a bo reservation.
213156 */
214157
215158 struct dma_fence *moving;
216
-
217
- struct drm_vma_offset_node vma_node;
218
-
219159 unsigned priority;
220160
221161 /**
....@@ -224,13 +164,7 @@
224164 * either of these locks held.
225165 */
226166
227
- uint64_t offset; /* GPU address space is independent of CPU word size */
228
-
229167 struct sg_table *sg;
230
-
231
- struct reservation_object *resv;
232
- struct reservation_object ttm_resv;
233
- struct mutex wu_mutex;
234168 };
235169
236170 /**
....@@ -273,7 +207,7 @@
273207 struct ttm_operation_ctx {
274208 bool interruptible;
275209 bool no_wait_gpu;
276
- struct reservation_object *resv;
210
+ struct dma_resv *resv;
277211 uint64_t bytes_moved;
278212 uint32_t flags;
279213 };
....@@ -294,19 +228,20 @@
294228 }
295229
296230 /**
297
- * ttm_bo_reference - reference a struct ttm_buffer_object
298
- *
231
+ * ttm_bo_get_unless_zero - reference a struct ttm_buffer_object unless
232
+ * its refcount has already reached zero.
299233 * @bo: The buffer object.
300234 *
301
- * Returns a refcounted pointer to a buffer object.
235
+ * Used to reference a TTM buffer object in lookups where the object is removed
236
+ * from the lookup structure during the destructor and for RCU lookups.
302237 *
303
- * This function is deprecated. Use @ttm_bo_get instead.
238
+ * Returns: @bo if the referencing was successful, NULL otherwise.
304239 */
305
-
306
-static inline struct ttm_buffer_object *
307
-ttm_bo_reference(struct ttm_buffer_object *bo)
240
+static inline __must_check struct ttm_buffer_object *
241
+ttm_bo_get_unless_zero(struct ttm_buffer_object *bo)
308242 {
309
- ttm_bo_get(bo);
243
+ if (!kref_get_unless_zero(&bo->kref))
244
+ return NULL;
310245 return bo;
311246 }
312247
....@@ -330,12 +265,12 @@
330265 * ttm_bo_mem_compat - Check if proposed placement is compatible with a bo
331266 *
332267 * @placement: Return immediately if buffer is busy.
333
- * @mem: The struct ttm_mem_reg indicating the region where the bo resides
268
+ * @mem: The struct ttm_resource indicating the region where the bo resides
334269 * @new_flags: Describes compatible placement found
335270 *
336271 * Returns true if the placement is compatible
337272 */
338
-bool ttm_bo_mem_compat(struct ttm_placement *placement, struct ttm_mem_reg *mem,
273
+bool ttm_bo_mem_compat(struct ttm_placement *placement, struct ttm_resource *mem,
339274 uint32_t *new_flags);
340275
341276 /**
....@@ -367,50 +302,27 @@
367302 void ttm_bo_put(struct ttm_buffer_object *bo);
368303
369304 /**
370
- * ttm_bo_unref
371
- *
372
- * @bo: The buffer object.
373
- *
374
- * Unreference and clear a pointer to a buffer object.
375
- *
376
- * This function is deprecated. Use @ttm_bo_put instead.
377
- */
378
-void ttm_bo_unref(struct ttm_buffer_object **bo);
379
-
380
-/**
381
- * ttm_bo_add_to_lru
382
- *
383
- * @bo: The buffer object.
384
- *
385
- * Add this bo to the relevant mem type lru and, if it's backed by
386
- * system pages (ttms) to the swap list.
387
- * This function must be called with struct ttm_bo_global::lru_lock held, and
388
- * is typically called immediately prior to unreserving a bo.
389
- */
390
-void ttm_bo_add_to_lru(struct ttm_buffer_object *bo);
391
-
392
-/**
393
- * ttm_bo_del_from_lru
394
- *
395
- * @bo: The buffer object.
396
- *
397
- * Remove this bo from all lru lists used to lookup and reserve an object.
398
- * This function must be called with struct ttm_bo_global::lru_lock held,
399
- * and is usually called just immediately after the bo has been reserved to
400
- * avoid recursive reservation from lru lists.
401
- */
402
-void ttm_bo_del_from_lru(struct ttm_buffer_object *bo);
403
-
404
-/**
405305 * ttm_bo_move_to_lru_tail
406306 *
407307 * @bo: The buffer object.
308
+ * @bulk: optional bulk move structure to remember BO positions
408309 *
409310 * Move this BO to the tail of all lru lists used to lookup and reserve an
410311 * object. This function must be called with struct ttm_bo_global::lru_lock
411312 * held, and is used to make a BO less likely to be considered for eviction.
412313 */
413
-void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo);
314
+void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo,
315
+ struct ttm_lru_bulk_move *bulk);
316
+
317
+/**
318
+ * ttm_bo_bulk_move_lru_tail
319
+ *
320
+ * @bulk: bulk move structure
321
+ *
322
+ * Bulk move BOs to the LRU tail, only valid to use when driver makes sure that
323
+ * BO order never changes. Should be called with ttm_bo_global::lru_lock held.
324
+ */
325
+void ttm_bo_bulk_move_lru_tail(struct ttm_lru_bulk_move *bulk);
414326
415327 /**
416328 * ttm_bo_lock_delayed_workqueue
....@@ -439,43 +351,6 @@
439351 bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
440352 const struct ttm_place *place);
441353
442
-/**
443
- * ttm_bo_synccpu_write_grab
444
- *
445
- * @bo: The buffer object:
446
- * @no_wait: Return immediately if buffer is busy.
447
- *
448
- * Synchronizes a buffer object for CPU RW access. This means
449
- * command submission that affects the buffer will return -EBUSY
450
- * until ttm_bo_synccpu_write_release is called.
451
- *
452
- * Returns
453
- * -EBUSY if the buffer is busy and no_wait is true.
454
- * -ERESTARTSYS if interrupted by a signal.
455
- */
456
-int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait);
457
-
458
-/**
459
- * ttm_bo_synccpu_write_release:
460
- *
461
- * @bo : The buffer object.
462
- *
463
- * Releases a synccpu lock.
464
- */
465
-void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo);
466
-
467
-/**
468
- * ttm_bo_acc_size
469
- *
470
- * @bdev: Pointer to a ttm_bo_device struct.
471
- * @bo_size: size of the buffer object in byte.
472
- * @struct_size: size of the structure holding buffer object datas
473
- *
474
- * Returns size to account for a buffer object
475
- */
476
-size_t ttm_bo_acc_size(struct ttm_bo_device *bdev,
477
- unsigned long bo_size,
478
- unsigned struct_size);
479354 size_t ttm_bo_dma_acc_size(struct ttm_bo_device *bdev,
480355 unsigned long bo_size,
481356 unsigned struct_size);
....@@ -491,7 +366,7 @@
491366 * @page_alignment: Data alignment in pages.
492367 * @ctx: TTM operation context for memory allocation.
493368 * @acc_size: Accounted size for this object.
494
- * @resv: Pointer to a reservation_object, or NULL to let ttm allocate one.
369
+ * @resv: Pointer to a dma_resv, or NULL to let ttm allocate one.
495370 * @destroy: Destroy function. Use NULL for kfree().
496371 *
497372 * This function initializes a pre-allocated struct ttm_buffer_object.
....@@ -524,7 +399,7 @@
524399 struct ttm_operation_ctx *ctx,
525400 size_t acc_size,
526401 struct sg_table *sg,
527
- struct reservation_object *resv,
402
+ struct dma_resv *resv,
528403 void (*destroy) (struct ttm_buffer_object *));
529404
530405 /**
....@@ -543,7 +418,7 @@
543418 * point to the shmem object backing a GEM object if TTM is used to back a
544419 * GEM user interface.
545420 * @acc_size: Accounted size for this object.
546
- * @resv: Pointer to a reservation_object, or NULL to let ttm allocate one.
421
+ * @resv: Pointer to a dma_resv, or NULL to let ttm allocate one.
547422 * @destroy: Destroy function. Use NULL for kfree().
548423 *
549424 * This function initializes a pre-allocated struct ttm_buffer_object.
....@@ -568,7 +443,7 @@
568443 unsigned long size, enum ttm_bo_type type,
569444 struct ttm_placement *placement,
570445 uint32_t page_alignment, bool interrubtible, size_t acc_size,
571
- struct sg_table *sg, struct reservation_object *resv,
446
+ struct sg_table *sg, struct dma_resv *resv,
572447 void (*destroy) (struct ttm_buffer_object *));
573448
574449 /**
....@@ -594,52 +469,6 @@
594469 enum ttm_bo_type type, struct ttm_placement *placement,
595470 uint32_t page_alignment, bool interruptible,
596471 struct ttm_buffer_object **p_bo);
597
-
598
-/**
599
- * ttm_bo_init_mm
600
- *
601
- * @bdev: Pointer to a ttm_bo_device struct.
602
- * @mem_type: The memory type.
603
- * @p_size: size managed area in pages.
604
- *
605
- * Initialize a manager for a given memory type.
606
- * Note: if part of driver firstopen, it must be protected from a
607
- * potentially racing lastclose.
608
- * Returns:
609
- * -EINVAL: invalid size or memory type.
610
- * -ENOMEM: Not enough memory.
611
- * May also return driver-specified errors.
612
- */
613
-int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type,
614
- unsigned long p_size);
615
-
616
-/**
617
- * ttm_bo_clean_mm
618
- *
619
- * @bdev: Pointer to a ttm_bo_device struct.
620
- * @mem_type: The memory type.
621
- *
622
- * Take down a manager for a given memory type after first walking
623
- * the LRU list to evict any buffers left alive.
624
- *
625
- * Normally, this function is part of lastclose() or unload(), and at that
626
- * point there shouldn't be any buffers left created by user-space, since
627
- * there should've been removed by the file descriptor release() method.
628
- * However, before this function is run, make sure to signal all sync objects,
629
- * and verify that the delayed delete queue is empty. The driver must also
630
- * make sure that there are no NO_EVICT buffers present in this memory type
631
- * when the call is made.
632
- *
633
- * If this function is part of a VT switch, the caller must make sure that
634
- * there are no appications currently validating buffers before this
635
- * function is called. The caller can do that by first taking the
636
- * struct ttm_bo_device::ttm_lock in write mode.
637
- *
638
- * Returns:
639
- * -EINVAL: invalid or uninitialized memory type.
640
- * -EBUSY: There are still buffers left in this memory type.
641
- */
642
-int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type);
643472
644473 /**
645474 * ttm_bo_evict_mm
....@@ -708,16 +537,14 @@
708537 void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map);
709538
710539 /**
711
- * ttm_fbdev_mmap - mmap fbdev memory backed by a ttm buffer object.
540
+ * ttm_bo_mmap_obj - mmap memory backed by a ttm buffer object.
712541 *
713542 * @vma: vma as input from the fbdev mmap method.
714
- * @bo: The bo backing the address space. The address space will
715
- * have the same size as the bo, and start at offset 0.
543
+ * @bo: The bo backing the address space.
716544 *
717
- * This function is intended to be called by the fbdev mmap method
718
- * if the fbdev address space is to be backed by a bo.
545
+ * Maps a buffer object.
719546 */
720
-int ttm_fbdev_mmap(struct vm_area_struct *vma, struct ttm_buffer_object *bo);
547
+int ttm_bo_mmap_obj(struct vm_area_struct *vma, struct ttm_buffer_object *bo);
721548
722549 /**
723550 * ttm_bo_mmap - mmap out of the ttm device address space.
....@@ -731,10 +558,6 @@
731558 */
732559 int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
733560 struct ttm_bo_device *bdev);
734
-
735
-void *ttm_kmap_atomic_prot(struct page *page, pgprot_t prot);
736
-
737
-void ttm_kunmap_atomic_prot(void *addr, pgprot_t prot);
738561
739562 /**
740563 * ttm_bo_io
....@@ -762,6 +585,51 @@
762585
763586 int ttm_bo_swapout(struct ttm_bo_global *glob,
764587 struct ttm_operation_ctx *ctx);
765
-void ttm_bo_swapout_all(struct ttm_bo_device *bdev);
766
-int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo);
588
+void ttm_bo_swapout_all(void);
589
+
590
+/**
591
+ * ttm_bo_uses_embedded_gem_object - check if the given bo uses the
592
+ * embedded drm_gem_object.
593
+ *
594
+ * Most ttm drivers are using gem too, so the embedded
595
+ * ttm_buffer_object.base will be initialized by the driver (before
596
+ * calling ttm_bo_init). It is also possible to use ttm without gem
597
+ * though (vmwgfx does that).
598
+ *
599
+ * This helper will figure whenever a given ttm bo is a gem object too
600
+ * or not.
601
+ *
602
+ * @bo: The bo to check.
603
+ */
604
+static inline bool ttm_bo_uses_embedded_gem_object(struct ttm_buffer_object *bo)
605
+{
606
+ return bo->base.dev != NULL;
607
+}
608
+
609
+int ttm_mem_evict_first(struct ttm_bo_device *bdev,
610
+ struct ttm_resource_manager *man,
611
+ const struct ttm_place *place,
612
+ struct ttm_operation_ctx *ctx,
613
+ struct ww_acquire_ctx *ticket);
614
+
615
+/* Default number of pre-faulted pages in the TTM fault handler */
616
+#define TTM_BO_VM_NUM_PREFAULT 16
617
+
618
+vm_fault_t ttm_bo_vm_reserve(struct ttm_buffer_object *bo,
619
+ struct vm_fault *vmf);
620
+
621
+vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vmf,
622
+ pgprot_t prot,
623
+ pgoff_t num_prefault,
624
+ pgoff_t fault_page_size);
625
+
626
+vm_fault_t ttm_bo_vm_fault(struct vm_fault *vmf);
627
+
628
+void ttm_bo_vm_open(struct vm_area_struct *vma);
629
+
630
+void ttm_bo_vm_close(struct vm_area_struct *vma);
631
+
632
+int ttm_bo_vm_access(struct vm_area_struct *vma, unsigned long addr,
633
+ void *buf, int len, int write);
634
+
767635 #endif