1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <drm/drmP.h>
29#include <drm/radeon_drm.h>
30#include "radeon.h"
31#include "radeon_reg.h"
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66int radeon_gart_table_ram_alloc(struct radeon_device *rdev)
67{
68 void *ptr;
69
70 ptr = pci_alloc_consistent(rdev->pdev, rdev->gart.table_size,
71 &rdev->gart.table_addr);
72 if (ptr == NULL) {
73 return -ENOMEM;
74 }
75#ifdef CONFIG_X86
76 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480 ||
77 rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {
78 set_memory_uc((unsigned long)ptr,
79 rdev->gart.table_size >> PAGE_SHIFT);
80 }
81#endif
82 rdev->gart.ptr = ptr;
83 memset((void *)rdev->gart.ptr, 0, rdev->gart.table_size);
84 return 0;
85}
86
87
88
89
90
91
92
93
94
95
96void radeon_gart_table_ram_free(struct radeon_device *rdev)
97{
98 if (rdev->gart.ptr == NULL) {
99 return;
100 }
101#ifdef CONFIG_X86
102 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480 ||
103 rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {
104 set_memory_wb((unsigned long)rdev->gart.ptr,
105 rdev->gart.table_size >> PAGE_SHIFT);
106 }
107#endif
108 pci_free_consistent(rdev->pdev, rdev->gart.table_size,
109 (void *)rdev->gart.ptr,
110 rdev->gart.table_addr);
111 rdev->gart.ptr = NULL;
112 rdev->gart.table_addr = 0;
113}
114
115
116
117
118
119
120
121
122
123
124
125int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
126{
127 int r;
128
129 if (rdev->gart.robj == NULL) {
130 r = radeon_bo_create(rdev, rdev->gart.table_size,
131 PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
132 NULL, &rdev->gart.robj);
133 if (r) {
134 return r;
135 }
136 }
137 return 0;
138}
139
140
141
142
143
144
145
146
147
148
149
150int radeon_gart_table_vram_pin(struct radeon_device *rdev)
151{
152 uint64_t gpu_addr;
153 int r;
154
155 r = radeon_bo_reserve(rdev->gart.robj, false);
156 if (unlikely(r != 0))
157 return r;
158 r = radeon_bo_pin(rdev->gart.robj,
159 RADEON_GEM_DOMAIN_VRAM, &gpu_addr);
160 if (r) {
161 radeon_bo_unreserve(rdev->gart.robj);
162 return r;
163 }
164 r = radeon_bo_kmap(rdev->gart.robj, &rdev->gart.ptr);
165 if (r)
166 radeon_bo_unpin(rdev->gart.robj);
167 radeon_bo_unreserve(rdev->gart.robj);
168 rdev->gart.table_addr = gpu_addr;
169 return r;
170}
171
172
173
174
175
176
177
178
179
180void radeon_gart_table_vram_unpin(struct radeon_device *rdev)
181{
182 int r;
183
184 if (rdev->gart.robj == NULL) {
185 return;
186 }
187 r = radeon_bo_reserve(rdev->gart.robj, false);
188 if (likely(r == 0)) {
189 radeon_bo_kunmap(rdev->gart.robj);
190 radeon_bo_unpin(rdev->gart.robj);
191 radeon_bo_unreserve(rdev->gart.robj);
192 rdev->gart.ptr = NULL;
193 }
194}
195
196
197
198
199
200
201
202
203
204
205void radeon_gart_table_vram_free(struct radeon_device *rdev)
206{
207 if (rdev->gart.robj == NULL) {
208 return;
209 }
210 radeon_gart_table_vram_unpin(rdev);
211 radeon_bo_unref(&rdev->gart.robj);
212}
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
228 int pages)
229{
230 unsigned t;
231 unsigned p;
232 int i, j;
233 u64 page_base;
234
235 if (!rdev->gart.ready) {
236 WARN(1, "trying to unbind memory from uninitialized GART !\n");
237 return;
238 }
239 t = offset / RADEON_GPU_PAGE_SIZE;
240 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
241 for (i = 0; i < pages; i++, p++) {
242 if (rdev->gart.pages[p]) {
243 rdev->gart.pages[p] = NULL;
244 rdev->gart.pages_addr[p] = rdev->dummy_page.addr;
245 page_base = rdev->gart.pages_addr[p];
246 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
247 if (rdev->gart.ptr) {
248 radeon_gart_set_page(rdev, t, page_base);
249 }
250 page_base += RADEON_GPU_PAGE_SIZE;
251 }
252 }
253 }
254 mb();
255 radeon_gart_tlb_flush(rdev);
256}
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
272 int pages, struct page **pagelist, dma_addr_t *dma_addr)
273{
274 unsigned t;
275 unsigned p;
276 uint64_t page_base;
277 int i, j;
278
279 if (!rdev->gart.ready) {
280 WARN(1, "trying to bind memory to uninitialized GART !\n");
281 return -EINVAL;
282 }
283 t = offset / RADEON_GPU_PAGE_SIZE;
284 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
285
286 for (i = 0; i < pages; i++, p++) {
287 rdev->gart.pages_addr[p] = dma_addr[i];
288 rdev->gart.pages[p] = pagelist[i];
289 if (rdev->gart.ptr) {
290 page_base = rdev->gart.pages_addr[p];
291 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
292 radeon_gart_set_page(rdev, t, page_base);
293 page_base += RADEON_GPU_PAGE_SIZE;
294 }
295 }
296 }
297 mb();
298 radeon_gart_tlb_flush(rdev);
299 return 0;
300}
301
302
303
304
305
306
307
308
309
310void radeon_gart_restore(struct radeon_device *rdev)
311{
312 int i, j, t;
313 u64 page_base;
314
315 if (!rdev->gart.ptr) {
316 return;
317 }
318 for (i = 0, t = 0; i < rdev->gart.num_cpu_pages; i++) {
319 page_base = rdev->gart.pages_addr[i];
320 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
321 radeon_gart_set_page(rdev, t, page_base);
322 page_base += RADEON_GPU_PAGE_SIZE;
323 }
324 }
325 mb();
326 radeon_gart_tlb_flush(rdev);
327}
328
329
330
331
332
333
334
335
336
337int radeon_gart_init(struct radeon_device *rdev)
338{
339 int r, i;
340
341 if (rdev->gart.pages) {
342 return 0;
343 }
344
345 if (PAGE_SIZE < RADEON_GPU_PAGE_SIZE) {
346 DRM_ERROR("Page size is smaller than GPU page size!\n");
347 return -EINVAL;
348 }
349 r = radeon_dummy_page_init(rdev);
350 if (r)
351 return r;
352
353 rdev->gart.num_cpu_pages = rdev->mc.gtt_size / PAGE_SIZE;
354 rdev->gart.num_gpu_pages = rdev->mc.gtt_size / RADEON_GPU_PAGE_SIZE;
355 DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n",
356 rdev->gart.num_cpu_pages, rdev->gart.num_gpu_pages);
357
358 rdev->gart.pages = vzalloc(sizeof(void *) * rdev->gart.num_cpu_pages);
359 if (rdev->gart.pages == NULL) {
360 radeon_gart_fini(rdev);
361 return -ENOMEM;
362 }
363 rdev->gart.pages_addr = vzalloc(sizeof(dma_addr_t) *
364 rdev->gart.num_cpu_pages);
365 if (rdev->gart.pages_addr == NULL) {
366 radeon_gart_fini(rdev);
367 return -ENOMEM;
368 }
369
370 for (i = 0; i < rdev->gart.num_cpu_pages; i++) {
371 rdev->gart.pages_addr[i] = rdev->dummy_page.addr;
372 }
373 return 0;
374}
375
376
377
378
379
380
381
382
383void radeon_gart_fini(struct radeon_device *rdev)
384{
385 if (rdev->gart.pages && rdev->gart.pages_addr && rdev->gart.ready) {
386
387 radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages);
388 }
389 rdev->gart.ready = false;
390 vfree(rdev->gart.pages);
391 vfree(rdev->gart.pages_addr);
392 rdev->gart.pages = NULL;
393 rdev->gart.pages_addr = NULL;
394
395 radeon_dummy_page_fini(rdev);
396}
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431static unsigned radeon_vm_num_pdes(struct radeon_device *rdev)
432{
433 return rdev->vm_manager.max_pfn >> RADEON_VM_BLOCK_SIZE;
434}
435
436
437
438
439
440
441
442
443static unsigned radeon_vm_directory_size(struct radeon_device *rdev)
444{
445 return RADEON_GPU_PAGE_ALIGN(radeon_vm_num_pdes(rdev) * 8);
446}
447
448
449
450
451
452
453
454
455
456int radeon_vm_manager_init(struct radeon_device *rdev)
457{
458 struct radeon_vm *vm;
459 struct radeon_bo_va *bo_va;
460 int r;
461 unsigned size;
462
463 if (!rdev->vm_manager.enabled) {
464
465 size = radeon_vm_directory_size(rdev);
466 size += rdev->vm_manager.max_pfn * 8;
467 size *= 2;
468 r = radeon_sa_bo_manager_init(rdev, &rdev->vm_manager.sa_manager,
469 RADEON_GPU_PAGE_ALIGN(size),
470 RADEON_GEM_DOMAIN_VRAM);
471 if (r) {
472 dev_err(rdev->dev, "failed to allocate vm bo (%dKB)\n",
473 (rdev->vm_manager.max_pfn * 8) >> 10);
474 return r;
475 }
476
477 r = radeon_asic_vm_init(rdev);
478 if (r)
479 return r;
480
481 rdev->vm_manager.enabled = true;
482
483 r = radeon_sa_bo_manager_start(rdev, &rdev->vm_manager.sa_manager);
484 if (r)
485 return r;
486 }
487
488
489 list_for_each_entry(vm, &rdev->vm_manager.lru_vm, list) {
490 if (vm->page_directory == NULL)
491 continue;
492
493 list_for_each_entry(bo_va, &vm->va, vm_list) {
494 bo_va->valid = false;
495 }
496 }
497 return 0;
498}
499
500
501
502
503
504
505
506
507
508
509
510static void radeon_vm_free_pt(struct radeon_device *rdev,
511 struct radeon_vm *vm)
512{
513 struct radeon_bo_va *bo_va;
514 int i;
515
516 if (!vm->page_directory)
517 return;
518
519 list_del_init(&vm->list);
520 radeon_sa_bo_free(rdev, &vm->page_directory, vm->fence);
521
522 list_for_each_entry(bo_va, &vm->va, vm_list) {
523 bo_va->valid = false;
524 }
525
526 if (vm->page_tables == NULL)
527 return;
528
529 for (i = 0; i < radeon_vm_num_pdes(rdev); i++)
530 radeon_sa_bo_free(rdev, &vm->page_tables[i], vm->fence);
531
532 kfree(vm->page_tables);
533}
534
535
536
537
538
539
540
541
542void radeon_vm_manager_fini(struct radeon_device *rdev)
543{
544 struct radeon_vm *vm, *tmp;
545 int i;
546
547 if (!rdev->vm_manager.enabled)
548 return;
549
550 mutex_lock(&rdev->vm_manager.lock);
551
552 list_for_each_entry_safe(vm, tmp, &rdev->vm_manager.lru_vm, list) {
553 mutex_lock(&vm->mutex);
554 radeon_vm_free_pt(rdev, vm);
555 mutex_unlock(&vm->mutex);
556 }
557 for (i = 0; i < RADEON_NUM_VM; ++i) {
558 radeon_fence_unref(&rdev->vm_manager.active[i]);
559 }
560 radeon_asic_vm_fini(rdev);
561 mutex_unlock(&rdev->vm_manager.lock);
562
563 radeon_sa_bo_manager_suspend(rdev, &rdev->vm_manager.sa_manager);
564 radeon_sa_bo_manager_fini(rdev, &rdev->vm_manager.sa_manager);
565 rdev->vm_manager.enabled = false;
566}
567
568
569
570
571
572
573
574
575
576
577
578
579static int radeon_vm_evict(struct radeon_device *rdev, struct radeon_vm *vm)
580{
581 struct radeon_vm *vm_evict;
582
583 if (list_empty(&rdev->vm_manager.lru_vm))
584 return -ENOMEM;
585
586 vm_evict = list_first_entry(&rdev->vm_manager.lru_vm,
587 struct radeon_vm, list);
588 if (vm_evict == vm)
589 return -ENOMEM;
590
591 mutex_lock(&vm_evict->mutex);
592 radeon_vm_free_pt(rdev, vm_evict);
593 mutex_unlock(&vm_evict->mutex);
594 return 0;
595}
596
597
598
599
600
601
602
603
604
605
606
607
608int radeon_vm_alloc_pt(struct radeon_device *rdev, struct radeon_vm *vm)
609{
610 unsigned pd_size, pts_size;
611 u64 *pd_addr;
612 int r;
613
614 if (vm == NULL) {
615 return -EINVAL;
616 }
617
618 if (vm->page_directory != NULL) {
619 return 0;
620 }
621
622retry:
623 pd_size = RADEON_GPU_PAGE_ALIGN(radeon_vm_directory_size(rdev));
624 r = radeon_sa_bo_new(rdev, &rdev->vm_manager.sa_manager,
625 &vm->page_directory, pd_size,
626 RADEON_GPU_PAGE_SIZE, false);
627 if (r == -ENOMEM) {
628 r = radeon_vm_evict(rdev, vm);
629 if (r)
630 return r;
631 goto retry;
632
633 } else if (r) {
634 return r;
635 }
636
637 vm->pd_gpu_addr = radeon_sa_bo_gpu_addr(vm->page_directory);
638
639
640 pd_addr = radeon_sa_bo_cpu_addr(vm->page_directory);
641 memset(pd_addr, 0, pd_size);
642
643 pts_size = radeon_vm_num_pdes(rdev) * sizeof(struct radeon_sa_bo *);
644 vm->page_tables = kzalloc(pts_size, GFP_KERNEL);
645
646 if (vm->page_tables == NULL) {
647 DRM_ERROR("Cannot allocate memory for page table array\n");
648 radeon_sa_bo_free(rdev, &vm->page_directory, vm->fence);
649 return -ENOMEM;
650 }
651
652 return 0;
653}
654
655
656
657
658
659
660
661
662
663
664
665void radeon_vm_add_to_lru(struct radeon_device *rdev, struct radeon_vm *vm)
666{
667 list_del_init(&vm->list);
668 list_add_tail(&vm->list, &rdev->vm_manager.lru_vm);
669}
670
671
672
673
674
675
676
677
678
679
680
681
682
683struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
684 struct radeon_vm *vm, int ring)
685{
686 struct radeon_fence *best[RADEON_NUM_RINGS] = {};
687 unsigned choices[2] = {};
688 unsigned i;
689
690
691 if (vm->fence && vm->fence == rdev->vm_manager.active[vm->id])
692 return NULL;
693
694
695 radeon_fence_unref(&vm->last_flush);
696
697
698 for (i = 1; i < rdev->vm_manager.nvm; ++i) {
699 struct radeon_fence *fence = rdev->vm_manager.active[i];
700
701 if (fence == NULL) {
702
703 vm->id = i;
704 return NULL;
705 }
706
707 if (radeon_fence_is_earlier(fence, best[fence->ring])) {
708 best[fence->ring] = fence;
709 choices[fence->ring == ring ? 0 : 1] = i;
710 }
711 }
712
713 for (i = 0; i < 2; ++i) {
714 if (choices[i]) {
715 vm->id = choices[i];
716 return rdev->vm_manager.active[choices[i]];
717 }
718 }
719
720
721 BUG();
722 return NULL;
723}
724
725
726
727
728
729
730
731
732
733
734
735
736
737void radeon_vm_fence(struct radeon_device *rdev,
738 struct radeon_vm *vm,
739 struct radeon_fence *fence)
740{
741 radeon_fence_unref(&rdev->vm_manager.active[vm->id]);
742 rdev->vm_manager.active[vm->id] = radeon_fence_ref(fence);
743
744 radeon_fence_unref(&vm->fence);
745 vm->fence = radeon_fence_ref(fence);
746}
747
748
749
750
751
752
753
754
755
756
757
758
759
760struct radeon_bo_va *radeon_vm_bo_find(struct radeon_vm *vm,
761 struct radeon_bo *bo)
762{
763 struct radeon_bo_va *bo_va;
764
765 list_for_each_entry(bo_va, &bo->va, bo_list) {
766 if (bo_va->vm == vm) {
767 return bo_va;
768 }
769 }
770 return NULL;
771}
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786struct radeon_bo_va *radeon_vm_bo_add(struct radeon_device *rdev,
787 struct radeon_vm *vm,
788 struct radeon_bo *bo)
789{
790 struct radeon_bo_va *bo_va;
791
792 bo_va = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
793 if (bo_va == NULL) {
794 return NULL;
795 }
796 bo_va->vm = vm;
797 bo_va->bo = bo;
798 bo_va->soffset = 0;
799 bo_va->eoffset = 0;
800 bo_va->flags = 0;
801 bo_va->valid = false;
802 bo_va->ref_count = 1;
803 INIT_LIST_HEAD(&bo_va->bo_list);
804 INIT_LIST_HEAD(&bo_va->vm_list);
805
806 mutex_lock(&vm->mutex);
807 list_add(&bo_va->vm_list, &vm->va);
808 list_add_tail(&bo_va->bo_list, &bo->va);
809 mutex_unlock(&vm->mutex);
810
811 return bo_va;
812}
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828int radeon_vm_bo_set_addr(struct radeon_device *rdev,
829 struct radeon_bo_va *bo_va,
830 uint64_t soffset,
831 uint32_t flags)
832{
833 uint64_t size = radeon_bo_size(bo_va->bo);
834 uint64_t eoffset, last_offset = 0;
835 struct radeon_vm *vm = bo_va->vm;
836 struct radeon_bo_va *tmp;
837 struct list_head *head;
838 unsigned last_pfn;
839
840 if (soffset) {
841
842 eoffset = soffset + size;
843 if (soffset >= eoffset) {
844 return -EINVAL;
845 }
846
847 last_pfn = eoffset / RADEON_GPU_PAGE_SIZE;
848 if (last_pfn > rdev->vm_manager.max_pfn) {
849 dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n",
850 last_pfn, rdev->vm_manager.max_pfn);
851 return -EINVAL;
852 }
853
854 } else {
855 eoffset = last_pfn = 0;
856 }
857
858 mutex_lock(&vm->mutex);
859 head = &vm->va;
860 last_offset = 0;
861 list_for_each_entry(tmp, &vm->va, vm_list) {
862 if (bo_va == tmp) {
863
864 continue;
865 }
866
867 if (soffset >= last_offset && eoffset <= tmp->soffset) {
868
869 break;
870 }
871 if (eoffset > tmp->soffset && soffset < tmp->eoffset) {
872
873 dev_err(rdev->dev, "bo %p va 0x%08X conflict with (bo %p 0x%08X 0x%08X)\n",
874 bo_va->bo, (unsigned)bo_va->soffset, tmp->bo,
875 (unsigned)tmp->soffset, (unsigned)tmp->eoffset);
876 mutex_unlock(&vm->mutex);
877 return -EINVAL;
878 }
879 last_offset = tmp->eoffset;
880 head = &tmp->vm_list;
881 }
882
883 bo_va->soffset = soffset;
884 bo_va->eoffset = eoffset;
885 bo_va->flags = flags;
886 bo_va->valid = false;
887 list_move(&bo_va->vm_list, head);
888
889 mutex_unlock(&vm->mutex);
890 return 0;
891}
892
893
894
895
896
897
898
899
900
901
902
903uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr)
904{
905 uint64_t result;
906
907
908 result = rdev->gart.pages_addr[addr >> PAGE_SHIFT];
909
910
911 result |= addr & (~PAGE_MASK);
912
913 return result;
914}
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930static int radeon_vm_update_pdes(struct radeon_device *rdev,
931 struct radeon_vm *vm,
932 struct radeon_ib *ib,
933 uint64_t start, uint64_t end)
934{
935 static const uint32_t incr = RADEON_VM_PTE_COUNT * 8;
936
937 uint64_t last_pde = ~0, last_pt = ~0;
938 unsigned count = 0;
939 uint64_t pt_idx;
940 int r;
941
942 start = (start / RADEON_GPU_PAGE_SIZE) >> RADEON_VM_BLOCK_SIZE;
943 end = (end / RADEON_GPU_PAGE_SIZE) >> RADEON_VM_BLOCK_SIZE;
944
945
946 for (pt_idx = start; pt_idx <= end; ++pt_idx) {
947 uint64_t pde, pt;
948
949 if (vm->page_tables[pt_idx])
950 continue;
951
952retry:
953 r = radeon_sa_bo_new(rdev, &rdev->vm_manager.sa_manager,
954 &vm->page_tables[pt_idx],
955 RADEON_VM_PTE_COUNT * 8,
956 RADEON_GPU_PAGE_SIZE, false);
957
958 if (r == -ENOMEM) {
959 r = radeon_vm_evict(rdev, vm);
960 if (r)
961 return r;
962 goto retry;
963 } else if (r) {
964 return r;
965 }
966
967 pde = vm->pd_gpu_addr + pt_idx * 8;
968
969 pt = radeon_sa_bo_gpu_addr(vm->page_tables[pt_idx]);
970
971 if (((last_pde + 8 * count) != pde) ||
972 ((last_pt + incr * count) != pt)) {
973
974 if (count) {
975 radeon_asic_vm_set_page(rdev, ib, last_pde,
976 last_pt, count, incr,
977 RADEON_VM_PAGE_VALID);
978 }
979
980 count = 1;
981 last_pde = pde;
982 last_pt = pt;
983 } else {
984 ++count;
985 }
986 }
987
988 if (count) {
989 radeon_asic_vm_set_page(rdev, ib, last_pde, last_pt, count,
990 incr, RADEON_VM_PAGE_VALID);
991
992 }
993
994 return 0;
995}
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011static void radeon_vm_update_ptes(struct radeon_device *rdev,
1012 struct radeon_vm *vm,
1013 struct radeon_ib *ib,
1014 uint64_t start, uint64_t end,
1015 uint64_t dst, uint32_t flags)
1016{
1017 static const uint64_t mask = RADEON_VM_PTE_COUNT - 1;
1018
1019 uint64_t last_pte = ~0, last_dst = ~0;
1020 unsigned count = 0;
1021 uint64_t addr;
1022
1023 start = start / RADEON_GPU_PAGE_SIZE;
1024 end = end / RADEON_GPU_PAGE_SIZE;
1025
1026
1027 for (addr = start; addr < end; ) {
1028 uint64_t pt_idx = addr >> RADEON_VM_BLOCK_SIZE;
1029 unsigned nptes;
1030 uint64_t pte;
1031
1032 if ((addr & ~mask) == (end & ~mask))
1033 nptes = end - addr;
1034 else
1035 nptes = RADEON_VM_PTE_COUNT - (addr & mask);
1036
1037 pte = radeon_sa_bo_gpu_addr(vm->page_tables[pt_idx]);
1038 pte += (addr & mask) * 8;
1039
1040 if ((last_pte + 8 * count) != pte) {
1041
1042 if (count) {
1043 radeon_asic_vm_set_page(rdev, ib, last_pte,
1044 last_dst, count,
1045 RADEON_GPU_PAGE_SIZE,
1046 flags);
1047 }
1048
1049 count = nptes;
1050 last_pte = pte;
1051 last_dst = dst;
1052 } else {
1053 count += nptes;
1054 }
1055
1056 addr += nptes;
1057 dst += nptes * RADEON_GPU_PAGE_SIZE;
1058 }
1059
1060 if (count) {
1061 radeon_asic_vm_set_page(rdev, ib, last_pte,
1062 last_dst, count,
1063 RADEON_GPU_PAGE_SIZE, flags);
1064 }
1065}
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080int radeon_vm_bo_update_pte(struct radeon_device *rdev,
1081 struct radeon_vm *vm,
1082 struct radeon_bo *bo,
1083 struct ttm_mem_reg *mem)
1084{
1085 unsigned ridx = rdev->asic->vm.pt_ring_index;
1086 struct radeon_ib ib;
1087 struct radeon_bo_va *bo_va;
1088 unsigned nptes, npdes, ndw;
1089 uint64_t addr;
1090 int r;
1091
1092
1093 if (vm->page_directory == NULL)
1094 return 0;
1095
1096 bo_va = radeon_vm_bo_find(vm, bo);
1097 if (bo_va == NULL) {
1098 dev_err(rdev->dev, "bo %p not in vm %p\n", bo, vm);
1099 return -EINVAL;
1100 }
1101
1102 if (!bo_va->soffset) {
1103 dev_err(rdev->dev, "bo %p don't has a mapping in vm %p\n",
1104 bo, vm);
1105 return -EINVAL;
1106 }
1107
1108 if ((bo_va->valid && mem) || (!bo_va->valid && mem == NULL))
1109 return 0;
1110
1111 bo_va->flags &= ~RADEON_VM_PAGE_VALID;
1112 bo_va->flags &= ~RADEON_VM_PAGE_SYSTEM;
1113 if (mem) {
1114 addr = mem->start << PAGE_SHIFT;
1115 if (mem->mem_type != TTM_PL_SYSTEM) {
1116 bo_va->flags |= RADEON_VM_PAGE_VALID;
1117 bo_va->valid = true;
1118 }
1119 if (mem->mem_type == TTM_PL_TT) {
1120 bo_va->flags |= RADEON_VM_PAGE_SYSTEM;
1121 } else {
1122 addr += rdev->vm_manager.vram_base_offset;
1123 }
1124 } else {
1125 addr = 0;
1126 bo_va->valid = false;
1127 }
1128
1129 nptes = radeon_bo_ngpu_pages(bo);
1130
1131
1132 npdes = (nptes >> RADEON_VM_BLOCK_SIZE) + 2;
1133
1134
1135 ndw = 64;
1136
1137 if (RADEON_VM_BLOCK_SIZE > 11)
1138
1139 ndw += (nptes >> 11) * 4;
1140 else
1141
1142
1143 ndw += (nptes >> RADEON_VM_BLOCK_SIZE) * 4;
1144
1145
1146 ndw += nptes * 2;
1147
1148
1149 ndw += (npdes >> 11) * 4;
1150
1151
1152 ndw += npdes * 2;
1153
1154
1155 if (ndw > 0xfffff)
1156 return -ENOMEM;
1157
1158 r = radeon_ib_get(rdev, ridx, &ib, NULL, ndw * 4);
1159 ib.length_dw = 0;
1160
1161 r = radeon_vm_update_pdes(rdev, vm, &ib, bo_va->soffset, bo_va->eoffset);
1162 if (r) {
1163 radeon_ib_free(rdev, &ib);
1164 return r;
1165 }
1166
1167 radeon_vm_update_ptes(rdev, vm, &ib, bo_va->soffset, bo_va->eoffset,
1168 addr, bo_va->flags);
1169
1170 radeon_ib_sync_to(&ib, vm->fence);
1171 r = radeon_ib_schedule(rdev, &ib, NULL);
1172 if (r) {
1173 radeon_ib_free(rdev, &ib);
1174 return r;
1175 }
1176 radeon_fence_unref(&vm->fence);
1177 vm->fence = radeon_fence_ref(ib.fence);
1178 radeon_ib_free(rdev, &ib);
1179 radeon_fence_unref(&vm->last_flush);
1180
1181 return 0;
1182}
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197int radeon_vm_bo_rmv(struct radeon_device *rdev,
1198 struct radeon_bo_va *bo_va)
1199{
1200 int r;
1201
1202 mutex_lock(&rdev->vm_manager.lock);
1203 mutex_lock(&bo_va->vm->mutex);
1204 r = radeon_vm_bo_update_pte(rdev, bo_va->vm, bo_va->bo, NULL);
1205 mutex_unlock(&rdev->vm_manager.lock);
1206 list_del(&bo_va->vm_list);
1207 mutex_unlock(&bo_va->vm->mutex);
1208 list_del(&bo_va->bo_list);
1209
1210 kfree(bo_va);
1211 return r;
1212}
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223void radeon_vm_bo_invalidate(struct radeon_device *rdev,
1224 struct radeon_bo *bo)
1225{
1226 struct radeon_bo_va *bo_va;
1227
1228 list_for_each_entry(bo_va, &bo->va, bo_list) {
1229 bo_va->valid = false;
1230 }
1231}
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241void radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
1242{
1243 vm->id = 0;
1244 vm->fence = NULL;
1245 mutex_init(&vm->mutex);
1246 INIT_LIST_HEAD(&vm->list);
1247 INIT_LIST_HEAD(&vm->va);
1248}
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm)
1260{
1261 struct radeon_bo_va *bo_va, *tmp;
1262 int r;
1263
1264 mutex_lock(&rdev->vm_manager.lock);
1265 mutex_lock(&vm->mutex);
1266 radeon_vm_free_pt(rdev, vm);
1267 mutex_unlock(&rdev->vm_manager.lock);
1268
1269 if (!list_empty(&vm->va)) {
1270 dev_err(rdev->dev, "still active bo inside vm\n");
1271 }
1272 list_for_each_entry_safe(bo_va, tmp, &vm->va, vm_list) {
1273 list_del_init(&bo_va->vm_list);
1274 r = radeon_bo_reserve(bo_va->bo, false);
1275 if (!r) {
1276 list_del_init(&bo_va->bo_list);
1277 radeon_bo_unreserve(bo_va->bo);
1278 kfree(bo_va);
1279 }
1280 }
1281 radeon_fence_unref(&vm->fence);
1282 radeon_fence_unref(&vm->last_flush);
1283 mutex_unlock(&vm->mutex);
1284}
1285