radeon_ttm.c 26.3 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
#include <drm/ttm/ttm_bo_api.h>
#include <drm/ttm/ttm_bo_driver.h>
49 50
#include <drm/ttm/ttm_placement.h>

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

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

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

63
struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
64 65 66 67 68 69 70 71 72
{
	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;
}

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

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

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

95 96 97 98 99 100 101 102 103 104
	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);
105
	switch (bo->mem.mem_type) {
106
	case TTM_PL_VRAM:
107
		if (rbo->rdev->ring[radeon_copy_ring_index(rbo->rdev)].ready == false)
108
			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
109 110 111 112 113 114 115 116 117 118 119 120 121 122
		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++) {
123
				if (rbo->placements[i].mem_type == TTM_PL_VRAM) {
124 125
					if (rbo->placements[i].fpfn < fpfn)
						rbo->placements[i].fpfn = fpfn;
126 127 128 129 130 131 132
				} else {
					rbo->placement.busy_placement =
						&rbo->placements[i];
					rbo->placement.num_busy_placement = 1;
				}
			}
		} else
133
			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
134 135
		break;
	case TTM_PL_TT:
136
	default:
137
		radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
138
	}
139
	*placement = rbo->placement;
140 141 142 143
}

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

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

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

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

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

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

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

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

208 209
static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
			  struct ttm_operation_ctx *ctx,
210 211
			  struct ttm_resource *new_mem,
			  struct ttm_place *hop)
212 213
{
	struct radeon_device *rdev;
214
	struct radeon_bo *rbo;
215
	struct ttm_resource *old_mem = &bo->mem;
216 217
	int r;

218 219 220 221 222
	if (new_mem->mem_type == TTM_PL_TT) {
		r = radeon_ttm_tt_bind(bo->bdev, bo->ttm, new_mem);
		if (r)
			return r;
	}
223

224
	r = ttm_bo_wait_ctx(bo, ctx);
225
	if (r)
226
		return r;
227

228 229
	/* Can't move a pinned BO */
	rbo = container_of(bo, struct radeon_bo, tbo);
230
	if (WARN_ON_ONCE(rbo->tbo.pin_count > 0))
231 232
		return -EINVAL;

233 234
	rdev = radeon_get_rdev(bo->bdev);
	if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
235
		ttm_bo_move_null(bo, new_mem);
236
		goto out;
237
	}
238 239
	if (old_mem->mem_type == TTM_PL_SYSTEM &&
	    new_mem->mem_type == TTM_PL_TT) {
240
		ttm_bo_move_null(bo, new_mem);
241
		goto out;
242
	}
243 244

	if (old_mem->mem_type == TTM_PL_TT &&
245
	    new_mem->mem_type == TTM_PL_SYSTEM) {
246 247
		radeon_ttm_tt_unbind(bo->bdev, bo->ttm);
		ttm_resource_free(bo, &bo->mem);
248
		ttm_bo_assign_mem(bo, new_mem);
249
		goto out;
250
	}
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
	if (rdev->ring[radeon_copy_ring_index(rdev)].ready &&
	    rdev->asic->copy.copy != NULL) {
		if ((old_mem->mem_type == TTM_PL_SYSTEM &&
		     new_mem->mem_type == TTM_PL_VRAM) ||
		    (old_mem->mem_type == TTM_PL_VRAM &&
		     new_mem->mem_type == TTM_PL_SYSTEM)) {
			hop->fpfn = 0;
			hop->lpfn = 0;
			hop->mem_type = TTM_PL_TT;
			hop->flags = 0;
			return -EMULTIHOP;
		}

		r = radeon_move_blit(bo, evict, new_mem, old_mem);
	} else {
		r = -ENODEV;
267 268
	}

269
	if (r) {
270
		r = ttm_bo_move_memcpy(bo, ctx, new_mem);
271 272
		if (r)
			return r;
273
	}
274

275
out:
276 277
	/* update statistics */
	atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &rdev->num_bytes_moved);
278
	radeon_bo_move_notify(bo, evict, new_mem);
279
	return 0;
280 281
}

282
static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *mem)
283 284
{
	struct radeon_device *rdev = radeon_get_rdev(bdev);
285
	size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT;
286 287 288 289 290 291

	switch (mem->mem_type) {
	case TTM_PL_SYSTEM:
		/* system memory */
		return 0;
	case TTM_PL_TT:
D
Daniel Vetter 已提交
292
#if IS_ENABLED(CONFIG_AGP)
293 294
		if (rdev->flags & RADEON_IS_AGP) {
			/* RADEON_IS_AGP is set only if AGP is active */
295 296
			mem->bus.offset = (mem->start << PAGE_SHIFT) +
				rdev->mc.agp_base;
297
			mem->bus.is_iomem = !rdev->ddev->agp->cant_use_aperture;
298
			mem->bus.caching = ttm_write_combined;
299 300 301 302
		}
#endif
		break;
	case TTM_PL_VRAM:
303
		mem->bus.offset = mem->start << PAGE_SHIFT;
304
		/* check if it's visible */
305
		if ((mem->bus.offset + bus_size) > rdev->mc.visible_vram_size)
306
			return -EINVAL;
307
		mem->bus.offset += rdev->mc.aper_base;
308
		mem->bus.is_iomem = true;
309
		mem->bus.caching = ttm_write_combined;
310 311 312 313 314
#ifdef __alpha__
		/*
		 * Alpha: use bus.addr to hold the ioremap() return,
		 * so we can modify bus.base below.
		 */
315
		mem->bus.addr = ioremap_wc(mem->bus.offset, bus_size);
316 317
		if (!mem->bus.addr)
			return -ENOMEM;
318 319 320 321 322 323 324

		/*
		 * 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().
		 */
325
		mem->bus.offset = (mem->bus.offset & 0x0ffffffffUL) +
326 327
			rdev->ddev->hose->dense_mem_base;
#endif
328 329 330 331 332 333 334
		break;
	default:
		return -EINVAL;
	}
	return 0;
}

335 336 337 338
/*
 * TTM backend functions.
 */
struct radeon_ttm_tt {
339
	struct ttm_tt		ttm;
340
	u64				offset;
341 342 343 344

	uint64_t			userptr;
	struct mm_struct		*usermm;
	uint32_t			userflags;
345
	bool bound;
346 347
};

348
/* prepare the sg table with the user pages */
D
Dave Airlie 已提交
349
static int radeon_ttm_tt_pin_userptr(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
350
{
D
Dave Airlie 已提交
351
	struct radeon_device *rdev = radeon_get_rdev(bdev);
352
	struct radeon_ttm_tt *gtt = (void *)ttm;
353
	unsigned pinned = 0;
354 355 356 357 358 359 360 361 362
	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;

363 364 365 366 367 368 369 370 371 372
	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;
	}

373 374 375 376 377
	do {
		unsigned num_pages = ttm->num_pages - pinned;
		uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE;
		struct page **pages = ttm->pages + pinned;

378 379
		r = get_user_pages(userptr, num_pages, write ? FOLL_WRITE : 0,
				   pages, NULL);
380 381 382 383 384 385 386 387 388 389 390 391 392
		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;

393 394
	r = dma_map_sgtable(rdev->dev, ttm->sg, direction, 0);
	if (r)
395 396
		goto release_sg;

397 398
	drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
				       ttm->num_pages);
399 400 401 402 403 404 405

	return 0;

release_sg:
	kfree(ttm->sg);

release_pages:
406
	release_pages(ttm->pages, pinned);
407 408 409
	return r;
}

D
Dave Airlie 已提交
410
static void radeon_ttm_tt_unpin_userptr(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
411
{
D
Dave Airlie 已提交
412
	struct radeon_device *rdev = radeon_get_rdev(bdev);
413
	struct radeon_ttm_tt *gtt = (void *)ttm;
414
	struct sg_page_iter sg_iter;
415 416 417 418 419

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

420 421 422 423
	/* double check that we don't free the table twice */
	if (!ttm->sg->sgl)
		return;

424
	/* free the sg table and pages again */
425
	dma_unmap_sgtable(rdev->dev, ttm->sg, direction, 0);
426

427
	for_each_sgtable_page(ttm->sg, &sg_iter, 0) {
428
		struct page *page = sg_page_iter_page(&sg_iter);
429 430 431 432
		if (!(gtt->userflags & RADEON_GEM_USERPTR_READONLY))
			set_page_dirty(page);

		mark_page_accessed(page);
433
		put_page(page);
434 435 436 437 438
	}

	sg_free_table(ttm->sg);
}

439 440 441 442 443 444 445
static bool radeon_ttm_backend_is_bound(struct ttm_tt *ttm)
{
	struct radeon_ttm_tt *gtt = (void*)ttm;

	return (gtt->bound);
}

D
Dave Airlie 已提交
446 447
static int radeon_ttm_backend_bind(struct ttm_bo_device *bdev,
				   struct ttm_tt *ttm,
448
				   struct ttm_resource *bo_mem)
449
{
450
	struct radeon_ttm_tt *gtt = (void*)ttm;
D
Dave Airlie 已提交
451
	struct radeon_device *rdev = radeon_get_rdev(bdev);
452 453
	uint32_t flags = RADEON_GART_PAGE_VALID | RADEON_GART_PAGE_READ |
		RADEON_GART_PAGE_WRITE;
454 455
	int r;

456 457 458
	if (gtt->bound)
		return 0;

459
	if (gtt->userptr) {
D
Dave Airlie 已提交
460
		radeon_ttm_tt_pin_userptr(bdev, ttm);
461 462 463
		flags &= ~RADEON_GART_PAGE_WRITE;
	}

464 465
	gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
	if (!ttm->num_pages) {
466
		WARN(1, "nothing to bind %u pages for mreg %p back %p!\n",
467 468
		     ttm->num_pages, bo_mem, ttm);
	}
469
	if (ttm->caching == ttm_cached)
470
		flags |= RADEON_GART_PAGE_SNOOP;
471
	r = radeon_gart_bind(rdev, gtt->offset, ttm->num_pages,
472
			     ttm->pages, gtt->ttm.dma_address, flags);
473
	if (r) {
474
		DRM_ERROR("failed to bind %u pages at 0x%08X\n",
475 476 477
			  ttm->num_pages, (unsigned)gtt->offset);
		return r;
	}
478
	gtt->bound = true;
479 480 481
	return 0;
}

D
Dave Airlie 已提交
482
static void radeon_ttm_backend_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
483
{
484
	struct radeon_ttm_tt *gtt = (void *)ttm;
D
Dave Airlie 已提交
485
	struct radeon_device *rdev = radeon_get_rdev(bdev);
486

487 488 489
	if (!gtt->bound)
		return;

490
	radeon_gart_unbind(rdev, gtt->offset, ttm->num_pages);
491 492

	if (gtt->userptr)
D
Dave Airlie 已提交
493
		radeon_ttm_tt_unpin_userptr(bdev, ttm);
494
	gtt->bound = false;
495 496
}

D
Dave Airlie 已提交
497
static void radeon_ttm_backend_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
498
{
499
	struct radeon_ttm_tt *gtt = (void *)ttm;
500

501
	radeon_ttm_backend_unbind(bdev, ttm);
D
Dave Airlie 已提交
502 503
	ttm_tt_destroy_common(bdev, ttm);

504
	ttm_tt_fini(&gtt->ttm);
505 506 507
	kfree(gtt);
}

508 509
static struct ttm_tt *radeon_ttm_tt_create(struct ttm_buffer_object *bo,
					   uint32_t page_flags)
510 511 512
{
	struct radeon_device *rdev;
	struct radeon_ttm_tt *gtt;
513 514 515 516
	enum ttm_caching caching;
	struct radeon_bo *rbo;

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

518
	rdev = radeon_get_rdev(bo->bdev);
D
Daniel Vetter 已提交
519
#if IS_ENABLED(CONFIG_AGP)
520
	if (rdev->flags & RADEON_IS_AGP) {
521 522
		return ttm_agp_tt_create(bo, rdev->ddev->agp->bridge,
					 page_flags);
523 524 525 526 527 528 529
	}
#endif

	gtt = kzalloc(sizeof(struct radeon_ttm_tt), GFP_KERNEL);
	if (gtt == NULL) {
		return NULL;
	}
530 531 532 533 534 535 536 537

	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;

538
	if (ttm_sg_tt_init(&gtt->ttm, bo, page_flags, caching)) {
539
		kfree(gtt);
540 541
		return NULL;
	}
542
	return &gtt->ttm;
543 544
}

545 546
static struct radeon_ttm_tt *radeon_ttm_tt_to_gtt(struct radeon_device *rdev,
						  struct ttm_tt *ttm)
547
{
548 549 550 551 552 553
#if IS_ENABLED(CONFIG_AGP)
	if (rdev->flags & RADEON_IS_AGP)
		return NULL;
#endif

	if (!ttm)
554
		return NULL;
555
	return container_of(ttm, struct radeon_ttm_tt, ttm);
556 557
}

D
Dave Airlie 已提交
558 559 560
static int radeon_ttm_tt_populate(struct ttm_bo_device *bdev,
				  struct ttm_tt *ttm,
				  struct ttm_operation_ctx *ctx)
561
{
562 563
	struct radeon_device *rdev = radeon_get_rdev(bdev);
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
564
	bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
565

566
	if (gtt && gtt->userptr) {
567
		ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
568 569 570 571 572 573 574
		if (!ttm->sg)
			return -ENOMEM;

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

575
	if (slave && ttm->sg) {
576 577
		drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
					       ttm->num_pages);
578 579 580
		return 0;
	}

581
	return ttm_pool_alloc(&rdev->mman.bdev.pool, ttm, ctx);
582 583
}

D
Dave Airlie 已提交
584
static void radeon_ttm_tt_unpopulate(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
585
{
586 587
	struct radeon_device *rdev = radeon_get_rdev(bdev);
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
588 589
	bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);

590
	if (gtt && gtt->userptr) {
591 592 593 594 595
		kfree(ttm->sg);
		ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
		return;
	}

596 597
	if (slave)
		return;
598

599
	return ttm_pool_free(&rdev->mman.bdev.pool, ttm);
600
}
601

602 603
int radeon_ttm_tt_set_userptr(struct radeon_device *rdev,
			      struct ttm_tt *ttm, uint64_t addr,
604 605
			      uint32_t flags)
{
606
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
607 608 609 610 611 612 613 614 615 616

	if (gtt == NULL)
		return -EINVAL;

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

617 618 619 620 621 622 623 624 625 626 627
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);
}

628 629 630 631
static int radeon_ttm_tt_bind(struct ttm_bo_device *bdev,
			      struct ttm_tt *ttm,
			      struct ttm_resource *bo_mem)
{
632
#if IS_ENABLED(CONFIG_AGP)
633
	struct radeon_device *rdev = radeon_get_rdev(bdev);
634
#endif
635

636 637
	if (!bo_mem)
		return -EINVAL;
638 639
#if IS_ENABLED(CONFIG_AGP)
	if (rdev->flags & RADEON_IS_AGP)
640
		return ttm_agp_bind(ttm, bo_mem);
641 642 643 644 645 646 647 648 649 650 651 652
#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) {
653
		ttm_agp_unbind(ttm);
654 655 656 657 658 659 660 661 662 663 664 665 666
		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) {
667
		ttm_agp_unbind(ttm);
D
Dave Airlie 已提交
668
		ttm_tt_destroy_common(bdev, ttm);
669
		ttm_agp_destroy(ttm);
670 671 672 673 674 675 676 677
		return;
	}
#endif
	radeon_ttm_backend_destroy(bdev, ttm);
}

bool radeon_ttm_tt_has_userptr(struct radeon_device *rdev,
			       struct ttm_tt *ttm)
678
{
679
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
680 681 682 683 684 685 686

	if (gtt == NULL)
		return false;

	return !!gtt->userptr;
}

687 688
bool radeon_ttm_tt_is_readonly(struct radeon_device *rdev,
			       struct ttm_tt *ttm)
689
{
690
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
691 692 693 694 695 696 697

	if (gtt == NULL)
		return false;

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

698 699 700 701 702 703
static void
radeon_bo_delete_mem_notify(struct ttm_buffer_object *bo)
{
	radeon_bo_move_notify(bo, false, NULL);
}

704
static struct ttm_bo_driver radeon_bo_driver = {
705
	.ttm_tt_create = &radeon_ttm_tt_create,
706 707
	.ttm_tt_populate = &radeon_ttm_tt_populate,
	.ttm_tt_unpopulate = &radeon_ttm_tt_unpopulate,
708
	.ttm_tt_destroy = &radeon_ttm_tt_destroy,
709
	.eviction_valuable = ttm_bo_eviction_valuable,
710 711 712
	.evict_flags = &radeon_evict_flags,
	.move = &radeon_bo_move,
	.verify_access = &radeon_verify_access,
713
	.delete_mem_notify = &radeon_bo_delete_mem_notify,
714
	.io_mem_reserve = &radeon_ttm_io_mem_reserve,
715 716 717 718 719 720 721
};

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

	/* No others user of address space so set it to 0 */
722
	r = ttm_bo_device_init(&rdev->mman.bdev, &radeon_bo_driver, rdev->dev,
723
			       rdev->ddev->anon_inode->i_mapping,
724
			       rdev->ddev->vma_offset_manager,
725
			       rdev->need_swiotlb,
726
			       dma_addressing_limited(&rdev->pdev->dev));
727 728 729 730
	if (r) {
		DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
		return r;
	}
731
	rdev->mman.initialized = true;
732

733 734 735
	ttm_pool_init(&rdev->mman.bdev.pool, rdev->dev, rdev->need_swiotlb,
		      dma_addressing_limited(&rdev->pdev->dev));

736
	r = radeon_ttm_init_vram(rdev);
737 738 739 740
	if (r) {
		DRM_ERROR("Failed initializing VRAM heap.\n");
		return r;
	}
741 742 743
	/* 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);

744
	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
745
			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
K
Kent Russell 已提交
746
			     NULL, &rdev->stolen_vga_memory);
747 748 749
	if (r) {
		return r;
	}
K
Kent Russell 已提交
750
	r = radeon_bo_reserve(rdev->stolen_vga_memory, false);
751 752
	if (r)
		return r;
K
Kent Russell 已提交
753 754
	r = radeon_bo_pin(rdev->stolen_vga_memory, RADEON_GEM_DOMAIN_VRAM, NULL);
	radeon_bo_unreserve(rdev->stolen_vga_memory);
755
	if (r) {
K
Kent Russell 已提交
756
		radeon_bo_unref(&rdev->stolen_vga_memory);
757 758 759
		return r;
	}
	DRM_INFO("radeon: %uM of VRAM memory ready\n",
760
		 (unsigned) (rdev->mc.real_vram_size / (1024 * 1024)));
761 762

	r = radeon_ttm_init_gtt(rdev);
763 764 765 766 767
	if (r) {
		DRM_ERROR("Failed initializing GTT heap.\n");
		return r;
	}
	DRM_INFO("radeon: %uM of GTT memory ready.\n",
768
		 (unsigned)(rdev->mc.gtt_size / (1024 * 1024)));
769 770 771 772 773 774

	r = radeon_ttm_debugfs_init(rdev);
	if (r) {
		DRM_ERROR("Failed to init debugfs\n");
		return r;
	}
775 776 777 778 779
	return 0;
}

void radeon_ttm_fini(struct radeon_device *rdev)
{
780 781
	int r;

782 783
	if (!rdev->mman.initialized)
		return;
784
	radeon_ttm_debugfs_fini(rdev);
K
Kent Russell 已提交
785 786
	if (rdev->stolen_vga_memory) {
		r = radeon_bo_reserve(rdev->stolen_vga_memory, false);
787
		if (r == 0) {
K
Kent Russell 已提交
788 789
			radeon_bo_unpin(rdev->stolen_vga_memory);
			radeon_bo_unreserve(rdev->stolen_vga_memory);
790
		}
K
Kent Russell 已提交
791
		radeon_bo_unref(&rdev->stolen_vga_memory);
792
	}
793 794
	ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_VRAM);
	ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_TT);
795 796
	ttm_bo_device_release(&rdev->mman.bdev);
	radeon_gart_fini(rdev);
797
	rdev->mman.initialized = false;
798 799 800
	DRM_INFO("radeon: ttm finalized\n");
}

801 802 803 804
/* 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)
{
805
	struct ttm_resource_manager *man;
806 807 808 809

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

810
	man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM);
811 812 813 814
	/* this just adjusts TTM size idea, which sets lpfn to the correct value */
	man->size = size >> PAGE_SHIFT;
}

815
static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf)
816
{
817 818
	struct ttm_buffer_object *bo = vmf->vma->vm_private_data;
	struct radeon_device *rdev = radeon_get_rdev(bo->bdev);
819
	vm_fault_t ret;
820

821
	down_read(&rdev->pm.mclk_lock);
822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839

	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:
840
	up_read(&rdev->pm.mclk_lock);
841
	return ret;
842 843
}

844 845 846 847 848 849 850
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
};

851 852 853
int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
{
	int r;
854 855
	struct drm_file *file_priv = filp->private_data;
	struct radeon_device *rdev = file_priv->minor->dev->dev_private;
856

857
	if (rdev == NULL)
858
		return -EINVAL;
859

860
	r = ttm_bo_mmap(filp, vma, &rdev->mman.bdev);
861
	if (unlikely(r != 0))
862
		return r;
863

864 865 866 867
	vma->vm_ops = &radeon_ttm_vm_ops;
	return 0;
}

868
#if defined(CONFIG_DEBUG_FS)
869

870 871 872
static int radeon_mm_dump_table(struct seq_file *m, void *data)
{
	struct drm_info_node *node = (struct drm_info_node *)m->private;
873
	unsigned ttm_pl = *(int*)node->info_ent->data;
874 875
	struct drm_device *dev = node->minor->dev;
	struct radeon_device *rdev = dev->dev_private;
876
	struct ttm_resource_manager *man = ttm_manager_type(&rdev->mman.bdev, ttm_pl);
D
Daniel Vetter 已提交
877
	struct drm_printer p = drm_seq_file_printer(m);
878

879
	man->func->debug(man, &p);
D
Daniel Vetter 已提交
880
	return 0;
881
}
882

883 884 885 886 887 888 889 890
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);
}
891

892 893 894 895 896 897
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},
898
	{"ttm_page_pool", radeon_ttm_pool_debugfs, 0, NULL}
899 900
};

901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
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
};

953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
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;
971
		size_t cur_size = min_t(size_t, size, PAGE_SIZE - off);
972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
		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
};

1007 1008 1009 1010
#endif

static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
{
1011
#if defined(CONFIG_DEBUG_FS)
1012 1013 1014
	unsigned count;

	struct drm_minor *minor = rdev->ddev->primary;
1015 1016 1017 1018 1019 1020 1021 1022
	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);
1023

1024
	count = ARRAY_SIZE(radeon_ttm_debugfs_list);
1025

1026 1027 1028
	return radeon_debugfs_add_files(rdev, radeon_ttm_debugfs_list, count);
#else

1029
	return 0;
1030
#endif
1031
}
1032 1033 1034 1035 1036 1037 1038

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

	debugfs_remove(rdev->mman.vram);
	rdev->mman.vram = NULL;
1039 1040 1041

	debugfs_remove(rdev->mman.gtt);
	rdev->mman.gtt = NULL;
1042 1043
#endif
}