radeon_ttm.c revision 1.2 1 /*
2 * Copyright 2009 Jerome Glisse.
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
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
16 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
17 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
18 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
19 * USE OR OTHER DEALINGS IN THE SOFTWARE.
20 *
21 * The above copyright notice and this permission notice (including the
22 * next paragraph) shall be included in all copies or substantial portions
23 * of the Software.
24 *
25 */
26 /*
27 * Authors:
28 * Jerome Glisse <glisse (at) freedesktop.org>
29 * Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
30 * Dave Airlie
31 */
32 #include <ttm/ttm_bo_api.h>
33 #include <ttm/ttm_bo_driver.h>
34 #include <ttm/ttm_placement.h>
35 #include <ttm/ttm_module.h>
36 #include <ttm/ttm_page_alloc.h>
37 #include <drm/drmP.h>
38 #include <drm/radeon_drm.h>
39 #include <linux/seq_file.h>
40 #include <linux/slab.h>
41 #include <linux/swiotlb.h>
42 #include <linux/debugfs.h>
43 #include "radeon_reg.h"
44 #include "radeon.h"
45
46 #ifdef __NetBSD__
47 #include <uvm/uvm_extern.h>
48 #include <uvm/uvm_param.h>
49 #include <drm/bus_dma_hacks.h>
50 #endif
51
52 #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
53
54 static int radeon_ttm_debugfs_init(struct radeon_device *rdev);
55 static void radeon_ttm_debugfs_fini(struct radeon_device *rdev);
56
57 static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
58 {
59 struct radeon_mman *mman;
60 struct radeon_device *rdev;
61
62 mman = container_of(bdev, struct radeon_mman, bdev);
63 rdev = container_of(mman, struct radeon_device, mman);
64 return rdev;
65 }
66
67
68 /*
69 * Global memory.
70 */
71 static int radeon_ttm_mem_global_init(struct drm_global_reference *ref)
72 {
73 return ttm_mem_global_init(ref->object);
74 }
75
76 static void radeon_ttm_mem_global_release(struct drm_global_reference *ref)
77 {
78 ttm_mem_global_release(ref->object);
79 }
80
81 static int radeon_ttm_global_init(struct radeon_device *rdev)
82 {
83 struct drm_global_reference *global_ref;
84 int r;
85
86 rdev->mman.mem_global_referenced = false;
87 global_ref = &rdev->mman.mem_global_ref;
88 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
89 global_ref->size = sizeof(struct ttm_mem_global);
90 global_ref->init = &radeon_ttm_mem_global_init;
91 global_ref->release = &radeon_ttm_mem_global_release;
92 r = drm_global_item_ref(global_ref);
93 if (r != 0) {
94 DRM_ERROR("Failed setting up TTM memory accounting "
95 "subsystem.\n");
96 return r;
97 }
98
99 rdev->mman.bo_global_ref.mem_glob =
100 rdev->mman.mem_global_ref.object;
101 global_ref = &rdev->mman.bo_global_ref.ref;
102 global_ref->global_type = DRM_GLOBAL_TTM_BO;
103 global_ref->size = sizeof(struct ttm_bo_global);
104 global_ref->init = &ttm_bo_global_init;
105 global_ref->release = &ttm_bo_global_release;
106 r = drm_global_item_ref(global_ref);
107 if (r != 0) {
108 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
109 drm_global_item_unref(&rdev->mman.mem_global_ref);
110 return r;
111 }
112
113 rdev->mman.mem_global_referenced = true;
114 return 0;
115 }
116
117 static void radeon_ttm_global_fini(struct radeon_device *rdev)
118 {
119 if (rdev->mman.mem_global_referenced) {
120 drm_global_item_unref(&rdev->mman.bo_global_ref.ref);
121 drm_global_item_unref(&rdev->mman.mem_global_ref);
122 rdev->mman.mem_global_referenced = false;
123 }
124 }
125
126 static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
127 {
128 return 0;
129 }
130
131 static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
132 struct ttm_mem_type_manager *man)
133 {
134 struct radeon_device *rdev;
135
136 rdev = radeon_get_rdev(bdev);
137
138 switch (type) {
139 case TTM_PL_SYSTEM:
140 /* System memory */
141 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
142 man->available_caching = TTM_PL_MASK_CACHING;
143 man->default_caching = TTM_PL_FLAG_CACHED;
144 break;
145 case TTM_PL_TT:
146 man->func = &ttm_bo_manager_func;
147 man->gpu_offset = rdev->mc.gtt_start;
148 man->available_caching = TTM_PL_MASK_CACHING;
149 man->default_caching = TTM_PL_FLAG_CACHED;
150 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | TTM_MEMTYPE_FLAG_CMA;
151 #if __OS_HAS_AGP
152 if (rdev->flags & RADEON_IS_AGP) {
153 if (!rdev->ddev->agp) {
154 DRM_ERROR("AGP is not enabled for memory type %u\n",
155 (unsigned)type);
156 return -EINVAL;
157 }
158 if (!rdev->ddev->agp->cant_use_aperture)
159 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
160 man->available_caching = TTM_PL_FLAG_UNCACHED |
161 TTM_PL_FLAG_WC;
162 man->default_caching = TTM_PL_FLAG_WC;
163 }
164 #endif
165 break;
166 case TTM_PL_VRAM:
167 /* "On-card" video ram */
168 man->func = &ttm_bo_manager_func;
169 man->gpu_offset = rdev->mc.vram_start;
170 man->flags = TTM_MEMTYPE_FLAG_FIXED |
171 TTM_MEMTYPE_FLAG_MAPPABLE;
172 man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC;
173 man->default_caching = TTM_PL_FLAG_WC;
174 break;
175 default:
176 DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
177 return -EINVAL;
178 }
179 return 0;
180 }
181
182 static void radeon_evict_flags(struct ttm_buffer_object *bo,
183 struct ttm_placement *placement)
184 {
185 struct radeon_bo *rbo;
186 static u32 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
187
188 if (!radeon_ttm_bo_is_radeon_bo(bo)) {
189 placement->fpfn = 0;
190 placement->lpfn = 0;
191 placement->placement = &placements;
192 placement->busy_placement = &placements;
193 placement->num_placement = 1;
194 placement->num_busy_placement = 1;
195 return;
196 }
197 rbo = container_of(bo, struct radeon_bo, tbo);
198 switch (bo->mem.mem_type) {
199 case TTM_PL_VRAM:
200 if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false)
201 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
202 else
203 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
204 break;
205 case TTM_PL_TT:
206 default:
207 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
208 }
209 *placement = rbo->placement;
210 }
211
212 static int radeon_verify_access(struct ttm_buffer_object *bo, struct file *filp)
213 {
214 struct radeon_bo *rbo = container_of(bo, struct radeon_bo, tbo);
215
216 return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp);
217 }
218
219 static void radeon_move_null(struct ttm_buffer_object *bo,
220 struct ttm_mem_reg *new_mem)
221 {
222 struct ttm_mem_reg *old_mem = &bo->mem;
223
224 BUG_ON(old_mem->mm_node != NULL);
225 *old_mem = *new_mem;
226 new_mem->mm_node = NULL;
227 }
228
229 static int radeon_move_blit(struct ttm_buffer_object *bo,
230 bool evict, bool no_wait_gpu,
231 struct ttm_mem_reg *new_mem,
232 struct ttm_mem_reg *old_mem)
233 {
234 struct radeon_device *rdev;
235 uint64_t old_start, new_start;
236 struct radeon_fence *fence;
237 int r, ridx;
238
239 rdev = radeon_get_rdev(bo->bdev);
240 ridx = radeon_copy_ring_index(rdev);
241 old_start = old_mem->start << PAGE_SHIFT;
242 new_start = new_mem->start << PAGE_SHIFT;
243
244 switch (old_mem->mem_type) {
245 case TTM_PL_VRAM:
246 old_start += rdev->mc.vram_start;
247 break;
248 case TTM_PL_TT:
249 old_start += rdev->mc.gtt_start;
250 break;
251 default:
252 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
253 return -EINVAL;
254 }
255 switch (new_mem->mem_type) {
256 case TTM_PL_VRAM:
257 new_start += rdev->mc.vram_start;
258 break;
259 case TTM_PL_TT:
260 new_start += rdev->mc.gtt_start;
261 break;
262 default:
263 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
264 return -EINVAL;
265 }
266 if (!rdev->ring[ridx].ready) {
267 DRM_ERROR("Trying to move memory with ring turned off.\n");
268 return -EINVAL;
269 }
270
271 BUILD_BUG_ON((PAGE_SIZE % RADEON_GPU_PAGE_SIZE) != 0);
272
273 /* sync other rings */
274 fence = bo->sync_obj;
275 r = radeon_copy(rdev, old_start, new_start,
276 new_mem->num_pages * (PAGE_SIZE / RADEON_GPU_PAGE_SIZE), /* GPU pages */
277 &fence);
278 /* FIXME: handle copy error */
279 r = ttm_bo_move_accel_cleanup(bo, (void *)fence,
280 evict, no_wait_gpu, new_mem);
281 radeon_fence_unref(&fence);
282 return r;
283 }
284
285 static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
286 bool evict, bool interruptible,
287 bool no_wait_gpu,
288 struct ttm_mem_reg *new_mem)
289 {
290 struct radeon_device *rdev __unused;
291 struct ttm_mem_reg *old_mem = &bo->mem;
292 struct ttm_mem_reg tmp_mem;
293 u32 placements;
294 struct ttm_placement placement;
295 int r;
296
297 rdev = radeon_get_rdev(bo->bdev);
298 tmp_mem = *new_mem;
299 tmp_mem.mm_node = NULL;
300 placement.fpfn = 0;
301 placement.lpfn = 0;
302 placement.num_placement = 1;
303 placement.placement = &placements;
304 placement.num_busy_placement = 1;
305 placement.busy_placement = &placements;
306 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
307 r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
308 interruptible, no_wait_gpu);
309 if (unlikely(r)) {
310 return r;
311 }
312
313 r = ttm_tt_set_placement_caching(bo->ttm, tmp_mem.placement);
314 if (unlikely(r)) {
315 goto out_cleanup;
316 }
317
318 r = ttm_tt_bind(bo->ttm, &tmp_mem);
319 if (unlikely(r)) {
320 goto out_cleanup;
321 }
322 r = radeon_move_blit(bo, true, no_wait_gpu, &tmp_mem, old_mem);
323 if (unlikely(r)) {
324 goto out_cleanup;
325 }
326 r = ttm_bo_move_ttm(bo, true, no_wait_gpu, new_mem);
327 out_cleanup:
328 ttm_bo_mem_put(bo, &tmp_mem);
329 return r;
330 }
331
332 static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
333 bool evict, bool interruptible,
334 bool no_wait_gpu,
335 struct ttm_mem_reg *new_mem)
336 {
337 struct radeon_device *rdev __unused;
338 struct ttm_mem_reg *old_mem = &bo->mem;
339 struct ttm_mem_reg tmp_mem;
340 struct ttm_placement placement;
341 u32 placements;
342 int r;
343
344 rdev = radeon_get_rdev(bo->bdev);
345 tmp_mem = *new_mem;
346 tmp_mem.mm_node = NULL;
347 placement.fpfn = 0;
348 placement.lpfn = 0;
349 placement.num_placement = 1;
350 placement.placement = &placements;
351 placement.num_busy_placement = 1;
352 placement.busy_placement = &placements;
353 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
354 r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
355 interruptible, no_wait_gpu);
356 if (unlikely(r)) {
357 return r;
358 }
359 r = ttm_bo_move_ttm(bo, true, no_wait_gpu, &tmp_mem);
360 if (unlikely(r)) {
361 goto out_cleanup;
362 }
363 r = radeon_move_blit(bo, true, no_wait_gpu, new_mem, old_mem);
364 if (unlikely(r)) {
365 goto out_cleanup;
366 }
367 out_cleanup:
368 ttm_bo_mem_put(bo, &tmp_mem);
369 return r;
370 }
371
372 static int radeon_bo_move(struct ttm_buffer_object *bo,
373 bool evict, bool interruptible,
374 bool no_wait_gpu,
375 struct ttm_mem_reg *new_mem)
376 {
377 struct radeon_device *rdev;
378 struct ttm_mem_reg *old_mem = &bo->mem;
379 int r;
380
381 rdev = radeon_get_rdev(bo->bdev);
382 if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
383 radeon_move_null(bo, new_mem);
384 return 0;
385 }
386 if ((old_mem->mem_type == TTM_PL_TT &&
387 new_mem->mem_type == TTM_PL_SYSTEM) ||
388 (old_mem->mem_type == TTM_PL_SYSTEM &&
389 new_mem->mem_type == TTM_PL_TT)) {
390 /* bind is enough */
391 radeon_move_null(bo, new_mem);
392 return 0;
393 }
394 if (!rdev->ring[radeon_copy_ring_index(rdev)].ready ||
395 rdev->asic->copy.copy == NULL) {
396 /* use memcpy */
397 goto memcpy;
398 }
399
400 if (old_mem->mem_type == TTM_PL_VRAM &&
401 new_mem->mem_type == TTM_PL_SYSTEM) {
402 r = radeon_move_vram_ram(bo, evict, interruptible,
403 no_wait_gpu, new_mem);
404 } else if (old_mem->mem_type == TTM_PL_SYSTEM &&
405 new_mem->mem_type == TTM_PL_VRAM) {
406 r = radeon_move_ram_vram(bo, evict, interruptible,
407 no_wait_gpu, new_mem);
408 } else {
409 r = radeon_move_blit(bo, evict, no_wait_gpu, new_mem, old_mem);
410 }
411
412 if (r) {
413 memcpy:
414 r = ttm_bo_move_memcpy(bo, evict, no_wait_gpu, new_mem);
415 if (r) {
416 return r;
417 }
418 }
419
420 /* update statistics */
421 atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &rdev->num_bytes_moved);
422 return 0;
423 }
424
425 static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
426 {
427 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
428 struct radeon_device *rdev = radeon_get_rdev(bdev);
429
430 mem->bus.addr = NULL;
431 mem->bus.offset = 0;
432 mem->bus.size = mem->num_pages << PAGE_SHIFT;
433 mem->bus.base = 0;
434 mem->bus.is_iomem = false;
435 if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE))
436 return -EINVAL;
437 switch (mem->mem_type) {
438 case TTM_PL_SYSTEM:
439 /* system memory */
440 return 0;
441 case TTM_PL_TT:
442 #if __OS_HAS_AGP
443 if (rdev->flags & RADEON_IS_AGP) {
444 /* RADEON_IS_AGP is set only if AGP is active */
445 mem->bus.offset = mem->start << PAGE_SHIFT;
446 mem->bus.base = rdev->mc.agp_base;
447 mem->bus.is_iomem = !rdev->ddev->agp->cant_use_aperture;
448 }
449 #endif
450 break;
451 case TTM_PL_VRAM:
452 mem->bus.offset = mem->start << PAGE_SHIFT;
453 /* check if it's visible */
454 if ((mem->bus.offset + mem->bus.size) > rdev->mc.visible_vram_size)
455 return -EINVAL;
456 mem->bus.base = rdev->mc.aper_base;
457 mem->bus.is_iomem = true;
458 #ifdef __alpha__
459 /*
460 * Alpha: use bus.addr to hold the ioremap() return,
461 * so we can modify bus.base below.
462 */
463 if (mem->placement & TTM_PL_FLAG_WC)
464 mem->bus.addr =
465 ioremap_wc(mem->bus.base + mem->bus.offset,
466 mem->bus.size);
467 else
468 mem->bus.addr =
469 ioremap_nocache(mem->bus.base + mem->bus.offset,
470 mem->bus.size);
471
472 /*
473 * Alpha: Use just the bus offset plus
474 * the hose/domain memory base for bus.base.
475 * It then can be used to build PTEs for VRAM
476 * access, as done in ttm_bo_vm_fault().
477 */
478 mem->bus.base = (mem->bus.base & 0x0ffffffffUL) +
479 rdev->ddev->hose->dense_mem_base;
480 #endif
481 break;
482 default:
483 return -EINVAL;
484 }
485 return 0;
486 }
487
488 static void radeon_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
489 {
490 }
491
492 static int radeon_sync_obj_wait(void *sync_obj, bool lazy, bool interruptible)
493 {
494 return radeon_fence_wait((struct radeon_fence *)sync_obj, interruptible);
495 }
496
497 static int radeon_sync_obj_flush(void *sync_obj)
498 {
499 return 0;
500 }
501
502 static void radeon_sync_obj_unref(void **sync_obj)
503 {
504 radeon_fence_unref((struct radeon_fence **)sync_obj);
505 }
506
507 static void *radeon_sync_obj_ref(void *sync_obj)
508 {
509 return radeon_fence_ref((struct radeon_fence *)sync_obj);
510 }
511
512 static bool radeon_sync_obj_signaled(void *sync_obj)
513 {
514 return radeon_fence_signaled((struct radeon_fence *)sync_obj);
515 }
516
517 /*
518 * TTM backend functions.
519 */
520 struct radeon_ttm_tt {
521 struct ttm_dma_tt ttm;
522 struct radeon_device *rdev;
523 u64 offset;
524 };
525
526 static int radeon_ttm_backend_bind(struct ttm_tt *ttm,
527 struct ttm_mem_reg *bo_mem)
528 {
529 struct radeon_ttm_tt *gtt = (void*)ttm;
530 int r;
531
532 gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
533 if (!ttm->num_pages) {
534 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
535 ttm->num_pages, bo_mem, ttm);
536 }
537 r = radeon_gart_bind(gtt->rdev, gtt->offset,
538 ttm->num_pages, ttm->pages, gtt->ttm.dma_address);
539 if (r) {
540 DRM_ERROR("failed to bind %lu pages at 0x%08X\n",
541 ttm->num_pages, (unsigned)gtt->offset);
542 return r;
543 }
544 return 0;
545 }
546
547 static int radeon_ttm_backend_unbind(struct ttm_tt *ttm)
548 {
549 struct radeon_ttm_tt *gtt = (void *)ttm;
550
551 radeon_gart_unbind(gtt->rdev, gtt->offset, ttm->num_pages);
552 return 0;
553 }
554
555 static void radeon_ttm_backend_destroy(struct ttm_tt *ttm)
556 {
557 struct radeon_ttm_tt *gtt = (void *)ttm;
558
559 ttm_dma_tt_fini(>t->ttm);
560 kfree(gtt);
561 }
562
563 static struct ttm_backend_func radeon_backend_func = {
564 .bind = &radeon_ttm_backend_bind,
565 .unbind = &radeon_ttm_backend_unbind,
566 .destroy = &radeon_ttm_backend_destroy,
567 };
568
569 static struct ttm_tt *radeon_ttm_tt_create(struct ttm_bo_device *bdev,
570 unsigned long size, uint32_t page_flags,
571 struct page *dummy_read_page)
572 {
573 struct radeon_device *rdev;
574 struct radeon_ttm_tt *gtt;
575
576 rdev = radeon_get_rdev(bdev);
577 #if __OS_HAS_AGP
578 if (rdev->flags & RADEON_IS_AGP) {
579 return ttm_agp_tt_create(bdev, rdev->ddev->agp->bridge,
580 size, page_flags, dummy_read_page);
581 }
582 #endif
583
584 gtt = kzalloc(sizeof(struct radeon_ttm_tt), GFP_KERNEL);
585 if (gtt == NULL) {
586 return NULL;
587 }
588 gtt->ttm.ttm.func = &radeon_backend_func;
589 gtt->rdev = rdev;
590 if (ttm_dma_tt_init(>t->ttm, bdev, size, page_flags, dummy_read_page)) {
591 kfree(gtt);
592 return NULL;
593 }
594 return >t->ttm.ttm;
595 }
596
597 static int radeon_ttm_tt_populate(struct ttm_tt *ttm)
598 {
599 struct radeon_device *rdev;
600 struct radeon_ttm_tt *gtt = (void *)ttm;
601 #ifndef __NetBSD__
602 unsigned i;
603 int r;
604 #endif
605 bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
606
607 if (ttm->state != tt_unpopulated)
608 return 0;
609
610 if (slave && ttm->sg) {
611 #ifdef __NetBSD__ /* XXX drm prime */
612 return -EINVAL;
613 #else
614 drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
615 gtt->ttm.dma_address, ttm->num_pages);
616 ttm->state = tt_unbound;
617 return 0;
618 #endif
619 }
620
621 rdev = radeon_get_rdev(ttm->bdev);
622 #if __OS_HAS_AGP
623 if (rdev->flags & RADEON_IS_AGP) {
624 return ttm_agp_tt_populate(ttm);
625 }
626 #endif
627
628 #ifdef __NetBSD__
629 /* XXX errno NetBSD->Linux */
630 return ttm_bus_dma_populate(>t->ttm);
631 #else
632
633 #ifdef CONFIG_SWIOTLB
634 if (swiotlb_nr_tbl()) {
635 return ttm_dma_populate(>t->ttm, rdev->dev);
636 }
637 #endif
638
639 r = ttm_pool_populate(ttm);
640 if (r) {
641 return r;
642 }
643
644 for (i = 0; i < ttm->num_pages; i++) {
645 gtt->ttm.dma_address[i] = pci_map_page(rdev->pdev, ttm->pages[i],
646 0, PAGE_SIZE,
647 PCI_DMA_BIDIRECTIONAL);
648 if (pci_dma_mapping_error(rdev->pdev, gtt->ttm.dma_address[i])) {
649 while (--i) {
650 pci_unmap_page(rdev->pdev, gtt->ttm.dma_address[i],
651 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
652 gtt->ttm.dma_address[i] = 0;
653 }
654 ttm_pool_unpopulate(ttm);
655 return -EFAULT;
656 }
657 }
658 return 0;
659 #endif
660 }
661
662 static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm)
663 {
664 struct radeon_device *rdev;
665 struct radeon_ttm_tt *gtt = (void *)ttm;
666 #ifndef __NetBSD__
667 unsigned i;
668 #endif
669 bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
670
671 if (slave)
672 return;
673
674 rdev = radeon_get_rdev(ttm->bdev);
675 #if __OS_HAS_AGP
676 if (rdev->flags & RADEON_IS_AGP) {
677 ttm_agp_tt_unpopulate(ttm);
678 return;
679 }
680 #endif
681
682 #ifdef __NetBSD__
683 ttm_bus_dma_unpopulate(>t->ttm);
684 return;
685 #else
686
687 #ifdef CONFIG_SWIOTLB
688 if (swiotlb_nr_tbl()) {
689 ttm_dma_unpopulate(>t->ttm, rdev->dev);
690 return;
691 }
692 #endif
693
694 for (i = 0; i < ttm->num_pages; i++) {
695 if (gtt->ttm.dma_address[i]) {
696 pci_unmap_page(rdev->pdev, gtt->ttm.dma_address[i],
697 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
698 }
699 }
700
701 ttm_pool_unpopulate(ttm);
702 #endif
703 }
704
705 static struct ttm_bo_driver radeon_bo_driver = {
706 .ttm_tt_create = &radeon_ttm_tt_create,
707 .ttm_tt_populate = &radeon_ttm_tt_populate,
708 .ttm_tt_unpopulate = &radeon_ttm_tt_unpopulate,
709 .invalidate_caches = &radeon_invalidate_caches,
710 .init_mem_type = &radeon_init_mem_type,
711 .evict_flags = &radeon_evict_flags,
712 .move = &radeon_bo_move,
713 .verify_access = &radeon_verify_access,
714 .sync_obj_signaled = &radeon_sync_obj_signaled,
715 .sync_obj_wait = &radeon_sync_obj_wait,
716 .sync_obj_flush = &radeon_sync_obj_flush,
717 .sync_obj_unref = &radeon_sync_obj_unref,
718 .sync_obj_ref = &radeon_sync_obj_ref,
719 .move_notify = &radeon_bo_move_notify,
720 .fault_reserve_notify = &radeon_bo_fault_reserve_notify,
721 .io_mem_reserve = &radeon_ttm_io_mem_reserve,
722 .io_mem_free = &radeon_ttm_io_mem_free,
723 };
724
725 int radeon_ttm_init(struct radeon_device *rdev)
726 {
727 int r;
728
729 r = radeon_ttm_global_init(rdev);
730 if (r) {
731 return r;
732 }
733 /* No others user of address space so set it to 0 */
734 r = ttm_bo_device_init(&rdev->mman.bdev,
735 rdev->mman.bo_global_ref.ref.object,
736 &radeon_bo_driver,
737 #ifdef __NetBSD__
738 rdev->ddev->bst,
739 rdev->ddev->dmat,
740 #else
741 rdev->ddev->anon_inode->i_mapping,
742 #endif
743 DRM_FILE_PAGE_OFFSET,
744 rdev->need_dma32);
745 if (r) {
746 DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
747 return r;
748 }
749 rdev->mman.initialized = true;
750 r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_VRAM,
751 rdev->mc.real_vram_size >> PAGE_SHIFT);
752 if (r) {
753 DRM_ERROR("Failed initializing VRAM heap.\n");
754 return r;
755 }
756 /* Change the size here instead of the init above so only lpfn is affected */
757 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
758
759 r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
760 RADEON_GEM_DOMAIN_VRAM,
761 NULL, &rdev->stollen_vga_memory);
762 if (r) {
763 return r;
764 }
765 r = radeon_bo_reserve(rdev->stollen_vga_memory, false);
766 if (r)
767 return r;
768 r = radeon_bo_pin(rdev->stollen_vga_memory, RADEON_GEM_DOMAIN_VRAM, NULL);
769 radeon_bo_unreserve(rdev->stollen_vga_memory);
770 if (r) {
771 radeon_bo_unref(&rdev->stollen_vga_memory);
772 return r;
773 }
774 DRM_INFO("radeon: %uM of VRAM memory ready\n",
775 (unsigned) (rdev->mc.real_vram_size / (1024 * 1024)));
776 r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_TT,
777 rdev->mc.gtt_size >> PAGE_SHIFT);
778 if (r) {
779 DRM_ERROR("Failed initializing GTT heap.\n");
780 return r;
781 }
782 DRM_INFO("radeon: %uM of GTT memory ready.\n",
783 (unsigned)(rdev->mc.gtt_size / (1024 * 1024)));
784
785 r = radeon_ttm_debugfs_init(rdev);
786 if (r) {
787 DRM_ERROR("Failed to init debugfs\n");
788 return r;
789 }
790 return 0;
791 }
792
793 void radeon_ttm_fini(struct radeon_device *rdev)
794 {
795 int r;
796
797 if (!rdev->mman.initialized)
798 return;
799 radeon_ttm_debugfs_fini(rdev);
800 if (rdev->stollen_vga_memory) {
801 r = radeon_bo_reserve(rdev->stollen_vga_memory, false);
802 if (r == 0) {
803 radeon_bo_unpin(rdev->stollen_vga_memory);
804 radeon_bo_unreserve(rdev->stollen_vga_memory);
805 }
806 radeon_bo_unref(&rdev->stollen_vga_memory);
807 }
808 ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_VRAM);
809 ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT);
810 ttm_bo_device_release(&rdev->mman.bdev);
811 radeon_gart_fini(rdev);
812 radeon_ttm_global_fini(rdev);
813 rdev->mman.initialized = false;
814 DRM_INFO("radeon: ttm finalized\n");
815 }
816
817 /* this should only be called at bootup or when userspace
818 * isn't running */
819 void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size)
820 {
821 struct ttm_mem_type_manager *man;
822
823 if (!rdev->mman.initialized)
824 return;
825
826 man = &rdev->mman.bdev.man[TTM_PL_VRAM];
827 /* this just adjusts TTM size idea, which sets lpfn to the correct value */
828 man->size = size >> PAGE_SHIFT;
829 }
830
831 #ifdef __NetBSD__
832
833 #include <uvm/uvm_fault.h>
834
835 int
836 radeon_ttm_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr,
837 struct vm_page **pps, int npages, int centeridx, vm_prot_t access_type,
838 int flags)
839 {
840 struct uvm_object *const uobj = ufi->entry->object.uvm_obj;
841 struct ttm_buffer_object *const bo = container_of(uobj,
842 struct ttm_buffer_object, uvmobj);
843 struct radeon_device *const rdev = radeon_get_rdev(bo->bdev);
844 int error;
845
846 KASSERT(rdev != NULL);
847 down_read(&rdev->pm.mclk_lock);
848 error = ttm_bo_uvm_fault(ufi, vaddr, pps, npages, centeridx,
849 access_type, flags);
850 up_read(&rdev->pm.mclk_lock);
851
852 return error;
853 }
854
855 int
856 radeon_mmap_object(struct drm_device *dev, off_t offset, size_t size,
857 vm_prot_t prot, struct uvm_object **uobjp, voff_t *uoffsetp,
858 struct file *file)
859 {
860 struct radeon_device *rdev = dev->dev_private;
861
862 KASSERT(0 == (offset & ~(PAGE_SIZE - 1)));
863
864 if (__predict_false(rdev == NULL)) /* XXX How?? */
865 return -EINVAL;
866
867 if (__predict_false((offset >> PAGE_SHIFT) < DRM_FILE_PAGE_OFFSET))
868 return drm_mmap_object(dev, offset, size, prot, uobjp,
869 uoffsetp /* , file */);
870 else
871 return ttm_bo_mmap_object(&rdev->mman.bdev, offset, size, prot,
872 uobjp, uoffsetp, file);
873 }
874
875 #else
876
877 static struct vm_operations_struct radeon_ttm_vm_ops;
878 static const struct vm_operations_struct *ttm_vm_ops = NULL;
879
880 static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
881 {
882 struct ttm_buffer_object *bo;
883 struct radeon_device *rdev;
884 int r;
885
886 bo = (struct ttm_buffer_object *)vma->vm_private_data;
887 if (bo == NULL) {
888 return VM_FAULT_NOPAGE;
889 }
890 rdev = radeon_get_rdev(bo->bdev);
891 down_read(&rdev->pm.mclk_lock);
892 r = ttm_vm_ops->fault(vma, vmf);
893 up_read(&rdev->pm.mclk_lock);
894 return r;
895 }
896
897 int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
898 {
899 struct drm_file *file_priv;
900 struct radeon_device *rdev;
901 int r;
902
903 if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) {
904 return drm_mmap(filp, vma);
905 }
906
907 file_priv = filp->private_data;
908 rdev = file_priv->minor->dev->dev_private;
909 if (rdev == NULL) {
910 return -EINVAL;
911 }
912 r = ttm_bo_mmap(filp, vma, &rdev->mman.bdev);
913 if (unlikely(r != 0)) {
914 return r;
915 }
916 if (unlikely(ttm_vm_ops == NULL)) {
917 ttm_vm_ops = vma->vm_ops;
918 radeon_ttm_vm_ops = *ttm_vm_ops;
919 radeon_ttm_vm_ops.fault = &radeon_ttm_fault;
920 }
921 vma->vm_ops = &radeon_ttm_vm_ops;
922 return 0;
923 }
924
925 #endif /* __NetBSD__ */
926
927 #if defined(CONFIG_DEBUG_FS)
928
929 static int radeon_mm_dump_table(struct seq_file *m, void *data)
930 {
931 struct drm_info_node *node = (struct drm_info_node *)m->private;
932 unsigned ttm_pl = *(int *)node->info_ent->data;
933 struct drm_device *dev = node->minor->dev;
934 struct radeon_device *rdev = dev->dev_private;
935 struct drm_mm *mm = (struct drm_mm *)rdev->mman.bdev.man[ttm_pl].priv;
936 int ret;
937 struct ttm_bo_global *glob = rdev->mman.bdev.glob;
938
939 spin_lock(&glob->lru_lock);
940 ret = drm_mm_dump_table(m, mm);
941 spin_unlock(&glob->lru_lock);
942 return ret;
943 }
944
945 static int ttm_pl_vram = TTM_PL_VRAM;
946 static int ttm_pl_tt = TTM_PL_TT;
947
948 static struct drm_info_list radeon_ttm_debugfs_list[] = {
949 {"radeon_vram_mm", radeon_mm_dump_table, 0, &ttm_pl_vram},
950 {"radeon_gtt_mm", radeon_mm_dump_table, 0, &ttm_pl_tt},
951 {"ttm_page_pool", ttm_page_alloc_debugfs, 0, NULL},
952 #ifdef CONFIG_SWIOTLB
953 {"ttm_dma_page_pool", ttm_dma_page_alloc_debugfs, 0, NULL}
954 #endif
955 };
956
957 static int radeon_ttm_vram_open(struct inode *inode, struct file *filep)
958 {
959 struct radeon_device *rdev = inode->i_private;
960 i_size_write(inode, rdev->mc.mc_vram_size);
961 filep->private_data = inode->i_private;
962 return 0;
963 }
964
965 static ssize_t radeon_ttm_vram_read(struct file *f, char __user *buf,
966 size_t size, loff_t *pos)
967 {
968 struct radeon_device *rdev = f->private_data;
969 ssize_t result = 0;
970 int r;
971
972 if (size & 0x3 || *pos & 0x3)
973 return -EINVAL;
974
975 while (size) {
976 unsigned long flags;
977 uint32_t value;
978
979 if (*pos >= rdev->mc.mc_vram_size)
980 return result;
981
982 spin_lock_irqsave(&rdev->mmio_idx_lock, flags);
983 WREG32(RADEON_MM_INDEX, ((uint32_t)*pos) | 0x80000000);
984 if (rdev->family >= CHIP_CEDAR)
985 WREG32(EVERGREEN_MM_INDEX_HI, *pos >> 31);
986 value = RREG32(RADEON_MM_DATA);
987 spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);
988
989 r = put_user(value, (uint32_t *)buf);
990 if (r)
991 return r;
992
993 result += 4;
994 buf += 4;
995 *pos += 4;
996 size -= 4;
997 }
998
999 return result;
1000 }
1001
1002 static const struct file_operations radeon_ttm_vram_fops = {
1003 .owner = THIS_MODULE,
1004 .open = radeon_ttm_vram_open,
1005 .read = radeon_ttm_vram_read,
1006 .llseek = default_llseek
1007 };
1008
1009 static int radeon_ttm_gtt_open(struct inode *inode, struct file *filep)
1010 {
1011 struct radeon_device *rdev = inode->i_private;
1012 i_size_write(inode, rdev->mc.gtt_size);
1013 filep->private_data = inode->i_private;
1014 return 0;
1015 }
1016
1017 static ssize_t radeon_ttm_gtt_read(struct file *f, char __user *buf,
1018 size_t size, loff_t *pos)
1019 {
1020 struct radeon_device *rdev = f->private_data;
1021 ssize_t result = 0;
1022 int r;
1023
1024 while (size) {
1025 loff_t p = *pos / PAGE_SIZE;
1026 unsigned off = *pos & ~PAGE_MASK;
1027 size_t cur_size = min_t(size_t, size, PAGE_SIZE - off);
1028 struct page *page;
1029 void *ptr;
1030
1031 if (p >= rdev->gart.num_cpu_pages)
1032 return result;
1033
1034 page = rdev->gart.pages[p];
1035 if (page) {
1036 ptr = kmap(page);
1037 ptr += off;
1038
1039 r = copy_to_user(buf, ptr, cur_size);
1040 kunmap(rdev->gart.pages[p]);
1041 } else
1042 r = clear_user(buf, cur_size);
1043
1044 if (r)
1045 return -EFAULT;
1046
1047 result += cur_size;
1048 buf += cur_size;
1049 *pos += cur_size;
1050 size -= cur_size;
1051 }
1052
1053 return result;
1054 }
1055
1056 static const struct file_operations radeon_ttm_gtt_fops = {
1057 .owner = THIS_MODULE,
1058 .open = radeon_ttm_gtt_open,
1059 .read = radeon_ttm_gtt_read,
1060 .llseek = default_llseek
1061 };
1062
1063 #endif
1064
1065 static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
1066 {
1067 #if defined(CONFIG_DEBUG_FS)
1068 unsigned count;
1069
1070 struct drm_minor *minor = rdev->ddev->primary;
1071 struct dentry *ent, *root = minor->debugfs_root;
1072
1073 ent = debugfs_create_file("radeon_vram", S_IFREG | S_IRUGO, root,
1074 rdev, &radeon_ttm_vram_fops);
1075 if (IS_ERR(ent))
1076 return PTR_ERR(ent);
1077 rdev->mman.vram = ent;
1078
1079 ent = debugfs_create_file("radeon_gtt", S_IFREG | S_IRUGO, root,
1080 rdev, &radeon_ttm_gtt_fops);
1081 if (IS_ERR(ent))
1082 return PTR_ERR(ent);
1083 rdev->mman.gtt = ent;
1084
1085 count = ARRAY_SIZE(radeon_ttm_debugfs_list);
1086
1087 #ifdef CONFIG_SWIOTLB
1088 if (!swiotlb_nr_tbl())
1089 --count;
1090 #endif
1091
1092 return radeon_debugfs_add_files(rdev, radeon_ttm_debugfs_list, count);
1093 #else
1094
1095 return 0;
1096 #endif
1097 }
1098
1099 static void radeon_ttm_debugfs_fini(struct radeon_device *rdev)
1100 {
1101 #if defined(CONFIG_DEBUG_FS)
1102
1103 debugfs_remove(rdev->mman.vram);
1104 rdev->mman.vram = NULL;
1105
1106 debugfs_remove(rdev->mman.gtt);
1107 rdev->mman.gtt = NULL;
1108 #endif
1109 }
1110