amdgpu_ttm.c 59.0 KB
Newer Older
A
Alex Deucher 已提交
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
#include <linux/dma-mapping.h>
34 35 36
#include <linux/iommu.h>
#include <linux/pagemap.h>
#include <linux/sched/task.h>
37
#include <linux/sched/mm.h>
38 39 40 41
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/swap.h>
#include <linux/swiotlb.h>
42
#include <linux/dma-buf.h>
43
#include <linux/sizes.h>
44

45 46 47
#include <drm/ttm/ttm_bo_api.h>
#include <drm/ttm/ttm_bo_driver.h>
#include <drm/ttm/ttm_placement.h>
48

A
Alex Deucher 已提交
49
#include <drm/amdgpu_drm.h>
50

A
Alex Deucher 已提交
51
#include "amdgpu.h"
52
#include "amdgpu_object.h"
53
#include "amdgpu_trace.h"
54
#include "amdgpu_amdkfd.h"
55
#include "amdgpu_sdma.h"
56
#include "amdgpu_ras.h"
57
#include "amdgpu_atomfirmware.h"
58
#include "amdgpu_res_cursor.h"
A
Alex Deucher 已提交
59 60
#include "bif/bif_4_1_d.h"

61 62
#define AMDGPU_TTM_VRAM_MAX_DW_READ	(size_t)128

63
static int amdgpu_ttm_backend_bind(struct ttm_device *bdev,
64 65
				   struct ttm_tt *ttm,
				   struct ttm_resource *bo_mem);
66
static void amdgpu_ttm_backend_unbind(struct ttm_device *bdev,
67
				      struct ttm_tt *ttm);
68

69
static int amdgpu_ttm_init_on_chip(struct amdgpu_device *adev,
70
				    unsigned int type,
71
				    uint64_t size_in_page)
72
{
73
	return ttm_range_man_init(&adev->mman.bdev, type,
74
				  false, size_in_page);
A
Alex Deucher 已提交
75 76
}

77 78 79 80 81 82 83 84
/**
 * amdgpu_evict_flags - Compute placement flags
 *
 * @bo: The buffer object to evict
 * @placement: Possible destination(s) for evicted BO
 *
 * Fill in placement data when ttm_bo_evict() is called
 */
A
Alex Deucher 已提交
85 86 87
static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
				struct ttm_placement *placement)
{
88
	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
89
	struct amdgpu_bo *abo;
90
	static const struct ttm_place placements = {
A
Alex Deucher 已提交
91 92
		.fpfn = 0,
		.lpfn = 0,
93
		.mem_type = TTM_PL_SYSTEM,
94
		.flags = 0
A
Alex Deucher 已提交
95 96
	};

97
	/* Don't handle scatter gather BOs */
98 99 100 101 102 103
	if (bo->type == ttm_bo_type_sg) {
		placement->num_placement = 0;
		placement->num_busy_placement = 0;
		return;
	}

104
	/* Object isn't an AMDGPU object so ignore */
105
	if (!amdgpu_bo_is_amdgpu_bo(bo)) {
A
Alex Deucher 已提交
106 107 108 109 110 111
		placement->placement = &placements;
		placement->busy_placement = &placements;
		placement->num_placement = 1;
		placement->num_busy_placement = 1;
		return;
	}
112

113
	abo = ttm_to_amdgpu_bo(bo);
114 115 116 117 118 119 120 121 122 123 124 125 126 127
	if (abo->flags & AMDGPU_AMDKFD_CREATE_SVM_BO) {
		struct dma_fence *fence;
		struct dma_resv *resv = &bo->base._resv;

		rcu_read_lock();
		fence = rcu_dereference(resv->fence_excl);
		if (fence && !fence->ops->signaled)
			dma_fence_enable_sw_signaling(fence);

		placement->num_placement = 0;
		placement->num_busy_placement = 0;
		rcu_read_unlock();
		return;
	}
128 129

	switch (bo->resource->mem_type) {
130 131 132 133 134 135 136
	case AMDGPU_PL_GDS:
	case AMDGPU_PL_GWS:
	case AMDGPU_PL_OA:
		placement->num_placement = 0;
		placement->num_busy_placement = 0;
		return;

A
Alex Deucher 已提交
137
	case TTM_PL_VRAM:
138
		if (!adev->mman.buffer_funcs_enabled) {
139
			/* Move to system memory */
140
			amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
141
		} else if (!amdgpu_gmc_vram_full_visible(&adev->gmc) &&
142 143
			   !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) &&
			   amdgpu_bo_in_cpu_visible_vram(abo)) {
144 145 146 147 148 149

			/* 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
			 */
150
			amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM |
151
							 AMDGPU_GEM_DOMAIN_GTT);
152
			abo->placements[0].fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
153 154 155
			abo->placements[0].lpfn = 0;
			abo->placement.busy_placement = &abo->placements[1];
			abo->placement.num_busy_placement = 1;
156
		} else {
157
			/* Move to GTT memory */
158
			amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT);
159
		}
A
Alex Deucher 已提交
160 161 162
		break;
	case TTM_PL_TT:
	default:
163
		amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
164
		break;
A
Alex Deucher 已提交
165
	}
166
	*placement = abo->placement;
A
Alex Deucher 已提交
167 168
}

169 170 171 172
/**
 * amdgpu_ttm_map_buffer - Map memory into the GART windows
 * @bo: buffer object to map
 * @mem: memory object to map
173
 * @mm_cur: range to map
174 175 176 177 178 179 180 181 182 183
 * @num_pages: number of pages to map
 * @window: which GART window to use
 * @ring: DMA ring to use for the copy
 * @tmz: if we should setup a TMZ enabled mapping
 * @addr: resulting address inside the MC address space
 *
 * Setup one of the GART windows to access a specific piece of memory or return
 * the physical address for local memory.
 */
static int amdgpu_ttm_map_buffer(struct ttm_buffer_object *bo,
184
				 struct ttm_resource *mem,
185 186 187 188
				 struct amdgpu_res_cursor *mm_cur,
				 unsigned num_pages, unsigned window,
				 struct amdgpu_ring *ring, bool tmz,
				 uint64_t *addr)
189 190 191 192 193 194
{
	struct amdgpu_device *adev = ring->adev;
	struct amdgpu_job *job;
	unsigned num_dw, num_bytes;
	struct dma_fence *fence;
	uint64_t src_addr, dst_addr;
195
	void *cpu_addr;
196
	uint64_t flags;
197
	unsigned int i;
198 199 200 201 202 203
	int r;

	BUG_ON(adev->mman.buffer_funcs->copy_max_bytes <
	       AMDGPU_GTT_MAX_TRANSFER_SIZE * 8);

	/* Map only what can't be accessed directly */
204
	if (!tmz && mem->start != AMDGPU_BO_INVALID_OFFSET) {
205 206
		*addr = amdgpu_ttm_domain_start(adev, mem->mem_type) +
			mm_cur->start;
207 208 209 210 211 212
		return 0;
	}

	*addr = adev->gmc.gart_start;
	*addr += (u64)window * AMDGPU_GTT_MAX_TRANSFER_SIZE *
		AMDGPU_GPU_PAGE_SIZE;
213
	*addr += mm_cur->start & ~PAGE_MASK;
214 215

	num_dw = ALIGN(adev->mman.buffer_funcs->copy_num_dw, 8);
216
	num_bytes = num_pages * 8 * AMDGPU_GPU_PAGES_IN_CPU_PAGE;
217 218

	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4 + num_bytes,
219
				     AMDGPU_IB_POOL_DELAYED, &job);
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
	if (r)
		return r;

	src_addr = num_dw * 4;
	src_addr += job->ibs[0].gpu_addr;

	dst_addr = amdgpu_bo_gpu_offset(adev->gart.bo);
	dst_addr += window * AMDGPU_GTT_MAX_TRANSFER_SIZE * 8;
	amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_addr,
				dst_addr, num_bytes, false);

	amdgpu_ring_pad_ib(ring, &job->ibs[0]);
	WARN_ON(job->ibs[0].length_dw > num_dw);

	flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, mem);
	if (tmz)
		flags |= AMDGPU_PTE_TMZ;

238 239 240
	cpu_addr = &job->ibs[0].ptr[num_dw];

	if (mem->mem_type == TTM_PL_TT) {
241
		dma_addr_t *dma_addr;
242

243 244
		dma_addr = &bo->ttm->dma_address[mm_cur->start >> PAGE_SHIFT];
		r = amdgpu_gart_map(adev, 0, num_pages, dma_addr, flags,
245 246 247 248 249 250
				    cpu_addr);
		if (r)
			goto error_free;
	} else {
		dma_addr_t dma_address;

251
		dma_address = mm_cur->start;
252 253 254 255 256 257 258 259 260 261 262
		dma_address += adev->vm_manager.vram_base_offset;

		for (i = 0; i < num_pages; ++i) {
			r = amdgpu_gart_map(adev, i << PAGE_SHIFT, 1,
					    &dma_address, flags, cpu_addr);
			if (r)
				goto error_free;

			dma_address += PAGE_SIZE;
		}
	}
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277

	r = amdgpu_job_submit(job, &adev->mman.entity,
			      AMDGPU_FENCE_OWNER_UNDEFINED, &fence);
	if (r)
		goto error_free;

	dma_fence_put(fence);

	return r;

error_free:
	amdgpu_job_free(job);
	return r;
}

278
/**
279
 * amdgpu_ttm_copy_mem_to_mem - Helper function for copy
280 281 282 283 284 285 286
 * @adev: amdgpu device
 * @src: buffer/address where to read from
 * @dst: buffer/address where to write to
 * @size: number of bytes to copy
 * @tmz: if a secure copy should be used
 * @resv: resv object to sync to
 * @f: Returns the last fence if multiple jobs are submitted.
287 288 289 290 291 292 293
 *
 * The function copies @size bytes from {src->mem + src->offset} to
 * {dst->mem + dst->offset}. src->bo and dst->bo could be same BO for a
 * move and different for a BO to BO copy.
 *
 */
int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,
294 295
			       const struct amdgpu_copy_mem *src,
			       const struct amdgpu_copy_mem *dst,
296
			       uint64_t size, bool tmz,
297
			       struct dma_resv *resv,
298
			       struct dma_fence **f)
299
{
300 301 302
	const uint32_t GTT_MAX_BYTES = (AMDGPU_GTT_MAX_TRANSFER_SIZE *
					AMDGPU_GPU_PAGE_SIZE);

303
	struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
304
	struct amdgpu_res_cursor src_mm, dst_mm;
305
	struct dma_fence *fence = NULL;
306
	int r = 0;
307

308
	if (!adev->mman.buffer_funcs_enabled) {
A
Alex Deucher 已提交
309 310 311 312
		DRM_ERROR("Trying to move memory with ring turned off.\n");
		return -EINVAL;
	}

313 314
	amdgpu_res_first(src->mem, src->offset, size, &src_mm);
	amdgpu_res_first(dst->mem, dst->offset, size, &dst_mm);
315

316
	mutex_lock(&adev->mman.gtt_window_lock);
317 318 319
	while (src_mm.remaining) {
		uint32_t src_page_offset = src_mm.start & ~PAGE_MASK;
		uint32_t dst_page_offset = dst_mm.start & ~PAGE_MASK;
320
		struct dma_fence *next;
321 322
		uint32_t cur_size;
		uint64_t from, to;
323

324 325 326
		/* Copy size cannot exceed GTT_MAX_BYTES. So if src or dst
		 * begins at an offset, then adjust the size accordingly
		 */
327
		cur_size = max(src_page_offset, dst_page_offset);
328
		cur_size = min(min3(src_mm.size, dst_mm.size, size),
329
			       (uint64_t)(GTT_MAX_BYTES - cur_size));
330 331

		/* Map src to window 0 and dst to window 1. */
332
		r = amdgpu_ttm_map_buffer(src->bo, src->mem, &src_mm,
333
					  PFN_UP(cur_size + src_page_offset),
334
					  0, ring, tmz, &from);
335 336
		if (r)
			goto error;
337

338
		r = amdgpu_ttm_map_buffer(dst->bo, dst->mem, &dst_mm,
339
					  PFN_UP(cur_size + dst_page_offset),
340
					  1, ring, tmz, &to);
341 342
		if (r)
			goto error;
343

344
		r = amdgpu_copy_buffer(ring, from, to, cur_size,
345
				       resv, &next, false, true, tmz);
346 347 348
		if (r)
			goto error;

349
		dma_fence_put(fence);
350 351
		fence = next;

352 353
		amdgpu_res_next(&src_mm, cur_size);
		amdgpu_res_next(&dst_mm, cur_size);
354
	}
355
error:
356
	mutex_unlock(&adev->mman.gtt_window_lock);
357 358 359 360 361 362
	if (f)
		*f = dma_fence_get(fence);
	dma_fence_put(fence);
	return r;
}

363
/*
364 365
 * amdgpu_move_blit - Copy an entire buffer to another buffer
 *
366 367
 * This is a helper called by amdgpu_bo_move() and amdgpu_move_vram_ram() to
 * help move buffers to and from VRAM.
368
 */
369
static int amdgpu_move_blit(struct ttm_buffer_object *bo,
370
			    bool evict,
371 372
			    struct ttm_resource *new_mem,
			    struct ttm_resource *old_mem)
373 374
{
	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
375
	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
376 377 378 379 380 381 382 383 384 385 386 387 388
	struct amdgpu_copy_mem src, dst;
	struct dma_fence *fence = NULL;
	int r;

	src.bo = bo;
	dst.bo = bo;
	src.mem = old_mem;
	dst.mem = new_mem;
	src.offset = 0;
	dst.offset = 0;

	r = amdgpu_ttm_copy_mem_to_mem(adev, &src, &dst,
				       new_mem->num_pages << PAGE_SHIFT,
389
				       amdgpu_bo_encrypted(abo),
390
				       bo->base.resv, &fence);
391 392
	if (r)
		goto error;
393

394 395
	/* clear the space being freed */
	if (old_mem->mem_type == TTM_PL_VRAM &&
396
	    (abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE)) {
397 398 399 400 401 402 403 404 405 406 407 408
		struct dma_fence *wipe_fence = NULL;

		r = amdgpu_fill_buffer(ttm_to_amdgpu_bo(bo), AMDGPU_POISON,
				       NULL, &wipe_fence);
		if (r) {
			goto error;
		} else if (wipe_fence) {
			dma_fence_put(fence);
			fence = wipe_fence;
		}
	}

409 410
	/* Always block for VM page tables before committing the new location */
	if (bo->type == ttm_bo_type_kernel)
411
		r = ttm_bo_move_accel_cleanup(bo, fence, true, false, new_mem);
412
	else
413
		r = ttm_bo_move_accel_cleanup(bo, fence, evict, true, new_mem);
414
	dma_fence_put(fence);
A
Alex Deucher 已提交
415
	return r;
416 417 418

error:
	if (fence)
419 420
		dma_fence_wait(fence, false);
	dma_fence_put(fence);
421
	return r;
A
Alex Deucher 已提交
422 423
}

424
/*
425 426 427 428 429
 * amdgpu_mem_visible - Check that memory can be accessed by ttm_bo_move_memcpy
 *
 * Called by amdgpu_bo_move()
 */
static bool amdgpu_mem_visible(struct amdgpu_device *adev,
430
			       struct ttm_resource *mem)
431
{
432 433
	uint64_t mem_size = (u64)mem->num_pages << PAGE_SHIFT;
	struct amdgpu_res_cursor cursor;
434 435 436 437 438 439 440

	if (mem->mem_type == TTM_PL_SYSTEM ||
	    mem->mem_type == TTM_PL_TT)
		return true;
	if (mem->mem_type != TTM_PL_VRAM)
		return false;

441 442
	amdgpu_res_first(mem, 0, mem_size, &cursor);

443
	/* ttm_resource_ioremap only supports contiguous memory */
444
	if (cursor.size != mem_size)
445 446
		return false;

447
	return cursor.start + cursor.size <= adev->gmc.visible_vram_size;
448 449
}

450
/*
451 452 453 454
 * amdgpu_bo_move - Move a buffer object to a new memory location
 *
 * Called by ttm_bo_handle_move_mem()
 */
455 456
static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
			  struct ttm_operation_ctx *ctx,
457 458
			  struct ttm_resource *new_mem,
			  struct ttm_place *hop)
A
Alex Deucher 已提交
459 460
{
	struct amdgpu_device *adev;
461
	struct amdgpu_bo *abo;
462
	struct ttm_resource *old_mem = bo->resource;
A
Alex Deucher 已提交
463 464
	int r;

465 466 467 468 469 470
	if (new_mem->mem_type == TTM_PL_TT) {
		r = amdgpu_ttm_backend_bind(bo->bdev, bo->ttm, new_mem);
		if (r)
			return r;
	}

471
	/* Can't move a pinned BO */
472
	abo = ttm_to_amdgpu_bo(bo);
473
	if (WARN_ON_ONCE(abo->tbo.pin_count > 0))
474 475
		return -EINVAL;

476
	adev = amdgpu_ttm_adev(bo->bdev);
477

A
Alex Deucher 已提交
478
	if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
479
		ttm_bo_move_null(bo, new_mem);
480
		goto out;
A
Alex Deucher 已提交
481
	}
482 483
	if (old_mem->mem_type == TTM_PL_SYSTEM &&
	    new_mem->mem_type == TTM_PL_TT) {
484
		ttm_bo_move_null(bo, new_mem);
485
		goto out;
A
Alex Deucher 已提交
486
	}
487
	if (old_mem->mem_type == TTM_PL_TT &&
488
	    new_mem->mem_type == TTM_PL_SYSTEM) {
489
		r = ttm_bo_wait_ctx(bo, ctx);
490
		if (r)
491
			return r;
492 493

		amdgpu_ttm_backend_unbind(bo->bdev, bo->ttm);
494
		ttm_resource_free(bo, bo->resource);
495
		ttm_bo_assign_mem(bo, new_mem);
496
		goto out;
497
	}
498

499 500 501 502 503 504 505
	if (old_mem->mem_type == AMDGPU_PL_GDS ||
	    old_mem->mem_type == AMDGPU_PL_GWS ||
	    old_mem->mem_type == AMDGPU_PL_OA ||
	    new_mem->mem_type == AMDGPU_PL_GDS ||
	    new_mem->mem_type == AMDGPU_PL_GWS ||
	    new_mem->mem_type == AMDGPU_PL_OA) {
		/* Nothing to save here */
506
		ttm_bo_move_null(bo, new_mem);
507
		goto out;
508
	}
509

510 511 512 513 514 515 516 517 518 519 520 521 522 523
	if (adev->mman.buffer_funcs_enabled) {
		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 = amdgpu_move_blit(bo, evict, new_mem, old_mem);
	} else {
524 525
		r = -ENODEV;
	}
A
Alex Deucher 已提交
526 527

	if (r) {
528 529 530 531
		/* Check that all memory is CPU accessible */
		if (!amdgpu_mem_visible(adev, old_mem) ||
		    !amdgpu_mem_visible(adev, new_mem)) {
			pr_err("Move buffer fallback to memcpy unavailable\n");
532
			return r;
A
Alex Deucher 已提交
533
		}
534 535 536

		r = ttm_bo_move_memcpy(bo, ctx, new_mem);
		if (r)
537
			return r;
A
Alex Deucher 已提交
538 539
	}

540 541 542 543 544 545 546 547 548
	if (bo->type == ttm_bo_type_device &&
	    new_mem->mem_type == TTM_PL_VRAM &&
	    old_mem->mem_type != TTM_PL_VRAM) {
		/* amdgpu_bo_fault_reserve_notify will re-set this if the CPU
		 * accesses the BO after it's moved.
		 */
		abo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
	}

549
out:
A
Alex Deucher 已提交
550
	/* update statistics */
551
	atomic64_add(bo->base.size, &adev->num_bytes_moved);
552
	amdgpu_bo_move_notify(bo, evict, new_mem);
A
Alex Deucher 已提交
553 554 555
	return 0;
}

556
/*
557 558 559 560
 * amdgpu_ttm_io_mem_reserve - Reserve a block of memory during a fault
 *
 * Called by ttm_mem_io_reserve() ultimately via ttm_bo_vm_fault()
 */
561 562
static int amdgpu_ttm_io_mem_reserve(struct ttm_device *bdev,
				     struct ttm_resource *mem)
A
Alex Deucher 已提交
563
{
564
	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
565
	size_t bus_size = (size_t)mem->num_pages << PAGE_SHIFT;
A
Alex Deucher 已提交
566 567 568 569 570 571 572 573 574 575

	switch (mem->mem_type) {
	case TTM_PL_SYSTEM:
		/* system memory */
		return 0;
	case TTM_PL_TT:
		break;
	case TTM_PL_VRAM:
		mem->bus.offset = mem->start << PAGE_SHIFT;
		/* check if it's visible */
576
		if ((mem->bus.offset + bus_size) > adev->gmc.visible_vram_size)
A
Alex Deucher 已提交
577
			return -EINVAL;
578

579
		if (adev->mman.aper_base_kaddr &&
580
		    mem->placement & TTM_PL_FLAG_CONTIGUOUS)
581 582 583
			mem->bus.addr = (u8 *)adev->mman.aper_base_kaddr +
					mem->bus.offset;

584
		mem->bus.offset += adev->gmc.aper_base;
A
Alex Deucher 已提交
585
		mem->bus.is_iomem = true;
586 587 588 589
		if (adev->gmc.xgmi.connected_to_cpu)
			mem->bus.caching = ttm_cached;
		else
			mem->bus.caching = ttm_write_combined;
A
Alex Deucher 已提交
590 591 592 593 594 595 596
		break;
	default:
		return -EINVAL;
	}
	return 0;
}

597 598 599
static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,
					   unsigned long page_offset)
{
600
	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
601
	struct amdgpu_res_cursor cursor;
602

603 604
	amdgpu_res_first(bo->resource, (u64)page_offset << PAGE_SHIFT, 0,
			 &cursor);
605
	return (adev->gmc.aper_base + cursor.start) >> PAGE_SHIFT;
606 607
}

608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628
/**
 * amdgpu_ttm_domain_start - Returns GPU start address
 * @adev: amdgpu device object
 * @type: type of the memory
 *
 * Returns:
 * GPU start address of a memory domain
 */

uint64_t amdgpu_ttm_domain_start(struct amdgpu_device *adev, uint32_t type)
{
	switch (type) {
	case TTM_PL_TT:
		return adev->gmc.gart_start;
	case TTM_PL_VRAM:
		return adev->gmc.vram_start;
	}

	return 0;
}

A
Alex Deucher 已提交
629 630 631 632
/*
 * TTM backend functions.
 */
struct amdgpu_ttm_tt {
633
	struct ttm_tt	ttm;
634
	struct drm_gem_object	*gobj;
635 636
	u64			offset;
	uint64_t		userptr;
637
	struct task_struct	*usertask;
638
	uint32_t		userflags;
639
	bool			bound;
640
#if IS_ENABLED(CONFIG_DRM_AMDGPU_USERPTR)
641
	struct hmm_range	*range;
642
#endif
A
Alex Deucher 已提交
643 644
};

645
#ifdef CONFIG_DRM_AMDGPU_USERPTR
646
/*
647 648
 * amdgpu_ttm_tt_get_user_pages - get device accessible pages that back user
 * memory and start HMM tracking CPU page table update
649
 *
650 651
 * Calling function must call amdgpu_ttm_tt_userptr_range_done() once and only
 * once afterwards to stop HMM tracking
652
 */
653
int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages)
A
Alex Deucher 已提交
654
{
655
	struct ttm_tt *ttm = bo->tbo.ttm;
A
Alex Deucher 已提交
656
	struct amdgpu_ttm_tt *gtt = (void *)ttm;
657
	unsigned long start = gtt->userptr;
658
	struct vm_area_struct *vma;
659
	struct mm_struct *mm;
660
	bool readonly;
661
	int r = 0;
A
Alex Deucher 已提交
662

663 664 665
	mm = bo->notifier.mm;
	if (unlikely(!mm)) {
		DRM_DEBUG_DRIVER("BO is not registered?\n");
666
		return -EFAULT;
667
	}
668

669 670 671 672
	/* Another get_user_pages is running at the same time?? */
	if (WARN_ON(gtt->range))
		return -EFAULT;

673
	if (!mmget_not_zero(mm)) /* Happens during process shutdown */
674 675
		return -ESRCH;

676
	mmap_read_lock(mm);
677
	vma = find_vma(mm, start);
678
	mmap_read_unlock(mm);
679 680
	if (unlikely(!vma || start < vma->vm_start)) {
		r = -EFAULT;
681
		goto out_putmm;
682
	}
683
	if (unlikely((gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) &&
684
		vma->vm_file)) {
685
		r = -EPERM;
686
		goto out_putmm;
687
	}
688

689 690 691 692 693
	readonly = amdgpu_ttm_tt_is_readonly(ttm);
	r = amdgpu_hmm_range_get_pages(&bo->notifier, mm, pages, start,
				       ttm->num_pages, &gtt->range, readonly,
				       false);
out_putmm:
694
	mmput(mm);
695

696 697 698
	return r;
}

699
/*
700 701
 * amdgpu_ttm_tt_userptr_range_done - stop HMM track the CPU page table change
 * Check if the pages backing this ttm range have been invalidated
702
 *
703
 * Returns: true if pages are still valid
704
 */
705
bool amdgpu_ttm_tt_get_user_pages_done(struct ttm_tt *ttm)
706
{
707
	struct amdgpu_ttm_tt *gtt = (void *)ttm;
708
	bool r = false;
709

710 711
	if (!gtt || !gtt->userptr)
		return false;
712

713
	DRM_DEBUG_DRIVER("user_pages_done 0x%llx pages 0x%x\n",
714
		gtt->userptr, ttm->num_pages);
715

716
	WARN_ONCE(!gtt->range || !gtt->range->hmm_pfns,
717 718
		"No user pages to check\n");

719
	if (gtt->range) {
720 721 722 723
		/*
		 * FIXME: Must always hold notifier_lock for this, and must
		 * not ignore the return code.
		 */
724
		r = amdgpu_hmm_range_get_pages_done(gtt->range);
725
		gtt->range = NULL;
726
	}
727

728
	return !r;
729
}
730
#endif
731

732
/*
733
 * amdgpu_ttm_tt_set_user_pages - Copy pages in, putting old pages as necessary.
734
 *
735
 * Called by amdgpu_cs_list_validate(). This creates the page list
736 737
 * that backs user memory and will ultimately be mapped into the device
 * address space.
738
 */
739
void amdgpu_ttm_tt_set_user_pages(struct ttm_tt *ttm, struct page **pages)
740
{
741
	unsigned long i;
742

743
	for (i = 0; i < ttm->num_pages; ++i)
744
		ttm->pages[i] = pages ? pages[i] : NULL;
745 746
}

747
/*
748
 * amdgpu_ttm_tt_pin_userptr - prepare the sg table with the user pages
749 750 751
 *
 * Called by amdgpu_ttm_backend_bind()
 **/
752
static int amdgpu_ttm_tt_pin_userptr(struct ttm_device *bdev,
D
Dave Airlie 已提交
753
				     struct ttm_tt *ttm)
754
{
D
Dave Airlie 已提交
755
	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
756 757 758 759
	struct amdgpu_ttm_tt *gtt = (void *)ttm;
	int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
	enum dma_data_direction direction = write ?
		DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
760
	int r;
761

762
	/* Allocate an SG array and squash pages into it */
A
Alex Deucher 已提交
763
	r = sg_alloc_table_from_pages(ttm->sg, ttm->pages, ttm->num_pages, 0,
X
xinhui pan 已提交
764
				      (u64)ttm->num_pages << PAGE_SHIFT,
A
Alex Deucher 已提交
765 766 767 768
				      GFP_KERNEL);
	if (r)
		goto release_sg;

769
	/* Map SG to device */
770 771
	r = dma_map_sgtable(adev->dev, ttm->sg, direction, 0);
	if (r)
A
Alex Deucher 已提交
772 773
		goto release_sg;

774
	/* convert SG to linear array of pages and dma addresses */
775 776
	drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
				       ttm->num_pages);
A
Alex Deucher 已提交
777 778 779 780 781

	return 0;

release_sg:
	kfree(ttm->sg);
782
	ttm->sg = NULL;
A
Alex Deucher 已提交
783 784 785
	return r;
}

786
/*
787 788
 * amdgpu_ttm_tt_unpin_userptr - Unpin and unmap userptr pages
 */
789
static void amdgpu_ttm_tt_unpin_userptr(struct ttm_device *bdev,
D
Dave Airlie 已提交
790
					struct ttm_tt *ttm)
A
Alex Deucher 已提交
791
{
D
Dave Airlie 已提交
792
	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
A
Alex Deucher 已提交
793 794 795 796 797 798
	struct amdgpu_ttm_tt *gtt = (void *)ttm;
	int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
	enum dma_data_direction direction = write ?
		DMA_BIDIRECTIONAL : DMA_TO_DEVICE;

	/* double check that we don't free the table twice */
799
	if (!ttm->sg || !ttm->sg->sgl)
A
Alex Deucher 已提交
800 801
		return;

802
	/* unmap the pages mapped to the device */
803
	dma_unmap_sgtable(adev->dev, ttm->sg, direction, 0);
804
	sg_free_table(ttm->sg);
805

806
#if IS_ENABLED(CONFIG_DRM_AMDGPU_USERPTR)
807 808 809 810 811
	if (gtt->range) {
		unsigned long i;

		for (i = 0; i < ttm->num_pages; i++) {
			if (ttm->pages[i] !=
812
			    hmm_pfn_to_page(gtt->range->hmm_pfns[i]))
813 814 815 816 817
				break;
		}

		WARN((i == ttm->num_pages), "Missing get_user_page_done\n");
	}
818
#endif
A
Alex Deucher 已提交
819 820
}

821
static int amdgpu_ttm_gart_bind(struct amdgpu_device *adev,
822 823 824 825 826 827 828 829
				struct ttm_buffer_object *tbo,
				uint64_t flags)
{
	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(tbo);
	struct ttm_tt *ttm = tbo->ttm;
	struct amdgpu_ttm_tt *gtt = (void *)ttm;
	int r;

830 831 832
	if (amdgpu_bo_encrypted(abo))
		flags |= AMDGPU_PTE_TMZ;

833
	if (abo->flags & AMDGPU_GEM_CREATE_CP_MQD_GFX9) {
834 835 836 837 838 839 840
		uint64_t page_idx = 1;

		r = amdgpu_gart_bind(adev, gtt->offset, page_idx,
				ttm->pages, gtt->ttm.dma_address, flags);
		if (r)
			goto gart_bind_fail;

841 842 843 844
		/* The memory type of the first page defaults to UC. Now
		 * modify the memory type to NC from the second page of
		 * the BO onward.
		 */
845 846
		flags &= ~AMDGPU_PTE_MTYPE_VG10_MASK;
		flags |= AMDGPU_PTE_MTYPE_VG10(AMDGPU_MTYPE_NC);
847 848 849 850 851 852 853 854 855 856 857 858 859

		r = amdgpu_gart_bind(adev,
				gtt->offset + (page_idx << PAGE_SHIFT),
				ttm->num_pages - page_idx,
				&ttm->pages[page_idx],
				&(gtt->ttm.dma_address[page_idx]), flags);
	} else {
		r = amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
				     ttm->pages, gtt->ttm.dma_address, flags);
	}

gart_bind_fail:
	if (r)
860
		DRM_ERROR("failed to bind %u pages at 0x%08llX\n",
861 862 863 864 865
			  ttm->num_pages, gtt->offset);

	return r;
}

866
/*
867 868 869 870 871
 * amdgpu_ttm_backend_bind - Bind GTT memory
 *
 * Called by ttm_tt_bind() on behalf of ttm_bo_handle_move_mem().
 * This handles binding GTT memory to the device address space.
 */
872
static int amdgpu_ttm_backend_bind(struct ttm_device *bdev,
D
Dave Airlie 已提交
873
				   struct ttm_tt *ttm,
874
				   struct ttm_resource *bo_mem)
A
Alex Deucher 已提交
875
{
D
Dave Airlie 已提交
876
	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
A
Alex Deucher 已提交
877
	struct amdgpu_ttm_tt *gtt = (void*)ttm;
878
	uint64_t flags;
879
	int r = 0;
A
Alex Deucher 已提交
880

881 882 883 884 885 886
	if (!bo_mem)
		return -EINVAL;

	if (gtt->bound)
		return 0;

887
	if (gtt->userptr) {
D
Dave Airlie 已提交
888
		r = amdgpu_ttm_tt_pin_userptr(bdev, ttm);
889 890 891 892
		if (r) {
			DRM_ERROR("failed to pin userptr\n");
			return r;
		}
893 894 895 896 897 898 899 900 901 902 903 904 905 906 907
	} else if (ttm->page_flags & TTM_PAGE_FLAG_SG) {
		if (!ttm->sg) {
			struct dma_buf_attachment *attach;
			struct sg_table *sgt;

			attach = gtt->gobj->import_attach;
			sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
			if (IS_ERR(sgt))
				return PTR_ERR(sgt);

			ttm->sg = sgt;
		}

		drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
					       ttm->num_pages);
908
	}
909

A
Alex Deucher 已提交
910
	if (!ttm->num_pages) {
911
		WARN(1, "nothing to bind %u pages for mreg %p back %p!\n",
A
Alex Deucher 已提交
912 913 914 915 916 917 918 919
		     ttm->num_pages, bo_mem, ttm);
	}

	if (bo_mem->mem_type == AMDGPU_PL_GDS ||
	    bo_mem->mem_type == AMDGPU_PL_GWS ||
	    bo_mem->mem_type == AMDGPU_PL_OA)
		return -EINVAL;

920 921
	if (!amdgpu_gtt_mgr_has_gart_addr(bo_mem)) {
		gtt->offset = AMDGPU_BO_INVALID_OFFSET;
922
		return 0;
923
	}
924

925
	/* compute PTE flags relevant to this BO memory */
C
Christian König 已提交
926
	flags = amdgpu_ttm_tt_pte_flags(adev, ttm, bo_mem);
927 928

	/* bind pages into GART page tables */
929
	gtt->offset = (u64)bo_mem->start << PAGE_SHIFT;
C
Christian König 已提交
930
	r = amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
931 932
		ttm->pages, gtt->ttm.dma_address, flags);

933
	if (r)
934
		DRM_ERROR("failed to bind %u pages at 0x%08llX\n",
935
			  ttm->num_pages, gtt->offset);
936
	gtt->bound = true;
937
	return r;
938 939
}

940
/*
941 942 943 944 945 946
 * amdgpu_ttm_alloc_gart - Make sure buffer object is accessible either
 * through AGP or GART aperture.
 *
 * If bo is accessible through AGP aperture, then use AGP aperture
 * to access bo; otherwise allocate logical space in GART aperture
 * and map bo to GART aperture.
947
 */
948
int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo)
949
{
950
	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
951
	struct ttm_operation_ctx ctx = { false, false };
952
	struct amdgpu_ttm_tt *gtt = (void *)bo->ttm;
953
	struct ttm_resource tmp;
954 955
	struct ttm_placement placement;
	struct ttm_place placements;
956
	uint64_t addr, flags;
957 958
	int r;

959
	if (bo->resource->start != AMDGPU_BO_INVALID_OFFSET)
960 961
		return 0;

962 963
	addr = amdgpu_gmc_agp_addr(bo);
	if (addr != AMDGPU_BO_INVALID_OFFSET) {
964
		bo->resource->start = addr >> PAGE_SHIFT;
965
	} else {
966

967 968 969 970 971 972 973
		/* allocate GART space */
		placement.num_placement = 1;
		placement.placement = &placements;
		placement.num_busy_placement = 1;
		placement.busy_placement = &placements;
		placements.fpfn = 0;
		placements.lpfn = adev->gmc.gart_size >> PAGE_SHIFT;
974
		placements.mem_type = TTM_PL_TT;
975
		placements.flags = bo->resource->placement;
976 977 978 979

		r = ttm_bo_mem_space(bo, &placement, &tmp, &ctx);
		if (unlikely(r))
			return r;
980

981 982
		/* compute PTE flags for this buffer object */
		flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, &tmp);
983

984
		/* Bind pages */
985
		gtt->offset = (u64)tmp.start << PAGE_SHIFT;
986 987
		r = amdgpu_ttm_gart_bind(adev, bo, flags);
		if (unlikely(r)) {
988
			ttm_resource_free(bo, &tmp);
989 990 991
			return r;
		}

992 993
		ttm_resource_free(bo, bo->resource);
		ttm_bo_assign_mem(bo, &tmp);
994
	}
995

996
	return 0;
A
Alex Deucher 已提交
997 998
}

999
/*
1000 1001 1002 1003 1004
 * amdgpu_ttm_recover_gart - Rebind GTT pages
 *
 * Called by amdgpu_gtt_mgr_recover() from amdgpu_device_reset() to
 * rebind GTT pages during a GPU reset.
 */
1005
int amdgpu_ttm_recover_gart(struct ttm_buffer_object *tbo)
1006
{
1007
	struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
1008
	uint64_t flags;
1009 1010
	int r;

1011
	if (!tbo->ttm)
1012 1013
		return 0;

1014
	flags = amdgpu_ttm_tt_pte_flags(adev, tbo->ttm, tbo->resource);
1015 1016
	r = amdgpu_ttm_gart_bind(adev, tbo, flags);

1017
	return r;
1018 1019
}

1020
/*
1021 1022 1023 1024 1025
 * amdgpu_ttm_backend_unbind - Unbind GTT mapped pages
 *
 * Called by ttm_tt_unbind() on behalf of ttm_bo_move_ttm() and
 * ttm_tt_destroy().
 */
1026
static void amdgpu_ttm_backend_unbind(struct ttm_device *bdev,
D
Dave Airlie 已提交
1027
				      struct ttm_tt *ttm)
A
Alex Deucher 已提交
1028
{
D
Dave Airlie 已提交
1029
	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
A
Alex Deucher 已提交
1030
	struct amdgpu_ttm_tt *gtt = (void *)ttm;
1031
	int r;
A
Alex Deucher 已提交
1032

1033
	/* if the pages have userptr pinning then clear that first */
1034
	if (gtt->userptr) {
D
Dave Airlie 已提交
1035
		amdgpu_ttm_tt_unpin_userptr(bdev, ttm);
1036 1037 1038 1039 1040 1041 1042
	} else if (ttm->sg && gtt->gobj->import_attach) {
		struct dma_buf_attachment *attach;

		attach = gtt->gobj->import_attach;
		dma_buf_unmap_attachment(attach, ttm->sg, DMA_BIDIRECTIONAL);
		ttm->sg = NULL;
	}
1043

1044 1045 1046
	if (!gtt->bound)
		return;

1047
	if (gtt->offset == AMDGPU_BO_INVALID_OFFSET)
1048
		return;
1049

A
Alex Deucher 已提交
1050
	/* unbind shouldn't be done for GDS/GWS/OA in ttm_bo_clean_mm */
C
Christian König 已提交
1051
	r = amdgpu_gart_unbind(adev, gtt->offset, ttm->num_pages);
1052
	if (r)
1053
		DRM_ERROR("failed to unbind %u pages at 0x%08llX\n",
1054
			  gtt->ttm.num_pages, gtt->offset);
1055
	gtt->bound = false;
A
Alex Deucher 已提交
1056 1057
}

1058
static void amdgpu_ttm_backend_destroy(struct ttm_device *bdev,
D
Dave Airlie 已提交
1059
				       struct ttm_tt *ttm)
A
Alex Deucher 已提交
1060 1061 1062
{
	struct amdgpu_ttm_tt *gtt = (void *)ttm;

1063
	amdgpu_ttm_backend_unbind(bdev, ttm);
D
Dave Airlie 已提交
1064
	ttm_tt_destroy_common(bdev, ttm);
1065 1066 1067
	if (gtt->usertask)
		put_task_struct(gtt->usertask);

1068
	ttm_tt_fini(&gtt->ttm);
A
Alex Deucher 已提交
1069 1070 1071
	kfree(gtt);
}

1072 1073 1074 1075
/**
 * amdgpu_ttm_tt_create - Create a ttm_tt object for a given BO
 *
 * @bo: The buffer object to create a GTT ttm_tt object around
1076
 * @page_flags: Page flags to be added to the ttm_tt object
1077 1078 1079
 *
 * Called by ttm_tt_create().
 */
1080 1081
static struct ttm_tt *amdgpu_ttm_tt_create(struct ttm_buffer_object *bo,
					   uint32_t page_flags)
A
Alex Deucher 已提交
1082
{
1083
	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
A
Alex Deucher 已提交
1084
	struct amdgpu_ttm_tt *gtt;
1085
	enum ttm_caching caching;
A
Alex Deucher 已提交
1086 1087 1088 1089 1090

	gtt = kzalloc(sizeof(struct amdgpu_ttm_tt), GFP_KERNEL);
	if (gtt == NULL) {
		return NULL;
	}
1091
	gtt->gobj = &bo->base;
1092

1093 1094 1095 1096 1097
	if (abo->flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
		caching = ttm_write_combined;
	else
		caching = ttm_cached;

1098
	/* allocate space for the uninitialized page entries */
1099
	if (ttm_sg_tt_init(&gtt->ttm, bo, page_flags, caching)) {
A
Alex Deucher 已提交
1100 1101 1102
		kfree(gtt);
		return NULL;
	}
1103
	return &gtt->ttm;
A
Alex Deucher 已提交
1104 1105
}

1106
/*
1107 1108 1109 1110 1111
 * amdgpu_ttm_tt_populate - Map GTT pages visible to the device
 *
 * Map the pages of a ttm_tt object to an address space visible
 * to the underlying device.
 */
1112
static int amdgpu_ttm_tt_populate(struct ttm_device *bdev,
D
Dave Airlie 已提交
1113 1114
				  struct ttm_tt *ttm,
				  struct ttm_operation_ctx *ctx)
A
Alex Deucher 已提交
1115
{
D
Dave Airlie 已提交
1116
	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
A
Alex Deucher 已提交
1117 1118
	struct amdgpu_ttm_tt *gtt = (void *)ttm;

1119
	/* user pages are bound by amdgpu_ttm_tt_pin_userptr() */
A
Alex Deucher 已提交
1120
	if (gtt && gtt->userptr) {
1121
		ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
A
Alex Deucher 已提交
1122 1123 1124 1125 1126 1127 1128
		if (!ttm->sg)
			return -ENOMEM;

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

1129
	if (ttm->page_flags & TTM_PAGE_FLAG_SG)
1130
		return 0;
A
Alex Deucher 已提交
1131

1132
	return ttm_pool_alloc(&adev->mman.bdev.pool, ttm, ctx);
A
Alex Deucher 已提交
1133 1134
}

1135
/*
1136 1137 1138 1139 1140
 * amdgpu_ttm_tt_unpopulate - unmap GTT pages and unpopulate page arrays
 *
 * Unmaps pages of a ttm_tt object from the device address space and
 * unpopulates the page array backing it.
 */
1141
static void amdgpu_ttm_tt_unpopulate(struct ttm_device *bdev,
1142
				     struct ttm_tt *ttm)
A
Alex Deucher 已提交
1143 1144
{
	struct amdgpu_ttm_tt *gtt = (void *)ttm;
1145
	struct amdgpu_device *adev;
A
Alex Deucher 已提交
1146 1147

	if (gtt && gtt->userptr) {
1148
		amdgpu_ttm_tt_set_user_pages(ttm, NULL);
A
Alex Deucher 已提交
1149
		kfree(ttm->sg);
1150
		ttm->sg = NULL;
A
Alex Deucher 已提交
1151
		ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
1152 1153 1154 1155
		return;
	}

	if (ttm->page_flags & TTM_PAGE_FLAG_SG)
A
Alex Deucher 已提交
1156 1157
		return;

D
Dave Airlie 已提交
1158
	adev = amdgpu_ttm_adev(bdev);
1159
	return ttm_pool_free(&adev->mman.bdev.pool, ttm);
A
Alex Deucher 已提交
1160 1161
}

1162
/**
1163 1164
 * amdgpu_ttm_tt_set_userptr - Initialize userptr GTT ttm_tt for the current
 * task
1165
 *
1166
 * @bo: The ttm_buffer_object to bind this userptr to
1167 1168 1169 1170 1171 1172
 * @addr:  The address in the current tasks VM space to use
 * @flags: Requirements of userptr object.
 *
 * Called by amdgpu_gem_userptr_ioctl() to bind userptr pages
 * to current task
 */
1173 1174
int amdgpu_ttm_tt_set_userptr(struct ttm_buffer_object *bo,
			      uint64_t addr, uint32_t flags)
A
Alex Deucher 已提交
1175
{
1176
	struct amdgpu_ttm_tt *gtt;
A
Alex Deucher 已提交
1177

1178 1179 1180 1181 1182 1183
	if (!bo->ttm) {
		/* TODO: We want a separate TTM object type for userptrs */
		bo->ttm = amdgpu_ttm_tt_create(bo, 0);
		if (bo->ttm == NULL)
			return -ENOMEM;
	}
A
Alex Deucher 已提交
1184

1185
	gtt = (void *)bo->ttm;
A
Alex Deucher 已提交
1186 1187
	gtt->userptr = addr;
	gtt->userflags = flags;
1188 1189 1190 1191 1192 1193

	if (gtt->usertask)
		put_task_struct(gtt->usertask);
	gtt->usertask = current->group_leader;
	get_task_struct(gtt->usertask);

A
Alex Deucher 已提交
1194 1195 1196
	return 0;
}

1197
/*
1198 1199
 * amdgpu_ttm_tt_get_usermm - Return memory manager for ttm_tt object
 */
1200
struct mm_struct *amdgpu_ttm_tt_get_usermm(struct ttm_tt *ttm)
A
Alex Deucher 已提交
1201 1202 1203 1204
{
	struct amdgpu_ttm_tt *gtt = (void *)ttm;

	if (gtt == NULL)
1205
		return NULL;
A
Alex Deucher 已提交
1206

1207 1208 1209 1210
	if (gtt->usertask == NULL)
		return NULL;

	return gtt->usertask->mm;
A
Alex Deucher 已提交
1211 1212
}

1213
/*
1214 1215
 * amdgpu_ttm_tt_affect_userptr - Determine if a ttm_tt object lays inside an
 * address range for the current task.
1216 1217
 *
 */
1218 1219 1220 1221 1222 1223
bool amdgpu_ttm_tt_affect_userptr(struct ttm_tt *ttm, unsigned long start,
				  unsigned long end)
{
	struct amdgpu_ttm_tt *gtt = (void *)ttm;
	unsigned long size;

1224
	if (gtt == NULL || !gtt->userptr)
1225 1226
		return false;

1227 1228 1229
	/* Return false if no part of the ttm_tt object lies within
	 * the range
	 */
1230
	size = (unsigned long)gtt->ttm.num_pages * PAGE_SIZE;
1231 1232 1233 1234 1235 1236
	if (gtt->userptr > end || gtt->userptr + size <= start)
		return false;

	return true;
}

1237
/*
1238
 * amdgpu_ttm_tt_is_userptr - Have the pages backing by userptr?
1239
 */
1240
bool amdgpu_ttm_tt_is_userptr(struct ttm_tt *ttm)
1241 1242 1243 1244 1245 1246
{
	struct amdgpu_ttm_tt *gtt = (void *)ttm;

	if (gtt == NULL || !gtt->userptr)
		return false;

1247
	return true;
1248 1249
}

1250
/*
1251 1252
 * amdgpu_ttm_tt_is_readonly - Is the ttm_tt object read only?
 */
A
Alex Deucher 已提交
1253 1254 1255 1256 1257 1258 1259 1260 1261 1262
bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm)
{
	struct amdgpu_ttm_tt *gtt = (void *)ttm;

	if (gtt == NULL)
		return false;

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

1263
/**
1264
 * amdgpu_ttm_tt_pde_flags - Compute PDE flags for ttm_tt object
1265 1266 1267
 *
 * @ttm: The ttm_tt object to compute the flags for
 * @mem: The memory registry backing this ttm_tt object
1268 1269
 *
 * Figure out the flags to use for a VM PDE (Page Directory Entry).
1270
 */
1271
uint64_t amdgpu_ttm_tt_pde_flags(struct ttm_tt *ttm, struct ttm_resource *mem)
A
Alex Deucher 已提交
1272
{
1273
	uint64_t flags = 0;
A
Alex Deucher 已提交
1274 1275 1276 1277

	if (mem && mem->mem_type != TTM_PL_SYSTEM)
		flags |= AMDGPU_PTE_VALID;

1278
	if (mem && mem->mem_type == TTM_PL_TT) {
A
Alex Deucher 已提交
1279 1280
		flags |= AMDGPU_PTE_SYSTEM;

1281
		if (ttm->caching == ttm_cached)
1282 1283
			flags |= AMDGPU_PTE_SNOOPED;
	}
A
Alex Deucher 已提交
1284

1285 1286 1287 1288
	if (mem && mem->mem_type == TTM_PL_VRAM &&
			mem->bus.caching == ttm_cached)
		flags |= AMDGPU_PTE_SNOOPED;

1289 1290 1291 1292 1293 1294
	return flags;
}

/**
 * amdgpu_ttm_tt_pte_flags - Compute PTE flags for ttm_tt object
 *
1295
 * @adev: amdgpu_device pointer
1296 1297
 * @ttm: The ttm_tt object to compute the flags for
 * @mem: The memory registry backing this ttm_tt object
1298
 *
1299 1300 1301
 * Figure out the flags to use for a VM PTE (Page Table Entry).
 */
uint64_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
1302
				 struct ttm_resource *mem)
1303 1304 1305
{
	uint64_t flags = amdgpu_ttm_tt_pde_flags(ttm, mem);

1306
	flags |= adev->gart.gart_pte_flags;
A
Alex Deucher 已提交
1307 1308 1309 1310 1311 1312 1313 1314
	flags |= AMDGPU_PTE_READABLE;

	if (!amdgpu_ttm_tt_is_readonly(ttm))
		flags |= AMDGPU_PTE_WRITEABLE;

	return flags;
}

1315
/*
1316 1317
 * amdgpu_ttm_bo_eviction_valuable - Check to see if we can evict a buffer
 * object.
1318
 *
1319 1320 1321
 * Return true if eviction is sensible. Called by ttm_mem_evict_first() on
 * behalf of ttm_bo_mem_force_space() which tries to evict buffer objects until
 * it can find space for a new object and by ttm_bo_force_list_clean() which is
1322 1323
 * used to clean out a memory space.
 */
1324 1325 1326
static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
					    const struct ttm_place *place)
{
1327
	unsigned long num_pages = bo->resource->num_pages;
1328
	struct amdgpu_res_cursor cursor;
1329
	struct dma_resv_list *flist;
1330 1331 1332
	struct dma_fence *f;
	int i;

1333
	if (bo->type == ttm_bo_type_kernel &&
1334
	    !amdgpu_vm_evictable(ttm_to_amdgpu_bo(bo)))
1335 1336
		return false;

1337 1338 1339 1340
	/* If bo is a KFD BO, check if the bo belongs to the current process.
	 * If true, then return false as any KFD process needs all its BOs to
	 * be resident to run successfully
	 */
1341
	flist = dma_resv_get_list(bo->base.resv);
1342 1343 1344
	if (flist) {
		for (i = 0; i < flist->shared_count; ++i) {
			f = rcu_dereference_protected(flist->shared[i],
1345
				dma_resv_held(bo->base.resv));
1346 1347 1348 1349
			if (amdkfd_fence_check_mm(f, current->mm))
				return false;
		}
	}
1350

1351
	switch (bo->resource->mem_type) {
1352
	case TTM_PL_TT:
1353 1354 1355
		if (amdgpu_bo_is_amdgpu_bo(bo) &&
		    amdgpu_bo_encrypted(ttm_to_amdgpu_bo(bo)))
			return false;
1356
		return true;
1357

1358
	case TTM_PL_VRAM:
1359
		/* Check each drm MM node individually */
1360
		amdgpu_res_first(bo->resource, 0, (u64)num_pages << PAGE_SHIFT,
1361 1362 1363 1364 1365
				 &cursor);
		while (cursor.remaining) {
			if (place->fpfn < PFN_DOWN(cursor.start + cursor.size)
			    && !(place->lpfn &&
				 place->lpfn <= PFN_DOWN(cursor.start)))
1366 1367
				return true;

1368
			amdgpu_res_next(&cursor, cursor.size);
1369
		}
1370
		return false;
1371

1372 1373
	default:
		break;
1374 1375 1376 1377 1378
	}

	return ttm_bo_eviction_valuable(bo, place);
}

1379
/**
1380
 * amdgpu_ttm_access_memory - Read or Write memory that backs a buffer object.
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390
 *
 * @bo:  The buffer object to read/write
 * @offset:  Offset into buffer object
 * @buf:  Secondary buffer to write/read from
 * @len: Length in bytes of access
 * @write:  true if writing
 *
 * This is used to access VRAM that backs a buffer object via MMIO
 * access for debugging purposes.
 */
1391
static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,
1392 1393
				    unsigned long offset, void *buf, int len,
				    int write)
1394
{
1395
	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
1396
	struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev);
1397 1398
	struct amdgpu_res_cursor cursor;
	unsigned long flags;
1399 1400 1401
	uint32_t value = 0;
	int ret = 0;

1402
	if (bo->resource->mem_type != TTM_PL_VRAM)
1403 1404
		return -EIO;

1405
	amdgpu_res_first(bo->resource, offset, len, &cursor);
1406 1407 1408 1409
	while (cursor.remaining) {
		uint64_t aligned_pos = cursor.start & ~(uint64_t)3;
		uint64_t bytes = 4 - (cursor.start & 3);
		uint32_t shift = (cursor.start & 3) * 8;
1410 1411
		uint32_t mask = 0xffffffff << shift;

1412 1413 1414
		if (cursor.size < bytes) {
			mask &= 0xffffffff >> (bytes - cursor.size) * 8;
			bytes = cursor.size;
1415 1416
		}

1417 1418 1419 1420
		if (mask != 0xffffffff) {
			spin_lock_irqsave(&adev->mmio_idx_lock, flags);
			WREG32_NO_KIQ(mmMM_INDEX, ((uint32_t)aligned_pos) | 0x80000000);
			WREG32_NO_KIQ(mmMM_INDEX_HI, aligned_pos >> 31);
1421
			value = RREG32_NO_KIQ(mmMM_DATA);
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432
			if (write) {
				value &= ~mask;
				value |= (*(uint32_t *)buf << shift) & mask;
				WREG32_NO_KIQ(mmMM_DATA, value);
			}
			spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
			if (!write) {
				value = (value & mask) >> shift;
				memcpy(buf, &value, bytes);
			}
		} else {
1433
			bytes = cursor.size & ~0x3ULL;
1434 1435 1436
			amdgpu_device_vram_access(adev, cursor.start,
						  (uint32_t *)buf, bytes,
						  write);
1437 1438 1439 1440
		}

		ret += bytes;
		buf = (uint8_t *)buf + bytes;
1441
		amdgpu_res_next(&cursor, bytes);
1442 1443 1444 1445 1446
	}

	return ret;
}

1447 1448 1449 1450 1451 1452
static void
amdgpu_bo_delete_mem_notify(struct ttm_buffer_object *bo)
{
	amdgpu_bo_move_notify(bo, false, NULL);
}

1453
static struct ttm_device_funcs amdgpu_bo_driver = {
A
Alex Deucher 已提交
1454 1455 1456
	.ttm_tt_create = &amdgpu_ttm_tt_create,
	.ttm_tt_populate = &amdgpu_ttm_tt_populate,
	.ttm_tt_unpopulate = &amdgpu_ttm_tt_unpopulate,
1457
	.ttm_tt_destroy = &amdgpu_ttm_backend_destroy,
1458
	.eviction_valuable = amdgpu_ttm_bo_eviction_valuable,
A
Alex Deucher 已提交
1459 1460
	.evict_flags = &amdgpu_evict_flags,
	.move = &amdgpu_bo_move,
1461
	.delete_mem_notify = &amdgpu_bo_delete_mem_notify,
1462
	.release_notify = &amdgpu_bo_release_notify,
A
Alex Deucher 已提交
1463
	.io_mem_reserve = &amdgpu_ttm_io_mem_reserve,
1464
	.io_mem_pfn = amdgpu_ttm_io_mem_pfn,
1465 1466
	.access_memory = &amdgpu_ttm_access_memory,
	.del_from_lru_notify = &amdgpu_vm_del_from_lru_notify
A
Alex Deucher 已提交
1467 1468
};

1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
/*
 * Firmware Reservation functions
 */
/**
 * amdgpu_ttm_fw_reserve_vram_fini - free fw reserved vram
 *
 * @adev: amdgpu_device pointer
 *
 * free fw reserved vram if it has been reserved.
 */
static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev)
{
1481 1482
	amdgpu_bo_free_kernel(&adev->mman.fw_vram_usage_reserved_bo,
		NULL, &adev->mman.fw_vram_usage_va);
1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
}

/**
 * amdgpu_ttm_fw_reserve_vram_init - create bo vram reservation from fw
 *
 * @adev: amdgpu_device pointer
 *
 * create bo vram reservation from fw.
 */
static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev)
{
1494 1495
	uint64_t vram_size = adev->gmc.visible_vram_size;

1496 1497
	adev->mman.fw_vram_usage_va = NULL;
	adev->mman.fw_vram_usage_reserved_bo = NULL;
1498

1499 1500
	if (adev->mman.fw_vram_usage_size == 0 ||
	    adev->mman.fw_vram_usage_size > vram_size)
1501
		return 0;
1502

1503
	return amdgpu_bo_create_kernel_at(adev,
1504 1505
					  adev->mman.fw_vram_usage_start_offset,
					  adev->mman.fw_vram_usage_size,
1506
					  AMDGPU_GEM_DOMAIN_VRAM,
1507 1508
					  &adev->mman.fw_vram_usage_reserved_bo,
					  &adev->mman.fw_vram_usage_va);
1509
}
1510

1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532
/*
 * Memoy training reservation functions
 */

/**
 * amdgpu_ttm_training_reserve_vram_fini - free memory training reserved vram
 *
 * @adev: amdgpu_device pointer
 *
 * free memory training reserved vram if it has been reserved.
 */
static int amdgpu_ttm_training_reserve_vram_fini(struct amdgpu_device *adev)
{
	struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;

	ctx->init = PSP_MEM_TRAIN_NOT_SUPPORT;
	amdgpu_bo_free_kernel(&ctx->c2p_bo, NULL, NULL);
	ctx->c2p_bo = NULL;

	return 0;
}

1533
static void amdgpu_ttm_training_data_block_init(struct amdgpu_device *adev)
1534
{
1535
	struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;
1536

1537
	memset(ctx, 0, sizeof(*ctx));
1538

1539
	ctx->c2p_train_data_offset =
1540
		ALIGN((adev->gmc.mc_vram_size - adev->mman.discovery_tmr_size - SZ_1M), SZ_1M);
1541 1542 1543 1544
	ctx->p2c_train_data_offset =
		(adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET);
	ctx->train_data_size =
		GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES;
1545

1546 1547 1548 1549
	DRM_DEBUG("train_data_size:%llx,p2c_train_data_offset:%llx,c2p_train_data_offset:%llx.\n",
			ctx->train_data_size,
			ctx->p2c_train_data_offset,
			ctx->c2p_train_data_offset);
1550 1551
}

1552 1553 1554
/*
 * reserve TMR memory at the top of VRAM which holds
 * IP Discovery data and is protected by PSP.
1555
 */
1556
static int amdgpu_ttm_reserve_tmr(struct amdgpu_device *adev)
1557 1558 1559
{
	int ret;
	struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;
1560
	bool mem_train_support = false;
1561

1562
	if (!amdgpu_sriov_vf(adev)) {
1563
		if (amdgpu_atomfirmware_mem_training_supported(adev))
1564
			mem_train_support = true;
1565
		else
1566
			DRM_DEBUG("memory training does not support!\n");
1567 1568
	}

1569 1570 1571 1572 1573 1574 1575
	/*
	 * Query reserved tmr size through atom firmwareinfo for Sienna_Cichlid and onwards for all
	 * the use cases (IP discovery/G6 memory training/profiling/diagnostic data.etc)
	 *
	 * Otherwise, fallback to legacy approach to check and reserve tmr block for ip
	 * discovery data and G6 memory training data respectively
	 */
1576
	adev->mman.discovery_tmr_size =
1577
		amdgpu_atomfirmware_get_fw_reserved_fb_size(adev);
1578 1579
	if (!adev->mman.discovery_tmr_size)
		adev->mman.discovery_tmr_size = DISCOVERY_TMR_OFFSET;
1580 1581 1582 1583 1584

	if (mem_train_support) {
		/* reserve vram for mem train according to TMR location */
		amdgpu_ttm_training_data_block_init(adev);
		ret = amdgpu_bo_create_kernel_at(adev,
1585 1586 1587 1588 1589
					 ctx->c2p_train_data_offset,
					 ctx->train_data_size,
					 AMDGPU_GEM_DOMAIN_VRAM,
					 &ctx->c2p_bo,
					 NULL);
1590 1591 1592 1593
		if (ret) {
			DRM_ERROR("alloc c2p_bo failed(%d)!\n", ret);
			amdgpu_ttm_training_reserve_vram_fini(adev);
			return ret;
1594
		}
1595
		ctx->init = PSP_MEM_TRAIN_RESERVE_SUCCESS;
1596
	}
1597 1598

	ret = amdgpu_bo_create_kernel_at(adev,
1599 1600
				adev->gmc.real_vram_size - adev->mman.discovery_tmr_size,
				adev->mman.discovery_tmr_size,
1601
				AMDGPU_GEM_DOMAIN_VRAM,
1602
				&adev->mman.discovery_memory,
1603
				NULL);
1604
	if (ret) {
1605
		DRM_ERROR("alloc tmr failed(%d)!\n", ret);
1606
		amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL);
1607
		return ret;
1608 1609 1610 1611 1612
	}

	return 0;
}

1613
/*
1614 1615
 * amdgpu_ttm_init - Init the memory management (ttm) as well as various
 * gtt/vram related fields.
1616 1617 1618 1619 1620 1621
 *
 * This initializes all of the memory space pools that the TTM layer
 * will need such as the GTT space (system memory mapped to the device),
 * VRAM (on-board memory), and on-chip memories (GDS, GWS, OA) which
 * can be mapped per VMID.
 */
A
Alex Deucher 已提交
1622 1623
int amdgpu_ttm_init(struct amdgpu_device *adev)
{
1624
	uint64_t gtt_size;
A
Alex Deucher 已提交
1625
	int r;
1626
	u64 vis_vram_limit;
A
Alex Deucher 已提交
1627

1628 1629
	mutex_init(&adev->mman.gtt_window_lock);

A
Alex Deucher 已提交
1630
	/* No others user of address space so set it to 0 */
1631
	r = ttm_device_init(&adev->mman.bdev, &amdgpu_bo_driver, adev->dev,
1632 1633
			       adev_to_drm(adev)->anon_inode->i_mapping,
			       adev_to_drm(adev)->vma_offset_manager,
1634
			       adev->need_swiotlb,
1635
			       dma_addressing_limited(adev->dev));
A
Alex Deucher 已提交
1636 1637 1638 1639 1640
	if (r) {
		DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
		return r;
	}
	adev->mman.initialized = true;
1641

1642
	/* Initialize VRAM pool with all of VRAM divided into pages */
1643
	r = amdgpu_vram_mgr_init(adev);
A
Alex Deucher 已提交
1644 1645 1646 1647
	if (r) {
		DRM_ERROR("Failed initializing VRAM heap.\n");
		return r;
	}
1648 1649 1650 1651

	/* Reduce size of CPU-visible VRAM if requested */
	vis_vram_limit = (u64)amdgpu_vis_vram_limit * 1024 * 1024;
	if (amdgpu_vis_vram_limit > 0 &&
1652 1653
	    vis_vram_limit <= adev->gmc.visible_vram_size)
		adev->gmc.visible_vram_size = vis_vram_limit;
1654

A
Alex Deucher 已提交
1655
	/* Change the size here instead of the init above so only lpfn is affected */
1656
	amdgpu_ttm_set_buffer_funcs_status(adev, false);
1657
#ifdef CONFIG_64BIT
1658
#ifdef CONFIG_X86
1659 1660 1661 1662 1663
	if (adev->gmc.xgmi.connected_to_cpu)
		adev->mman.aper_base_kaddr = ioremap_cache(adev->gmc.aper_base,
				adev->gmc.visible_vram_size);

	else
1664
#endif
1665 1666
		adev->mman.aper_base_kaddr = ioremap_wc(adev->gmc.aper_base,
				adev->gmc.visible_vram_size);
1667
#endif
A
Alex Deucher 已提交
1668

1669 1670 1671 1672
	/*
	 *The reserved vram for firmware must be pinned to the specified
	 *place on the VRAM, so reserve it early.
	 */
1673
	r = amdgpu_ttm_fw_reserve_vram_init(adev);
1674 1675 1676 1677
	if (r) {
		return r;
	}

1678
	/*
1679 1680 1681
	 * only NAVI10 and onwards ASIC support for IP discovery.
	 * If IP discovery enabled, a block of memory should be
	 * reserved for IP discovey.
1682
	 */
1683
	if (adev->mman.discovery_bin) {
1684
		r = amdgpu_ttm_reserve_tmr(adev);
1685 1686 1687
		if (r)
			return r;
	}
1688

1689 1690 1691 1692
	/* allocate memory as required for VGA
	 * This is used for VGA emulation and pre-OS scanout buffers to
	 * avoid display artifacts while transitioning between pre-OS
	 * and driver.  */
1693
	r = amdgpu_bo_create_kernel_at(adev, 0, adev->mman.stolen_vga_size,
1694
				       AMDGPU_GEM_DOMAIN_VRAM,
1695
				       &adev->mman.stolen_vga_memory,
1696
				       NULL);
C
Christian König 已提交
1697 1698
	if (r)
		return r;
1699 1700
	r = amdgpu_bo_create_kernel_at(adev, adev->mman.stolen_vga_size,
				       adev->mman.stolen_extended_size,
1701
				       AMDGPU_GEM_DOMAIN_VRAM,
1702
				       &adev->mman.stolen_extended_memory,
1703
				       NULL);
C
Christian König 已提交
1704 1705
	if (r)
		return r;
1706

A
Alex Deucher 已提交
1707
	DRM_INFO("amdgpu: %uM of VRAM memory ready\n",
1708
		 (unsigned) (adev->gmc.real_vram_size / (1024 * 1024)));
1709

1710 1711
	/* Compute GTT size, either bsaed on 3/4th the size of RAM size
	 * or whatever the user passed on module init */
1712 1713 1714 1715
	if (amdgpu_gtt_size == -1) {
		struct sysinfo si;

		si_meminfo(&si);
1716
		gtt_size = min(max((AMDGPU_DEFAULT_GTT_SIZE_MB << 20),
1717
			       adev->gmc.mc_vram_size),
1718 1719 1720
			       ((uint64_t)si.totalram * si.mem_unit * 3/4));
	}
	else
1721
		gtt_size = (uint64_t)amdgpu_gtt_size << 20;
1722 1723

	/* Initialize GTT memory pool */
1724
	r = amdgpu_gtt_mgr_init(adev, gtt_size);
A
Alex Deucher 已提交
1725 1726 1727 1728 1729
	if (r) {
		DRM_ERROR("Failed initializing GTT heap.\n");
		return r;
	}
	DRM_INFO("amdgpu: %uM of GTT memory ready.\n",
1730
		 (unsigned)(gtt_size / (1024 * 1024)));
A
Alex Deucher 已提交
1731

1732
	/* Initialize various on-chip memory pools */
1733
	r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_GDS, adev->gds.gds_size);
1734 1735 1736
	if (r) {
		DRM_ERROR("Failed initializing GDS heap.\n");
		return r;
A
Alex Deucher 已提交
1737 1738
	}

1739
	r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_GWS, adev->gds.gws_size);
1740 1741 1742
	if (r) {
		DRM_ERROR("Failed initializing gws heap.\n");
		return r;
A
Alex Deucher 已提交
1743 1744
	}

1745
	r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_OA, adev->gds.oa_size);
1746 1747 1748
	if (r) {
		DRM_ERROR("Failed initializing oa heap.\n");
		return r;
A
Alex Deucher 已提交
1749 1750 1751 1752 1753
	}

	return 0;
}

1754
/*
1755 1756
 * amdgpu_ttm_fini - De-initialize the TTM memory pools
 */
A
Alex Deucher 已提交
1757 1758 1759 1760
void amdgpu_ttm_fini(struct amdgpu_device *adev)
{
	if (!adev->mman.initialized)
		return;
1761

1762
	amdgpu_ttm_training_reserve_vram_fini(adev);
1763
	/* return the stolen vga memory back to VRAM */
1764 1765
	amdgpu_bo_free_kernel(&adev->mman.stolen_vga_memory, NULL, NULL);
	amdgpu_bo_free_kernel(&adev->mman.stolen_extended_memory, NULL, NULL);
1766
	/* return the IP Discovery TMR memory back to VRAM */
1767
	amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL);
1768
	amdgpu_ttm_fw_reserve_vram_fini(adev);
1769

1770 1771
	amdgpu_vram_mgr_fini(adev);
	amdgpu_gtt_mgr_fini(adev);
1772 1773 1774
	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GDS);
	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GWS);
	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_OA);
1775
	ttm_device_fini(&adev->mman.bdev);
A
Alex Deucher 已提交
1776 1777 1778 1779
	adev->mman.initialized = false;
	DRM_INFO("amdgpu: ttm finalized\n");
}

1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
/**
 * amdgpu_ttm_set_buffer_funcs_status - enable/disable use of buffer functions
 *
 * @adev: amdgpu_device pointer
 * @enable: true when we can use buffer functions.
 *
 * Enable/disable use of buffer functions during suspend/resume. This should
 * only be called at bootup or when userspace isn't running.
 */
void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
A
Alex Deucher 已提交
1790
{
1791
	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM);
1792
	uint64_t size;
1793
	int r;
A
Alex Deucher 已提交
1794

1795
	if (!adev->mman.initialized || amdgpu_in_reset(adev) ||
1796
	    adev->mman.buffer_funcs_enabled == enable)
A
Alex Deucher 已提交
1797 1798
		return;

1799 1800
	if (enable) {
		struct amdgpu_ring *ring;
N
Nirmoy Das 已提交
1801
		struct drm_gpu_scheduler *sched;
1802 1803

		ring = adev->mman.buffer_funcs_ring;
N
Nirmoy Das 已提交
1804 1805
		sched = &ring->sched;
		r = drm_sched_entity_init(&adev->mman.entity,
1806
					  DRM_SCHED_PRIORITY_KERNEL, &sched,
N
Nirmoy Das 已提交
1807
					  1, NULL);
1808 1809 1810 1811 1812 1813
		if (r) {
			DRM_ERROR("Failed setting up TTM BO move entity (%d)\n",
				  r);
			return;
		}
	} else {
1814
		drm_sched_entity_destroy(&adev->mman.entity);
1815 1816
		dma_fence_put(man->move);
		man->move = NULL;
1817 1818
	}

A
Alex Deucher 已提交
1819
	/* this just adjusts TTM size idea, which sets lpfn to the correct value */
1820 1821 1822 1823
	if (enable)
		size = adev->gmc.real_vram_size;
	else
		size = adev->gmc.visible_vram_size;
A
Alex Deucher 已提交
1824
	man->size = size >> PAGE_SHIFT;
1825
	adev->mman.buffer_funcs_enabled = enable;
A
Alex Deucher 已提交
1826 1827
}

1828 1829
int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,
		       uint64_t dst_offset, uint32_t byte_count,
1830
		       struct dma_resv *resv,
1831
		       struct dma_fence **fence, bool direct_submit,
1832
		       bool vm_needs_flush, bool tmz)
A
Alex Deucher 已提交
1833
{
1834 1835
	enum amdgpu_ib_pool_type pool = direct_submit ? AMDGPU_IB_POOL_DIRECT :
		AMDGPU_IB_POOL_DELAYED;
A
Alex Deucher 已提交
1836
	struct amdgpu_device *adev = ring->adev;
1837 1838
	struct amdgpu_job *job;

A
Alex Deucher 已提交
1839 1840 1841 1842 1843
	uint32_t max_bytes;
	unsigned num_loops, num_dw;
	unsigned i;
	int r;

1844
	if (direct_submit && !ring->sched.ready) {
1845 1846 1847 1848
		DRM_ERROR("Trying to move memory with ring turned off.\n");
		return -EINVAL;
	}

A
Alex Deucher 已提交
1849 1850
	max_bytes = adev->mman.buffer_funcs->copy_max_bytes;
	num_loops = DIV_ROUND_UP(byte_count, max_bytes);
L
Luben Tuikov 已提交
1851
	num_dw = ALIGN(num_loops * adev->mman.buffer_funcs->copy_num_dw, 8);
1852

1853
	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4, pool, &job);
1854
	if (r)
1855
		return r;
1856

1857
	if (vm_needs_flush) {
1858 1859
		job->vm_pd_addr = amdgpu_gmc_pd_addr(adev->gmc.pdb0_bo ?
					adev->gmc.pdb0_bo : adev->gart.bo);
1860 1861
		job->vm_needs_flush = true;
	}
1862
	if (resv) {
1863
		r = amdgpu_sync_resv(adev, &job->sync, resv,
1864 1865
				     AMDGPU_SYNC_ALWAYS,
				     AMDGPU_FENCE_OWNER_UNDEFINED);
1866 1867 1868 1869
		if (r) {
			DRM_ERROR("sync failed (%d).\n", r);
			goto error_free;
		}
A
Alex Deucher 已提交
1870 1871 1872 1873 1874
	}

	for (i = 0; i < num_loops; i++) {
		uint32_t cur_size_in_bytes = min(byte_count, max_bytes);

1875
		amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_offset,
1876
					dst_offset, cur_size_in_bytes, tmz);
A
Alex Deucher 已提交
1877 1878 1879 1880 1881 1882

		src_offset += cur_size_in_bytes;
		dst_offset += cur_size_in_bytes;
		byte_count -= cur_size_in_bytes;
	}

1883 1884
	amdgpu_ring_pad_ib(ring, &job->ibs[0]);
	WARN_ON(job->ibs[0].length_dw > num_dw);
1885 1886 1887
	if (direct_submit)
		r = amdgpu_job_submit_direct(job, ring, fence);
	else
1888
		r = amdgpu_job_submit(job, &adev->mman.entity,
1889
				      AMDGPU_FENCE_OWNER_UNDEFINED, fence);
1890 1891
	if (r)
		goto error_free;
A
Alex Deucher 已提交
1892

1893
	return r;
1894

1895
error_free:
1896
	amdgpu_job_free(job);
1897
	DRM_ERROR("Error scheduling IBs (%d)\n", r);
1898
	return r;
A
Alex Deucher 已提交
1899 1900
}

1901
int amdgpu_fill_buffer(struct amdgpu_bo *bo,
1902
		       uint32_t src_data,
1903
		       struct dma_resv *resv,
1904
		       struct dma_fence **fence)
1905
{
1906
	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
1907
	uint32_t max_bytes = adev->mman.buffer_funcs->fill_max_bytes;
1908 1909
	struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;

1910
	struct amdgpu_res_cursor cursor;
1911
	unsigned int num_loops, num_dw;
1912
	uint64_t num_bytes;
1913 1914

	struct amdgpu_job *job;
1915 1916
	int r;

1917
	if (!adev->mman.buffer_funcs_enabled) {
1918 1919 1920 1921
		DRM_ERROR("Trying to clear memory with ring turned off.\n");
		return -EINVAL;
	}

1922
	if (bo->tbo.resource->mem_type == TTM_PL_TT) {
1923
		r = amdgpu_ttm_alloc_gart(&bo->tbo);
1924 1925 1926 1927
		if (r)
			return r;
	}

1928
	num_bytes = bo->tbo.resource->num_pages << PAGE_SHIFT;
1929 1930
	num_loops = 0;

1931
	amdgpu_res_first(bo->tbo.resource, 0, num_bytes, &cursor);
1932 1933 1934
	while (cursor.remaining) {
		num_loops += DIV_ROUND_UP_ULL(cursor.size, max_bytes);
		amdgpu_res_next(&cursor, cursor.size);
1935
	}
1936
	num_dw = num_loops * adev->mman.buffer_funcs->fill_num_dw;
1937 1938

	/* for IB padding */
1939
	num_dw += 64;
1940

1941 1942
	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4, AMDGPU_IB_POOL_DELAYED,
				     &job);
1943 1944 1945 1946 1947
	if (r)
		return r;

	if (resv) {
		r = amdgpu_sync_resv(adev, &job->sync, resv,
1948 1949
				     AMDGPU_SYNC_ALWAYS,
				     AMDGPU_FENCE_OWNER_UNDEFINED);
1950 1951 1952 1953 1954 1955
		if (r) {
			DRM_ERROR("sync failed (%d).\n", r);
			goto error_free;
		}
	}

1956
	amdgpu_res_first(bo->tbo.resource, 0, num_bytes, &cursor);
1957 1958 1959
	while (cursor.remaining) {
		uint32_t cur_size = min_t(uint64_t, cursor.size, max_bytes);
		uint64_t dst_addr = cursor.start;
1960

1961 1962
		dst_addr += amdgpu_ttm_domain_start(adev,
						    bo->tbo.resource->mem_type);
1963 1964
		amdgpu_emit_fill_buffer(adev, &job->ibs[0], src_data, dst_addr,
					cur_size);
1965

1966
		amdgpu_res_next(&cursor, cur_size);
1967 1968 1969 1970
	}

	amdgpu_ring_pad_ib(ring, &job->ibs[0]);
	WARN_ON(job->ibs[0].length_dw > num_dw);
1971
	r = amdgpu_job_submit(job, &adev->mman.entity,
1972
			      AMDGPU_FENCE_OWNER_UNDEFINED, fence);
1973 1974 1975 1976 1977 1978 1979 1980 1981 1982
	if (r)
		goto error_free;

	return 0;

error_free:
	amdgpu_job_free(job);
	return r;
}

A
Alex Deucher 已提交
1983 1984
#if defined(CONFIG_DEBUG_FS)

1985
static int amdgpu_mm_vram_table_show(struct seq_file *m, void *unused)
A
Alex Deucher 已提交
1986
{
1987 1988 1989
	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
							    TTM_PL_VRAM);
D
Daniel Vetter 已提交
1990
	struct drm_printer p = drm_seq_file_printer(m);
A
Alex Deucher 已提交
1991

1992
	man->func->debug(man, &p);
D
Daniel Vetter 已提交
1993
	return 0;
A
Alex Deucher 已提交
1994 1995
}

1996
static int amdgpu_ttm_page_pool_show(struct seq_file *m, void *unused)
1997
{
1998
	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
1999 2000 2001 2002

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

2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052
static int amdgpu_mm_tt_table_show(struct seq_file *m, void *unused)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
							    TTM_PL_TT);
	struct drm_printer p = drm_seq_file_printer(m);

	man->func->debug(man, &p);
	return 0;
}

static int amdgpu_mm_gds_table_show(struct seq_file *m, void *unused)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
							    AMDGPU_PL_GDS);
	struct drm_printer p = drm_seq_file_printer(m);

	man->func->debug(man, &p);
	return 0;
}

static int amdgpu_mm_gws_table_show(struct seq_file *m, void *unused)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
							    AMDGPU_PL_GWS);
	struct drm_printer p = drm_seq_file_printer(m);

	man->func->debug(man, &p);
	return 0;
}

static int amdgpu_mm_oa_table_show(struct seq_file *m, void *unused)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev,
							    AMDGPU_PL_OA);
	struct drm_printer p = drm_seq_file_printer(m);

	man->func->debug(man, &p);
	return 0;
}

DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_vram_table);
DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_tt_table);
DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_gds_table);
DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_gws_table);
DEFINE_SHOW_ATTRIBUTE(amdgpu_mm_oa_table);
DEFINE_SHOW_ATTRIBUTE(amdgpu_ttm_page_pool);
A
Alex Deucher 已提交
2053

2054
/*
2055 2056 2057 2058
 * amdgpu_ttm_vram_read - Linear read access to VRAM
 *
 * Accesses VRAM via MMIO for debugging purposes.
 */
A
Alex Deucher 已提交
2059 2060 2061
static ssize_t amdgpu_ttm_vram_read(struct file *f, char __user *buf,
				    size_t size, loff_t *pos)
{
A
Al Viro 已提交
2062
	struct amdgpu_device *adev = file_inode(f)->i_private;
A
Alex Deucher 已提交
2063 2064 2065 2066 2067
	ssize_t result = 0;

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

2068
	if (*pos >= adev->gmc.mc_vram_size)
2069 2070
		return -ENXIO;

2071
	size = min(size, (size_t)(adev->gmc.mc_vram_size - *pos));
A
Alex Deucher 已提交
2072
	while (size) {
2073 2074
		size_t bytes = min(size, AMDGPU_TTM_VRAM_MAX_DW_READ * 4);
		uint32_t value[AMDGPU_TTM_VRAM_MAX_DW_READ];
A
Alex Deucher 已提交
2075

2076
		amdgpu_device_vram_access(adev, *pos, value, bytes, false);
2077 2078
		if (copy_to_user(buf, value, bytes))
			return -EFAULT;
A
Alex Deucher 已提交
2079

2080 2081 2082 2083
		result += bytes;
		buf += bytes;
		*pos += bytes;
		size -= bytes;
A
Alex Deucher 已提交
2084 2085 2086 2087 2088
	}

	return result;
}

2089
/*
2090 2091 2092 2093
 * amdgpu_ttm_vram_write - Linear write access to VRAM
 *
 * Accesses VRAM via MMIO for debugging purposes.
 */
2094 2095 2096 2097 2098 2099 2100 2101 2102 2103
static ssize_t amdgpu_ttm_vram_write(struct file *f, const char __user *buf,
				    size_t size, loff_t *pos)
{
	struct amdgpu_device *adev = file_inode(f)->i_private;
	ssize_t result = 0;
	int r;

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

2104
	if (*pos >= adev->gmc.mc_vram_size)
2105 2106 2107 2108 2109 2110
		return -ENXIO;

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

2111
		if (*pos >= adev->gmc.mc_vram_size)
2112 2113 2114 2115 2116 2117 2118
			return result;

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

		spin_lock_irqsave(&adev->mmio_idx_lock, flags);
2119 2120 2121
		WREG32_NO_KIQ(mmMM_INDEX, ((uint32_t)*pos) | 0x80000000);
		WREG32_NO_KIQ(mmMM_INDEX_HI, *pos >> 31);
		WREG32_NO_KIQ(mmMM_DATA, value);
2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132
		spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);

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

	return result;
}

A
Alex Deucher 已提交
2133 2134 2135
static const struct file_operations amdgpu_ttm_vram_fops = {
	.owner = THIS_MODULE,
	.read = amdgpu_ttm_vram_read,
2136 2137
	.write = amdgpu_ttm_vram_write,
	.llseek = default_llseek,
A
Alex Deucher 已提交
2138 2139
};

2140
/*
2141 2142 2143 2144 2145 2146
 * amdgpu_iomem_read - Virtual read access to GPU mapped memory
 *
 * This function is used to read memory that has been mapped to the
 * GPU and the known addresses are not physical addresses but instead
 * bus addresses (e.g., what you'd put in an IB or ring buffer).
 */
2147 2148
static ssize_t amdgpu_iomem_read(struct file *f, char __user *buf,
				 size_t size, loff_t *pos)
2149 2150 2151
{
	struct amdgpu_device *adev = file_inode(f)->i_private;
	struct iommu_domain *dom;
2152 2153
	ssize_t result = 0;
	int r;
2154

2155
	/* retrieve the IOMMU domain if any for this device */
2156
	dom = iommu_get_domain_for_dev(adev->dev);
2157

2158 2159 2160 2161 2162 2163 2164 2165 2166 2167
	while (size) {
		phys_addr_t addr = *pos & PAGE_MASK;
		loff_t off = *pos & ~PAGE_MASK;
		size_t bytes = PAGE_SIZE - off;
		unsigned long pfn;
		struct page *p;
		void *ptr;

		bytes = bytes < size ? bytes : size;

2168 2169 2170 2171
		/* Translate the bus address to a physical address.  If
		 * the domain is NULL it means there is no IOMMU active
		 * and the address translation is the identity
		 */
2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182
		addr = dom ? iommu_iova_to_phys(dom, addr) : addr;

		pfn = addr >> PAGE_SHIFT;
		if (!pfn_valid(pfn))
			return -EPERM;

		p = pfn_to_page(pfn);
		if (p->mapping != adev->mman.bdev.dev_mapping)
			return -EPERM;

		ptr = kmap(p);
2183
		r = copy_to_user(buf, ptr + off, bytes);
2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195
		kunmap(p);
		if (r)
			return -EFAULT;

		size -= bytes;
		*pos += bytes;
		result += bytes;
	}

	return result;
}

2196
/*
2197 2198 2199 2200 2201 2202
 * amdgpu_iomem_write - Virtual write access to GPU mapped memory
 *
 * This function is used to write memory that has been mapped to the
 * GPU and the known addresses are not physical addresses but instead
 * bus addresses (e.g., what you'd put in an IB or ring buffer).
 */
2203 2204 2205 2206 2207 2208 2209
static ssize_t amdgpu_iomem_write(struct file *f, const char __user *buf,
				 size_t size, loff_t *pos)
{
	struct amdgpu_device *adev = file_inode(f)->i_private;
	struct iommu_domain *dom;
	ssize_t result = 0;
	int r;
2210 2211

	dom = iommu_get_domain_for_dev(adev->dev);
2212

2213 2214 2215 2216 2217 2218 2219 2220 2221
	while (size) {
		phys_addr_t addr = *pos & PAGE_MASK;
		loff_t off = *pos & ~PAGE_MASK;
		size_t bytes = PAGE_SIZE - off;
		unsigned long pfn;
		struct page *p;
		void *ptr;

		bytes = bytes < size ? bytes : size;
2222

2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233
		addr = dom ? iommu_iova_to_phys(dom, addr) : addr;

		pfn = addr >> PAGE_SHIFT;
		if (!pfn_valid(pfn))
			return -EPERM;

		p = pfn_to_page(pfn);
		if (p->mapping != adev->mman.bdev.dev_mapping)
			return -EPERM;

		ptr = kmap(p);
2234
		r = copy_from_user(ptr + off, buf, bytes);
2235 2236 2237 2238 2239 2240 2241 2242 2243 2244
		kunmap(p);
		if (r)
			return -EFAULT;

		size -= bytes;
		*pos += bytes;
		result += bytes;
	}

	return result;
2245 2246
}

2247
static const struct file_operations amdgpu_ttm_iomem_fops = {
2248
	.owner = THIS_MODULE,
2249 2250
	.read = amdgpu_iomem_read,
	.write = amdgpu_iomem_write,
2251 2252
	.llseek = default_llseek
};
2253

2254 2255
#endif

2256
void amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
A
Alex Deucher 已提交
2257 2258
{
#if defined(CONFIG_DEBUG_FS)
2259
	struct drm_minor *minor = adev_to_drm(adev)->primary;
2260 2261
	struct dentry *root = minor->debugfs_root;

2262
	debugfs_create_file_size("amdgpu_vram", 0444, root, adev,
2263
				 &amdgpu_ttm_vram_fops, adev->gmc.mc_vram_size);
2264
	debugfs_create_file("amdgpu_iomem", 0444, root, adev,
2265
			    &amdgpu_ttm_iomem_fops);
2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277
	debugfs_create_file("amdgpu_vram_mm", 0444, root, adev,
			    &amdgpu_mm_vram_table_fops);
	debugfs_create_file("amdgpu_gtt_mm", 0444, root, adev,
			    &amdgpu_mm_tt_table_fops);
	debugfs_create_file("amdgpu_gds_mm", 0444, root, adev,
			    &amdgpu_mm_gds_table_fops);
	debugfs_create_file("amdgpu_gws_mm", 0444, root, adev,
			    &amdgpu_mm_gws_table_fops);
	debugfs_create_file("amdgpu_oa_mm", 0444, root, adev,
			    &amdgpu_mm_oa_table_fops);
	debugfs_create_file("ttm_page_pool", 0444, root, adev,
			    &amdgpu_ttm_page_pool_fops);
A
Alex Deucher 已提交
2278 2279
#endif
}