Merge tag 'exfat-for-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/linki...
[linux-2.6-microblaze.git] / drivers / gpu / drm / ttm / ttm_bo_util.c
1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2 /**************************************************************************
3  *
4  * Copyright (c) 2007-2009 VMware, Inc., Palo Alto, CA., USA
5  * All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  *
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
22  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
23  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
24  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
25  * USE OR OTHER DEALINGS IN THE SOFTWARE.
26  *
27  **************************************************************************/
28 /*
29  * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
30  */
31
32 #include <drm/ttm/ttm_bo_driver.h>
33 #include <drm/ttm/ttm_placement.h>
34 #include <drm/drm_vma_manager.h>
35 #include <linux/dma-buf-map.h>
36 #include <linux/io.h>
37 #include <linux/highmem.h>
38 #include <linux/wait.h>
39 #include <linux/slab.h>
40 #include <linux/vmalloc.h>
41 #include <linux/module.h>
42 #include <linux/dma-resv.h>
43
44 struct ttm_transfer_obj {
45         struct ttm_buffer_object base;
46         struct ttm_buffer_object *bo;
47 };
48
49 int ttm_mem_io_reserve(struct ttm_bo_device *bdev,
50                        struct ttm_resource *mem)
51 {
52         if (mem->bus.offset || mem->bus.addr)
53                 return 0;
54
55         mem->bus.is_iomem = false;
56         if (!bdev->driver->io_mem_reserve)
57                 return 0;
58
59         return bdev->driver->io_mem_reserve(bdev, mem);
60 }
61
62 void ttm_mem_io_free(struct ttm_bo_device *bdev,
63                      struct ttm_resource *mem)
64 {
65         if (!mem->bus.offset && !mem->bus.addr)
66                 return;
67
68         if (bdev->driver->io_mem_free)
69                 bdev->driver->io_mem_free(bdev, mem);
70
71         mem->bus.offset = 0;
72         mem->bus.addr = NULL;
73 }
74
75 static int ttm_resource_ioremap(struct ttm_bo_device *bdev,
76                                struct ttm_resource *mem,
77                                void **virtual)
78 {
79         int ret;
80         void *addr;
81
82         *virtual = NULL;
83         ret = ttm_mem_io_reserve(bdev, mem);
84         if (ret || !mem->bus.is_iomem)
85                 return ret;
86
87         if (mem->bus.addr) {
88                 addr = mem->bus.addr;
89         } else {
90                 size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT;
91
92                 if (mem->bus.caching == ttm_write_combined)
93                         addr = ioremap_wc(mem->bus.offset, bus_size);
94                 else
95                         addr = ioremap(mem->bus.offset, bus_size);
96                 if (!addr) {
97                         ttm_mem_io_free(bdev, mem);
98                         return -ENOMEM;
99                 }
100         }
101         *virtual = addr;
102         return 0;
103 }
104
105 static void ttm_resource_iounmap(struct ttm_bo_device *bdev,
106                                 struct ttm_resource *mem,
107                                 void *virtual)
108 {
109         if (virtual && mem->bus.addr == NULL)
110                 iounmap(virtual);
111         ttm_mem_io_free(bdev, mem);
112 }
113
114 static int ttm_copy_io_page(void *dst, void *src, unsigned long page)
115 {
116         uint32_t *dstP =
117             (uint32_t *) ((unsigned long)dst + (page << PAGE_SHIFT));
118         uint32_t *srcP =
119             (uint32_t *) ((unsigned long)src + (page << PAGE_SHIFT));
120
121         int i;
122         for (i = 0; i < PAGE_SIZE / sizeof(uint32_t); ++i)
123                 iowrite32(ioread32(srcP++), dstP++);
124         return 0;
125 }
126
127 static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src,
128                                 unsigned long page,
129                                 pgprot_t prot)
130 {
131         struct page *d = ttm->pages[page];
132         void *dst;
133
134         if (!d)
135                 return -ENOMEM;
136
137         src = (void *)((unsigned long)src + (page << PAGE_SHIFT));
138         dst = kmap_atomic_prot(d, prot);
139         if (!dst)
140                 return -ENOMEM;
141
142         memcpy_fromio(dst, src, PAGE_SIZE);
143
144         kunmap_atomic(dst);
145
146         return 0;
147 }
148
149 static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst,
150                                 unsigned long page,
151                                 pgprot_t prot)
152 {
153         struct page *s = ttm->pages[page];
154         void *src;
155
156         if (!s)
157                 return -ENOMEM;
158
159         dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT));
160         src = kmap_atomic_prot(s, prot);
161         if (!src)
162                 return -ENOMEM;
163
164         memcpy_toio(dst, src, PAGE_SIZE);
165
166         kunmap_atomic(src);
167
168         return 0;
169 }
170
171 int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
172                        struct ttm_operation_ctx *ctx,
173                        struct ttm_resource *new_mem)
174 {
175         struct ttm_bo_device *bdev = bo->bdev;
176         struct ttm_resource_manager *man = ttm_manager_type(bdev, new_mem->mem_type);
177         struct ttm_tt *ttm = bo->ttm;
178         struct ttm_resource *old_mem = &bo->mem;
179         struct ttm_resource old_copy = *old_mem;
180         void *old_iomap;
181         void *new_iomap;
182         int ret;
183         unsigned long i;
184
185         ret = ttm_bo_wait_ctx(bo, ctx);
186         if (ret)
187                 return ret;
188
189         ret = ttm_resource_ioremap(bdev, old_mem, &old_iomap);
190         if (ret)
191                 return ret;
192         ret = ttm_resource_ioremap(bdev, new_mem, &new_iomap);
193         if (ret)
194                 goto out;
195
196         /*
197          * Single TTM move. NOP.
198          */
199         if (old_iomap == NULL && new_iomap == NULL)
200                 goto out2;
201
202         /*
203          * Don't move nonexistent data. Clear destination instead.
204          */
205         if (old_iomap == NULL &&
206             (ttm == NULL || (!ttm_tt_is_populated(ttm) &&
207                              !(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)))) {
208                 memset_io(new_iomap, 0, new_mem->num_pages*PAGE_SIZE);
209                 goto out2;
210         }
211
212         /*
213          * TTM might be null for moves within the same region.
214          */
215         if (ttm) {
216                 ret = ttm_tt_populate(bdev, ttm, ctx);
217                 if (ret)
218                         goto out1;
219         }
220
221         for (i = 0; i < new_mem->num_pages; ++i) {
222                 if (old_iomap == NULL) {
223                         pgprot_t prot = ttm_io_prot(bo, old_mem, PAGE_KERNEL);
224                         ret = ttm_copy_ttm_io_page(ttm, new_iomap, i,
225                                                    prot);
226                 } else if (new_iomap == NULL) {
227                         pgprot_t prot = ttm_io_prot(bo, new_mem, PAGE_KERNEL);
228                         ret = ttm_copy_io_ttm_page(ttm, old_iomap, i,
229                                                    prot);
230                 } else {
231                         ret = ttm_copy_io_page(new_iomap, old_iomap, i);
232                 }
233                 if (ret)
234                         goto out1;
235         }
236         mb();
237 out2:
238         old_copy = *old_mem;
239
240         ttm_bo_assign_mem(bo, new_mem);
241
242         if (!man->use_tt)
243                 ttm_bo_tt_destroy(bo);
244
245 out1:
246         ttm_resource_iounmap(bdev, old_mem, new_iomap);
247 out:
248         ttm_resource_iounmap(bdev, &old_copy, old_iomap);
249
250         /*
251          * On error, keep the mm node!
252          */
253         if (!ret)
254                 ttm_resource_free(bo, &old_copy);
255         return ret;
256 }
257 EXPORT_SYMBOL(ttm_bo_move_memcpy);
258
259 static void ttm_transfered_destroy(struct ttm_buffer_object *bo)
260 {
261         struct ttm_transfer_obj *fbo;
262
263         fbo = container_of(bo, struct ttm_transfer_obj, base);
264         ttm_bo_put(fbo->bo);
265         kfree(fbo);
266 }
267
268 /**
269  * ttm_buffer_object_transfer
270  *
271  * @bo: A pointer to a struct ttm_buffer_object.
272  * @new_obj: A pointer to a pointer to a newly created ttm_buffer_object,
273  * holding the data of @bo with the old placement.
274  *
275  * This is a utility function that may be called after an accelerated move
276  * has been scheduled. A new buffer object is created as a placeholder for
277  * the old data while it's being copied. When that buffer object is idle,
278  * it can be destroyed, releasing the space of the old placement.
279  * Returns:
280  * !0: Failure.
281  */
282
283 static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
284                                       struct ttm_buffer_object **new_obj)
285 {
286         struct ttm_transfer_obj *fbo;
287         int ret;
288
289         fbo = kmalloc(sizeof(*fbo), GFP_KERNEL);
290         if (!fbo)
291                 return -ENOMEM;
292
293         fbo->base = *bo;
294
295         ttm_bo_get(bo);
296         fbo->bo = bo;
297
298         /**
299          * Fix up members that we shouldn't copy directly:
300          * TODO: Explicit member copy would probably be better here.
301          */
302
303         atomic_inc(&ttm_bo_glob.bo_count);
304         INIT_LIST_HEAD(&fbo->base.ddestroy);
305         INIT_LIST_HEAD(&fbo->base.lru);
306         INIT_LIST_HEAD(&fbo->base.swap);
307         fbo->base.moving = NULL;
308         drm_vma_node_reset(&fbo->base.base.vma_node);
309
310         kref_init(&fbo->base.kref);
311         fbo->base.destroy = &ttm_transfered_destroy;
312         fbo->base.acc_size = 0;
313         fbo->base.pin_count = 1;
314         if (bo->type != ttm_bo_type_sg)
315                 fbo->base.base.resv = &fbo->base.base._resv;
316
317         dma_resv_init(&fbo->base.base._resv);
318         fbo->base.base.dev = NULL;
319         ret = dma_resv_trylock(&fbo->base.base._resv);
320         WARN_ON(!ret);
321
322         *new_obj = &fbo->base;
323         return 0;
324 }
325
326 pgprot_t ttm_io_prot(struct ttm_buffer_object *bo, struct ttm_resource *res,
327                      pgprot_t tmp)
328 {
329         struct ttm_resource_manager *man;
330         enum ttm_caching caching;
331
332         man = ttm_manager_type(bo->bdev, res->mem_type);
333         caching = man->use_tt ? bo->ttm->caching : res->bus.caching;
334
335         /* Cached mappings need no adjustment */
336         if (caching == ttm_cached)
337                 return tmp;
338
339 #if defined(__i386__) || defined(__x86_64__)
340         if (caching == ttm_write_combined)
341                 tmp = pgprot_writecombine(tmp);
342         else if (boot_cpu_data.x86 > 3)
343                 tmp = pgprot_noncached(tmp);
344 #endif
345 #if defined(__ia64__) || defined(__arm__) || defined(__aarch64__) || \
346     defined(__powerpc__) || defined(__mips__)
347         if (caching == ttm_write_combined)
348                 tmp = pgprot_writecombine(tmp);
349         else
350                 tmp = pgprot_noncached(tmp);
351 #endif
352 #if defined(__sparc__)
353         tmp = pgprot_noncached(tmp);
354 #endif
355         return tmp;
356 }
357 EXPORT_SYMBOL(ttm_io_prot);
358
359 static int ttm_bo_ioremap(struct ttm_buffer_object *bo,
360                           unsigned long offset,
361                           unsigned long size,
362                           struct ttm_bo_kmap_obj *map)
363 {
364         struct ttm_resource *mem = &bo->mem;
365
366         if (bo->mem.bus.addr) {
367                 map->bo_kmap_type = ttm_bo_map_premapped;
368                 map->virtual = (void *)(((u8 *)bo->mem.bus.addr) + offset);
369         } else {
370                 map->bo_kmap_type = ttm_bo_map_iomap;
371                 if (mem->bus.caching == ttm_write_combined)
372                         map->virtual = ioremap_wc(bo->mem.bus.offset + offset,
373                                                   size);
374                 else
375                         map->virtual = ioremap(bo->mem.bus.offset + offset,
376                                                size);
377         }
378         return (!map->virtual) ? -ENOMEM : 0;
379 }
380
381 static int ttm_bo_kmap_ttm(struct ttm_buffer_object *bo,
382                            unsigned long start_page,
383                            unsigned long num_pages,
384                            struct ttm_bo_kmap_obj *map)
385 {
386         struct ttm_resource *mem = &bo->mem;
387         struct ttm_operation_ctx ctx = {
388                 .interruptible = false,
389                 .no_wait_gpu = false
390         };
391         struct ttm_tt *ttm = bo->ttm;
392         pgprot_t prot;
393         int ret;
394
395         BUG_ON(!ttm);
396
397         ret = ttm_tt_populate(bo->bdev, ttm, &ctx);
398         if (ret)
399                 return ret;
400
401         if (num_pages == 1 && ttm->caching == ttm_cached) {
402                 /*
403                  * We're mapping a single page, and the desired
404                  * page protection is consistent with the bo.
405                  */
406
407                 map->bo_kmap_type = ttm_bo_map_kmap;
408                 map->page = ttm->pages[start_page];
409                 map->virtual = kmap(map->page);
410         } else {
411                 /*
412                  * We need to use vmap to get the desired page protection
413                  * or to make the buffer object look contiguous.
414                  */
415                 prot = ttm_io_prot(bo, mem, PAGE_KERNEL);
416                 map->bo_kmap_type = ttm_bo_map_vmap;
417                 map->virtual = vmap(ttm->pages + start_page, num_pages,
418                                     0, prot);
419         }
420         return (!map->virtual) ? -ENOMEM : 0;
421 }
422
423 int ttm_bo_kmap(struct ttm_buffer_object *bo,
424                 unsigned long start_page, unsigned long num_pages,
425                 struct ttm_bo_kmap_obj *map)
426 {
427         unsigned long offset, size;
428         int ret;
429
430         map->virtual = NULL;
431         map->bo = bo;
432         if (num_pages > bo->num_pages)
433                 return -EINVAL;
434         if (start_page > bo->num_pages)
435                 return -EINVAL;
436
437         ret = ttm_mem_io_reserve(bo->bdev, &bo->mem);
438         if (ret)
439                 return ret;
440         if (!bo->mem.bus.is_iomem) {
441                 return ttm_bo_kmap_ttm(bo, start_page, num_pages, map);
442         } else {
443                 offset = start_page << PAGE_SHIFT;
444                 size = num_pages << PAGE_SHIFT;
445                 return ttm_bo_ioremap(bo, offset, size, map);
446         }
447 }
448 EXPORT_SYMBOL(ttm_bo_kmap);
449
450 void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map)
451 {
452         if (!map->virtual)
453                 return;
454         switch (map->bo_kmap_type) {
455         case ttm_bo_map_iomap:
456                 iounmap(map->virtual);
457                 break;
458         case ttm_bo_map_vmap:
459                 vunmap(map->virtual);
460                 break;
461         case ttm_bo_map_kmap:
462                 kunmap(map->page);
463                 break;
464         case ttm_bo_map_premapped:
465                 break;
466         default:
467                 BUG();
468         }
469         ttm_mem_io_free(map->bo->bdev, &map->bo->mem);
470         map->virtual = NULL;
471         map->page = NULL;
472 }
473 EXPORT_SYMBOL(ttm_bo_kunmap);
474
475 int ttm_bo_vmap(struct ttm_buffer_object *bo, struct dma_buf_map *map)
476 {
477         struct ttm_resource *mem = &bo->mem;
478         int ret;
479
480         ret = ttm_mem_io_reserve(bo->bdev, mem);
481         if (ret)
482                 return ret;
483
484         if (mem->bus.is_iomem) {
485                 void __iomem *vaddr_iomem;
486                 size_t size = bo->num_pages << PAGE_SHIFT;
487
488                 if (mem->bus.addr)
489                         vaddr_iomem = (void __iomem *)mem->bus.addr;
490                 else if (mem->bus.caching == ttm_write_combined)
491                         vaddr_iomem = ioremap_wc(mem->bus.offset, size);
492                 else
493                         vaddr_iomem = ioremap(mem->bus.offset, size);
494
495                 if (!vaddr_iomem)
496                         return -ENOMEM;
497
498                 dma_buf_map_set_vaddr_iomem(map, vaddr_iomem);
499
500         } else {
501                 struct ttm_operation_ctx ctx = {
502                         .interruptible = false,
503                         .no_wait_gpu = false
504                 };
505                 struct ttm_tt *ttm = bo->ttm;
506                 pgprot_t prot;
507                 void *vaddr;
508
509                 ret = ttm_tt_populate(bo->bdev, ttm, &ctx);
510                 if (ret)
511                         return ret;
512
513                 /*
514                  * We need to use vmap to get the desired page protection
515                  * or to make the buffer object look contiguous.
516                  */
517                 prot = ttm_io_prot(bo, mem, PAGE_KERNEL);
518                 vaddr = vmap(ttm->pages, bo->num_pages, 0, prot);
519                 if (!vaddr)
520                         return -ENOMEM;
521
522                 dma_buf_map_set_vaddr(map, vaddr);
523         }
524
525         return 0;
526 }
527 EXPORT_SYMBOL(ttm_bo_vmap);
528
529 void ttm_bo_vunmap(struct ttm_buffer_object *bo, struct dma_buf_map *map)
530 {
531         struct ttm_resource *mem = &bo->mem;
532
533         if (dma_buf_map_is_null(map))
534                 return;
535
536         if (!map->is_iomem)
537                 vunmap(map->vaddr);
538         else if (!mem->bus.addr)
539                 iounmap(map->vaddr_iomem);
540         dma_buf_map_clear(map);
541
542         ttm_mem_io_free(bo->bdev, &bo->mem);
543 }
544 EXPORT_SYMBOL(ttm_bo_vunmap);
545
546 static int ttm_bo_wait_free_node(struct ttm_buffer_object *bo,
547                                  bool dst_use_tt)
548 {
549         int ret;
550         ret = ttm_bo_wait(bo, false, false);
551         if (ret)
552                 return ret;
553
554         if (!dst_use_tt)
555                 ttm_bo_tt_destroy(bo);
556         ttm_resource_free(bo, &bo->mem);
557         return 0;
558 }
559
560 static int ttm_bo_move_to_ghost(struct ttm_buffer_object *bo,
561                                 struct dma_fence *fence,
562                                 bool dst_use_tt)
563 {
564         struct ttm_buffer_object *ghost_obj;
565         int ret;
566
567         /**
568          * This should help pipeline ordinary buffer moves.
569          *
570          * Hang old buffer memory on a new buffer object,
571          * and leave it to be released when the GPU
572          * operation has completed.
573          */
574
575         dma_fence_put(bo->moving);
576         bo->moving = dma_fence_get(fence);
577
578         ret = ttm_buffer_object_transfer(bo, &ghost_obj);
579         if (ret)
580                 return ret;
581
582         dma_resv_add_excl_fence(&ghost_obj->base._resv, fence);
583
584         /**
585          * If we're not moving to fixed memory, the TTM object
586          * needs to stay alive. Otherwhise hang it on the ghost
587          * bo to be unbound and destroyed.
588          */
589
590         if (dst_use_tt)
591                 ghost_obj->ttm = NULL;
592         else
593                 bo->ttm = NULL;
594
595         dma_resv_unlock(&ghost_obj->base._resv);
596         ttm_bo_put(ghost_obj);
597         return 0;
598 }
599
600 static void ttm_bo_move_pipeline_evict(struct ttm_buffer_object *bo,
601                                        struct dma_fence *fence)
602 {
603         struct ttm_bo_device *bdev = bo->bdev;
604         struct ttm_resource_manager *from = ttm_manager_type(bdev, bo->mem.mem_type);
605
606         /**
607          * BO doesn't have a TTM we need to bind/unbind. Just remember
608          * this eviction and free up the allocation
609          */
610         spin_lock(&from->move_lock);
611         if (!from->move || dma_fence_is_later(fence, from->move)) {
612                 dma_fence_put(from->move);
613                 from->move = dma_fence_get(fence);
614         }
615         spin_unlock(&from->move_lock);
616
617         ttm_resource_free(bo, &bo->mem);
618
619         dma_fence_put(bo->moving);
620         bo->moving = dma_fence_get(fence);
621 }
622
623 int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
624                               struct dma_fence *fence,
625                               bool evict,
626                               bool pipeline,
627                               struct ttm_resource *new_mem)
628 {
629         struct ttm_bo_device *bdev = bo->bdev;
630         struct ttm_resource_manager *from = ttm_manager_type(bdev, bo->mem.mem_type);
631         struct ttm_resource_manager *man = ttm_manager_type(bdev, new_mem->mem_type);
632         int ret = 0;
633
634         dma_resv_add_excl_fence(bo->base.resv, fence);
635         if (!evict)
636                 ret = ttm_bo_move_to_ghost(bo, fence, man->use_tt);
637         else if (!from->use_tt && pipeline)
638                 ttm_bo_move_pipeline_evict(bo, fence);
639         else
640                 ret = ttm_bo_wait_free_node(bo, man->use_tt);
641
642         if (ret)
643                 return ret;
644
645         ttm_bo_assign_mem(bo, new_mem);
646
647         return 0;
648 }
649 EXPORT_SYMBOL(ttm_bo_move_accel_cleanup);
650
651 int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
652 {
653         struct ttm_buffer_object *ghost;
654         int ret;
655
656         ret = ttm_buffer_object_transfer(bo, &ghost);
657         if (ret)
658                 return ret;
659
660         ret = dma_resv_copy_fences(&ghost->base._resv, bo->base.resv);
661         /* Last resort, wait for the BO to be idle when we are OOM */
662         if (ret)
663                 ttm_bo_wait(bo, false, false);
664
665         memset(&bo->mem, 0, sizeof(bo->mem));
666         bo->mem.mem_type = TTM_PL_SYSTEM;
667         bo->ttm = NULL;
668
669         dma_resv_unlock(&ghost->base._resv);
670         ttm_bo_put(ghost);
671
672         return 0;
673 }