GNU Linux-libre 4.14.265-gnu1
[releases.git] / drivers / gpu / drm / nouveau / nouveau_bo.c
1 /*
2  * Copyright 2007 Dave Airlied
3  * All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22  * OTHER DEALINGS IN THE SOFTWARE.
23  */
24 /*
25  * Authors: Dave Airlied <airlied@linux.ie>
26  *          Ben Skeggs   <darktama@iinet.net.au>
27  *          Jeremy Kolb  <jkolb@brandeis.edu>
28  */
29
30 #include <linux/dma-mapping.h>
31 #include <linux/swiotlb.h>
32
33 #include "nouveau_drv.h"
34 #include "nouveau_dma.h"
35 #include "nouveau_fence.h"
36
37 #include "nouveau_bo.h"
38 #include "nouveau_ttm.h"
39 #include "nouveau_gem.h"
40
41 /*
42  * NV10-NV40 tiling helpers
43  */
44
45 static void
46 nv10_bo_update_tile_region(struct drm_device *dev, struct nouveau_drm_tile *reg,
47                            u32 addr, u32 size, u32 pitch, u32 flags)
48 {
49         struct nouveau_drm *drm = nouveau_drm(dev);
50         int i = reg - drm->tile.reg;
51         struct nvkm_device *device = nvxx_device(&drm->client.device);
52         struct nvkm_fb *fb = device->fb;
53         struct nvkm_fb_tile *tile = &fb->tile.region[i];
54
55         nouveau_fence_unref(&reg->fence);
56
57         if (tile->pitch)
58                 nvkm_fb_tile_fini(fb, i, tile);
59
60         if (pitch)
61                 nvkm_fb_tile_init(fb, i, addr, size, pitch, flags, tile);
62
63         nvkm_fb_tile_prog(fb, i, tile);
64 }
65
66 static struct nouveau_drm_tile *
67 nv10_bo_get_tile_region(struct drm_device *dev, int i)
68 {
69         struct nouveau_drm *drm = nouveau_drm(dev);
70         struct nouveau_drm_tile *tile = &drm->tile.reg[i];
71
72         spin_lock(&drm->tile.lock);
73
74         if (!tile->used &&
75             (!tile->fence || nouveau_fence_done(tile->fence)))
76                 tile->used = true;
77         else
78                 tile = NULL;
79
80         spin_unlock(&drm->tile.lock);
81         return tile;
82 }
83
84 static void
85 nv10_bo_put_tile_region(struct drm_device *dev, struct nouveau_drm_tile *tile,
86                         struct dma_fence *fence)
87 {
88         struct nouveau_drm *drm = nouveau_drm(dev);
89
90         if (tile) {
91                 spin_lock(&drm->tile.lock);
92                 tile->fence = (struct nouveau_fence *)dma_fence_get(fence);
93                 tile->used = false;
94                 spin_unlock(&drm->tile.lock);
95         }
96 }
97
98 static struct nouveau_drm_tile *
99 nv10_bo_set_tiling(struct drm_device *dev, u32 addr,
100                    u32 size, u32 pitch, u32 flags)
101 {
102         struct nouveau_drm *drm = nouveau_drm(dev);
103         struct nvkm_fb *fb = nvxx_fb(&drm->client.device);
104         struct nouveau_drm_tile *tile, *found = NULL;
105         int i;
106
107         for (i = 0; i < fb->tile.regions; i++) {
108                 tile = nv10_bo_get_tile_region(dev, i);
109
110                 if (pitch && !found) {
111                         found = tile;
112                         continue;
113
114                 } else if (tile && fb->tile.region[i].pitch) {
115                         /* Kill an unused tile region. */
116                         nv10_bo_update_tile_region(dev, tile, 0, 0, 0, 0);
117                 }
118
119                 nv10_bo_put_tile_region(dev, tile, NULL);
120         }
121
122         if (found)
123                 nv10_bo_update_tile_region(dev, found, addr, size,
124                                             pitch, flags);
125         return found;
126 }
127
128 static void
129 nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
130 {
131         struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
132         struct drm_device *dev = drm->dev;
133         struct nouveau_bo *nvbo = nouveau_bo(bo);
134
135         if (unlikely(nvbo->gem.filp))
136                 DRM_ERROR("bo %p still attached to GEM object\n", bo);
137         WARN_ON(nvbo->pin_refcnt > 0);
138         nv10_bo_put_tile_region(dev, nvbo->tile, NULL);
139         kfree(nvbo);
140 }
141
142 static inline u64
143 roundup_64(u64 x, u32 y)
144 {
145         x += y - 1;
146         do_div(x, y);
147         return x * y;
148 }
149
150 static void
151 nouveau_bo_fixup_align(struct nouveau_bo *nvbo, u32 flags,
152                        int *align, u64 *size)
153 {
154         struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
155         struct nvif_device *device = &drm->client.device;
156
157         if (device->info.family < NV_DEVICE_INFO_V0_TESLA) {
158                 if (nvbo->tile_mode) {
159                         if (device->info.chipset >= 0x40) {
160                                 *align = 65536;
161                                 *size = roundup_64(*size, 64 * nvbo->tile_mode);
162
163                         } else if (device->info.chipset >= 0x30) {
164                                 *align = 32768;
165                                 *size = roundup_64(*size, 64 * nvbo->tile_mode);
166
167                         } else if (device->info.chipset >= 0x20) {
168                                 *align = 16384;
169                                 *size = roundup_64(*size, 64 * nvbo->tile_mode);
170
171                         } else if (device->info.chipset >= 0x10) {
172                                 *align = 16384;
173                                 *size = roundup_64(*size, 32 * nvbo->tile_mode);
174                         }
175                 }
176         } else {
177                 *size = roundup_64(*size, (1 << nvbo->page_shift));
178                 *align = max((1 <<  nvbo->page_shift), *align);
179         }
180
181         *size = roundup_64(*size, PAGE_SIZE);
182 }
183
184 int
185 nouveau_bo_new(struct nouveau_cli *cli, u64 size, int align,
186                uint32_t flags, uint32_t tile_mode, uint32_t tile_flags,
187                struct sg_table *sg, struct reservation_object *robj,
188                struct nouveau_bo **pnvbo)
189 {
190         struct nouveau_drm *drm = nouveau_drm(cli->dev);
191         struct nouveau_bo *nvbo;
192         size_t acc_size;
193         int ret;
194         int type = ttm_bo_type_device;
195
196         if (!size) {
197                 NV_WARN(drm, "skipped size %016llx\n", size);
198                 return -EINVAL;
199         }
200
201         if (sg)
202                 type = ttm_bo_type_sg;
203
204         nvbo = kzalloc(sizeof(struct nouveau_bo), GFP_KERNEL);
205         if (!nvbo)
206                 return -ENOMEM;
207         INIT_LIST_HEAD(&nvbo->head);
208         INIT_LIST_HEAD(&nvbo->entry);
209         INIT_LIST_HEAD(&nvbo->vma_list);
210         nvbo->tile_mode = tile_mode;
211         nvbo->tile_flags = tile_flags;
212         nvbo->bo.bdev = &drm->ttm.bdev;
213         nvbo->cli = cli;
214
215         if (!nvxx_device(&drm->client.device)->func->cpu_coherent)
216                 nvbo->force_coherent = flags & TTM_PL_FLAG_UNCACHED;
217
218         nvbo->page_shift = 12;
219         if (drm->client.vm) {
220                 if (!(flags & TTM_PL_FLAG_TT) && size > 256 * 1024)
221                         nvbo->page_shift = drm->client.vm->mmu->lpg_shift;
222         }
223
224         nouveau_bo_fixup_align(nvbo, flags, &align, &size);
225         nvbo->bo.mem.num_pages = size >> PAGE_SHIFT;
226         nouveau_bo_placement_set(nvbo, flags, 0);
227
228         acc_size = ttm_bo_dma_acc_size(&drm->ttm.bdev, size,
229                                        sizeof(struct nouveau_bo));
230
231         ret = ttm_bo_init(&drm->ttm.bdev, &nvbo->bo, size,
232                           type, &nvbo->placement,
233                           align >> PAGE_SHIFT, false, NULL, acc_size, sg,
234                           robj, nouveau_bo_del_ttm);
235         if (ret) {
236                 /* ttm will call nouveau_bo_del_ttm if it fails.. */
237                 return ret;
238         }
239
240         *pnvbo = nvbo;
241         return 0;
242 }
243
244 static void
245 set_placement_list(struct ttm_place *pl, unsigned *n, uint32_t type, uint32_t flags)
246 {
247         *n = 0;
248
249         if (type & TTM_PL_FLAG_VRAM)
250                 pl[(*n)++].flags = TTM_PL_FLAG_VRAM | flags;
251         if (type & TTM_PL_FLAG_TT)
252                 pl[(*n)++].flags = TTM_PL_FLAG_TT | flags;
253         if (type & TTM_PL_FLAG_SYSTEM)
254                 pl[(*n)++].flags = TTM_PL_FLAG_SYSTEM | flags;
255 }
256
257 static void
258 set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
259 {
260         struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
261         u32 vram_pages = drm->client.device.info.ram_size >> PAGE_SHIFT;
262         unsigned i, fpfn, lpfn;
263
264         if (drm->client.device.info.family == NV_DEVICE_INFO_V0_CELSIUS &&
265             nvbo->tile_mode && (type & TTM_PL_FLAG_VRAM) &&
266             nvbo->bo.mem.num_pages < vram_pages / 4) {
267                 /*
268                  * Make sure that the color and depth buffers are handled
269                  * by independent memory controller units. Up to a 9x
270                  * speed up when alpha-blending and depth-test are enabled
271                  * at the same time.
272                  */
273                 if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) {
274                         fpfn = vram_pages / 2;
275                         lpfn = ~0;
276                 } else {
277                         fpfn = 0;
278                         lpfn = vram_pages / 2;
279                 }
280                 for (i = 0; i < nvbo->placement.num_placement; ++i) {
281                         nvbo->placements[i].fpfn = fpfn;
282                         nvbo->placements[i].lpfn = lpfn;
283                 }
284                 for (i = 0; i < nvbo->placement.num_busy_placement; ++i) {
285                         nvbo->busy_placements[i].fpfn = fpfn;
286                         nvbo->busy_placements[i].lpfn = lpfn;
287                 }
288         }
289 }
290
291 void
292 nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t type, uint32_t busy)
293 {
294         struct ttm_placement *pl = &nvbo->placement;
295         uint32_t flags = (nvbo->force_coherent ? TTM_PL_FLAG_UNCACHED :
296                                                  TTM_PL_MASK_CACHING) |
297                          (nvbo->pin_refcnt ? TTM_PL_FLAG_NO_EVICT : 0);
298
299         pl->placement = nvbo->placements;
300         set_placement_list(nvbo->placements, &pl->num_placement,
301                            type, flags);
302
303         pl->busy_placement = nvbo->busy_placements;
304         set_placement_list(nvbo->busy_placements, &pl->num_busy_placement,
305                            type | busy, flags);
306
307         set_placement_range(nvbo, type);
308 }
309
310 int
311 nouveau_bo_pin(struct nouveau_bo *nvbo, uint32_t memtype, bool contig)
312 {
313         struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
314         struct ttm_buffer_object *bo = &nvbo->bo;
315         bool force = false, evict = false;
316         int ret;
317
318         ret = ttm_bo_reserve(bo, false, false, NULL);
319         if (ret)
320                 return ret;
321
322         if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA &&
323             memtype == TTM_PL_FLAG_VRAM && contig) {
324                 if (nvbo->tile_flags & NOUVEAU_GEM_TILE_NONCONTIG) {
325                         if (bo->mem.mem_type == TTM_PL_VRAM) {
326                                 struct nvkm_mem *mem = bo->mem.mm_node;
327                                 if (!nvkm_mm_contiguous(mem->mem))
328                                         evict = true;
329                         }
330                         nvbo->tile_flags &= ~NOUVEAU_GEM_TILE_NONCONTIG;
331                         force = true;
332                 }
333         }
334
335         if (nvbo->pin_refcnt) {
336                 if (!(memtype & (1 << bo->mem.mem_type)) || evict) {
337                         NV_ERROR(drm, "bo %p pinned elsewhere: "
338                                       "0x%08x vs 0x%08x\n", bo,
339                                  1 << bo->mem.mem_type, memtype);
340                         ret = -EBUSY;
341                 }
342                 nvbo->pin_refcnt++;
343                 goto out;
344         }
345
346         if (evict) {
347                 nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_TT, 0);
348                 ret = nouveau_bo_validate(nvbo, false, false);
349                 if (ret)
350                         goto out;
351         }
352
353         nvbo->pin_refcnt++;
354         nouveau_bo_placement_set(nvbo, memtype, 0);
355
356         /* drop pin_refcnt temporarily, so we don't trip the assertion
357          * in nouveau_bo_move() that makes sure we're not trying to
358          * move a pinned buffer
359          */
360         nvbo->pin_refcnt--;
361         ret = nouveau_bo_validate(nvbo, false, false);
362         if (ret)
363                 goto out;
364         nvbo->pin_refcnt++;
365
366         switch (bo->mem.mem_type) {
367         case TTM_PL_VRAM:
368                 drm->gem.vram_available -= bo->mem.size;
369                 break;
370         case TTM_PL_TT:
371                 drm->gem.gart_available -= bo->mem.size;
372                 break;
373         default:
374                 break;
375         }
376
377 out:
378         if (force && ret)
379                 nvbo->tile_flags |= NOUVEAU_GEM_TILE_NONCONTIG;
380         ttm_bo_unreserve(bo);
381         return ret;
382 }
383
384 int
385 nouveau_bo_unpin(struct nouveau_bo *nvbo)
386 {
387         struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
388         struct ttm_buffer_object *bo = &nvbo->bo;
389         int ret, ref;
390
391         ret = ttm_bo_reserve(bo, false, false, NULL);
392         if (ret)
393                 return ret;
394
395         ref = --nvbo->pin_refcnt;
396         WARN_ON_ONCE(ref < 0);
397         if (ref)
398                 goto out;
399
400         nouveau_bo_placement_set(nvbo, bo->mem.placement, 0);
401
402         ret = nouveau_bo_validate(nvbo, false, false);
403         if (ret == 0) {
404                 switch (bo->mem.mem_type) {
405                 case TTM_PL_VRAM:
406                         drm->gem.vram_available += bo->mem.size;
407                         break;
408                 case TTM_PL_TT:
409                         drm->gem.gart_available += bo->mem.size;
410                         break;
411                 default:
412                         break;
413                 }
414         }
415
416 out:
417         ttm_bo_unreserve(bo);
418         return ret;
419 }
420
421 int
422 nouveau_bo_map(struct nouveau_bo *nvbo)
423 {
424         int ret;
425
426         ret = ttm_bo_reserve(&nvbo->bo, false, false, NULL);
427         if (ret)
428                 return ret;
429
430         ret = ttm_bo_kmap(&nvbo->bo, 0, nvbo->bo.mem.num_pages, &nvbo->kmap);
431
432         ttm_bo_unreserve(&nvbo->bo);
433         return ret;
434 }
435
436 void
437 nouveau_bo_unmap(struct nouveau_bo *nvbo)
438 {
439         if (!nvbo)
440                 return;
441
442         ttm_bo_kunmap(&nvbo->kmap);
443 }
444
445 void
446 nouveau_bo_sync_for_device(struct nouveau_bo *nvbo)
447 {
448         struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
449         struct nvkm_device *device = nvxx_device(&drm->client.device);
450         struct ttm_dma_tt *ttm_dma = (struct ttm_dma_tt *)nvbo->bo.ttm;
451         int i;
452
453         if (!ttm_dma || !ttm_dma->dma_address)
454                 return;
455
456         /* Don't waste time looping if the object is coherent */
457         if (nvbo->force_coherent)
458                 return;
459
460         for (i = 0; i < ttm_dma->ttm.num_pages; i++)
461                 dma_sync_single_for_device(device->dev, ttm_dma->dma_address[i],
462                                            PAGE_SIZE, DMA_TO_DEVICE);
463 }
464
465 void
466 nouveau_bo_sync_for_cpu(struct nouveau_bo *nvbo)
467 {
468         struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
469         struct nvkm_device *device = nvxx_device(&drm->client.device);
470         struct ttm_dma_tt *ttm_dma = (struct ttm_dma_tt *)nvbo->bo.ttm;
471         int i;
472
473         if (!ttm_dma || !ttm_dma->dma_address)
474                 return;
475
476         /* Don't waste time looping if the object is coherent */
477         if (nvbo->force_coherent)
478                 return;
479
480         for (i = 0; i < ttm_dma->ttm.num_pages; i++)
481                 dma_sync_single_for_cpu(device->dev, ttm_dma->dma_address[i],
482                                         PAGE_SIZE, DMA_FROM_DEVICE);
483 }
484
485 int
486 nouveau_bo_validate(struct nouveau_bo *nvbo, bool interruptible,
487                     bool no_wait_gpu)
488 {
489         int ret;
490
491         ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement,
492                               interruptible, no_wait_gpu);
493         if (ret)
494                 return ret;
495
496         nouveau_bo_sync_for_device(nvbo);
497
498         return 0;
499 }
500
501 void
502 nouveau_bo_wr16(struct nouveau_bo *nvbo, unsigned index, u16 val)
503 {
504         bool is_iomem;
505         u16 *mem = ttm_kmap_obj_virtual(&nvbo->kmap, &is_iomem);
506
507         mem += index;
508
509         if (is_iomem)
510                 iowrite16_native(val, (void __force __iomem *)mem);
511         else
512                 *mem = val;
513 }
514
515 u32
516 nouveau_bo_rd32(struct nouveau_bo *nvbo, unsigned index)
517 {
518         bool is_iomem;
519         u32 *mem = ttm_kmap_obj_virtual(&nvbo->kmap, &is_iomem);
520
521         mem += index;
522
523         if (is_iomem)
524                 return ioread32_native((void __force __iomem *)mem);
525         else
526                 return *mem;
527 }
528
529 void
530 nouveau_bo_wr32(struct nouveau_bo *nvbo, unsigned index, u32 val)
531 {
532         bool is_iomem;
533         u32 *mem = ttm_kmap_obj_virtual(&nvbo->kmap, &is_iomem);
534
535         mem += index;
536
537         if (is_iomem)
538                 iowrite32_native(val, (void __force __iomem *)mem);
539         else
540                 *mem = val;
541 }
542
543 static struct ttm_tt *
544 nouveau_ttm_tt_create(struct ttm_bo_device *bdev, unsigned long size,
545                       uint32_t page_flags, struct page *dummy_read)
546 {
547 #if IS_ENABLED(CONFIG_AGP)
548         struct nouveau_drm *drm = nouveau_bdev(bdev);
549
550         if (drm->agp.bridge) {
551                 return ttm_agp_tt_create(bdev, drm->agp.bridge, size,
552                                          page_flags, dummy_read);
553         }
554 #endif
555
556         return nouveau_sgdma_create_ttm(bdev, size, page_flags, dummy_read);
557 }
558
559 static int
560 nouveau_bo_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
561 {
562         /* We'll do this from user space. */
563         return 0;
564 }
565
566 static int
567 nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
568                          struct ttm_mem_type_manager *man)
569 {
570         struct nouveau_drm *drm = nouveau_bdev(bdev);
571
572         switch (type) {
573         case TTM_PL_SYSTEM:
574                 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
575                 man->available_caching = TTM_PL_MASK_CACHING;
576                 man->default_caching = TTM_PL_FLAG_CACHED;
577                 break;
578         case TTM_PL_VRAM:
579                 man->flags = TTM_MEMTYPE_FLAG_FIXED |
580                              TTM_MEMTYPE_FLAG_MAPPABLE;
581                 man->available_caching = TTM_PL_FLAG_UNCACHED |
582                                          TTM_PL_FLAG_WC;
583                 man->default_caching = TTM_PL_FLAG_WC;
584
585                 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
586                         /* Some BARs do not support being ioremapped WC */
587                         if (nvxx_bar(&drm->client.device)->iomap_uncached) {
588                                 man->available_caching = TTM_PL_FLAG_UNCACHED;
589                                 man->default_caching = TTM_PL_FLAG_UNCACHED;
590                         }
591
592                         man->func = &nouveau_vram_manager;
593                         man->io_reserve_fastpath = false;
594                         man->use_io_reserve_lru = true;
595                 } else {
596                         man->func = &ttm_bo_manager_func;
597                 }
598                 break;
599         case TTM_PL_TT:
600                 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA)
601                         man->func = &nouveau_gart_manager;
602                 else
603                 if (!drm->agp.bridge)
604                         man->func = &nv04_gart_manager;
605                 else
606                         man->func = &ttm_bo_manager_func;
607
608                 if (drm->agp.bridge) {
609                         man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
610                         man->available_caching = TTM_PL_FLAG_UNCACHED |
611                                 TTM_PL_FLAG_WC;
612                         man->default_caching = TTM_PL_FLAG_WC;
613                 } else {
614                         man->flags = TTM_MEMTYPE_FLAG_MAPPABLE |
615                                      TTM_MEMTYPE_FLAG_CMA;
616                         man->available_caching = TTM_PL_MASK_CACHING;
617                         man->default_caching = TTM_PL_FLAG_CACHED;
618                 }
619
620                 break;
621         default:
622                 return -EINVAL;
623         }
624         return 0;
625 }
626
627 static void
628 nouveau_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl)
629 {
630         struct nouveau_bo *nvbo = nouveau_bo(bo);
631
632         switch (bo->mem.mem_type) {
633         case TTM_PL_VRAM:
634                 nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_TT,
635                                          TTM_PL_FLAG_SYSTEM);
636                 break;
637         default:
638                 nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_SYSTEM, 0);
639                 break;
640         }
641
642         *pl = nvbo->placement;
643 }
644
645
646 static int
647 nve0_bo_move_init(struct nouveau_channel *chan, u32 handle)
648 {
649         int ret = RING_SPACE(chan, 2);
650         if (ret == 0) {
651                 BEGIN_NVC0(chan, NvSubCopy, 0x0000, 1);
652                 OUT_RING  (chan, handle & 0x0000ffff);
653                 FIRE_RING (chan);
654         }
655         return ret;
656 }
657
658 static int
659 nve0_bo_move_copy(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
660                   struct ttm_mem_reg *old_reg, struct ttm_mem_reg *new_reg)
661 {
662         struct nvkm_mem *mem = old_reg->mm_node;
663         int ret = RING_SPACE(chan, 10);
664         if (ret == 0) {
665                 BEGIN_NVC0(chan, NvSubCopy, 0x0400, 8);
666                 OUT_RING  (chan, upper_32_bits(mem->vma[0].offset));
667                 OUT_RING  (chan, lower_32_bits(mem->vma[0].offset));
668                 OUT_RING  (chan, upper_32_bits(mem->vma[1].offset));
669                 OUT_RING  (chan, lower_32_bits(mem->vma[1].offset));
670                 OUT_RING  (chan, PAGE_SIZE);
671                 OUT_RING  (chan, PAGE_SIZE);
672                 OUT_RING  (chan, PAGE_SIZE);
673                 OUT_RING  (chan, new_reg->num_pages);
674                 BEGIN_IMC0(chan, NvSubCopy, 0x0300, 0x0386);
675         }
676         return ret;
677 }
678
679 static int
680 nvc0_bo_move_init(struct nouveau_channel *chan, u32 handle)
681 {
682         int ret = RING_SPACE(chan, 2);
683         if (ret == 0) {
684                 BEGIN_NVC0(chan, NvSubCopy, 0x0000, 1);
685                 OUT_RING  (chan, handle);
686         }
687         return ret;
688 }
689
690 static int
691 nvc0_bo_move_copy(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
692                   struct ttm_mem_reg *old_reg, struct ttm_mem_reg *new_reg)
693 {
694         struct nvkm_mem *mem = old_reg->mm_node;
695         u64 src_offset = mem->vma[0].offset;
696         u64 dst_offset = mem->vma[1].offset;
697         u32 page_count = new_reg->num_pages;
698         int ret;
699
700         page_count = new_reg->num_pages;
701         while (page_count) {
702                 int line_count = (page_count > 8191) ? 8191 : page_count;
703
704                 ret = RING_SPACE(chan, 11);
705                 if (ret)
706                         return ret;
707
708                 BEGIN_NVC0(chan, NvSubCopy, 0x030c, 8);
709                 OUT_RING  (chan, upper_32_bits(src_offset));
710                 OUT_RING  (chan, lower_32_bits(src_offset));
711                 OUT_RING  (chan, upper_32_bits(dst_offset));
712                 OUT_RING  (chan, lower_32_bits(dst_offset));
713                 OUT_RING  (chan, PAGE_SIZE);
714                 OUT_RING  (chan, PAGE_SIZE);
715                 OUT_RING  (chan, PAGE_SIZE);
716                 OUT_RING  (chan, line_count);
717                 BEGIN_NVC0(chan, NvSubCopy, 0x0300, 1);
718                 OUT_RING  (chan, 0x00000110);
719
720                 page_count -= line_count;
721                 src_offset += (PAGE_SIZE * line_count);
722                 dst_offset += (PAGE_SIZE * line_count);
723         }
724
725         return 0;
726 }
727
728 static int
729 nvc0_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
730                   struct ttm_mem_reg *old_reg, struct ttm_mem_reg *new_reg)
731 {
732         struct nvkm_mem *mem = old_reg->mm_node;
733         u64 src_offset = mem->vma[0].offset;
734         u64 dst_offset = mem->vma[1].offset;
735         u32 page_count = new_reg->num_pages;
736         int ret;
737
738         page_count = new_reg->num_pages;
739         while (page_count) {
740                 int line_count = (page_count > 2047) ? 2047 : page_count;
741
742                 ret = RING_SPACE(chan, 12);
743                 if (ret)
744                         return ret;
745
746                 BEGIN_NVC0(chan, NvSubCopy, 0x0238, 2);
747                 OUT_RING  (chan, upper_32_bits(dst_offset));
748                 OUT_RING  (chan, lower_32_bits(dst_offset));
749                 BEGIN_NVC0(chan, NvSubCopy, 0x030c, 6);
750                 OUT_RING  (chan, upper_32_bits(src_offset));
751                 OUT_RING  (chan, lower_32_bits(src_offset));
752                 OUT_RING  (chan, PAGE_SIZE); /* src_pitch */
753                 OUT_RING  (chan, PAGE_SIZE); /* dst_pitch */
754                 OUT_RING  (chan, PAGE_SIZE); /* line_length */
755                 OUT_RING  (chan, line_count);
756                 BEGIN_NVC0(chan, NvSubCopy, 0x0300, 1);
757                 OUT_RING  (chan, 0x00100110);
758
759                 page_count -= line_count;
760                 src_offset += (PAGE_SIZE * line_count);
761                 dst_offset += (PAGE_SIZE * line_count);
762         }
763
764         return 0;
765 }
766
767 static int
768 nva3_bo_move_copy(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
769                   struct ttm_mem_reg *old_reg, struct ttm_mem_reg *new_reg)
770 {
771         struct nvkm_mem *mem = old_reg->mm_node;
772         u64 src_offset = mem->vma[0].offset;
773         u64 dst_offset = mem->vma[1].offset;
774         u32 page_count = new_reg->num_pages;
775         int ret;
776
777         page_count = new_reg->num_pages;
778         while (page_count) {
779                 int line_count = (page_count > 8191) ? 8191 : page_count;
780
781                 ret = RING_SPACE(chan, 11);
782                 if (ret)
783                         return ret;
784
785                 BEGIN_NV04(chan, NvSubCopy, 0x030c, 8);
786                 OUT_RING  (chan, upper_32_bits(src_offset));
787                 OUT_RING  (chan, lower_32_bits(src_offset));
788                 OUT_RING  (chan, upper_32_bits(dst_offset));
789                 OUT_RING  (chan, lower_32_bits(dst_offset));
790                 OUT_RING  (chan, PAGE_SIZE);
791                 OUT_RING  (chan, PAGE_SIZE);
792                 OUT_RING  (chan, PAGE_SIZE);
793                 OUT_RING  (chan, line_count);
794                 BEGIN_NV04(chan, NvSubCopy, 0x0300, 1);
795                 OUT_RING  (chan, 0x00000110);
796
797                 page_count -= line_count;
798                 src_offset += (PAGE_SIZE * line_count);
799                 dst_offset += (PAGE_SIZE * line_count);
800         }
801
802         return 0;
803 }
804
805 static int
806 nv98_bo_move_exec(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
807                   struct ttm_mem_reg *old_reg, struct ttm_mem_reg *new_reg)
808 {
809         struct nvkm_mem *mem = old_reg->mm_node;
810         int ret = RING_SPACE(chan, 7);
811         if (ret == 0) {
812                 BEGIN_NV04(chan, NvSubCopy, 0x0320, 6);
813                 OUT_RING  (chan, upper_32_bits(mem->vma[0].offset));
814                 OUT_RING  (chan, lower_32_bits(mem->vma[0].offset));
815                 OUT_RING  (chan, upper_32_bits(mem->vma[1].offset));
816                 OUT_RING  (chan, lower_32_bits(mem->vma[1].offset));
817                 OUT_RING  (chan, 0x00000000 /* COPY */);
818                 OUT_RING  (chan, new_reg->num_pages << PAGE_SHIFT);
819         }
820         return ret;
821 }
822
823 static int
824 nv84_bo_move_exec(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
825                   struct ttm_mem_reg *old_reg, struct ttm_mem_reg *new_reg)
826 {
827         struct nvkm_mem *mem = old_reg->mm_node;
828         int ret = RING_SPACE(chan, 7);
829         if (ret == 0) {
830                 BEGIN_NV04(chan, NvSubCopy, 0x0304, 6);
831                 OUT_RING  (chan, new_reg->num_pages << PAGE_SHIFT);
832                 OUT_RING  (chan, upper_32_bits(mem->vma[0].offset));
833                 OUT_RING  (chan, lower_32_bits(mem->vma[0].offset));
834                 OUT_RING  (chan, upper_32_bits(mem->vma[1].offset));
835                 OUT_RING  (chan, lower_32_bits(mem->vma[1].offset));
836                 OUT_RING  (chan, 0x00000000 /* MODE_COPY, QUERY_NONE */);
837         }
838         return ret;
839 }
840
841 static int
842 nv50_bo_move_init(struct nouveau_channel *chan, u32 handle)
843 {
844         int ret = RING_SPACE(chan, 6);
845         if (ret == 0) {
846                 BEGIN_NV04(chan, NvSubCopy, 0x0000, 1);
847                 OUT_RING  (chan, handle);
848                 BEGIN_NV04(chan, NvSubCopy, 0x0180, 3);
849                 OUT_RING  (chan, chan->drm->ntfy.handle);
850                 OUT_RING  (chan, chan->vram.handle);
851                 OUT_RING  (chan, chan->vram.handle);
852         }
853
854         return ret;
855 }
856
857 static int
858 nv50_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
859                   struct ttm_mem_reg *old_reg, struct ttm_mem_reg *new_reg)
860 {
861         struct nvkm_mem *mem = old_reg->mm_node;
862         u64 length = (new_reg->num_pages << PAGE_SHIFT);
863         u64 src_offset = mem->vma[0].offset;
864         u64 dst_offset = mem->vma[1].offset;
865         int src_tiled = !!mem->memtype;
866         int dst_tiled = !!((struct nvkm_mem *)new_reg->mm_node)->memtype;
867         int ret;
868
869         while (length) {
870                 u32 amount, stride, height;
871
872                 ret = RING_SPACE(chan, 18 + 6 * (src_tiled + dst_tiled));
873                 if (ret)
874                         return ret;
875
876                 amount  = min(length, (u64)(4 * 1024 * 1024));
877                 stride  = 16 * 4;
878                 height  = amount / stride;
879
880                 if (src_tiled) {
881                         BEGIN_NV04(chan, NvSubCopy, 0x0200, 7);
882                         OUT_RING  (chan, 0);
883                         OUT_RING  (chan, 0);
884                         OUT_RING  (chan, stride);
885                         OUT_RING  (chan, height);
886                         OUT_RING  (chan, 1);
887                         OUT_RING  (chan, 0);
888                         OUT_RING  (chan, 0);
889                 } else {
890                         BEGIN_NV04(chan, NvSubCopy, 0x0200, 1);
891                         OUT_RING  (chan, 1);
892                 }
893                 if (dst_tiled) {
894                         BEGIN_NV04(chan, NvSubCopy, 0x021c, 7);
895                         OUT_RING  (chan, 0);
896                         OUT_RING  (chan, 0);
897                         OUT_RING  (chan, stride);
898                         OUT_RING  (chan, height);
899                         OUT_RING  (chan, 1);
900                         OUT_RING  (chan, 0);
901                         OUT_RING  (chan, 0);
902                 } else {
903                         BEGIN_NV04(chan, NvSubCopy, 0x021c, 1);
904                         OUT_RING  (chan, 1);
905                 }
906
907                 BEGIN_NV04(chan, NvSubCopy, 0x0238, 2);
908                 OUT_RING  (chan, upper_32_bits(src_offset));
909                 OUT_RING  (chan, upper_32_bits(dst_offset));
910                 BEGIN_NV04(chan, NvSubCopy, 0x030c, 8);
911                 OUT_RING  (chan, lower_32_bits(src_offset));
912                 OUT_RING  (chan, lower_32_bits(dst_offset));
913                 OUT_RING  (chan, stride);
914                 OUT_RING  (chan, stride);
915                 OUT_RING  (chan, stride);
916                 OUT_RING  (chan, height);
917                 OUT_RING  (chan, 0x00000101);
918                 OUT_RING  (chan, 0x00000000);
919                 BEGIN_NV04(chan, NvSubCopy, NV_MEMORY_TO_MEMORY_FORMAT_NOP, 1);
920                 OUT_RING  (chan, 0);
921
922                 length -= amount;
923                 src_offset += amount;
924                 dst_offset += amount;
925         }
926
927         return 0;
928 }
929
930 static int
931 nv04_bo_move_init(struct nouveau_channel *chan, u32 handle)
932 {
933         int ret = RING_SPACE(chan, 4);
934         if (ret == 0) {
935                 BEGIN_NV04(chan, NvSubCopy, 0x0000, 1);
936                 OUT_RING  (chan, handle);
937                 BEGIN_NV04(chan, NvSubCopy, 0x0180, 1);
938                 OUT_RING  (chan, chan->drm->ntfy.handle);
939         }
940
941         return ret;
942 }
943
944 static inline uint32_t
945 nouveau_bo_mem_ctxdma(struct ttm_buffer_object *bo,
946                       struct nouveau_channel *chan, struct ttm_mem_reg *reg)
947 {
948         if (reg->mem_type == TTM_PL_TT)
949                 return NvDmaTT;
950         return chan->vram.handle;
951 }
952
953 static int
954 nv04_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
955                   struct ttm_mem_reg *old_reg, struct ttm_mem_reg *new_reg)
956 {
957         u32 src_offset = old_reg->start << PAGE_SHIFT;
958         u32 dst_offset = new_reg->start << PAGE_SHIFT;
959         u32 page_count = new_reg->num_pages;
960         int ret;
961
962         ret = RING_SPACE(chan, 3);
963         if (ret)
964                 return ret;
965
966         BEGIN_NV04(chan, NvSubCopy, NV_MEMORY_TO_MEMORY_FORMAT_DMA_SOURCE, 2);
967         OUT_RING  (chan, nouveau_bo_mem_ctxdma(bo, chan, old_reg));
968         OUT_RING  (chan, nouveau_bo_mem_ctxdma(bo, chan, new_reg));
969
970         page_count = new_reg->num_pages;
971         while (page_count) {
972                 int line_count = (page_count > 2047) ? 2047 : page_count;
973
974                 ret = RING_SPACE(chan, 11);
975                 if (ret)
976                         return ret;
977
978                 BEGIN_NV04(chan, NvSubCopy,
979                                  NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
980                 OUT_RING  (chan, src_offset);
981                 OUT_RING  (chan, dst_offset);
982                 OUT_RING  (chan, PAGE_SIZE); /* src_pitch */
983                 OUT_RING  (chan, PAGE_SIZE); /* dst_pitch */
984                 OUT_RING  (chan, PAGE_SIZE); /* line_length */
985                 OUT_RING  (chan, line_count);
986                 OUT_RING  (chan, 0x00000101);
987                 OUT_RING  (chan, 0x00000000);
988                 BEGIN_NV04(chan, NvSubCopy, NV_MEMORY_TO_MEMORY_FORMAT_NOP, 1);
989                 OUT_RING  (chan, 0);
990
991                 page_count -= line_count;
992                 src_offset += (PAGE_SIZE * line_count);
993                 dst_offset += (PAGE_SIZE * line_count);
994         }
995
996         return 0;
997 }
998
999 static int
1000 nouveau_bo_move_prep(struct nouveau_drm *drm, struct ttm_buffer_object *bo,
1001                      struct ttm_mem_reg *reg)
1002 {
1003         struct nvkm_mem *old_mem = bo->mem.mm_node;
1004         struct nvkm_mem *new_mem = reg->mm_node;
1005         u64 size = (u64)reg->num_pages << PAGE_SHIFT;
1006         int ret;
1007
1008         ret = nvkm_vm_get(drm->client.vm, size, old_mem->page_shift,
1009                           NV_MEM_ACCESS_RW, &old_mem->vma[0]);
1010         if (ret)
1011                 return ret;
1012
1013         ret = nvkm_vm_get(drm->client.vm, size, new_mem->page_shift,
1014                           NV_MEM_ACCESS_RW, &old_mem->vma[1]);
1015         if (ret) {
1016                 nvkm_vm_put(&old_mem->vma[0]);
1017                 return ret;
1018         }
1019
1020         nvkm_vm_map(&old_mem->vma[0], old_mem);
1021         nvkm_vm_map(&old_mem->vma[1], new_mem);
1022         return 0;
1023 }
1024
1025 static int
1026 nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
1027                      bool no_wait_gpu, struct ttm_mem_reg *new_reg)
1028 {
1029         struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
1030         struct nouveau_channel *chan = drm->ttm.chan;
1031         struct nouveau_cli *cli = (void *)chan->user.client;
1032         struct nouveau_fence *fence;
1033         int ret;
1034
1035         /* create temporary vmas for the transfer and attach them to the
1036          * old nvkm_mem node, these will get cleaned up after ttm has
1037          * destroyed the ttm_mem_reg
1038          */
1039         if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
1040                 ret = nouveau_bo_move_prep(drm, bo, new_reg);
1041                 if (ret)
1042                         return ret;
1043         }
1044
1045         mutex_lock_nested(&cli->mutex, SINGLE_DEPTH_NESTING);
1046         ret = nouveau_fence_sync(nouveau_bo(bo), chan, true, intr);
1047         if (ret == 0) {
1048                 ret = drm->ttm.move(chan, bo, &bo->mem, new_reg);
1049                 if (ret == 0) {
1050                         ret = nouveau_fence_new(chan, false, &fence);
1051                         if (ret == 0) {
1052                                 ret = ttm_bo_move_accel_cleanup(bo,
1053                                                                 &fence->base,
1054                                                                 evict,
1055                                                                 new_reg);
1056                                 nouveau_fence_unref(&fence);
1057                         }
1058                 }
1059         }
1060         mutex_unlock(&cli->mutex);
1061         return ret;
1062 }
1063
1064 void
1065 nouveau_bo_move_init(struct nouveau_drm *drm)
1066 {
1067         static const struct {
1068                 const char *name;
1069                 int engine;
1070                 s32 oclass;
1071                 int (*exec)(struct nouveau_channel *,
1072                             struct ttm_buffer_object *,
1073                             struct ttm_mem_reg *, struct ttm_mem_reg *);
1074                 int (*init)(struct nouveau_channel *, u32 handle);
1075         } _methods[] = {
1076                 {  "COPY", 4, 0xc1b5, nve0_bo_move_copy, nve0_bo_move_init },
1077                 {  "GRCE", 0, 0xc1b5, nve0_bo_move_copy, nvc0_bo_move_init },
1078                 {  "COPY", 4, 0xc0b5, nve0_bo_move_copy, nve0_bo_move_init },
1079                 {  "GRCE", 0, 0xc0b5, nve0_bo_move_copy, nvc0_bo_move_init },
1080                 {  "COPY", 4, 0xb0b5, nve0_bo_move_copy, nve0_bo_move_init },
1081                 {  "GRCE", 0, 0xb0b5, nve0_bo_move_copy, nvc0_bo_move_init },
1082                 {  "COPY", 4, 0xa0b5, nve0_bo_move_copy, nve0_bo_move_init },
1083                 {  "GRCE", 0, 0xa0b5, nve0_bo_move_copy, nvc0_bo_move_init },
1084                 { "COPY1", 5, 0x90b8, nvc0_bo_move_copy, nvc0_bo_move_init },
1085                 { "COPY0", 4, 0x90b5, nvc0_bo_move_copy, nvc0_bo_move_init },
1086                 {  "COPY", 0, 0x85b5, nva3_bo_move_copy, nv50_bo_move_init },
1087                 { "CRYPT", 0, 0x74c1, nv84_bo_move_exec, nv50_bo_move_init },
1088                 {  "M2MF", 0, 0x9039, nvc0_bo_move_m2mf, nvc0_bo_move_init },
1089                 {  "M2MF", 0, 0x5039, nv50_bo_move_m2mf, nv50_bo_move_init },
1090                 {  "M2MF", 0, 0x0039, nv04_bo_move_m2mf, nv04_bo_move_init },
1091                 {},
1092                 { "CRYPT", 0, 0x88b4, nv98_bo_move_exec, nv50_bo_move_init },
1093         }, *mthd = _methods;
1094         const char *name = "CPU";
1095         int ret;
1096
1097         do {
1098                 struct nouveau_channel *chan;
1099
1100                 if (mthd->engine)
1101                         chan = drm->cechan;
1102                 else
1103                         chan = drm->channel;
1104                 if (chan == NULL)
1105                         continue;
1106
1107                 ret = nvif_object_init(&chan->user,
1108                                        mthd->oclass | (mthd->engine << 16),
1109                                        mthd->oclass, NULL, 0,
1110                                        &drm->ttm.copy);
1111                 if (ret == 0) {
1112                         ret = mthd->init(chan, drm->ttm.copy.handle);
1113                         if (ret) {
1114                                 nvif_object_fini(&drm->ttm.copy);
1115                                 continue;
1116                         }
1117
1118                         drm->ttm.move = mthd->exec;
1119                         drm->ttm.chan = chan;
1120                         name = mthd->name;
1121                         break;
1122                 }
1123         } while ((++mthd)->exec);
1124
1125         NV_INFO(drm, "MM: using %s for buffer copies\n", name);
1126 }
1127
1128 static int
1129 nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
1130                       bool no_wait_gpu, struct ttm_mem_reg *new_reg)
1131 {
1132         struct ttm_place placement_memtype = {
1133                 .fpfn = 0,
1134                 .lpfn = 0,
1135                 .flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING
1136         };
1137         struct ttm_placement placement;
1138         struct ttm_mem_reg tmp_reg;
1139         int ret;
1140
1141         placement.num_placement = placement.num_busy_placement = 1;
1142         placement.placement = placement.busy_placement = &placement_memtype;
1143
1144         tmp_reg = *new_reg;
1145         tmp_reg.mm_node = NULL;
1146         ret = ttm_bo_mem_space(bo, &placement, &tmp_reg, intr, no_wait_gpu);
1147         if (ret)
1148                 return ret;
1149
1150         ret = ttm_tt_bind(bo->ttm, &tmp_reg);
1151         if (ret)
1152                 goto out;
1153
1154         ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait_gpu, &tmp_reg);
1155         if (ret)
1156                 goto out;
1157
1158         ret = ttm_bo_move_ttm(bo, intr, no_wait_gpu, new_reg);
1159 out:
1160         ttm_bo_mem_put(bo, &tmp_reg);
1161         return ret;
1162 }
1163
1164 static int
1165 nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr,
1166                       bool no_wait_gpu, struct ttm_mem_reg *new_reg)
1167 {
1168         struct ttm_place placement_memtype = {
1169                 .fpfn = 0,
1170                 .lpfn = 0,
1171                 .flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING
1172         };
1173         struct ttm_placement placement;
1174         struct ttm_mem_reg tmp_reg;
1175         int ret;
1176
1177         placement.num_placement = placement.num_busy_placement = 1;
1178         placement.placement = placement.busy_placement = &placement_memtype;
1179
1180         tmp_reg = *new_reg;
1181         tmp_reg.mm_node = NULL;
1182         ret = ttm_bo_mem_space(bo, &placement, &tmp_reg, intr, no_wait_gpu);
1183         if (ret)
1184                 return ret;
1185
1186         ret = ttm_bo_move_ttm(bo, intr, no_wait_gpu, &tmp_reg);
1187         if (ret)
1188                 goto out;
1189
1190         ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait_gpu, new_reg);
1191         if (ret)
1192                 goto out;
1193
1194 out:
1195         ttm_bo_mem_put(bo, &tmp_reg);
1196         return ret;
1197 }
1198
1199 static void
1200 nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, bool evict,
1201                      struct ttm_mem_reg *new_reg)
1202 {
1203         struct nouveau_bo *nvbo = nouveau_bo(bo);
1204         struct nvkm_vma *vma;
1205
1206         /* ttm can now (stupidly) pass the driver bos it didn't create... */
1207         if (bo->destroy != nouveau_bo_del_ttm)
1208                 return;
1209
1210         list_for_each_entry(vma, &nvbo->vma_list, head) {
1211                 if (new_reg && new_reg->mem_type != TTM_PL_SYSTEM &&
1212                               (new_reg->mem_type == TTM_PL_VRAM ||
1213                                nvbo->page_shift != vma->vm->mmu->lpg_shift)) {
1214                         nvkm_vm_map(vma, new_reg->mm_node);
1215                 } else {
1216                         WARN_ON(ttm_bo_wait(bo, false, false));
1217                         nvkm_vm_unmap(vma);
1218                 }
1219         }
1220 }
1221
1222 static int
1223 nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_reg,
1224                    struct nouveau_drm_tile **new_tile)
1225 {
1226         struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
1227         struct drm_device *dev = drm->dev;
1228         struct nouveau_bo *nvbo = nouveau_bo(bo);
1229         u64 offset = new_reg->start << PAGE_SHIFT;
1230
1231         *new_tile = NULL;
1232         if (new_reg->mem_type != TTM_PL_VRAM)
1233                 return 0;
1234
1235         if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_CELSIUS) {
1236                 *new_tile = nv10_bo_set_tiling(dev, offset, new_reg->size,
1237                                                 nvbo->tile_mode,
1238                                                 nvbo->tile_flags);
1239         }
1240
1241         return 0;
1242 }
1243
1244 static void
1245 nouveau_bo_vm_cleanup(struct ttm_buffer_object *bo,
1246                       struct nouveau_drm_tile *new_tile,
1247                       struct nouveau_drm_tile **old_tile)
1248 {
1249         struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
1250         struct drm_device *dev = drm->dev;
1251         struct dma_fence *fence = reservation_object_get_excl(bo->resv);
1252
1253         nv10_bo_put_tile_region(dev, *old_tile, fence);
1254         *old_tile = new_tile;
1255 }
1256
1257 static int
1258 nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr,
1259                 bool no_wait_gpu, struct ttm_mem_reg *new_reg)
1260 {
1261         struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
1262         struct nouveau_bo *nvbo = nouveau_bo(bo);
1263         struct ttm_mem_reg *old_reg = &bo->mem;
1264         struct nouveau_drm_tile *new_tile = NULL;
1265         int ret = 0;
1266
1267         ret = ttm_bo_wait(bo, intr, no_wait_gpu);
1268         if (ret)
1269                 return ret;
1270
1271         if (nvbo->pin_refcnt)
1272                 NV_WARN(drm, "Moving pinned object %p!\n", nvbo);
1273
1274         if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) {
1275                 ret = nouveau_bo_vm_bind(bo, new_reg, &new_tile);
1276                 if (ret)
1277                         return ret;
1278         }
1279
1280         /* Fake bo copy. */
1281         if (old_reg->mem_type == TTM_PL_SYSTEM && !bo->ttm) {
1282                 BUG_ON(bo->mem.mm_node != NULL);
1283                 bo->mem = *new_reg;
1284                 new_reg->mm_node = NULL;
1285                 goto out;
1286         }
1287
1288         /* Hardware assisted copy. */
1289         if (drm->ttm.move) {
1290                 if (new_reg->mem_type == TTM_PL_SYSTEM)
1291                         ret = nouveau_bo_move_flipd(bo, evict, intr,
1292                                                     no_wait_gpu, new_reg);
1293                 else if (old_reg->mem_type == TTM_PL_SYSTEM)
1294                         ret = nouveau_bo_move_flips(bo, evict, intr,
1295                                                     no_wait_gpu, new_reg);
1296                 else
1297                         ret = nouveau_bo_move_m2mf(bo, evict, intr,
1298                                                    no_wait_gpu, new_reg);
1299                 if (!ret)
1300                         goto out;
1301         }
1302
1303         /* Fallback to software copy. */
1304         ret = ttm_bo_wait(bo, intr, no_wait_gpu);
1305         if (ret == 0)
1306                 ret = ttm_bo_move_memcpy(bo, intr, no_wait_gpu, new_reg);
1307
1308 out:
1309         if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) {
1310                 if (ret)
1311                         nouveau_bo_vm_cleanup(bo, NULL, &new_tile);
1312                 else
1313                         nouveau_bo_vm_cleanup(bo, new_tile, &nvbo->tile);
1314         }
1315
1316         return ret;
1317 }
1318
1319 static int
1320 nouveau_bo_verify_access(struct ttm_buffer_object *bo, struct file *filp)
1321 {
1322         struct nouveau_bo *nvbo = nouveau_bo(bo);
1323
1324         return drm_vma_node_verify_access(&nvbo->gem.vma_node,
1325                                           filp->private_data);
1326 }
1327
1328 static int
1329 nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *reg)
1330 {
1331         struct ttm_mem_type_manager *man = &bdev->man[reg->mem_type];
1332         struct nouveau_drm *drm = nouveau_bdev(bdev);
1333         struct nvkm_device *device = nvxx_device(&drm->client.device);
1334         struct nvkm_mem *mem = reg->mm_node;
1335         int ret;
1336
1337         reg->bus.addr = NULL;
1338         reg->bus.offset = 0;
1339         reg->bus.size = reg->num_pages << PAGE_SHIFT;
1340         reg->bus.base = 0;
1341         reg->bus.is_iomem = false;
1342         if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE))
1343                 return -EINVAL;
1344         switch (reg->mem_type) {
1345         case TTM_PL_SYSTEM:
1346                 /* System memory */
1347                 return 0;
1348         case TTM_PL_TT:
1349 #if IS_ENABLED(CONFIG_AGP)
1350                 if (drm->agp.bridge) {
1351                         reg->bus.offset = reg->start << PAGE_SHIFT;
1352                         reg->bus.base = drm->agp.base;
1353                         reg->bus.is_iomem = !drm->agp.cma;
1354                 }
1355 #endif
1356                 if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA || !mem->memtype)
1357                         /* untiled */
1358                         break;
1359                 /* fallthrough, tiled memory */
1360         case TTM_PL_VRAM:
1361                 reg->bus.offset = reg->start << PAGE_SHIFT;
1362                 reg->bus.base = device->func->resource_addr(device, 1);
1363                 reg->bus.is_iomem = true;
1364                 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
1365                         struct nvkm_bar *bar = nvxx_bar(&drm->client.device);
1366                         int page_shift = 12;
1367                         if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_FERMI)
1368                                 page_shift = mem->page_shift;
1369
1370                         ret = nvkm_bar_umap(bar, mem->size << 12, page_shift,
1371                                             &mem->bar_vma);
1372                         if (ret)
1373                                 return ret;
1374
1375                         nvkm_vm_map(&mem->bar_vma, mem);
1376                         reg->bus.offset = mem->bar_vma.offset;
1377                 }
1378                 break;
1379         default:
1380                 return -EINVAL;
1381         }
1382         return 0;
1383 }
1384
1385 static void
1386 nouveau_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *reg)
1387 {
1388         struct nvkm_mem *mem = reg->mm_node;
1389
1390         if (!mem->bar_vma.node)
1391                 return;
1392
1393         nvkm_vm_unmap(&mem->bar_vma);
1394         nvkm_vm_put(&mem->bar_vma);
1395 }
1396
1397 static int
1398 nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
1399 {
1400         struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
1401         struct nouveau_bo *nvbo = nouveau_bo(bo);
1402         struct nvkm_device *device = nvxx_device(&drm->client.device);
1403         u32 mappable = device->func->resource_size(device, 1) >> PAGE_SHIFT;
1404         int i, ret;
1405
1406         /* as long as the bo isn't in vram, and isn't tiled, we've got
1407          * nothing to do here.
1408          */
1409         if (bo->mem.mem_type != TTM_PL_VRAM) {
1410                 if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA ||
1411                     !nouveau_bo_tile_layout(nvbo))
1412                         return 0;
1413
1414                 if (bo->mem.mem_type == TTM_PL_SYSTEM) {
1415                         nouveau_bo_placement_set(nvbo, TTM_PL_TT, 0);
1416
1417                         ret = nouveau_bo_validate(nvbo, false, false);
1418                         if (ret)
1419                                 return ret;
1420                 }
1421                 return 0;
1422         }
1423
1424         /* make sure bo is in mappable vram */
1425         if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA ||
1426             bo->mem.start + bo->mem.num_pages < mappable)
1427                 return 0;
1428
1429         for (i = 0; i < nvbo->placement.num_placement; ++i) {
1430                 nvbo->placements[i].fpfn = 0;
1431                 nvbo->placements[i].lpfn = mappable;
1432         }
1433
1434         for (i = 0; i < nvbo->placement.num_busy_placement; ++i) {
1435                 nvbo->busy_placements[i].fpfn = 0;
1436                 nvbo->busy_placements[i].lpfn = mappable;
1437         }
1438
1439         nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_VRAM, 0);
1440         return nouveau_bo_validate(nvbo, false, false);
1441 }
1442
1443 static int
1444 nouveau_ttm_tt_populate(struct ttm_tt *ttm)
1445 {
1446         struct ttm_dma_tt *ttm_dma = (void *)ttm;
1447         struct nouveau_drm *drm;
1448         struct nvkm_device *device;
1449         struct drm_device *dev;
1450         struct device *pdev;
1451         unsigned i;
1452         int r;
1453         bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
1454
1455         if (ttm->state != tt_unpopulated)
1456                 return 0;
1457
1458         if (slave && ttm->sg) {
1459                 /* make userspace faulting work */
1460                 drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
1461                                                  ttm_dma->dma_address, ttm->num_pages);
1462                 ttm->state = tt_unbound;
1463                 return 0;
1464         }
1465
1466         drm = nouveau_bdev(ttm->bdev);
1467         device = nvxx_device(&drm->client.device);
1468         dev = drm->dev;
1469         pdev = device->dev;
1470
1471 #if IS_ENABLED(CONFIG_AGP)
1472         if (drm->agp.bridge) {
1473                 return ttm_agp_tt_populate(ttm);
1474         }
1475 #endif
1476
1477 #if IS_ENABLED(CONFIG_SWIOTLB) && IS_ENABLED(CONFIG_X86)
1478         if (swiotlb_nr_tbl()) {
1479                 return ttm_dma_populate((void *)ttm, dev->dev);
1480         }
1481 #endif
1482
1483         r = ttm_pool_populate(ttm);
1484         if (r) {
1485                 return r;
1486         }
1487
1488         for (i = 0; i < ttm->num_pages; i++) {
1489                 dma_addr_t addr;
1490
1491                 addr = dma_map_page(pdev, ttm->pages[i], 0, PAGE_SIZE,
1492                                     DMA_BIDIRECTIONAL);
1493
1494                 if (dma_mapping_error(pdev, addr)) {
1495                         while (i--) {
1496                                 dma_unmap_page(pdev, ttm_dma->dma_address[i],
1497                                                PAGE_SIZE, DMA_BIDIRECTIONAL);
1498                                 ttm_dma->dma_address[i] = 0;
1499                         }
1500                         ttm_pool_unpopulate(ttm);
1501                         return -EFAULT;
1502                 }
1503
1504                 ttm_dma->dma_address[i] = addr;
1505         }
1506         return 0;
1507 }
1508
1509 static void
1510 nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm)
1511 {
1512         struct ttm_dma_tt *ttm_dma = (void *)ttm;
1513         struct nouveau_drm *drm;
1514         struct nvkm_device *device;
1515         struct drm_device *dev;
1516         struct device *pdev;
1517         unsigned i;
1518         bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
1519
1520         if (slave)
1521                 return;
1522
1523         drm = nouveau_bdev(ttm->bdev);
1524         device = nvxx_device(&drm->client.device);
1525         dev = drm->dev;
1526         pdev = device->dev;
1527
1528 #if IS_ENABLED(CONFIG_AGP)
1529         if (drm->agp.bridge) {
1530                 ttm_agp_tt_unpopulate(ttm);
1531                 return;
1532         }
1533 #endif
1534
1535 #if IS_ENABLED(CONFIG_SWIOTLB) && IS_ENABLED(CONFIG_X86)
1536         if (swiotlb_nr_tbl()) {
1537                 ttm_dma_unpopulate((void *)ttm, dev->dev);
1538                 return;
1539         }
1540 #endif
1541
1542         for (i = 0; i < ttm->num_pages; i++) {
1543                 if (ttm_dma->dma_address[i]) {
1544                         dma_unmap_page(pdev, ttm_dma->dma_address[i], PAGE_SIZE,
1545                                        DMA_BIDIRECTIONAL);
1546                 }
1547         }
1548
1549         ttm_pool_unpopulate(ttm);
1550 }
1551
1552 void
1553 nouveau_bo_fence(struct nouveau_bo *nvbo, struct nouveau_fence *fence, bool exclusive)
1554 {
1555         struct reservation_object *resv = nvbo->bo.resv;
1556
1557         if (exclusive)
1558                 reservation_object_add_excl_fence(resv, &fence->base);
1559         else if (fence)
1560                 reservation_object_add_shared_fence(resv, &fence->base);
1561 }
1562
1563 struct ttm_bo_driver nouveau_bo_driver = {
1564         .ttm_tt_create = &nouveau_ttm_tt_create,
1565         .ttm_tt_populate = &nouveau_ttm_tt_populate,
1566         .ttm_tt_unpopulate = &nouveau_ttm_tt_unpopulate,
1567         .invalidate_caches = nouveau_bo_invalidate_caches,
1568         .init_mem_type = nouveau_bo_init_mem_type,
1569         .eviction_valuable = ttm_bo_eviction_valuable,
1570         .evict_flags = nouveau_bo_evict_flags,
1571         .move_notify = nouveau_bo_move_ntfy,
1572         .move = nouveau_bo_move,
1573         .verify_access = nouveau_bo_verify_access,
1574         .fault_reserve_notify = &nouveau_ttm_fault_reserve_notify,
1575         .io_mem_reserve = &nouveau_ttm_io_mem_reserve,
1576         .io_mem_free = &nouveau_ttm_io_mem_free,
1577         .io_mem_pfn = ttm_bo_default_io_mem_pfn,
1578 };
1579
1580 struct nvkm_vma *
1581 nouveau_bo_vma_find(struct nouveau_bo *nvbo, struct nvkm_vm *vm)
1582 {
1583         struct nvkm_vma *vma;
1584         list_for_each_entry(vma, &nvbo->vma_list, head) {
1585                 if (vma->vm == vm)
1586                         return vma;
1587         }
1588
1589         return NULL;
1590 }
1591
1592 int
1593 nouveau_bo_vma_add(struct nouveau_bo *nvbo, struct nvkm_vm *vm,
1594                    struct nvkm_vma *vma)
1595 {
1596         const u32 size = nvbo->bo.mem.num_pages << PAGE_SHIFT;
1597         int ret;
1598
1599         ret = nvkm_vm_get(vm, size, nvbo->page_shift,
1600                              NV_MEM_ACCESS_RW, vma);
1601         if (ret)
1602                 return ret;
1603
1604         if ( nvbo->bo.mem.mem_type != TTM_PL_SYSTEM &&
1605             (nvbo->bo.mem.mem_type == TTM_PL_VRAM ||
1606              nvbo->page_shift != vma->vm->mmu->lpg_shift))
1607                 nvkm_vm_map(vma, nvbo->bo.mem.mm_node);
1608
1609         list_add_tail(&vma->head, &nvbo->vma_list);
1610         vma->refcount = 1;
1611         return 0;
1612 }
1613
1614 void
1615 nouveau_bo_vma_del(struct nouveau_bo *nvbo, struct nvkm_vma *vma)
1616 {
1617         if (vma->node) {
1618                 if (nvbo->bo.mem.mem_type != TTM_PL_SYSTEM)
1619                         nvkm_vm_unmap(vma);
1620                 nvkm_vm_put(vma);
1621                 list_del(&vma->head);
1622         }
1623 }