radeon_ttm.c 28.6 KB
Newer Older
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 29 30 31
/*
 * Copyright 2009 Jerome Glisse.
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 */
/*
 * Authors:
 *    Jerome Glisse <glisse@freedesktop.org>
 *    Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
 *    Dave Airlie
 */
32 33 34

#include <linux/dma-mapping.h>
#include <linux/pagemap.h>
35
#include <linux/pci.h>
36 37 38 39 40 41 42 43 44 45 46
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/swap.h>
#include <linux/swiotlb.h>

#include <drm/drm_agpsupport.h>
#include <drm/drm_debugfs.h>
#include <drm/drm_device.h>
#include <drm/drm_file.h>
#include <drm/drm_prime.h>
#include <drm/radeon_drm.h>
47 48 49
#include <drm/ttm/ttm_bo_api.h>
#include <drm/ttm/ttm_bo_driver.h>
#include <drm/ttm/ttm_module.h>
50 51
#include <drm/ttm/ttm_placement.h>

52 53 54
#include "radeon_reg.h"
#include "radeon.h"

55
static int radeon_ttm_debugfs_init(struct radeon_device *rdev);
56
static void radeon_ttm_debugfs_fini(struct radeon_device *rdev);
57

58 59 60
static int radeon_ttm_tt_bind(struct ttm_bo_device *bdev,
			      struct ttm_tt *ttm,
			      struct ttm_resource *bo_mem);
61 62
static void radeon_ttm_tt_unbind(struct ttm_bo_device *bdev,
				 struct ttm_tt *ttm);
63

64
struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
65 66 67 68 69 70 71 72 73
{
	struct radeon_mman *mman;
	struct radeon_device *rdev;

	mman = container_of(bdev, struct radeon_mman, bdev);
	rdev = container_of(mman, struct radeon_device, mman);
	return rdev;
}

74 75
static int radeon_ttm_init_vram(struct radeon_device *rdev)
{
76
	return ttm_range_man_init(&rdev->mman.bdev, TTM_PL_VRAM,
77
				  false, rdev->mc.real_vram_size >> PAGE_SHIFT);
78 79 80 81
}

static int radeon_ttm_init_gtt(struct radeon_device *rdev)
{
82
	return ttm_range_man_init(&rdev->mman.bdev, TTM_PL_TT,
83
				  true, rdev->mc.gtt_size >> PAGE_SHIFT);
84 85
}

86 87
static void radeon_evict_flags(struct ttm_buffer_object *bo,
				struct ttm_placement *placement)
88
{
89
	static const struct ttm_place placements = {
90 91
		.fpfn = 0,
		.lpfn = 0,
92
		.mem_type = TTM_PL_SYSTEM,
93
		.flags = 0
94 95
	};

96 97 98 99 100 101 102 103 104 105
	struct radeon_bo *rbo;

	if (!radeon_ttm_bo_is_radeon_bo(bo)) {
		placement->placement = &placements;
		placement->busy_placement = &placements;
		placement->num_placement = 1;
		placement->num_busy_placement = 1;
		return;
	}
	rbo = container_of(bo, struct radeon_bo, tbo);
106
	switch (bo->mem.mem_type) {
107
	case TTM_PL_VRAM:
108
		if (rbo->rdev->ring[radeon_copy_ring_index(rbo->rdev)].ready == false)
109
			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
110 111 112 113 114 115 116 117 118 119 120 121 122 123
		else if (rbo->rdev->mc.visible_vram_size < rbo->rdev->mc.real_vram_size &&
			 bo->mem.start < (rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT)) {
			unsigned fpfn = rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
			int i;

			/* Try evicting to the CPU inaccessible part of VRAM
			 * first, but only set GTT as busy placement, so this
			 * BO will be evicted to GTT rather than causing other
			 * BOs to be evicted from VRAM
			 */
			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM |
							 RADEON_GEM_DOMAIN_GTT);
			rbo->placement.num_busy_placement = 0;
			for (i = 0; i < rbo->placement.num_placement; i++) {
124
				if (rbo->placements[i].mem_type == TTM_PL_VRAM) {
125 126
					if (rbo->placements[i].fpfn < fpfn)
						rbo->placements[i].fpfn = fpfn;
127 128 129 130 131 132 133
				} else {
					rbo->placement.busy_placement =
						&rbo->placements[i];
					rbo->placement.num_busy_placement = 1;
				}
			}
		} else
134
			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
135 136
		break;
	case TTM_PL_TT:
137
	default:
138
		radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
139
	}
140
	*placement = rbo->placement;
141 142 143 144
}

static int radeon_verify_access(struct ttm_buffer_object *bo, struct file *filp)
{
145
	struct radeon_bo *rbo = container_of(bo, struct radeon_bo, tbo);
146
	struct radeon_device *rdev = radeon_get_rdev(bo->bdev);
147

148
	if (radeon_ttm_tt_has_userptr(rdev, bo->ttm))
149
		return -EPERM;
150
	return drm_vma_node_verify_access(&rbo->tbo.base.vma_node,
D
David Herrmann 已提交
151
					  filp->private_data);
152 153 154
}

static int radeon_move_blit(struct ttm_buffer_object *bo,
155
			bool evict,
156 157
			struct ttm_resource *new_mem,
			struct ttm_resource *old_mem)
158 159 160
{
	struct radeon_device *rdev;
	uint64_t old_start, new_start;
161
	struct radeon_fence *fence;
162
	unsigned num_pages;
163
	int r, ridx;
164 165

	rdev = radeon_get_rdev(bo->bdev);
166
	ridx = radeon_copy_ring_index(rdev);
167 168
	old_start = (u64)old_mem->start << PAGE_SHIFT;
	new_start = (u64)new_mem->start << PAGE_SHIFT;
169 170 171

	switch (old_mem->mem_type) {
	case TTM_PL_VRAM:
172
		old_start += rdev->mc.vram_start;
173 174
		break;
	case TTM_PL_TT:
175
		old_start += rdev->mc.gtt_start;
176 177 178 179 180 181 182
		break;
	default:
		DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
		return -EINVAL;
	}
	switch (new_mem->mem_type) {
	case TTM_PL_VRAM:
183
		new_start += rdev->mc.vram_start;
184 185
		break;
	case TTM_PL_TT:
186
		new_start += rdev->mc.gtt_start;
187 188 189 190 191
		break;
	default:
		DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
		return -EINVAL;
	}
192
	if (!rdev->ring[ridx].ready) {
193
		DRM_ERROR("Trying to move memory with ring turned off.\n");
194 195
		return -EINVAL;
	}
196 197 198

	BUILD_BUG_ON((PAGE_SIZE % RADEON_GPU_PAGE_SIZE) != 0);

199
	num_pages = new_mem->num_pages * (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
200
	fence = radeon_copy(rdev, old_start, new_start, num_pages, bo->base.resv);
201 202 203
	if (IS_ERR(fence))
		return PTR_ERR(fence);

204
	r = ttm_bo_move_accel_cleanup(bo, &fence->base, evict, false, new_mem);
205 206 207 208 209
	radeon_fence_unref(&fence);
	return r;
}

static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
210 211
				bool evict,
				struct ttm_operation_ctx *ctx,
212
				struct ttm_resource *new_mem)
213
{
214 215
	struct ttm_resource *old_mem = &bo->mem;
	struct ttm_resource tmp_mem;
216
	struct ttm_place placements;
217
	struct ttm_placement placement;
218 219 220 221
	int r;

	tmp_mem = *new_mem;
	tmp_mem.mm_node = NULL;
222 223 224 225
	placement.num_placement = 1;
	placement.placement = &placements;
	placement.num_busy_placement = 1;
	placement.busy_placement = &placements;
226 227
	placements.fpfn = 0;
	placements.lpfn = 0;
228
	placements.mem_type = TTM_PL_TT;
229
	placements.flags = 0;
230
	r = ttm_bo_mem_space(bo, &placement, &tmp_mem, ctx);
231 232 233
	if (unlikely(r)) {
		return r;
	}
234

235
	r = ttm_tt_populate(bo->bdev, bo->ttm, ctx);
236 237 238 239
	if (unlikely(r)) {
		goto out_cleanup;
	}

240
	r = radeon_ttm_tt_bind(bo->bdev, bo->ttm, &tmp_mem);
241 242 243
	if (unlikely(r)) {
		goto out_cleanup;
	}
244
	r = radeon_move_blit(bo, true, &tmp_mem, old_mem);
245 246 247
	if (unlikely(r)) {
		goto out_cleanup;
	}
248
	r = ttm_bo_wait_ctx(bo, ctx);
249 250 251
	if (unlikely(r))
		goto out_cleanup;

252 253
	radeon_ttm_tt_unbind(bo->bdev, bo->ttm);
	ttm_resource_free(bo, &bo->mem);
254
	ttm_bo_assign_mem(bo, new_mem);
255
out_cleanup:
256
	ttm_resource_free(bo, &tmp_mem);
257 258 259 260
	return r;
}

static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
261 262
				bool evict,
				struct ttm_operation_ctx *ctx,
263
				struct ttm_resource *new_mem)
264
{
265 266
	struct ttm_resource *old_mem = &bo->mem;
	struct ttm_resource tmp_mem;
267
	struct ttm_placement placement;
268
	struct ttm_place placements;
269 270 271 272
	int r;

	tmp_mem = *new_mem;
	tmp_mem.mm_node = NULL;
273 274 275 276
	placement.num_placement = 1;
	placement.placement = &placements;
	placement.num_busy_placement = 1;
	placement.busy_placement = &placements;
277 278
	placements.fpfn = 0;
	placements.lpfn = 0;
279
	placements.mem_type = TTM_PL_TT;
280
	placements.flags = 0;
281
	r = ttm_bo_mem_space(bo, &placement, &tmp_mem, ctx);
282 283 284
	if (unlikely(r)) {
		return r;
	}
285 286 287

	r = ttm_tt_populate(bo->bdev, bo->ttm, ctx);
	if (unlikely(r))
288
		goto out_cleanup;
289 290 291 292 293

	r = radeon_ttm_tt_bind(bo->bdev, bo->ttm, &tmp_mem);
	if (unlikely(r))
		goto out_cleanup;

294
	ttm_bo_assign_mem(bo, &tmp_mem);
295
	r = radeon_move_blit(bo, true, new_mem, old_mem);
296 297 298 299
	if (unlikely(r)) {
		goto out_cleanup;
	}
out_cleanup:
300
	ttm_resource_free(bo, &tmp_mem);
301 302 303
	return r;
}

304 305
static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
			  struct ttm_operation_ctx *ctx,
306
			  struct ttm_resource *new_mem)
307 308
{
	struct radeon_device *rdev;
309
	struct radeon_bo *rbo;
310
	struct ttm_resource *old_mem = &bo->mem;
311 312
	int r;

313 314 315 316 317
	if (new_mem->mem_type == TTM_PL_TT) {
		r = radeon_ttm_tt_bind(bo->bdev, bo->ttm, new_mem);
		if (r)
			return r;
	}
318 319
	radeon_bo_move_notify(bo, evict, new_mem);

320
	r = ttm_bo_wait_ctx(bo, ctx);
321
	if (r)
322
		goto fail;
323

324 325
	/* Can't move a pinned BO */
	rbo = container_of(bo, struct radeon_bo, tbo);
326
	if (WARN_ON_ONCE(rbo->tbo.pin_count > 0))
327 328
		return -EINVAL;

329 330
	rdev = radeon_get_rdev(bo->bdev);
	if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
331
		ttm_bo_move_null(bo, new_mem);
332 333
		return 0;
	}
334 335
	if (old_mem->mem_type == TTM_PL_SYSTEM &&
	    new_mem->mem_type == TTM_PL_TT) {
336
		ttm_bo_move_null(bo, new_mem);
337 338
		return 0;
	}
339 340

	if (old_mem->mem_type == TTM_PL_TT &&
341
	    new_mem->mem_type == TTM_PL_SYSTEM) {
342 343
		radeon_ttm_tt_unbind(bo->bdev, bo->ttm);
		ttm_resource_free(bo, &bo->mem);
344 345 346
		ttm_bo_assign_mem(bo, new_mem);
		return 0;
	}
347 348
	if (!rdev->ring[radeon_copy_ring_index(rdev)].ready ||
	    rdev->asic->copy.copy == NULL) {
349
		/* use memcpy */
350
		goto memcpy;
351 352 353 354
	}

	if (old_mem->mem_type == TTM_PL_VRAM &&
	    new_mem->mem_type == TTM_PL_SYSTEM) {
355
		r = radeon_move_vram_ram(bo, evict, ctx, new_mem);
356 357
	} else if (old_mem->mem_type == TTM_PL_SYSTEM &&
		   new_mem->mem_type == TTM_PL_VRAM) {
358
		r = radeon_move_ram_vram(bo, evict, ctx, new_mem);
359
	} else {
360
		r = radeon_move_blit(bo, evict,
361
				     new_mem, old_mem);
362
	}
363 364 365

	if (r) {
memcpy:
366
		r = ttm_bo_move_memcpy(bo, ctx, new_mem);
367
		if (r) {
368
			goto fail;
369
		}
370
	}
371 372 373 374

	/* update statistics */
	atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &rdev->num_bytes_moved);
	return 0;
375 376 377 378 379
fail:
	swap(*new_mem, bo->mem);
	radeon_bo_move_notify(bo, false, new_mem);
	swap(*new_mem, bo->mem);
	return r;
380 381
}

382
static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *mem)
383 384
{
	struct radeon_device *rdev = radeon_get_rdev(bdev);
385
	size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT;
386 387 388 389 390 391

	switch (mem->mem_type) {
	case TTM_PL_SYSTEM:
		/* system memory */
		return 0;
	case TTM_PL_TT:
D
Daniel Vetter 已提交
392
#if IS_ENABLED(CONFIG_AGP)
393 394
		if (rdev->flags & RADEON_IS_AGP) {
			/* RADEON_IS_AGP is set only if AGP is active */
395 396
			mem->bus.offset = (mem->start << PAGE_SHIFT) +
				rdev->mc.agp_base;
397
			mem->bus.is_iomem = !rdev->ddev->agp->cant_use_aperture;
398
			mem->bus.caching = ttm_write_combined;
399 400 401 402
		}
#endif
		break;
	case TTM_PL_VRAM:
403
		mem->bus.offset = mem->start << PAGE_SHIFT;
404
		/* check if it's visible */
405
		if ((mem->bus.offset + bus_size) > rdev->mc.visible_vram_size)
406
			return -EINVAL;
407
		mem->bus.offset += rdev->mc.aper_base;
408
		mem->bus.is_iomem = true;
409
		mem->bus.caching = ttm_write_combined;
410 411 412 413 414
#ifdef __alpha__
		/*
		 * Alpha: use bus.addr to hold the ioremap() return,
		 * so we can modify bus.base below.
		 */
415
		mem->bus.addr = ioremap_wc(mem->bus.offset, bus_size);
416 417
		if (!mem->bus.addr)
			return -ENOMEM;
418 419 420 421 422 423 424

		/*
		 * Alpha: Use just the bus offset plus
		 * the hose/domain memory base for bus.base.
		 * It then can be used to build PTEs for VRAM
		 * access, as done in ttm_bo_vm_fault().
		 */
425
		mem->bus.offset = (mem->bus.offset & 0x0ffffffffUL) +
426 427
			rdev->ddev->hose->dense_mem_base;
#endif
428 429 430 431 432 433 434
		break;
	default:
		return -EINVAL;
	}
	return 0;
}

435 436 437 438
/*
 * TTM backend functions.
 */
struct radeon_ttm_tt {
439
	struct ttm_tt		ttm;
440
	u64				offset;
441 442 443 444

	uint64_t			userptr;
	struct mm_struct		*usermm;
	uint32_t			userflags;
445
	bool bound;
446 447
};

448
/* prepare the sg table with the user pages */
D
Dave Airlie 已提交
449
static int radeon_ttm_tt_pin_userptr(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
450
{
D
Dave Airlie 已提交
451
	struct radeon_device *rdev = radeon_get_rdev(bdev);
452
	struct radeon_ttm_tt *gtt = (void *)ttm;
453
	unsigned pinned = 0;
454 455 456 457 458 459 460 461 462
	int r;

	int write = !(gtt->userflags & RADEON_GEM_USERPTR_READONLY);
	enum dma_data_direction direction = write ?
		DMA_BIDIRECTIONAL : DMA_TO_DEVICE;

	if (current->mm != gtt->usermm)
		return -EPERM;

463 464 465 466 467 468 469 470 471 472
	if (gtt->userflags & RADEON_GEM_USERPTR_ANONONLY) {
		/* check that we only pin down anonymous memory
		   to prevent problems with writeback */
		unsigned long end = gtt->userptr + ttm->num_pages * PAGE_SIZE;
		struct vm_area_struct *vma;
		vma = find_vma(gtt->usermm, gtt->userptr);
		if (!vma || vma->vm_file || vma->vm_end < end)
			return -EPERM;
	}

473 474 475 476 477
	do {
		unsigned num_pages = ttm->num_pages - pinned;
		uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE;
		struct page **pages = ttm->pages + pinned;

478 479
		r = get_user_pages(userptr, num_pages, write ? FOLL_WRITE : 0,
				   pages, NULL);
480 481 482 483 484 485 486 487 488 489 490 491 492
		if (r < 0)
			goto release_pages;

		pinned += r;

	} while (pinned < ttm->num_pages);

	r = sg_alloc_table_from_pages(ttm->sg, ttm->pages, ttm->num_pages, 0,
				      ttm->num_pages << PAGE_SHIFT,
				      GFP_KERNEL);
	if (r)
		goto release_sg;

493 494
	r = dma_map_sgtable(rdev->dev, ttm->sg, direction, 0);
	if (r)
495 496 497 498 499 500 501 502 503 504 505
		goto release_sg;

	drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
					 gtt->ttm.dma_address, ttm->num_pages);

	return 0;

release_sg:
	kfree(ttm->sg);

release_pages:
506
	release_pages(ttm->pages, pinned);
507 508 509
	return r;
}

D
Dave Airlie 已提交
510
static void radeon_ttm_tt_unpin_userptr(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
511
{
D
Dave Airlie 已提交
512
	struct radeon_device *rdev = radeon_get_rdev(bdev);
513
	struct radeon_ttm_tt *gtt = (void *)ttm;
514
	struct sg_page_iter sg_iter;
515 516 517 518 519

	int write = !(gtt->userflags & RADEON_GEM_USERPTR_READONLY);
	enum dma_data_direction direction = write ?
		DMA_BIDIRECTIONAL : DMA_TO_DEVICE;

520 521 522 523
	/* double check that we don't free the table twice */
	if (!ttm->sg->sgl)
		return;

524
	/* free the sg table and pages again */
525
	dma_unmap_sgtable(rdev->dev, ttm->sg, direction, 0);
526

527
	for_each_sgtable_page(ttm->sg, &sg_iter, 0) {
528
		struct page *page = sg_page_iter_page(&sg_iter);
529 530 531 532
		if (!(gtt->userflags & RADEON_GEM_USERPTR_READONLY))
			set_page_dirty(page);

		mark_page_accessed(page);
533
		put_page(page);
534 535 536 537 538
	}

	sg_free_table(ttm->sg);
}

539 540 541 542 543 544 545
static bool radeon_ttm_backend_is_bound(struct ttm_tt *ttm)
{
	struct radeon_ttm_tt *gtt = (void*)ttm;

	return (gtt->bound);
}

D
Dave Airlie 已提交
546 547
static int radeon_ttm_backend_bind(struct ttm_bo_device *bdev,
				   struct ttm_tt *ttm,
548
				   struct ttm_resource *bo_mem)
549
{
550
	struct radeon_ttm_tt *gtt = (void*)ttm;
D
Dave Airlie 已提交
551
	struct radeon_device *rdev = radeon_get_rdev(bdev);
552 553
	uint32_t flags = RADEON_GART_PAGE_VALID | RADEON_GART_PAGE_READ |
		RADEON_GART_PAGE_WRITE;
554 555
	int r;

556 557 558
	if (gtt->bound)
		return 0;

559
	if (gtt->userptr) {
D
Dave Airlie 已提交
560
		radeon_ttm_tt_pin_userptr(bdev, ttm);
561 562 563
		flags &= ~RADEON_GART_PAGE_WRITE;
	}

564 565
	gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
	if (!ttm->num_pages) {
566
		WARN(1, "nothing to bind %u pages for mreg %p back %p!\n",
567 568
		     ttm->num_pages, bo_mem, ttm);
	}
569
	if (ttm->caching == ttm_cached)
570
		flags |= RADEON_GART_PAGE_SNOOP;
571
	r = radeon_gart_bind(rdev, gtt->offset, ttm->num_pages,
572
			     ttm->pages, gtt->ttm.dma_address, flags);
573
	if (r) {
574
		DRM_ERROR("failed to bind %u pages at 0x%08X\n",
575 576 577
			  ttm->num_pages, (unsigned)gtt->offset);
		return r;
	}
578
	gtt->bound = true;
579 580 581
	return 0;
}

D
Dave Airlie 已提交
582
static void radeon_ttm_backend_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
583
{
584
	struct radeon_ttm_tt *gtt = (void *)ttm;
D
Dave Airlie 已提交
585
	struct radeon_device *rdev = radeon_get_rdev(bdev);
586

587 588 589
	if (!gtt->bound)
		return;

590
	radeon_gart_unbind(rdev, gtt->offset, ttm->num_pages);
591 592

	if (gtt->userptr)
D
Dave Airlie 已提交
593
		radeon_ttm_tt_unpin_userptr(bdev, ttm);
594
	gtt->bound = false;
595 596
}

D
Dave Airlie 已提交
597
static void radeon_ttm_backend_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
598
{
599
	struct radeon_ttm_tt *gtt = (void *)ttm;
600

601
	radeon_ttm_backend_unbind(bdev, ttm);
D
Dave Airlie 已提交
602 603
	ttm_tt_destroy_common(bdev, ttm);

604
	ttm_tt_fini(&gtt->ttm);
605 606 607
	kfree(gtt);
}

608 609
static struct ttm_tt *radeon_ttm_tt_create(struct ttm_buffer_object *bo,
					   uint32_t page_flags)
610 611 612
{
	struct radeon_device *rdev;
	struct radeon_ttm_tt *gtt;
613 614 615 616
	enum ttm_caching caching;
	struct radeon_bo *rbo;

	rbo = container_of(bo, struct radeon_bo, tbo);
617

618
	rdev = radeon_get_rdev(bo->bdev);
D
Daniel Vetter 已提交
619
#if IS_ENABLED(CONFIG_AGP)
620
	if (rdev->flags & RADEON_IS_AGP) {
621 622
		return ttm_agp_tt_create(bo, rdev->ddev->agp->bridge,
					 page_flags);
623 624 625 626 627 628 629
	}
#endif

	gtt = kzalloc(sizeof(struct radeon_ttm_tt), GFP_KERNEL);
	if (gtt == NULL) {
		return NULL;
	}
630 631 632 633 634 635 636 637 638

	if (rbo->flags & RADEON_GEM_GTT_UC)
		caching = ttm_uncached;
	else if (rbo->flags & RADEON_GEM_GTT_WC)
		caching = ttm_write_combined;
	else
		caching = ttm_cached;

	if (ttm_dma_tt_init(&gtt->ttm, bo, page_flags, caching)) {
639
		kfree(gtt);
640 641
		return NULL;
	}
642
	return &gtt->ttm;
643 644
}

645 646
static struct radeon_ttm_tt *radeon_ttm_tt_to_gtt(struct radeon_device *rdev,
						  struct ttm_tt *ttm)
647
{
648 649 650 651 652 653
#if IS_ENABLED(CONFIG_AGP)
	if (rdev->flags & RADEON_IS_AGP)
		return NULL;
#endif

	if (!ttm)
654
		return NULL;
655
	return container_of(ttm, struct radeon_ttm_tt, ttm);
656 657
}

D
Dave Airlie 已提交
658 659 660
static int radeon_ttm_tt_populate(struct ttm_bo_device *bdev,
				  struct ttm_tt *ttm,
				  struct ttm_operation_ctx *ctx)
661
{
662 663
	struct radeon_device *rdev = radeon_get_rdev(bdev);
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
664
	bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
665

666
	if (gtt && gtt->userptr) {
667
		ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
668 669 670 671 672 673 674
		if (!ttm->sg)
			return -ENOMEM;

		ttm->page_flags |= TTM_PAGE_FLAG_SG;
		return 0;
	}

675 676 677 678 679 680
	if (slave && ttm->sg) {
		drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
						 gtt->ttm.dma_address, ttm->num_pages);
		return 0;
	}

681
	return ttm_pool_alloc(&rdev->mman.bdev.pool, ttm, ctx);
682 683
}

D
Dave Airlie 已提交
684
static void radeon_ttm_tt_unpopulate(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
685
{
686 687
	struct radeon_device *rdev = radeon_get_rdev(bdev);
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
688 689
	bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);

690
	if (gtt && gtt->userptr) {
691 692 693 694 695
		kfree(ttm->sg);
		ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
		return;
	}

696 697
	if (slave)
		return;
698

699
	return ttm_pool_free(&rdev->mman.bdev.pool, ttm);
700
}
701

702 703
int radeon_ttm_tt_set_userptr(struct radeon_device *rdev,
			      struct ttm_tt *ttm, uint64_t addr,
704 705
			      uint32_t flags)
{
706
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
707 708 709 710 711 712 713 714 715 716

	if (gtt == NULL)
		return -EINVAL;

	gtt->userptr = addr;
	gtt->usermm = current->mm;
	gtt->userflags = flags;
	return 0;
}

717 718 719 720 721 722 723 724 725 726 727
bool radeon_ttm_tt_is_bound(struct ttm_bo_device *bdev,
			    struct ttm_tt *ttm)
{
#if IS_ENABLED(CONFIG_AGP)
	struct radeon_device *rdev = radeon_get_rdev(bdev);
	if (rdev->flags & RADEON_IS_AGP)
		return ttm_agp_is_bound(ttm);
#endif
	return radeon_ttm_backend_is_bound(ttm);
}

728 729 730 731
static int radeon_ttm_tt_bind(struct ttm_bo_device *bdev,
			      struct ttm_tt *ttm,
			      struct ttm_resource *bo_mem)
{
732
#if IS_ENABLED(CONFIG_AGP)
733
	struct radeon_device *rdev = radeon_get_rdev(bdev);
734
#endif
735

736 737
	if (!bo_mem)
		return -EINVAL;
738 739
#if IS_ENABLED(CONFIG_AGP)
	if (rdev->flags & RADEON_IS_AGP)
740
		return ttm_agp_bind(ttm, bo_mem);
741 742 743 744 745 746 747 748 749 750 751 752
#endif

	return radeon_ttm_backend_bind(bdev, ttm, bo_mem);
}

static void radeon_ttm_tt_unbind(struct ttm_bo_device *bdev,
				 struct ttm_tt *ttm)
{
#if IS_ENABLED(CONFIG_AGP)
	struct radeon_device *rdev = radeon_get_rdev(bdev);

	if (rdev->flags & RADEON_IS_AGP) {
753
		ttm_agp_unbind(ttm);
754 755 756 757 758 759 760 761 762 763 764 765 766
		return;
	}
#endif
	radeon_ttm_backend_unbind(bdev, ttm);
}

static void radeon_ttm_tt_destroy(struct ttm_bo_device *bdev,
				  struct ttm_tt *ttm)
{
#if IS_ENABLED(CONFIG_AGP)
	struct radeon_device *rdev = radeon_get_rdev(bdev);

	if (rdev->flags & RADEON_IS_AGP) {
767
		ttm_agp_unbind(ttm);
D
Dave Airlie 已提交
768
		ttm_tt_destroy_common(bdev, ttm);
769
		ttm_agp_destroy(ttm);
770 771 772 773 774 775 776 777
		return;
	}
#endif
	radeon_ttm_backend_destroy(bdev, ttm);
}

bool radeon_ttm_tt_has_userptr(struct radeon_device *rdev,
			       struct ttm_tt *ttm)
778
{
779
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
780 781 782 783 784 785 786

	if (gtt == NULL)
		return false;

	return !!gtt->userptr;
}

787 788
bool radeon_ttm_tt_is_readonly(struct radeon_device *rdev,
			       struct ttm_tt *ttm)
789
{
790
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
791 792 793 794 795 796 797

	if (gtt == NULL)
		return false;

	return !!(gtt->userflags & RADEON_GEM_USERPTR_READONLY);
}

798 799 800 801 802 803
static void
radeon_bo_delete_mem_notify(struct ttm_buffer_object *bo)
{
	radeon_bo_move_notify(bo, false, NULL);
}

804
static struct ttm_bo_driver radeon_bo_driver = {
805
	.ttm_tt_create = &radeon_ttm_tt_create,
806 807
	.ttm_tt_populate = &radeon_ttm_tt_populate,
	.ttm_tt_unpopulate = &radeon_ttm_tt_unpopulate,
808
	.ttm_tt_destroy = &radeon_ttm_tt_destroy,
809
	.eviction_valuable = ttm_bo_eviction_valuable,
810 811 812
	.evict_flags = &radeon_evict_flags,
	.move = &radeon_bo_move,
	.verify_access = &radeon_verify_access,
813
	.delete_mem_notify = &radeon_bo_delete_mem_notify,
814
	.io_mem_reserve = &radeon_ttm_io_mem_reserve,
815 816 817 818 819 820 821
};

int radeon_ttm_init(struct radeon_device *rdev)
{
	int r;

	/* No others user of address space so set it to 0 */
822
	r = ttm_bo_device_init(&rdev->mman.bdev, &radeon_bo_driver, rdev->dev,
823
			       rdev->ddev->anon_inode->i_mapping,
824
			       rdev->ddev->vma_offset_manager,
825
			       rdev->need_swiotlb,
826
			       dma_addressing_limited(&rdev->pdev->dev));
827 828 829 830
	if (r) {
		DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
		return r;
	}
831
	rdev->mman.initialized = true;
832

833 834 835
	ttm_pool_init(&rdev->mman.bdev.pool, rdev->dev, rdev->need_swiotlb,
		      dma_addressing_limited(&rdev->pdev->dev));

836
	r = radeon_ttm_init_vram(rdev);
837 838 839 840
	if (r) {
		DRM_ERROR("Failed initializing VRAM heap.\n");
		return r;
	}
841 842 843
	/* Change the size here instead of the init above so only lpfn is affected */
	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);

844
	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
845
			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
K
Kent Russell 已提交
846
			     NULL, &rdev->stolen_vga_memory);
847 848 849
	if (r) {
		return r;
	}
K
Kent Russell 已提交
850
	r = radeon_bo_reserve(rdev->stolen_vga_memory, false);
851 852
	if (r)
		return r;
K
Kent Russell 已提交
853 854
	r = radeon_bo_pin(rdev->stolen_vga_memory, RADEON_GEM_DOMAIN_VRAM, NULL);
	radeon_bo_unreserve(rdev->stolen_vga_memory);
855
	if (r) {
K
Kent Russell 已提交
856
		radeon_bo_unref(&rdev->stolen_vga_memory);
857 858 859
		return r;
	}
	DRM_INFO("radeon: %uM of VRAM memory ready\n",
860
		 (unsigned) (rdev->mc.real_vram_size / (1024 * 1024)));
861 862

	r = radeon_ttm_init_gtt(rdev);
863 864 865 866 867
	if (r) {
		DRM_ERROR("Failed initializing GTT heap.\n");
		return r;
	}
	DRM_INFO("radeon: %uM of GTT memory ready.\n",
868
		 (unsigned)(rdev->mc.gtt_size / (1024 * 1024)));
869 870 871 872 873 874

	r = radeon_ttm_debugfs_init(rdev);
	if (r) {
		DRM_ERROR("Failed to init debugfs\n");
		return r;
	}
875 876 877 878 879
	return 0;
}

void radeon_ttm_fini(struct radeon_device *rdev)
{
880 881
	int r;

882 883
	if (!rdev->mman.initialized)
		return;
884
	radeon_ttm_debugfs_fini(rdev);
K
Kent Russell 已提交
885 886
	if (rdev->stolen_vga_memory) {
		r = radeon_bo_reserve(rdev->stolen_vga_memory, false);
887
		if (r == 0) {
K
Kent Russell 已提交
888 889
			radeon_bo_unpin(rdev->stolen_vga_memory);
			radeon_bo_unreserve(rdev->stolen_vga_memory);
890
		}
K
Kent Russell 已提交
891
		radeon_bo_unref(&rdev->stolen_vga_memory);
892
	}
893 894
	ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_VRAM);
	ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_TT);
895 896
	ttm_bo_device_release(&rdev->mman.bdev);
	radeon_gart_fini(rdev);
897
	rdev->mman.initialized = false;
898 899 900
	DRM_INFO("radeon: ttm finalized\n");
}

901 902 903 904
/* this should only be called at bootup or when userspace
 * isn't running */
void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size)
{
905
	struct ttm_resource_manager *man;
906 907 908 909

	if (!rdev->mman.initialized)
		return;

910
	man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM);
911 912 913 914
	/* this just adjusts TTM size idea, which sets lpfn to the correct value */
	man->size = size >> PAGE_SHIFT;
}

915
static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf)
916
{
917 918
	struct ttm_buffer_object *bo = vmf->vma->vm_private_data;
	struct radeon_device *rdev = radeon_get_rdev(bo->bdev);
919
	vm_fault_t ret;
920

921
	down_read(&rdev->pm.mclk_lock);
922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939

	ret = ttm_bo_vm_reserve(bo, vmf);
	if (ret)
		goto unlock_mclk;

	ret = radeon_bo_fault_reserve_notify(bo);
	if (ret)
		goto unlock_resv;

	ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
				       TTM_BO_VM_NUM_PREFAULT, 1);
	if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
		goto unlock_mclk;

unlock_resv:
	dma_resv_unlock(bo->base.resv);

unlock_mclk:
940
	up_read(&rdev->pm.mclk_lock);
941
	return ret;
942 943
}

944 945 946 947 948 949 950
static struct vm_operations_struct radeon_ttm_vm_ops = {
	.fault = radeon_ttm_fault,
	.open = ttm_bo_vm_open,
	.close = ttm_bo_vm_close,
	.access = ttm_bo_vm_access
};

951 952 953
int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
{
	int r;
954 955
	struct drm_file *file_priv = filp->private_data;
	struct radeon_device *rdev = file_priv->minor->dev->dev_private;
956

957
	if (rdev == NULL)
958
		return -EINVAL;
959

960
	r = ttm_bo_mmap(filp, vma, &rdev->mman.bdev);
961
	if (unlikely(r != 0))
962
		return r;
963

964 965 966 967
	vma->vm_ops = &radeon_ttm_vm_ops;
	return 0;
}

968
#if defined(CONFIG_DEBUG_FS)
969

970 971 972
static int radeon_mm_dump_table(struct seq_file *m, void *data)
{
	struct drm_info_node *node = (struct drm_info_node *)m->private;
973
	unsigned ttm_pl = *(int*)node->info_ent->data;
974 975
	struct drm_device *dev = node->minor->dev;
	struct radeon_device *rdev = dev->dev_private;
976
	struct ttm_resource_manager *man = ttm_manager_type(&rdev->mman.bdev, ttm_pl);
D
Daniel Vetter 已提交
977
	struct drm_printer p = drm_seq_file_printer(m);
978

979
	man->func->debug(man, &p);
D
Daniel Vetter 已提交
980
	return 0;
981
}
982

983 984 985 986 987 988 989 990
static int radeon_ttm_pool_debugfs(struct seq_file *m, void *data)
{
	struct drm_info_node *node = (struct drm_info_node *)m->private;
	struct drm_device *dev = node->minor->dev;
	struct radeon_device *rdev = dev->dev_private;

	return ttm_pool_debugfs(&rdev->mman.bdev.pool, m);
}
991

992 993 994 995 996 997
static int ttm_pl_vram = TTM_PL_VRAM;
static int ttm_pl_tt = TTM_PL_TT;

static struct drm_info_list radeon_ttm_debugfs_list[] = {
	{"radeon_vram_mm", radeon_mm_dump_table, 0, &ttm_pl_vram},
	{"radeon_gtt_mm", radeon_mm_dump_table, 0, &ttm_pl_tt},
998
	{"ttm_page_pool", radeon_ttm_pool_debugfs, 0, NULL}
999 1000
};

1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
static int radeon_ttm_vram_open(struct inode *inode, struct file *filep)
{
	struct radeon_device *rdev = inode->i_private;
	i_size_write(inode, rdev->mc.mc_vram_size);
	filep->private_data = inode->i_private;
	return 0;
}

static ssize_t radeon_ttm_vram_read(struct file *f, char __user *buf,
				    size_t size, loff_t *pos)
{
	struct radeon_device *rdev = f->private_data;
	ssize_t result = 0;
	int r;

	if (size & 0x3 || *pos & 0x3)
		return -EINVAL;

	while (size) {
		unsigned long flags;
		uint32_t value;

		if (*pos >= rdev->mc.mc_vram_size)
			return result;

		spin_lock_irqsave(&rdev->mmio_idx_lock, flags);
		WREG32(RADEON_MM_INDEX, ((uint32_t)*pos) | 0x80000000);
		if (rdev->family >= CHIP_CEDAR)
			WREG32(EVERGREEN_MM_INDEX_HI, *pos >> 31);
		value = RREG32(RADEON_MM_DATA);
		spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);

		r = put_user(value, (uint32_t *)buf);
		if (r)
			return r;

		result += 4;
		buf += 4;
		*pos += 4;
		size -= 4;
	}

	return result;
}

static const struct file_operations radeon_ttm_vram_fops = {
	.owner = THIS_MODULE,
	.open = radeon_ttm_vram_open,
	.read = radeon_ttm_vram_read,
	.llseek = default_llseek
};

1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
static int radeon_ttm_gtt_open(struct inode *inode, struct file *filep)
{
	struct radeon_device *rdev = inode->i_private;
	i_size_write(inode, rdev->mc.gtt_size);
	filep->private_data = inode->i_private;
	return 0;
}

static ssize_t radeon_ttm_gtt_read(struct file *f, char __user *buf,
				   size_t size, loff_t *pos)
{
	struct radeon_device *rdev = f->private_data;
	ssize_t result = 0;
	int r;

	while (size) {
		loff_t p = *pos / PAGE_SIZE;
		unsigned off = *pos & ~PAGE_MASK;
1071
		size_t cur_size = min_t(size_t, size, PAGE_SIZE - off);
1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106
		struct page *page;
		void *ptr;

		if (p >= rdev->gart.num_cpu_pages)
			return result;

		page = rdev->gart.pages[p];
		if (page) {
			ptr = kmap(page);
			ptr += off;

			r = copy_to_user(buf, ptr, cur_size);
			kunmap(rdev->gart.pages[p]);
		} else
			r = clear_user(buf, cur_size);

		if (r)
			return -EFAULT;

		result += cur_size;
		buf += cur_size;
		*pos += cur_size;
		size -= cur_size;
	}

	return result;
}

static const struct file_operations radeon_ttm_gtt_fops = {
	.owner = THIS_MODULE,
	.open = radeon_ttm_gtt_open,
	.read = radeon_ttm_gtt_read,
	.llseek = default_llseek
};

1107 1108 1109 1110
#endif

static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
{
1111
#if defined(CONFIG_DEBUG_FS)
1112 1113 1114
	unsigned count;

	struct drm_minor *minor = rdev->ddev->primary;
1115 1116 1117 1118 1119 1120 1121 1122
	struct dentry *root = minor->debugfs_root;

	rdev->mman.vram = debugfs_create_file("radeon_vram", S_IFREG | S_IRUGO,
					      root, rdev,
					      &radeon_ttm_vram_fops);

	rdev->mman.gtt = debugfs_create_file("radeon_gtt", S_IFREG | S_IRUGO,
					     root, rdev, &radeon_ttm_gtt_fops);
1123

1124
	count = ARRAY_SIZE(radeon_ttm_debugfs_list);
1125

1126 1127 1128
	return radeon_debugfs_add_files(rdev, radeon_ttm_debugfs_list, count);
#else

1129
	return 0;
1130
#endif
1131
}
1132 1133 1134 1135 1136 1137 1138

static void radeon_ttm_debugfs_fini(struct radeon_device *rdev)
{
#if defined(CONFIG_DEBUG_FS)

	debugfs_remove(rdev->mman.vram);
	rdev->mman.vram = NULL;
1139 1140 1141

	debugfs_remove(rdev->mman.gtt);
	rdev->mman.gtt = NULL;
1142 1143
#endif
}