radeon_ttm.c 27.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 49 50
#include <drm/ttm/ttm_bo_api.h>
#include <drm/ttm/ttm_bo_driver.h>
#include <drm/ttm/ttm_module.h>
#include <drm/ttm/ttm_page_alloc.h>
51 52
#include <drm/ttm/ttm_placement.h>

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

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

59
struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
60 61 62 63 64 65 66 67 68
{
	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;
}

69 70
static int radeon_ttm_init_vram(struct radeon_device *rdev)
{
71
	return ttm_range_man_init(&rdev->mman.bdev, TTM_PL_VRAM,
72
				  false, rdev->mc.real_vram_size >> PAGE_SHIFT);
73 74 75 76
}

static int radeon_ttm_init_gtt(struct radeon_device *rdev)
{
77
	return ttm_range_man_init(&rdev->mman.bdev, TTM_PL_TT,
78
				  true, rdev->mc.gtt_size >> PAGE_SHIFT);
79 80
}

81 82
static void radeon_evict_flags(struct ttm_buffer_object *bo,
				struct ttm_placement *placement)
83
{
84
	static const struct ttm_place placements = {
85 86
		.fpfn = 0,
		.lpfn = 0,
87 88
		.mem_type = TTM_PL_SYSTEM,
		.flags = TTM_PL_MASK_CACHING
89 90
	};

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

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

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

static int radeon_move_blit(struct ttm_buffer_object *bo,
150
			bool evict, bool no_wait_gpu,
151 152
			struct ttm_resource *new_mem,
			struct ttm_resource *old_mem)
153 154 155
{
	struct radeon_device *rdev;
	uint64_t old_start, new_start;
156
	struct radeon_fence *fence;
157
	unsigned num_pages;
158
	int r, ridx;
159 160

	rdev = radeon_get_rdev(bo->bdev);
161
	ridx = radeon_copy_ring_index(rdev);
162 163
	old_start = (u64)old_mem->start << PAGE_SHIFT;
	new_start = (u64)new_mem->start << PAGE_SHIFT;
164 165 166

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

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

194
	num_pages = new_mem->num_pages * (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
195
	fence = radeon_copy(rdev, old_start, new_start, num_pages, bo->base.resv);
196 197 198
	if (IS_ERR(fence))
		return PTR_ERR(fence);

199
	r = ttm_bo_move_accel_cleanup(bo, &fence->base, evict, new_mem);
200 201 202 203 204
	radeon_fence_unref(&fence);
	return r;
}

static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
205
				bool evict, bool interruptible,
206
				bool no_wait_gpu,
207
				struct ttm_resource *new_mem)
208
{
209
	struct ttm_operation_ctx ctx = { interruptible, no_wait_gpu };
210 211
	struct ttm_resource *old_mem = &bo->mem;
	struct ttm_resource tmp_mem;
212
	struct ttm_place placements;
213
	struct ttm_placement placement;
214 215 216 217
	int r;

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

	r = ttm_tt_set_placement_caching(bo->ttm, tmp_mem.placement);
	if (unlikely(r)) {
		goto out_cleanup;
	}

D
Dave Airlie 已提交
236
	r = ttm_tt_bind(bo->bdev, bo->ttm, &tmp_mem, &ctx);
237 238 239
	if (unlikely(r)) {
		goto out_cleanup;
	}
240
	r = radeon_move_blit(bo, true, no_wait_gpu, &tmp_mem, old_mem);
241 242 243
	if (unlikely(r)) {
		goto out_cleanup;
	}
244
	r = ttm_bo_move_ttm(bo, &ctx, new_mem);
245
out_cleanup:
246
	ttm_resource_free(bo, &tmp_mem);
247 248 249 250
	return r;
}

static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
251
				bool evict, bool interruptible,
252
				bool no_wait_gpu,
253
				struct ttm_resource *new_mem)
254
{
255
	struct ttm_operation_ctx ctx = { interruptible, no_wait_gpu };
256 257
	struct ttm_resource *old_mem = &bo->mem;
	struct ttm_resource tmp_mem;
258
	struct ttm_placement placement;
259
	struct ttm_place placements;
260 261 262 263
	int r;

	tmp_mem = *new_mem;
	tmp_mem.mm_node = NULL;
264 265 266 267
	placement.num_placement = 1;
	placement.placement = &placements;
	placement.num_busy_placement = 1;
	placement.busy_placement = &placements;
268 269
	placements.fpfn = 0;
	placements.lpfn = 0;
270 271
	placements.mem_type = TTM_PL_TT;
	placements.flags = TTM_PL_MASK_CACHING;
272
	r = ttm_bo_mem_space(bo, &placement, &tmp_mem, &ctx);
273 274 275
	if (unlikely(r)) {
		return r;
	}
276
	r = ttm_bo_move_ttm(bo, &ctx, &tmp_mem);
277 278 279
	if (unlikely(r)) {
		goto out_cleanup;
	}
280
	r = radeon_move_blit(bo, true, no_wait_gpu, new_mem, old_mem);
281 282 283 284
	if (unlikely(r)) {
		goto out_cleanup;
	}
out_cleanup:
285
	ttm_resource_free(bo, &tmp_mem);
286 287 288
	return r;
}

289 290
static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
			  struct ttm_operation_ctx *ctx,
291
			  struct ttm_resource *new_mem)
292 293
{
	struct radeon_device *rdev;
294
	struct radeon_bo *rbo;
295
	struct ttm_resource *old_mem = &bo->mem;
296 297
	int r;

298
	r = ttm_bo_wait(bo, ctx->interruptible, ctx->no_wait_gpu);
299 300 301
	if (r)
		return r;

302 303 304 305 306
	/* Can't move a pinned BO */
	rbo = container_of(bo, struct radeon_bo, tbo);
	if (WARN_ON_ONCE(rbo->pin_count > 0))
		return -EINVAL;

307 308
	rdev = radeon_get_rdev(bo->bdev);
	if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
309
		ttm_bo_move_null(bo, new_mem);
310 311 312 313 314 315
		return 0;
	}
	if ((old_mem->mem_type == TTM_PL_TT &&
	     new_mem->mem_type == TTM_PL_SYSTEM) ||
	    (old_mem->mem_type == TTM_PL_SYSTEM &&
	     new_mem->mem_type == TTM_PL_TT)) {
316
		/* bind is enough */
317
		ttm_bo_move_null(bo, new_mem);
318 319
		return 0;
	}
320 321
	if (!rdev->ring[radeon_copy_ring_index(rdev)].ready ||
	    rdev->asic->copy.copy == NULL) {
322
		/* use memcpy */
323
		goto memcpy;
324 325 326 327
	}

	if (old_mem->mem_type == TTM_PL_VRAM &&
	    new_mem->mem_type == TTM_PL_SYSTEM) {
328 329
		r = radeon_move_vram_ram(bo, evict, ctx->interruptible,
					ctx->no_wait_gpu, new_mem);
330 331
	} else if (old_mem->mem_type == TTM_PL_SYSTEM &&
		   new_mem->mem_type == TTM_PL_VRAM) {
332 333
		r = radeon_move_ram_vram(bo, evict, ctx->interruptible,
					    ctx->no_wait_gpu, new_mem);
334
	} else {
335 336
		r = radeon_move_blit(bo, evict, ctx->no_wait_gpu,
				     new_mem, old_mem);
337
	}
338 339 340

	if (r) {
memcpy:
341
		r = ttm_bo_move_memcpy(bo, ctx, new_mem);
342 343 344
		if (r) {
			return r;
		}
345
	}
346 347 348 349

	/* update statistics */
	atomic64_add((u64)bo->num_pages << PAGE_SHIFT, &rdev->num_bytes_moved);
	return 0;
350 351
}

352
static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_resource *mem)
353 354
{
	struct radeon_device *rdev = radeon_get_rdev(bdev);
355
	size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT;
356 357 358 359 360 361

	switch (mem->mem_type) {
	case TTM_PL_SYSTEM:
		/* system memory */
		return 0;
	case TTM_PL_TT:
D
Daniel Vetter 已提交
362
#if IS_ENABLED(CONFIG_AGP)
363 364
		if (rdev->flags & RADEON_IS_AGP) {
			/* RADEON_IS_AGP is set only if AGP is active */
365 366
			mem->bus.offset = (mem->start << PAGE_SHIFT) +
				rdev->mc.agp_base;
367
			mem->bus.is_iomem = !rdev->ddev->agp->cant_use_aperture;
368 369 370 371
		}
#endif
		break;
	case TTM_PL_VRAM:
372
		mem->bus.offset = mem->start << PAGE_SHIFT;
373
		/* check if it's visible */
374
		if ((mem->bus.offset + bus_size) > rdev->mc.visible_vram_size)
375
			return -EINVAL;
376
		mem->bus.offset += rdev->mc.aper_base;
377
		mem->bus.is_iomem = true;
378 379 380 381 382 383 384
#ifdef __alpha__
		/*
		 * Alpha: use bus.addr to hold the ioremap() return,
		 * so we can modify bus.base below.
		 */
		if (mem->placement & TTM_PL_FLAG_WC)
			mem->bus.addr =
385
				ioremap_wc(mem->bus.offset, bus_size);
386 387
		else
			mem->bus.addr =
388
				ioremap(mem->bus.offset, bus_size);
389 390
		if (!mem->bus.addr)
			return -ENOMEM;
391 392 393 394 395 396 397

		/*
		 * 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().
		 */
398
		mem->bus.offset = (mem->bus.offset & 0x0ffffffffUL) +
399 400
			rdev->ddev->hose->dense_mem_base;
#endif
401 402 403 404 405 406 407
		break;
	default:
		return -EINVAL;
	}
	return 0;
}

408 409 410 411
/*
 * TTM backend functions.
 */
struct radeon_ttm_tt {
412
	struct ttm_dma_tt		ttm;
413
	u64				offset;
414 415 416 417

	uint64_t			userptr;
	struct mm_struct		*usermm;
	uint32_t			userflags;
418 419
};

420
/* prepare the sg table with the user pages */
D
Dave Airlie 已提交
421
static int radeon_ttm_tt_pin_userptr(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
422
{
D
Dave Airlie 已提交
423
	struct radeon_device *rdev = radeon_get_rdev(bdev);
424
	struct radeon_ttm_tt *gtt = (void *)ttm;
425
	unsigned pinned = 0;
426 427 428 429 430 431 432 433 434
	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;

435 436 437 438 439 440 441 442 443 444
	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;
	}

445 446 447 448 449
	do {
		unsigned num_pages = ttm->num_pages - pinned;
		uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE;
		struct page **pages = ttm->pages + pinned;

450 451
		r = get_user_pages(userptr, num_pages, write ? FOLL_WRITE : 0,
				   pages, NULL);
452 453 454 455 456 457 458 459 460 461 462 463 464
		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;

465 466
	r = dma_map_sgtable(rdev->dev, ttm->sg, direction, 0);
	if (r)
467 468 469 470 471 472 473 474 475 476 477
		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:
478
	release_pages(ttm->pages, pinned);
479 480 481
	return r;
}

D
Dave Airlie 已提交
482
static void radeon_ttm_tt_unpin_userptr(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
483
{
D
Dave Airlie 已提交
484
	struct radeon_device *rdev = radeon_get_rdev(bdev);
485
	struct radeon_ttm_tt *gtt = (void *)ttm;
486
	struct sg_page_iter sg_iter;
487 488 489 490 491

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

492 493 494 495
	/* double check that we don't free the table twice */
	if (!ttm->sg->sgl)
		return;

496
	/* free the sg table and pages again */
497
	dma_unmap_sgtable(rdev->dev, ttm->sg, direction, 0);
498

499
	for_each_sgtable_page(ttm->sg, &sg_iter, 0) {
500
		struct page *page = sg_page_iter_page(&sg_iter);
501 502 503 504
		if (!(gtt->userflags & RADEON_GEM_USERPTR_READONLY))
			set_page_dirty(page);

		mark_page_accessed(page);
505
		put_page(page);
506 507 508 509 510
	}

	sg_free_table(ttm->sg);
}

D
Dave Airlie 已提交
511 512
static int radeon_ttm_backend_bind(struct ttm_bo_device *bdev,
				   struct ttm_tt *ttm,
513
				   struct ttm_resource *bo_mem)
514
{
515
	struct radeon_ttm_tt *gtt = (void*)ttm;
D
Dave Airlie 已提交
516
	struct radeon_device *rdev = radeon_get_rdev(bdev);
517 518
	uint32_t flags = RADEON_GART_PAGE_VALID | RADEON_GART_PAGE_READ |
		RADEON_GART_PAGE_WRITE;
519 520
	int r;

521
	if (gtt->userptr) {
D
Dave Airlie 已提交
522
		radeon_ttm_tt_pin_userptr(bdev, ttm);
523 524 525
		flags &= ~RADEON_GART_PAGE_WRITE;
	}

526 527 528 529 530
	gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
	if (!ttm->num_pages) {
		WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
		     ttm->num_pages, bo_mem, ttm);
	}
531 532
	if (ttm->caching_state == tt_cached)
		flags |= RADEON_GART_PAGE_SNOOP;
533
	r = radeon_gart_bind(rdev, gtt->offset, ttm->num_pages,
534
			     ttm->pages, gtt->ttm.dma_address, flags);
535 536 537 538 539 540 541 542
	if (r) {
		DRM_ERROR("failed to bind %lu pages at 0x%08X\n",
			  ttm->num_pages, (unsigned)gtt->offset);
		return r;
	}
	return 0;
}

D
Dave Airlie 已提交
543
static void radeon_ttm_backend_unbind(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
544
{
545
	struct radeon_ttm_tt *gtt = (void *)ttm;
D
Dave Airlie 已提交
546
	struct radeon_device *rdev = radeon_get_rdev(bdev);
547

548
	radeon_gart_unbind(rdev, gtt->offset, ttm->num_pages);
549 550

	if (gtt->userptr)
D
Dave Airlie 已提交
551
		radeon_ttm_tt_unpin_userptr(bdev, ttm);
552 553
}

D
Dave Airlie 已提交
554
static void radeon_ttm_backend_destroy(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
555
{
556
	struct radeon_ttm_tt *gtt = (void *)ttm;
557

558
	ttm_dma_tt_fini(&gtt->ttm);
559 560 561
	kfree(gtt);
}

562 563
static struct ttm_tt *radeon_ttm_tt_create(struct ttm_buffer_object *bo,
					   uint32_t page_flags)
564 565 566 567
{
	struct radeon_device *rdev;
	struct radeon_ttm_tt *gtt;

568
	rdev = radeon_get_rdev(bo->bdev);
D
Daniel Vetter 已提交
569
#if IS_ENABLED(CONFIG_AGP)
570
	if (rdev->flags & RADEON_IS_AGP) {
571 572
		return ttm_agp_tt_create(bo, rdev->ddev->agp->bridge,
					 page_flags);
573 574 575 576 577 578 579
	}
#endif

	gtt = kzalloc(sizeof(struct radeon_ttm_tt), GFP_KERNEL);
	if (gtt == NULL) {
		return NULL;
	}
580
	if (ttm_dma_tt_init(&gtt->ttm, bo, page_flags)) {
581
		kfree(gtt);
582 583
		return NULL;
	}
584
	return &gtt->ttm.ttm;
585 586
}

587 588
static struct radeon_ttm_tt *radeon_ttm_tt_to_gtt(struct radeon_device *rdev,
						  struct ttm_tt *ttm)
589
{
590 591 592 593 594 595
#if IS_ENABLED(CONFIG_AGP)
	if (rdev->flags & RADEON_IS_AGP)
		return NULL;
#endif

	if (!ttm)
596
		return NULL;
597
	return container_of(ttm, struct radeon_ttm_tt, ttm.ttm);
598 599
}

D
Dave Airlie 已提交
600 601 602
static int radeon_ttm_tt_populate(struct ttm_bo_device *bdev,
				  struct ttm_tt *ttm,
				  struct ttm_operation_ctx *ctx)
603
{
604 605
	struct radeon_device *rdev = radeon_get_rdev(bdev);
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
606
	bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
607

608
	if (gtt && gtt->userptr) {
609
		ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
610 611 612 613
		if (!ttm->sg)
			return -ENOMEM;

		ttm->page_flags |= TTM_PAGE_FLAG_SG;
614
		ttm_tt_set_populated(ttm);
615 616 617
		return 0;
	}

618 619 620
	if (slave && ttm->sg) {
		drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
						 gtt->ttm.dma_address, ttm->num_pages);
621
		ttm_tt_set_populated(ttm);
622 623 624
		return 0;
	}

D
Daniel Vetter 已提交
625
#if IS_ENABLED(CONFIG_AGP)
J
Jerome Glisse 已提交
626
	if (rdev->flags & RADEON_IS_AGP) {
627
		return ttm_pool_populate(ttm, ctx);
J
Jerome Glisse 已提交
628 629
	}
#endif
630 631

#ifdef CONFIG_SWIOTLB
632
	if (rdev->need_swiotlb && swiotlb_nr_tbl()) {
633
		return ttm_dma_populate(&gtt->ttm, rdev->dev, ctx);
634 635 636
	}
#endif

637
	return ttm_populate_and_map_pages(rdev->dev, &gtt->ttm, ctx);
638 639
}

D
Dave Airlie 已提交
640
static void radeon_ttm_tt_unpopulate(struct ttm_bo_device *bdev, struct ttm_tt *ttm)
641
{
642 643
	struct radeon_device *rdev = radeon_get_rdev(bdev);
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
644 645
	bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);

646
	if (gtt && gtt->userptr) {
647 648 649 650 651
		kfree(ttm->sg);
		ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
		return;
	}

652 653
	if (slave)
		return;
654

D
Daniel Vetter 已提交
655
#if IS_ENABLED(CONFIG_AGP)
J
Jerome Glisse 已提交
656
	if (rdev->flags & RADEON_IS_AGP) {
657
		ttm_pool_unpopulate(ttm);
J
Jerome Glisse 已提交
658 659 660
		return;
	}
#endif
661 662

#ifdef CONFIG_SWIOTLB
663
	if (rdev->need_swiotlb && swiotlb_nr_tbl()) {
664
		ttm_dma_unpopulate(&gtt->ttm, rdev->dev);
665 666 667 668
		return;
	}
#endif

669
	ttm_unmap_and_unpopulate_pages(rdev->dev, &gtt->ttm);
670
}
671

672 673
int radeon_ttm_tt_set_userptr(struct radeon_device *rdev,
			      struct ttm_tt *ttm, uint64_t addr,
674 675
			      uint32_t flags)
{
676
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
677 678 679 680 681 682 683 684 685 686

	if (gtt == NULL)
		return -EINVAL;

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

687 688 689 690 691 692 693 694
static int radeon_ttm_tt_bind(struct ttm_bo_device *bdev,
			      struct ttm_tt *ttm,
			      struct ttm_resource *bo_mem)
{
	struct radeon_device *rdev = radeon_get_rdev(bdev);

#if IS_ENABLED(CONFIG_AGP)
	if (rdev->flags & RADEON_IS_AGP)
695
		return ttm_agp_bind(ttm, bo_mem);
696 697 698 699 700 701 702 703 704 705 706 707
#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) {
708
		ttm_agp_unbind(ttm);
709 710 711 712 713 714 715 716 717 718 719 720 721
		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) {
722
		ttm_agp_destroy(ttm);
723 724 725 726 727 728 729 730
		return;
	}
#endif
	radeon_ttm_backend_destroy(bdev, ttm);
}

bool radeon_ttm_tt_has_userptr(struct radeon_device *rdev,
			       struct ttm_tt *ttm)
731
{
732
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
733 734 735 736 737 738 739

	if (gtt == NULL)
		return false;

	return !!gtt->userptr;
}

740 741
bool radeon_ttm_tt_is_readonly(struct radeon_device *rdev,
			       struct ttm_tt *ttm)
742
{
743
	struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm);
744 745 746 747 748 749 750

	if (gtt == NULL)
		return false;

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

751
static struct ttm_bo_driver radeon_bo_driver = {
752
	.ttm_tt_create = &radeon_ttm_tt_create,
753 754
	.ttm_tt_populate = &radeon_ttm_tt_populate,
	.ttm_tt_unpopulate = &radeon_ttm_tt_unpopulate,
755 756 757
	.ttm_tt_bind = &radeon_ttm_tt_bind,
	.ttm_tt_unbind = &radeon_ttm_tt_unbind,
	.ttm_tt_destroy = &radeon_ttm_tt_destroy,
758
	.eviction_valuable = ttm_bo_eviction_valuable,
759 760 761
	.evict_flags = &radeon_evict_flags,
	.move = &radeon_bo_move,
	.verify_access = &radeon_verify_access,
762 763
	.move_notify = &radeon_bo_move_notify,
	.fault_reserve_notify = &radeon_bo_fault_reserve_notify,
764
	.io_mem_reserve = &radeon_ttm_io_mem_reserve,
765 766 767 768 769 770 771 772
};

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

	/* No others user of address space so set it to 0 */
	r = ttm_bo_device_init(&rdev->mman.bdev,
773 774
			       &radeon_bo_driver,
			       rdev->ddev->anon_inode->i_mapping,
775
			       rdev->ddev->vma_offset_manager,
776
			       dma_addressing_limited(&rdev->pdev->dev));
777 778 779 780
	if (r) {
		DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
		return r;
	}
781
	rdev->mman.initialized = true;
782 783

	r = radeon_ttm_init_vram(rdev);
784 785 786 787
	if (r) {
		DRM_ERROR("Failed initializing VRAM heap.\n");
		return r;
	}
788 789 790
	/* 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);

791
	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
792
			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
K
Kent Russell 已提交
793
			     NULL, &rdev->stolen_vga_memory);
794 795 796
	if (r) {
		return r;
	}
K
Kent Russell 已提交
797
	r = radeon_bo_reserve(rdev->stolen_vga_memory, false);
798 799
	if (r)
		return r;
K
Kent Russell 已提交
800 801
	r = radeon_bo_pin(rdev->stolen_vga_memory, RADEON_GEM_DOMAIN_VRAM, NULL);
	radeon_bo_unreserve(rdev->stolen_vga_memory);
802
	if (r) {
K
Kent Russell 已提交
803
		radeon_bo_unref(&rdev->stolen_vga_memory);
804 805 806
		return r;
	}
	DRM_INFO("radeon: %uM of VRAM memory ready\n",
807
		 (unsigned) (rdev->mc.real_vram_size / (1024 * 1024)));
808 809

	r = radeon_ttm_init_gtt(rdev);
810 811 812 813 814
	if (r) {
		DRM_ERROR("Failed initializing GTT heap.\n");
		return r;
	}
	DRM_INFO("radeon: %uM of GTT memory ready.\n",
815
		 (unsigned)(rdev->mc.gtt_size / (1024 * 1024)));
816 817 818 819 820 821

	r = radeon_ttm_debugfs_init(rdev);
	if (r) {
		DRM_ERROR("Failed to init debugfs\n");
		return r;
	}
822 823 824 825 826
	return 0;
}

void radeon_ttm_fini(struct radeon_device *rdev)
{
827 828
	int r;

829 830
	if (!rdev->mman.initialized)
		return;
831
	radeon_ttm_debugfs_fini(rdev);
K
Kent Russell 已提交
832 833
	if (rdev->stolen_vga_memory) {
		r = radeon_bo_reserve(rdev->stolen_vga_memory, false);
834
		if (r == 0) {
K
Kent Russell 已提交
835 836
			radeon_bo_unpin(rdev->stolen_vga_memory);
			radeon_bo_unreserve(rdev->stolen_vga_memory);
837
		}
K
Kent Russell 已提交
838
		radeon_bo_unref(&rdev->stolen_vga_memory);
839
	}
840 841
	ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_VRAM);
	ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_TT);
842 843
	ttm_bo_device_release(&rdev->mman.bdev);
	radeon_gart_fini(rdev);
844
	rdev->mman.initialized = false;
845 846 847
	DRM_INFO("radeon: ttm finalized\n");
}

848 849 850 851
/* 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)
{
852
	struct ttm_resource_manager *man;
853 854 855 856

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

857
	man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM);
858 859 860 861
	/* this just adjusts TTM size idea, which sets lpfn to the correct value */
	man->size = size >> PAGE_SHIFT;
}

862
static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf)
863 864
{
	struct ttm_buffer_object *bo;
865
	struct radeon_device *rdev;
866
	vm_fault_t ret;
867

868
	bo = (struct ttm_buffer_object *)vmf->vma->vm_private_data;
869
	if (bo == NULL)
870
		return VM_FAULT_NOPAGE;
871

872
	rdev = radeon_get_rdev(bo->bdev);
873
	down_read(&rdev->pm.mclk_lock);
874
	ret = ttm_bo_vm_fault(vmf);
875
	up_read(&rdev->pm.mclk_lock);
876
	return ret;
877 878
}

879 880 881 882 883 884 885
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
};

886 887 888
int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
{
	int r;
889 890
	struct drm_file *file_priv = filp->private_data;
	struct radeon_device *rdev = file_priv->minor->dev->dev_private;
891

892
	if (rdev == NULL)
893
		return -EINVAL;
894

895
	r = ttm_bo_mmap(filp, vma, &rdev->mman.bdev);
896
	if (unlikely(r != 0))
897
		return r;
898

899 900 901 902
	vma->vm_ops = &radeon_ttm_vm_ops;
	return 0;
}

903
#if defined(CONFIG_DEBUG_FS)
904

905 906 907
static int radeon_mm_dump_table(struct seq_file *m, void *data)
{
	struct drm_info_node *node = (struct drm_info_node *)m->private;
908
	unsigned ttm_pl = *(int*)node->info_ent->data;
909 910
	struct drm_device *dev = node->minor->dev;
	struct radeon_device *rdev = dev->dev_private;
911
	struct ttm_resource_manager *man = ttm_manager_type(&rdev->mman.bdev, ttm_pl);
D
Daniel Vetter 已提交
912
	struct drm_printer p = drm_seq_file_printer(m);
913

914
	man->func->debug(man, &p);
D
Daniel Vetter 已提交
915
	return 0;
916
}
917

918

919 920 921 922 923 924 925 926 927 928 929 930
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},
	{"ttm_page_pool", ttm_page_alloc_debugfs, 0, NULL},
#ifdef CONFIG_SWIOTLB
	{"ttm_dma_page_pool", ttm_dma_page_alloc_debugfs, 0, NULL}
#endif
};

931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982
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
};

983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
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;
1001
		size_t cur_size = min_t(size_t, size, PAGE_SIZE - off);
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
		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
};

1037 1038 1039 1040
#endif

static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
{
1041
#if defined(CONFIG_DEBUG_FS)
1042 1043 1044
	unsigned count;

	struct drm_minor *minor = rdev->ddev->primary;
1045 1046 1047 1048 1049 1050 1051 1052
	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);
1053

1054
	count = ARRAY_SIZE(radeon_ttm_debugfs_list);
1055

1056
#ifdef CONFIG_SWIOTLB
1057
	if (!(rdev->need_swiotlb && swiotlb_nr_tbl()))
1058
		--count;
1059
#endif
1060

1061 1062 1063
	return radeon_debugfs_add_files(rdev, radeon_ttm_debugfs_list, count);
#else

1064
	return 0;
1065
#endif
1066
}
1067 1068 1069 1070 1071 1072 1073

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

	debugfs_remove(rdev->mman.vram);
	rdev->mman.vram = NULL;
1074 1075 1076

	debugfs_remove(rdev->mman.gtt);
	rdev->mman.gtt = NULL;
1077 1078
#endif
}