xref: /linux/drivers/gpu/drm/drm_gem_vram_helper.c (revision f86fd32d)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #include <drm/drm_debugfs.h>
4 #include <drm/drm_device.h>
5 #include <drm/drm_drv.h>
6 #include <drm/drm_file.h>
7 #include <drm/drm_framebuffer.h>
8 #include <drm/drm_gem_ttm_helper.h>
9 #include <drm/drm_gem_vram_helper.h>
10 #include <drm/drm_mode.h>
11 #include <drm/drm_plane.h>
12 #include <drm/drm_prime.h>
13 #include <drm/drm_simple_kms_helper.h>
14 #include <drm/ttm/ttm_page_alloc.h>
15 
16 static const struct drm_gem_object_funcs drm_gem_vram_object_funcs;
17 
18 /**
19  * DOC: overview
20  *
21  * This library provides a GEM buffer object that is backed by video RAM
22  * (VRAM). It can be used for framebuffer devices with dedicated memory.
23  *
24  * The data structure &struct drm_vram_mm and its helpers implement a memory
25  * manager for simple framebuffer devices with dedicated video memory. Buffer
26  * objects are either placed in video RAM or evicted to system memory. The rsp.
27  * buffer object is provided by &struct drm_gem_vram_object.
28  */
29 
30 /*
31  * Buffer-objects helpers
32  */
33 
34 static void drm_gem_vram_cleanup(struct drm_gem_vram_object *gbo)
35 {
36 	/* We got here via ttm_bo_put(), which means that the
37 	 * TTM buffer object in 'bo' has already been cleaned
38 	 * up; only release the GEM object.
39 	 */
40 
41 	WARN_ON(gbo->kmap_use_count);
42 	WARN_ON(gbo->kmap.virtual);
43 
44 	drm_gem_object_release(&gbo->bo.base);
45 }
46 
47 static void drm_gem_vram_destroy(struct drm_gem_vram_object *gbo)
48 {
49 	drm_gem_vram_cleanup(gbo);
50 	kfree(gbo);
51 }
52 
53 static void ttm_buffer_object_destroy(struct ttm_buffer_object *bo)
54 {
55 	struct drm_gem_vram_object *gbo = drm_gem_vram_of_bo(bo);
56 
57 	drm_gem_vram_destroy(gbo);
58 }
59 
60 static void drm_gem_vram_placement(struct drm_gem_vram_object *gbo,
61 				   unsigned long pl_flag)
62 {
63 	unsigned int i;
64 	unsigned int c = 0;
65 	u32 invariant_flags = pl_flag & TTM_PL_FLAG_TOPDOWN;
66 
67 	gbo->placement.placement = gbo->placements;
68 	gbo->placement.busy_placement = gbo->placements;
69 
70 	if (pl_flag & TTM_PL_FLAG_VRAM)
71 		gbo->placements[c++].flags = TTM_PL_FLAG_WC |
72 					     TTM_PL_FLAG_UNCACHED |
73 					     TTM_PL_FLAG_VRAM |
74 					     invariant_flags;
75 
76 	if (pl_flag & TTM_PL_FLAG_SYSTEM)
77 		gbo->placements[c++].flags = TTM_PL_MASK_CACHING |
78 					     TTM_PL_FLAG_SYSTEM |
79 					     invariant_flags;
80 
81 	if (!c)
82 		gbo->placements[c++].flags = TTM_PL_MASK_CACHING |
83 					     TTM_PL_FLAG_SYSTEM |
84 					     invariant_flags;
85 
86 	gbo->placement.num_placement = c;
87 	gbo->placement.num_busy_placement = c;
88 
89 	for (i = 0; i < c; ++i) {
90 		gbo->placements[i].fpfn = 0;
91 		gbo->placements[i].lpfn = 0;
92 	}
93 }
94 
95 static int drm_gem_vram_init(struct drm_device *dev,
96 			     struct drm_gem_vram_object *gbo,
97 			     size_t size, unsigned long pg_align)
98 {
99 	struct drm_vram_mm *vmm = dev->vram_mm;
100 	struct ttm_bo_device *bdev;
101 	int ret;
102 	size_t acc_size;
103 
104 	if (WARN_ONCE(!vmm, "VRAM MM not initialized"))
105 		return -EINVAL;
106 	bdev = &vmm->bdev;
107 
108 	gbo->bo.base.funcs = &drm_gem_vram_object_funcs;
109 
110 	ret = drm_gem_object_init(dev, &gbo->bo.base, size);
111 	if (ret)
112 		return ret;
113 
114 	acc_size = ttm_bo_dma_acc_size(bdev, size, sizeof(*gbo));
115 
116 	gbo->bo.bdev = bdev;
117 	drm_gem_vram_placement(gbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM);
118 
119 	ret = ttm_bo_init(bdev, &gbo->bo, size, ttm_bo_type_device,
120 			  &gbo->placement, pg_align, false, acc_size,
121 			  NULL, NULL, ttm_buffer_object_destroy);
122 	if (ret)
123 		goto err_drm_gem_object_release;
124 
125 	return 0;
126 
127 err_drm_gem_object_release:
128 	drm_gem_object_release(&gbo->bo.base);
129 	return ret;
130 }
131 
132 /**
133  * drm_gem_vram_create() - Creates a VRAM-backed GEM object
134  * @dev:		the DRM device
135  * @size:		the buffer size in bytes
136  * @pg_align:		the buffer's alignment in multiples of the page size
137  *
138  * Returns:
139  * A new instance of &struct drm_gem_vram_object on success, or
140  * an ERR_PTR()-encoded error code otherwise.
141  */
142 struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
143 						size_t size,
144 						unsigned long pg_align)
145 {
146 	struct drm_gem_vram_object *gbo;
147 	int ret;
148 
149 	if (dev->driver->gem_create_object) {
150 		struct drm_gem_object *gem =
151 			dev->driver->gem_create_object(dev, size);
152 		if (!gem)
153 			return ERR_PTR(-ENOMEM);
154 		gbo = drm_gem_vram_of_gem(gem);
155 	} else {
156 		gbo = kzalloc(sizeof(*gbo), GFP_KERNEL);
157 		if (!gbo)
158 			return ERR_PTR(-ENOMEM);
159 	}
160 
161 	ret = drm_gem_vram_init(dev, gbo, size, pg_align);
162 	if (ret < 0)
163 		goto err_kfree;
164 
165 	return gbo;
166 
167 err_kfree:
168 	kfree(gbo);
169 	return ERR_PTR(ret);
170 }
171 EXPORT_SYMBOL(drm_gem_vram_create);
172 
173 /**
174  * drm_gem_vram_put() - Releases a reference to a VRAM-backed GEM object
175  * @gbo:	the GEM VRAM object
176  *
177  * See ttm_bo_put() for more information.
178  */
179 void drm_gem_vram_put(struct drm_gem_vram_object *gbo)
180 {
181 	ttm_bo_put(&gbo->bo);
182 }
183 EXPORT_SYMBOL(drm_gem_vram_put);
184 
185 /**
186  * drm_gem_vram_mmap_offset() - Returns a GEM VRAM object's mmap offset
187  * @gbo:	the GEM VRAM object
188  *
189  * See drm_vma_node_offset_addr() for more information.
190  *
191  * Returns:
192  * The buffer object's offset for userspace mappings on success, or
193  * 0 if no offset is allocated.
194  */
195 u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo)
196 {
197 	return drm_vma_node_offset_addr(&gbo->bo.base.vma_node);
198 }
199 EXPORT_SYMBOL(drm_gem_vram_mmap_offset);
200 
201 /**
202  * drm_gem_vram_offset() - \
203 	Returns a GEM VRAM object's offset in video memory
204  * @gbo:	the GEM VRAM object
205  *
206  * This function returns the buffer object's offset in the device's video
207  * memory. The buffer object has to be pinned to %TTM_PL_VRAM.
208  *
209  * Returns:
210  * The buffer object's offset in video memory on success, or
211  * a negative errno code otherwise.
212  */
213 s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo)
214 {
215 	if (WARN_ON_ONCE(!gbo->pin_count))
216 		return (s64)-ENODEV;
217 	return gbo->bo.offset;
218 }
219 EXPORT_SYMBOL(drm_gem_vram_offset);
220 
221 static int drm_gem_vram_pin_locked(struct drm_gem_vram_object *gbo,
222 				   unsigned long pl_flag)
223 {
224 	int i, ret;
225 	struct ttm_operation_ctx ctx = { false, false };
226 
227 	if (gbo->pin_count)
228 		goto out;
229 
230 	if (pl_flag)
231 		drm_gem_vram_placement(gbo, pl_flag);
232 
233 	for (i = 0; i < gbo->placement.num_placement; ++i)
234 		gbo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
235 
236 	ret = ttm_bo_validate(&gbo->bo, &gbo->placement, &ctx);
237 	if (ret < 0)
238 		return ret;
239 
240 out:
241 	++gbo->pin_count;
242 
243 	return 0;
244 }
245 
246 /**
247  * drm_gem_vram_pin() - Pins a GEM VRAM object in a region.
248  * @gbo:	the GEM VRAM object
249  * @pl_flag:	a bitmask of possible memory regions
250  *
251  * Pinning a buffer object ensures that it is not evicted from
252  * a memory region. A pinned buffer object has to be unpinned before
253  * it can be pinned to another region. If the pl_flag argument is 0,
254  * the buffer is pinned at its current location (video RAM or system
255  * memory).
256  *
257  * Small buffer objects, such as cursor images, can lead to memory
258  * fragmentation if they are pinned in the middle of video RAM. This
259  * is especially a problem on devices with only a small amount of
260  * video RAM. Fragmentation can prevent the primary framebuffer from
261  * fitting in, even though there's enough memory overall. The modifier
262  * DRM_GEM_VRAM_PL_FLAG_TOPDOWN marks the buffer object to be pinned
263  * at the high end of the memory region to avoid fragmentation.
264  *
265  * Returns:
266  * 0 on success, or
267  * a negative error code otherwise.
268  */
269 int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag)
270 {
271 	int ret;
272 
273 	ret = ttm_bo_reserve(&gbo->bo, true, false, NULL);
274 	if (ret)
275 		return ret;
276 	ret = drm_gem_vram_pin_locked(gbo, pl_flag);
277 	ttm_bo_unreserve(&gbo->bo);
278 
279 	return ret;
280 }
281 EXPORT_SYMBOL(drm_gem_vram_pin);
282 
283 static int drm_gem_vram_unpin_locked(struct drm_gem_vram_object *gbo)
284 {
285 	int i, ret;
286 	struct ttm_operation_ctx ctx = { false, false };
287 
288 	if (WARN_ON_ONCE(!gbo->pin_count))
289 		return 0;
290 
291 	--gbo->pin_count;
292 	if (gbo->pin_count)
293 		return 0;
294 
295 	for (i = 0; i < gbo->placement.num_placement ; ++i)
296 		gbo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
297 
298 	ret = ttm_bo_validate(&gbo->bo, &gbo->placement, &ctx);
299 	if (ret < 0)
300 		return ret;
301 
302 	return 0;
303 }
304 
305 /**
306  * drm_gem_vram_unpin() - Unpins a GEM VRAM object
307  * @gbo:	the GEM VRAM object
308  *
309  * Returns:
310  * 0 on success, or
311  * a negative error code otherwise.
312  */
313 int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo)
314 {
315 	int ret;
316 
317 	ret = ttm_bo_reserve(&gbo->bo, true, false, NULL);
318 	if (ret)
319 		return ret;
320 	ret = drm_gem_vram_unpin_locked(gbo);
321 	ttm_bo_unreserve(&gbo->bo);
322 
323 	return ret;
324 }
325 EXPORT_SYMBOL(drm_gem_vram_unpin);
326 
327 static void *drm_gem_vram_kmap_locked(struct drm_gem_vram_object *gbo,
328 				      bool map, bool *is_iomem)
329 {
330 	int ret;
331 	struct ttm_bo_kmap_obj *kmap = &gbo->kmap;
332 
333 	if (gbo->kmap_use_count > 0)
334 		goto out;
335 
336 	if (kmap->virtual || !map)
337 		goto out;
338 
339 	ret = ttm_bo_kmap(&gbo->bo, 0, gbo->bo.num_pages, kmap);
340 	if (ret)
341 		return ERR_PTR(ret);
342 
343 out:
344 	if (!kmap->virtual) {
345 		if (is_iomem)
346 			*is_iomem = false;
347 		return NULL; /* not mapped; don't increment ref */
348 	}
349 	++gbo->kmap_use_count;
350 	if (is_iomem)
351 		return ttm_kmap_obj_virtual(kmap, is_iomem);
352 	return kmap->virtual;
353 }
354 
355 /**
356  * drm_gem_vram_kmap() - Maps a GEM VRAM object into kernel address space
357  * @gbo:	the GEM VRAM object
358  * @map:	establish a mapping if necessary
359  * @is_iomem:	returns true if the mapped memory is I/O memory, or false \
360 	otherwise; can be NULL
361  *
362  * This function maps the buffer object into the kernel's address space
363  * or returns the current mapping. If the parameter map is false, the
364  * function only queries the current mapping, but does not establish a
365  * new one.
366  *
367  * Returns:
368  * The buffers virtual address if mapped, or
369  * NULL if not mapped, or
370  * an ERR_PTR()-encoded error code otherwise.
371  */
372 void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map,
373 			bool *is_iomem)
374 {
375 	int ret;
376 	void *virtual;
377 
378 	ret = ttm_bo_reserve(&gbo->bo, true, false, NULL);
379 	if (ret)
380 		return ERR_PTR(ret);
381 	virtual = drm_gem_vram_kmap_locked(gbo, map, is_iomem);
382 	ttm_bo_unreserve(&gbo->bo);
383 
384 	return virtual;
385 }
386 EXPORT_SYMBOL(drm_gem_vram_kmap);
387 
388 static void drm_gem_vram_kunmap_locked(struct drm_gem_vram_object *gbo)
389 {
390 	if (WARN_ON_ONCE(!gbo->kmap_use_count))
391 		return;
392 	if (--gbo->kmap_use_count > 0)
393 		return;
394 
395 	/*
396 	 * Permanently mapping and unmapping buffers adds overhead from
397 	 * updating the page tables and creates debugging output. Therefore,
398 	 * we delay the actual unmap operation until the BO gets evicted
399 	 * from memory. See drm_gem_vram_bo_driver_move_notify().
400 	 */
401 }
402 
403 /**
404  * drm_gem_vram_kunmap() - Unmaps a GEM VRAM object
405  * @gbo:	the GEM VRAM object
406  */
407 void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo)
408 {
409 	int ret;
410 
411 	ret = ttm_bo_reserve(&gbo->bo, false, false, NULL);
412 	if (WARN_ONCE(ret, "ttm_bo_reserve_failed(): ret=%d\n", ret))
413 		return;
414 	drm_gem_vram_kunmap_locked(gbo);
415 	ttm_bo_unreserve(&gbo->bo);
416 }
417 EXPORT_SYMBOL(drm_gem_vram_kunmap);
418 
419 /**
420  * drm_gem_vram_vmap() - Pins and maps a GEM VRAM object into kernel address
421  *                       space
422  * @gbo:	The GEM VRAM object to map
423  *
424  * The vmap function pins a GEM VRAM object to its current location, either
425  * system or video memory, and maps its buffer into kernel address space.
426  * As pinned object cannot be relocated, you should avoid pinning objects
427  * permanently. Call drm_gem_vram_vunmap() with the returned address to
428  * unmap and unpin the GEM VRAM object.
429  *
430  * If you have special requirements for the pinning or mapping operations,
431  * call drm_gem_vram_pin() and drm_gem_vram_kmap() directly.
432  *
433  * Returns:
434  * The buffer's virtual address on success, or
435  * an ERR_PTR()-encoded error code otherwise.
436  */
437 void *drm_gem_vram_vmap(struct drm_gem_vram_object *gbo)
438 {
439 	int ret;
440 	void *base;
441 
442 	ret = ttm_bo_reserve(&gbo->bo, true, false, NULL);
443 	if (ret)
444 		return ERR_PTR(ret);
445 
446 	ret = drm_gem_vram_pin_locked(gbo, 0);
447 	if (ret)
448 		goto err_ttm_bo_unreserve;
449 	base = drm_gem_vram_kmap_locked(gbo, true, NULL);
450 	if (IS_ERR(base)) {
451 		ret = PTR_ERR(base);
452 		goto err_drm_gem_vram_unpin_locked;
453 	}
454 
455 	ttm_bo_unreserve(&gbo->bo);
456 
457 	return base;
458 
459 err_drm_gem_vram_unpin_locked:
460 	drm_gem_vram_unpin_locked(gbo);
461 err_ttm_bo_unreserve:
462 	ttm_bo_unreserve(&gbo->bo);
463 	return ERR_PTR(ret);
464 }
465 EXPORT_SYMBOL(drm_gem_vram_vmap);
466 
467 /**
468  * drm_gem_vram_vunmap() - Unmaps and unpins a GEM VRAM object
469  * @gbo:	The GEM VRAM object to unmap
470  * @vaddr:	The mapping's base address as returned by drm_gem_vram_vmap()
471  *
472  * A call to drm_gem_vram_vunmap() unmaps and unpins a GEM VRAM buffer. See
473  * the documentation for drm_gem_vram_vmap() for more information.
474  */
475 void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, void *vaddr)
476 {
477 	int ret;
478 
479 	ret = ttm_bo_reserve(&gbo->bo, false, false, NULL);
480 	if (WARN_ONCE(ret, "ttm_bo_reserve_failed(): ret=%d\n", ret))
481 		return;
482 
483 	drm_gem_vram_kunmap_locked(gbo);
484 	drm_gem_vram_unpin_locked(gbo);
485 
486 	ttm_bo_unreserve(&gbo->bo);
487 }
488 EXPORT_SYMBOL(drm_gem_vram_vunmap);
489 
490 /**
491  * drm_gem_vram_fill_create_dumb() - \
492 	Helper for implementing &struct drm_driver.dumb_create
493  * @file:		the DRM file
494  * @dev:		the DRM device
495  * @pg_align:		the buffer's alignment in multiples of the page size
496  * @pitch_align:	the scanline's alignment in powers of 2
497  * @args:		the arguments as provided to \
498 				&struct drm_driver.dumb_create
499  *
500  * This helper function fills &struct drm_mode_create_dumb, which is used
501  * by &struct drm_driver.dumb_create. Implementations of this interface
502  * should forwards their arguments to this helper, plus the driver-specific
503  * parameters.
504  *
505  * Returns:
506  * 0 on success, or
507  * a negative error code otherwise.
508  */
509 int drm_gem_vram_fill_create_dumb(struct drm_file *file,
510 				  struct drm_device *dev,
511 				  unsigned long pg_align,
512 				  unsigned long pitch_align,
513 				  struct drm_mode_create_dumb *args)
514 {
515 	size_t pitch, size;
516 	struct drm_gem_vram_object *gbo;
517 	int ret;
518 	u32 handle;
519 
520 	pitch = args->width * DIV_ROUND_UP(args->bpp, 8);
521 	if (pitch_align) {
522 		if (WARN_ON_ONCE(!is_power_of_2(pitch_align)))
523 			return -EINVAL;
524 		pitch = ALIGN(pitch, pitch_align);
525 	}
526 	size = pitch * args->height;
527 
528 	size = roundup(size, PAGE_SIZE);
529 	if (!size)
530 		return -EINVAL;
531 
532 	gbo = drm_gem_vram_create(dev, size, pg_align);
533 	if (IS_ERR(gbo))
534 		return PTR_ERR(gbo);
535 
536 	ret = drm_gem_handle_create(file, &gbo->bo.base, &handle);
537 	if (ret)
538 		goto err_drm_gem_object_put_unlocked;
539 
540 	drm_gem_object_put_unlocked(&gbo->bo.base);
541 
542 	args->pitch = pitch;
543 	args->size = size;
544 	args->handle = handle;
545 
546 	return 0;
547 
548 err_drm_gem_object_put_unlocked:
549 	drm_gem_object_put_unlocked(&gbo->bo.base);
550 	return ret;
551 }
552 EXPORT_SYMBOL(drm_gem_vram_fill_create_dumb);
553 
554 /*
555  * Helpers for struct ttm_bo_driver
556  */
557 
558 static bool drm_is_gem_vram(struct ttm_buffer_object *bo)
559 {
560 	return (bo->destroy == ttm_buffer_object_destroy);
561 }
562 
563 static void drm_gem_vram_bo_driver_evict_flags(struct drm_gem_vram_object *gbo,
564 					       struct ttm_placement *pl)
565 {
566 	drm_gem_vram_placement(gbo, TTM_PL_FLAG_SYSTEM);
567 	*pl = gbo->placement;
568 }
569 
570 static void drm_gem_vram_bo_driver_move_notify(struct drm_gem_vram_object *gbo,
571 					       bool evict,
572 					       struct ttm_mem_reg *new_mem)
573 {
574 	struct ttm_bo_kmap_obj *kmap = &gbo->kmap;
575 
576 	if (WARN_ON_ONCE(gbo->kmap_use_count))
577 		return;
578 
579 	if (!kmap->virtual)
580 		return;
581 	ttm_bo_kunmap(kmap);
582 	kmap->virtual = NULL;
583 }
584 
585 /*
586  * Helpers for struct drm_gem_object_funcs
587  */
588 
589 /**
590  * drm_gem_vram_object_free() - \
591 	Implements &struct drm_gem_object_funcs.free
592  * @gem:       GEM object. Refers to &struct drm_gem_vram_object.gem
593  */
594 static void drm_gem_vram_object_free(struct drm_gem_object *gem)
595 {
596 	struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
597 
598 	drm_gem_vram_put(gbo);
599 }
600 
601 /*
602  * Helpers for dump buffers
603  */
604 
605 /**
606  * drm_gem_vram_driver_create_dumb() - \
607 	Implements &struct drm_driver.dumb_create
608  * @file:		the DRM file
609  * @dev:		the DRM device
610  * @args:		the arguments as provided to \
611 				&struct drm_driver.dumb_create
612  *
613  * This function requires the driver to use @drm_device.vram_mm for its
614  * instance of VRAM MM.
615  *
616  * Returns:
617  * 0 on success, or
618  * a negative error code otherwise.
619  */
620 int drm_gem_vram_driver_dumb_create(struct drm_file *file,
621 				    struct drm_device *dev,
622 				    struct drm_mode_create_dumb *args)
623 {
624 	if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized"))
625 		return -EINVAL;
626 
627 	return drm_gem_vram_fill_create_dumb(file, dev, 0, 0, args);
628 }
629 EXPORT_SYMBOL(drm_gem_vram_driver_dumb_create);
630 
631 /**
632  * drm_gem_vram_driver_dumb_mmap_offset() - \
633 	Implements &struct drm_driver.dumb_mmap_offset
634  * @file:	DRM file pointer.
635  * @dev:	DRM device.
636  * @handle:	GEM handle
637  * @offset:	Returns the mapping's memory offset on success
638  *
639  * Returns:
640  * 0 on success, or
641  * a negative errno code otherwise.
642  */
643 int drm_gem_vram_driver_dumb_mmap_offset(struct drm_file *file,
644 					 struct drm_device *dev,
645 					 uint32_t handle, uint64_t *offset)
646 {
647 	struct drm_gem_object *gem;
648 	struct drm_gem_vram_object *gbo;
649 
650 	gem = drm_gem_object_lookup(file, handle);
651 	if (!gem)
652 		return -ENOENT;
653 
654 	gbo = drm_gem_vram_of_gem(gem);
655 	*offset = drm_gem_vram_mmap_offset(gbo);
656 
657 	drm_gem_object_put_unlocked(gem);
658 
659 	return 0;
660 }
661 EXPORT_SYMBOL(drm_gem_vram_driver_dumb_mmap_offset);
662 
663 /*
664  * Helpers for struct drm_plane_helper_funcs
665  */
666 
667 /**
668  * drm_gem_vram_plane_helper_prepare_fb() - \
669  *	Implements &struct drm_plane_helper_funcs.prepare_fb
670  * @plane:	a DRM plane
671  * @new_state:	the plane's new state
672  *
673  * During plane updates, this function pins the GEM VRAM
674  * objects of the plane's new framebuffer to VRAM. Call
675  * drm_gem_vram_plane_helper_cleanup_fb() to unpin them.
676  *
677  * Returns:
678  *	0 on success, or
679  *	a negative errno code otherwise.
680  */
681 int
682 drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
683 				     struct drm_plane_state *new_state)
684 {
685 	size_t i;
686 	struct drm_gem_vram_object *gbo;
687 	int ret;
688 
689 	if (!new_state->fb)
690 		return 0;
691 
692 	for (i = 0; i < ARRAY_SIZE(new_state->fb->obj); ++i) {
693 		if (!new_state->fb->obj[i])
694 			continue;
695 		gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]);
696 		ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
697 		if (ret)
698 			goto err_drm_gem_vram_unpin;
699 	}
700 
701 	return 0;
702 
703 err_drm_gem_vram_unpin:
704 	while (i) {
705 		--i;
706 		gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]);
707 		drm_gem_vram_unpin(gbo);
708 	}
709 	return ret;
710 }
711 EXPORT_SYMBOL(drm_gem_vram_plane_helper_prepare_fb);
712 
713 /**
714  * drm_gem_vram_plane_helper_cleanup_fb() - \
715  *	Implements &struct drm_plane_helper_funcs.cleanup_fb
716  * @plane:	a DRM plane
717  * @old_state:	the plane's old state
718  *
719  * During plane updates, this function unpins the GEM VRAM
720  * objects of the plane's old framebuffer from VRAM. Complements
721  * drm_gem_vram_plane_helper_prepare_fb().
722  */
723 void
724 drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
725 				     struct drm_plane_state *old_state)
726 {
727 	size_t i;
728 	struct drm_gem_vram_object *gbo;
729 
730 	if (!old_state->fb)
731 		return;
732 
733 	for (i = 0; i < ARRAY_SIZE(old_state->fb->obj); ++i) {
734 		if (!old_state->fb->obj[i])
735 			continue;
736 		gbo = drm_gem_vram_of_gem(old_state->fb->obj[i]);
737 		drm_gem_vram_unpin(gbo);
738 	}
739 }
740 EXPORT_SYMBOL(drm_gem_vram_plane_helper_cleanup_fb);
741 
742 /*
743  * Helpers for struct drm_simple_display_pipe_funcs
744  */
745 
746 /**
747  * drm_gem_vram_simple_display_pipe_prepare_fb() - \
748  *	Implements &struct drm_simple_display_pipe_funcs.prepare_fb
749  * @pipe:	a simple display pipe
750  * @new_state:	the plane's new state
751  *
752  * During plane updates, this function pins the GEM VRAM
753  * objects of the plane's new framebuffer to VRAM. Call
754  * drm_gem_vram_simple_display_pipe_cleanup_fb() to unpin them.
755  *
756  * Returns:
757  *	0 on success, or
758  *	a negative errno code otherwise.
759  */
760 int drm_gem_vram_simple_display_pipe_prepare_fb(
761 	struct drm_simple_display_pipe *pipe,
762 	struct drm_plane_state *new_state)
763 {
764 	return drm_gem_vram_plane_helper_prepare_fb(&pipe->plane, new_state);
765 }
766 EXPORT_SYMBOL(drm_gem_vram_simple_display_pipe_prepare_fb);
767 
768 /**
769  * drm_gem_vram_simple_display_pipe_cleanup_fb() - \
770  *	Implements &struct drm_simple_display_pipe_funcs.cleanup_fb
771  * @pipe:	a simple display pipe
772  * @old_state:	the plane's old state
773  *
774  * During plane updates, this function unpins the GEM VRAM
775  * objects of the plane's old framebuffer from VRAM. Complements
776  * drm_gem_vram_simple_display_pipe_prepare_fb().
777  */
778 void drm_gem_vram_simple_display_pipe_cleanup_fb(
779 	struct drm_simple_display_pipe *pipe,
780 	struct drm_plane_state *old_state)
781 {
782 	drm_gem_vram_plane_helper_cleanup_fb(&pipe->plane, old_state);
783 }
784 EXPORT_SYMBOL(drm_gem_vram_simple_display_pipe_cleanup_fb);
785 
786 /*
787  * PRIME helpers
788  */
789 
790 /**
791  * drm_gem_vram_object_pin() - \
792 	Implements &struct drm_gem_object_funcs.pin
793  * @gem:	The GEM object to pin
794  *
795  * Returns:
796  * 0 on success, or
797  * a negative errno code otherwise.
798  */
799 static int drm_gem_vram_object_pin(struct drm_gem_object *gem)
800 {
801 	struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
802 
803 	/* Fbdev console emulation is the use case of these PRIME
804 	 * helpers. This may involve updating a hardware buffer from
805 	 * a shadow FB. We pin the buffer to it's current location
806 	 * (either video RAM or system memory) to prevent it from
807 	 * being relocated during the update operation. If you require
808 	 * the buffer to be pinned to VRAM, implement a callback that
809 	 * sets the flags accordingly.
810 	 */
811 	return drm_gem_vram_pin(gbo, 0);
812 }
813 
814 /**
815  * drm_gem_vram_object_unpin() - \
816 	Implements &struct drm_gem_object_funcs.unpin
817  * @gem:	The GEM object to unpin
818  */
819 static void drm_gem_vram_object_unpin(struct drm_gem_object *gem)
820 {
821 	struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
822 
823 	drm_gem_vram_unpin(gbo);
824 }
825 
826 /**
827  * drm_gem_vram_object_vmap() - \
828 	Implements &struct drm_gem_object_funcs.vmap
829  * @gem:	The GEM object to map
830  *
831  * Returns:
832  * The buffers virtual address on success, or
833  * NULL otherwise.
834  */
835 static void *drm_gem_vram_object_vmap(struct drm_gem_object *gem)
836 {
837 	struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
838 	void *base;
839 
840 	base = drm_gem_vram_vmap(gbo);
841 	if (IS_ERR(base))
842 		return NULL;
843 	return base;
844 }
845 
846 /**
847  * drm_gem_vram_object_vunmap() - \
848 	Implements &struct drm_gem_object_funcs.vunmap
849  * @gem:	The GEM object to unmap
850  * @vaddr:	The mapping's base address
851  */
852 static void drm_gem_vram_object_vunmap(struct drm_gem_object *gem,
853 				       void *vaddr)
854 {
855 	struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
856 
857 	drm_gem_vram_vunmap(gbo, vaddr);
858 }
859 
860 /*
861  * GEM object funcs
862  */
863 
864 static const struct drm_gem_object_funcs drm_gem_vram_object_funcs = {
865 	.free	= drm_gem_vram_object_free,
866 	.pin	= drm_gem_vram_object_pin,
867 	.unpin	= drm_gem_vram_object_unpin,
868 	.vmap	= drm_gem_vram_object_vmap,
869 	.vunmap	= drm_gem_vram_object_vunmap,
870 	.mmap   = drm_gem_ttm_mmap,
871 	.print_info = drm_gem_ttm_print_info,
872 };
873 
874 /*
875  * VRAM memory manager
876  */
877 
878 /*
879  * TTM TT
880  */
881 
882 static void backend_func_destroy(struct ttm_tt *tt)
883 {
884 	ttm_tt_fini(tt);
885 	kfree(tt);
886 }
887 
888 static struct ttm_backend_func backend_func = {
889 	.destroy = backend_func_destroy
890 };
891 
892 /*
893  * TTM BO device
894  */
895 
896 static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo,
897 					      uint32_t page_flags)
898 {
899 	struct ttm_tt *tt;
900 	int ret;
901 
902 	tt = kzalloc(sizeof(*tt), GFP_KERNEL);
903 	if (!tt)
904 		return NULL;
905 
906 	tt->func = &backend_func;
907 
908 	ret = ttm_tt_init(tt, bo, page_flags);
909 	if (ret < 0)
910 		goto err_ttm_tt_init;
911 
912 	return tt;
913 
914 err_ttm_tt_init:
915 	kfree(tt);
916 	return NULL;
917 }
918 
919 static int bo_driver_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
920 				   struct ttm_mem_type_manager *man)
921 {
922 	switch (type) {
923 	case TTM_PL_SYSTEM:
924 		man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
925 		man->available_caching = TTM_PL_MASK_CACHING;
926 		man->default_caching = TTM_PL_FLAG_CACHED;
927 		break;
928 	case TTM_PL_VRAM:
929 		man->func = &ttm_bo_manager_func;
930 		man->flags = TTM_MEMTYPE_FLAG_FIXED |
931 			     TTM_MEMTYPE_FLAG_MAPPABLE;
932 		man->available_caching = TTM_PL_FLAG_UNCACHED |
933 					 TTM_PL_FLAG_WC;
934 		man->default_caching = TTM_PL_FLAG_WC;
935 		break;
936 	default:
937 		return -EINVAL;
938 	}
939 	return 0;
940 }
941 
942 static void bo_driver_evict_flags(struct ttm_buffer_object *bo,
943 				  struct ttm_placement *placement)
944 {
945 	struct drm_gem_vram_object *gbo;
946 
947 	/* TTM may pass BOs that are not GEM VRAM BOs. */
948 	if (!drm_is_gem_vram(bo))
949 		return;
950 
951 	gbo = drm_gem_vram_of_bo(bo);
952 
953 	drm_gem_vram_bo_driver_evict_flags(gbo, placement);
954 }
955 
956 static void bo_driver_move_notify(struct ttm_buffer_object *bo,
957 				  bool evict,
958 				  struct ttm_mem_reg *new_mem)
959 {
960 	struct drm_gem_vram_object *gbo;
961 
962 	/* TTM may pass BOs that are not GEM VRAM BOs. */
963 	if (!drm_is_gem_vram(bo))
964 		return;
965 
966 	gbo = drm_gem_vram_of_bo(bo);
967 
968 	drm_gem_vram_bo_driver_move_notify(gbo, evict, new_mem);
969 }
970 
971 static int bo_driver_io_mem_reserve(struct ttm_bo_device *bdev,
972 				    struct ttm_mem_reg *mem)
973 {
974 	struct ttm_mem_type_manager *man = bdev->man + mem->mem_type;
975 	struct drm_vram_mm *vmm = drm_vram_mm_of_bdev(bdev);
976 
977 	if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE))
978 		return -EINVAL;
979 
980 	mem->bus.addr = NULL;
981 	mem->bus.size = mem->num_pages << PAGE_SHIFT;
982 
983 	switch (mem->mem_type) {
984 	case TTM_PL_SYSTEM:	/* nothing to do */
985 		mem->bus.offset = 0;
986 		mem->bus.base = 0;
987 		mem->bus.is_iomem = false;
988 		break;
989 	case TTM_PL_VRAM:
990 		mem->bus.offset = mem->start << PAGE_SHIFT;
991 		mem->bus.base = vmm->vram_base;
992 		mem->bus.is_iomem = true;
993 		break;
994 	default:
995 		return -EINVAL;
996 	}
997 
998 	return 0;
999 }
1000 
1001 static void bo_driver_io_mem_free(struct ttm_bo_device *bdev,
1002 				  struct ttm_mem_reg *mem)
1003 { }
1004 
1005 static struct ttm_bo_driver bo_driver = {
1006 	.ttm_tt_create = bo_driver_ttm_tt_create,
1007 	.ttm_tt_populate = ttm_pool_populate,
1008 	.ttm_tt_unpopulate = ttm_pool_unpopulate,
1009 	.init_mem_type = bo_driver_init_mem_type,
1010 	.eviction_valuable = ttm_bo_eviction_valuable,
1011 	.evict_flags = bo_driver_evict_flags,
1012 	.move_notify = bo_driver_move_notify,
1013 	.io_mem_reserve = bo_driver_io_mem_reserve,
1014 	.io_mem_free = bo_driver_io_mem_free,
1015 };
1016 
1017 /*
1018  * struct drm_vram_mm
1019  */
1020 
1021 #if defined(CONFIG_DEBUG_FS)
1022 static int drm_vram_mm_debugfs(struct seq_file *m, void *data)
1023 {
1024 	struct drm_info_node *node = (struct drm_info_node *) m->private;
1025 	struct drm_vram_mm *vmm = node->minor->dev->vram_mm;
1026 	struct drm_mm *mm = vmm->bdev.man[TTM_PL_VRAM].priv;
1027 	struct drm_printer p = drm_seq_file_printer(m);
1028 
1029 	spin_lock(&ttm_bo_glob.lru_lock);
1030 	drm_mm_print(mm, &p);
1031 	spin_unlock(&ttm_bo_glob.lru_lock);
1032 	return 0;
1033 }
1034 
1035 static const struct drm_info_list drm_vram_mm_debugfs_list[] = {
1036 	{ "vram-mm", drm_vram_mm_debugfs, 0, NULL },
1037 };
1038 #endif
1039 
1040 /**
1041  * drm_vram_mm_debugfs_init() - Register VRAM MM debugfs file.
1042  *
1043  * @minor: drm minor device.
1044  *
1045  * Returns:
1046  * 0 on success, or
1047  * a negative error code otherwise.
1048  */
1049 int drm_vram_mm_debugfs_init(struct drm_minor *minor)
1050 {
1051 	int ret = 0;
1052 
1053 #if defined(CONFIG_DEBUG_FS)
1054 	ret = drm_debugfs_create_files(drm_vram_mm_debugfs_list,
1055 				       ARRAY_SIZE(drm_vram_mm_debugfs_list),
1056 				       minor->debugfs_root, minor);
1057 #endif
1058 	return ret;
1059 }
1060 EXPORT_SYMBOL(drm_vram_mm_debugfs_init);
1061 
1062 static int drm_vram_mm_init(struct drm_vram_mm *vmm, struct drm_device *dev,
1063 			    uint64_t vram_base, size_t vram_size)
1064 {
1065 	int ret;
1066 
1067 	vmm->vram_base = vram_base;
1068 	vmm->vram_size = vram_size;
1069 
1070 	ret = ttm_bo_device_init(&vmm->bdev, &bo_driver,
1071 				 dev->anon_inode->i_mapping,
1072 				 dev->vma_offset_manager,
1073 				 true);
1074 	if (ret)
1075 		return ret;
1076 
1077 	ret = ttm_bo_init_mm(&vmm->bdev, TTM_PL_VRAM, vram_size >> PAGE_SHIFT);
1078 	if (ret)
1079 		return ret;
1080 
1081 	return 0;
1082 }
1083 
1084 static void drm_vram_mm_cleanup(struct drm_vram_mm *vmm)
1085 {
1086 	ttm_bo_device_release(&vmm->bdev);
1087 }
1088 
1089 /*
1090  * Helpers for integration with struct drm_device
1091  */
1092 
1093 /**
1094  * drm_vram_helper_alloc_mm - Allocates a device's instance of \
1095 	&struct drm_vram_mm
1096  * @dev:	the DRM device
1097  * @vram_base:	the base address of the video memory
1098  * @vram_size:	the size of the video memory in bytes
1099  *
1100  * Returns:
1101  * The new instance of &struct drm_vram_mm on success, or
1102  * an ERR_PTR()-encoded errno code otherwise.
1103  */
1104 struct drm_vram_mm *drm_vram_helper_alloc_mm(
1105 	struct drm_device *dev, uint64_t vram_base, size_t vram_size)
1106 {
1107 	int ret;
1108 
1109 	if (WARN_ON(dev->vram_mm))
1110 		return dev->vram_mm;
1111 
1112 	dev->vram_mm = kzalloc(sizeof(*dev->vram_mm), GFP_KERNEL);
1113 	if (!dev->vram_mm)
1114 		return ERR_PTR(-ENOMEM);
1115 
1116 	ret = drm_vram_mm_init(dev->vram_mm, dev, vram_base, vram_size);
1117 	if (ret)
1118 		goto err_kfree;
1119 
1120 	return dev->vram_mm;
1121 
1122 err_kfree:
1123 	kfree(dev->vram_mm);
1124 	dev->vram_mm = NULL;
1125 	return ERR_PTR(ret);
1126 }
1127 EXPORT_SYMBOL(drm_vram_helper_alloc_mm);
1128 
1129 /**
1130  * drm_vram_helper_release_mm - Releases a device's instance of \
1131 	&struct drm_vram_mm
1132  * @dev:	the DRM device
1133  */
1134 void drm_vram_helper_release_mm(struct drm_device *dev)
1135 {
1136 	if (!dev->vram_mm)
1137 		return;
1138 
1139 	drm_vram_mm_cleanup(dev->vram_mm);
1140 	kfree(dev->vram_mm);
1141 	dev->vram_mm = NULL;
1142 }
1143 EXPORT_SYMBOL(drm_vram_helper_release_mm);
1144