xref: /linux/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c (revision 6f17ab9a63e670bd62a287f95e3982f99eafd77e)
1 /*
2  * Copyright 2009 Jerome Glisse.
3  * All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sub license, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
16  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
17  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
18  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
19  * USE OR OTHER DEALINGS IN THE SOFTWARE.
20  *
21  * The above copyright notice and this permission notice (including the
22  * next paragraph) shall be included in all copies or substantial portions
23  * of the Software.
24  *
25  */
26 /*
27  * Authors:
28  *    Jerome Glisse <glisse@freedesktop.org>
29  *    Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
30  *    Dave Airlie
31  */
32 
33 #include <linux/dma-mapping.h>
34 #include <linux/iommu.h>
35 #include <linux/pagemap.h>
36 #include <linux/sched/task.h>
37 #include <linux/sched/mm.h>
38 #include <linux/seq_file.h>
39 #include <linux/slab.h>
40 #include <linux/swap.h>
41 #include <linux/dma-buf.h>
42 #include <linux/sizes.h>
43 #include <linux/module.h>
44 
45 #include <drm/drm_drv.h>
46 #include <drm/ttm/ttm_bo.h>
47 #include <drm/ttm/ttm_placement.h>
48 #include <drm/ttm/ttm_range_manager.h>
49 #include <drm/ttm/ttm_tt.h>
50 
51 #include <drm/amdgpu_drm.h>
52 
53 #include "amdgpu.h"
54 #include "amdgpu_object.h"
55 #include "amdgpu_trace.h"
56 #include "amdgpu_amdkfd.h"
57 #include "amdgpu_sdma.h"
58 #include "amdgpu_ras.h"
59 #include "amdgpu_hmm.h"
60 #include "amdgpu_atomfirmware.h"
61 #include "amdgpu_res_cursor.h"
62 #include "bif/bif_4_1_d.h"
63 
64 MODULE_IMPORT_NS("DMA_BUF");
65 
66 #define AMDGPU_TTM_VRAM_MAX_DW_READ	((size_t)128)
67 
68 static int amdgpu_ttm_backend_bind(struct ttm_device *bdev,
69 				   struct ttm_tt *ttm,
70 				   struct ttm_resource *bo_mem);
71 static void amdgpu_ttm_backend_unbind(struct ttm_device *bdev,
72 				      struct ttm_tt *ttm);
73 
74 static int amdgpu_ttm_init_on_chip(struct amdgpu_device *adev,
75 				    unsigned int type,
76 				    uint64_t size_in_page)
77 {
78 	return ttm_range_man_init(&adev->mman.bdev, type,
79 				  false, size_in_page);
80 }
81 
82 /**
83  * amdgpu_evict_flags - Compute placement flags
84  *
85  * @bo: The buffer object to evict
86  * @placement: Possible destination(s) for evicted BO
87  *
88  * Fill in placement data when ttm_bo_evict() is called
89  */
90 static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
91 				struct ttm_placement *placement)
92 {
93 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
94 	struct amdgpu_bo *abo;
95 	static const struct ttm_place placements = {
96 		.fpfn = 0,
97 		.lpfn = 0,
98 		.mem_type = TTM_PL_SYSTEM,
99 		.flags = 0
100 	};
101 
102 	/* Don't handle scatter gather BOs */
103 	if (bo->type == ttm_bo_type_sg) {
104 		placement->num_placement = 0;
105 		return;
106 	}
107 
108 	/* Object isn't an AMDGPU object so ignore */
109 	if (!amdgpu_bo_is_amdgpu_bo(bo)) {
110 		placement->placement = &placements;
111 		placement->num_placement = 1;
112 		return;
113 	}
114 
115 	abo = ttm_to_amdgpu_bo(bo);
116 	if (abo->flags & AMDGPU_GEM_CREATE_DISCARDABLE) {
117 		placement->num_placement = 0;
118 		return;
119 	}
120 
121 	switch (bo->resource->mem_type) {
122 	case AMDGPU_PL_GDS:
123 	case AMDGPU_PL_GWS:
124 	case AMDGPU_PL_OA:
125 	case AMDGPU_PL_DOORBELL:
126 		placement->num_placement = 0;
127 		return;
128 
129 	case TTM_PL_VRAM:
130 		if (!adev->mman.buffer_funcs_enabled) {
131 			/* Move to system memory */
132 			amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
133 
134 		} else if (!amdgpu_gmc_vram_full_visible(&adev->gmc) &&
135 			   !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) &&
136 			   amdgpu_res_cpu_visible(adev, bo->resource)) {
137 
138 			/* Try evicting to the CPU inaccessible part of VRAM
139 			 * first, but only set GTT as busy placement, so this
140 			 * BO will be evicted to GTT rather than causing other
141 			 * BOs to be evicted from VRAM
142 			 */
143 			amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM |
144 							AMDGPU_GEM_DOMAIN_GTT |
145 							AMDGPU_GEM_DOMAIN_CPU);
146 			abo->placements[0].fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
147 			abo->placements[0].lpfn = 0;
148 			abo->placements[0].flags |= TTM_PL_FLAG_DESIRED;
149 		} else {
150 			/* Move to GTT memory */
151 			amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT |
152 							AMDGPU_GEM_DOMAIN_CPU);
153 		}
154 		break;
155 	case TTM_PL_TT:
156 	case AMDGPU_PL_PREEMPT:
157 	default:
158 		amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
159 		break;
160 	}
161 	*placement = abo->placement;
162 }
163 
164 /**
165  * amdgpu_ttm_map_buffer - Map memory into the GART windows
166  * @bo: buffer object to map
167  * @mem: memory object to map
168  * @mm_cur: range to map
169  * @window: which GART window to use
170  * @ring: DMA ring to use for the copy
171  * @tmz: if we should setup a TMZ enabled mapping
172  * @size: in number of bytes to map, out number of bytes mapped
173  * @addr: resulting address inside the MC address space
174  *
175  * Setup one of the GART windows to access a specific piece of memory or return
176  * the physical address for local memory.
177  */
178 static int amdgpu_ttm_map_buffer(struct ttm_buffer_object *bo,
179 				 struct ttm_resource *mem,
180 				 struct amdgpu_res_cursor *mm_cur,
181 				 unsigned int window, struct amdgpu_ring *ring,
182 				 bool tmz, uint64_t *size, uint64_t *addr)
183 {
184 	struct amdgpu_device *adev = ring->adev;
185 	unsigned int offset, num_pages, num_dw, num_bytes;
186 	uint64_t src_addr, dst_addr;
187 	struct amdgpu_job *job;
188 	void *cpu_addr;
189 	uint64_t flags;
190 	unsigned int i;
191 	int r;
192 
193 	BUG_ON(adev->mman.buffer_funcs->copy_max_bytes <
194 	       AMDGPU_GTT_MAX_TRANSFER_SIZE * 8);
195 
196 	if (WARN_ON(mem->mem_type == AMDGPU_PL_PREEMPT))
197 		return -EINVAL;
198 
199 	/* Map only what can't be accessed directly */
200 	if (!tmz && mem->start != AMDGPU_BO_INVALID_OFFSET) {
201 		*addr = amdgpu_ttm_domain_start(adev, mem->mem_type) +
202 			mm_cur->start;
203 		return 0;
204 	}
205 
206 
207 	/*
208 	 * If start begins at an offset inside the page, then adjust the size
209 	 * and addr accordingly
210 	 */
211 	offset = mm_cur->start & ~PAGE_MASK;
212 
213 	num_pages = PFN_UP(*size + offset);
214 	num_pages = min_t(uint32_t, num_pages, AMDGPU_GTT_MAX_TRANSFER_SIZE);
215 
216 	*size = min(*size, (uint64_t)num_pages * PAGE_SIZE - offset);
217 
218 	*addr = adev->gmc.gart_start;
219 	*addr += (u64)window * AMDGPU_GTT_MAX_TRANSFER_SIZE *
220 		AMDGPU_GPU_PAGE_SIZE;
221 	*addr += offset;
222 
223 	num_dw = ALIGN(adev->mman.buffer_funcs->copy_num_dw, 8);
224 	num_bytes = num_pages * 8 * AMDGPU_GPU_PAGES_IN_CPU_PAGE;
225 
226 	r = amdgpu_job_alloc_with_ib(adev, &adev->mman.high_pr,
227 				     AMDGPU_FENCE_OWNER_UNDEFINED,
228 				     num_dw * 4 + num_bytes,
229 				     AMDGPU_IB_POOL_DELAYED, &job,
230 				     AMDGPU_KERNEL_JOB_ID_TTM_MAP_BUFFER);
231 	if (r)
232 		return r;
233 
234 	src_addr = num_dw * 4;
235 	src_addr += job->ibs[0].gpu_addr;
236 
237 	dst_addr = amdgpu_bo_gpu_offset(adev->gart.bo);
238 	dst_addr += window * AMDGPU_GTT_MAX_TRANSFER_SIZE * 8;
239 	amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_addr,
240 				dst_addr, num_bytes, 0);
241 
242 	amdgpu_ring_pad_ib(ring, &job->ibs[0]);
243 	WARN_ON(job->ibs[0].length_dw > num_dw);
244 
245 	flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, mem);
246 	if (tmz)
247 		flags |= AMDGPU_PTE_TMZ;
248 
249 	cpu_addr = &job->ibs[0].ptr[num_dw];
250 
251 	if (mem->mem_type == TTM_PL_TT) {
252 		dma_addr_t *dma_addr;
253 
254 		dma_addr = &bo->ttm->dma_address[mm_cur->start >> PAGE_SHIFT];
255 		amdgpu_gart_map(adev, 0, num_pages, dma_addr, flags, cpu_addr);
256 	} else {
257 		dma_addr_t dma_address;
258 
259 		dma_address = mm_cur->start;
260 		dma_address += adev->vm_manager.vram_base_offset;
261 
262 		for (i = 0; i < num_pages; ++i) {
263 			amdgpu_gart_map(adev, i << PAGE_SHIFT, 1, &dma_address,
264 					flags, cpu_addr);
265 			dma_address += PAGE_SIZE;
266 		}
267 	}
268 
269 	dma_fence_put(amdgpu_job_submit(job));
270 	return 0;
271 }
272 
273 /**
274  * amdgpu_ttm_copy_mem_to_mem - Helper function for copy
275  * @adev: amdgpu device
276  * @src: buffer/address where to read from
277  * @dst: buffer/address where to write to
278  * @size: number of bytes to copy
279  * @tmz: if a secure copy should be used
280  * @resv: resv object to sync to
281  * @f: Returns the last fence if multiple jobs are submitted.
282  *
283  * The function copies @size bytes from {src->mem + src->offset} to
284  * {dst->mem + dst->offset}. src->bo and dst->bo could be same BO for a
285  * move and different for a BO to BO copy.
286  *
287  */
288 int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,
289 			       const struct amdgpu_copy_mem *src,
290 			       const struct amdgpu_copy_mem *dst,
291 			       uint64_t size, bool tmz,
292 			       struct dma_resv *resv,
293 			       struct dma_fence **f)
294 {
295 	struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
296 	struct amdgpu_res_cursor src_mm, dst_mm;
297 	struct dma_fence *fence = NULL;
298 	int r = 0;
299 	uint32_t copy_flags = 0;
300 	struct amdgpu_bo *abo_src, *abo_dst;
301 
302 	if (!adev->mman.buffer_funcs_enabled) {
303 		dev_err(adev->dev,
304 			"Trying to move memory with ring turned off.\n");
305 		return -EINVAL;
306 	}
307 
308 	amdgpu_res_first(src->mem, src->offset, size, &src_mm);
309 	amdgpu_res_first(dst->mem, dst->offset, size, &dst_mm);
310 
311 	mutex_lock(&adev->mman.gtt_window_lock);
312 	while (src_mm.remaining) {
313 		uint64_t from, to, cur_size, tiling_flags;
314 		uint32_t num_type, data_format, max_com, write_compress_disable;
315 		struct dma_fence *next;
316 
317 		/* Never copy more than 256MiB at once to avoid a timeout */
318 		cur_size = min3(src_mm.size, dst_mm.size, 256ULL << 20);
319 
320 		/* Map src to window 0 and dst to window 1. */
321 		r = amdgpu_ttm_map_buffer(src->bo, src->mem, &src_mm,
322 					  0, ring, tmz, &cur_size, &from);
323 		if (r)
324 			goto error;
325 
326 		r = amdgpu_ttm_map_buffer(dst->bo, dst->mem, &dst_mm,
327 					  1, ring, tmz, &cur_size, &to);
328 		if (r)
329 			goto error;
330 
331 		abo_src = ttm_to_amdgpu_bo(src->bo);
332 		abo_dst = ttm_to_amdgpu_bo(dst->bo);
333 		if (tmz)
334 			copy_flags |= AMDGPU_COPY_FLAGS_TMZ;
335 		if ((abo_src->flags & AMDGPU_GEM_CREATE_GFX12_DCC) &&
336 		    (abo_src->tbo.resource->mem_type == TTM_PL_VRAM))
337 			copy_flags |= AMDGPU_COPY_FLAGS_READ_DECOMPRESSED;
338 		if ((abo_dst->flags & AMDGPU_GEM_CREATE_GFX12_DCC) &&
339 		    (dst->mem->mem_type == TTM_PL_VRAM)) {
340 			copy_flags |= AMDGPU_COPY_FLAGS_WRITE_COMPRESSED;
341 			amdgpu_bo_get_tiling_flags(abo_dst, &tiling_flags);
342 			max_com = AMDGPU_TILING_GET(tiling_flags, GFX12_DCC_MAX_COMPRESSED_BLOCK);
343 			num_type = AMDGPU_TILING_GET(tiling_flags, GFX12_DCC_NUMBER_TYPE);
344 			data_format = AMDGPU_TILING_GET(tiling_flags, GFX12_DCC_DATA_FORMAT);
345 			write_compress_disable =
346 				AMDGPU_TILING_GET(tiling_flags, GFX12_DCC_WRITE_COMPRESS_DISABLE);
347 			copy_flags |= (AMDGPU_COPY_FLAGS_SET(MAX_COMPRESSED, max_com) |
348 				       AMDGPU_COPY_FLAGS_SET(NUMBER_TYPE, num_type) |
349 				       AMDGPU_COPY_FLAGS_SET(DATA_FORMAT, data_format) |
350 				       AMDGPU_COPY_FLAGS_SET(WRITE_COMPRESS_DISABLE,
351 							     write_compress_disable));
352 		}
353 
354 		r = amdgpu_copy_buffer(ring, from, to, cur_size, resv,
355 				       &next, false, true, copy_flags);
356 		if (r)
357 			goto error;
358 
359 		dma_fence_put(fence);
360 		fence = next;
361 
362 		amdgpu_res_next(&src_mm, cur_size);
363 		amdgpu_res_next(&dst_mm, cur_size);
364 	}
365 error:
366 	mutex_unlock(&adev->mman.gtt_window_lock);
367 	if (f)
368 		*f = dma_fence_get(fence);
369 	dma_fence_put(fence);
370 	return r;
371 }
372 
373 /*
374  * amdgpu_move_blit - Copy an entire buffer to another buffer
375  *
376  * This is a helper called by amdgpu_bo_move() and amdgpu_move_vram_ram() to
377  * help move buffers to and from VRAM.
378  */
379 static int amdgpu_move_blit(struct ttm_buffer_object *bo,
380 			    bool evict,
381 			    struct ttm_resource *new_mem,
382 			    struct ttm_resource *old_mem)
383 {
384 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
385 	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
386 	struct amdgpu_copy_mem src, dst;
387 	struct dma_fence *fence = NULL;
388 	int r;
389 
390 	src.bo = bo;
391 	dst.bo = bo;
392 	src.mem = old_mem;
393 	dst.mem = new_mem;
394 	src.offset = 0;
395 	dst.offset = 0;
396 
397 	r = amdgpu_ttm_copy_mem_to_mem(adev, &src, &dst,
398 				       new_mem->size,
399 				       amdgpu_bo_encrypted(abo),
400 				       bo->base.resv, &fence);
401 	if (r)
402 		goto error;
403 
404 	/* clear the space being freed */
405 	if (old_mem->mem_type == TTM_PL_VRAM &&
406 	    (abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE)) {
407 		struct dma_fence *wipe_fence = NULL;
408 
409 		r = amdgpu_fill_buffer(abo, 0, NULL, &wipe_fence,
410 				       false, AMDGPU_KERNEL_JOB_ID_MOVE_BLIT);
411 		if (r) {
412 			goto error;
413 		} else if (wipe_fence) {
414 			amdgpu_vram_mgr_set_cleared(bo->resource);
415 			dma_fence_put(fence);
416 			fence = wipe_fence;
417 		}
418 	}
419 
420 	/* Always block for VM page tables before committing the new location */
421 	if (bo->type == ttm_bo_type_kernel)
422 		r = ttm_bo_move_accel_cleanup(bo, fence, true, false, new_mem);
423 	else
424 		r = ttm_bo_move_accel_cleanup(bo, fence, evict, true, new_mem);
425 	dma_fence_put(fence);
426 	return r;
427 
428 error:
429 	if (fence)
430 		dma_fence_wait(fence, false);
431 	dma_fence_put(fence);
432 	return r;
433 }
434 
435 /**
436  * amdgpu_res_cpu_visible - Check that resource can be accessed by CPU
437  * @adev: amdgpu device
438  * @res: the resource to check
439  *
440  * Returns: true if the full resource is CPU visible, false otherwise.
441  */
442 bool amdgpu_res_cpu_visible(struct amdgpu_device *adev,
443 			    struct ttm_resource *res)
444 {
445 	struct amdgpu_res_cursor cursor;
446 
447 	if (!res)
448 		return false;
449 
450 	if (res->mem_type == TTM_PL_SYSTEM || res->mem_type == TTM_PL_TT ||
451 	    res->mem_type == AMDGPU_PL_PREEMPT || res->mem_type == AMDGPU_PL_DOORBELL)
452 		return true;
453 
454 	if (res->mem_type != TTM_PL_VRAM)
455 		return false;
456 
457 	amdgpu_res_first(res, 0, res->size, &cursor);
458 	while (cursor.remaining) {
459 		if ((cursor.start + cursor.size) > adev->gmc.visible_vram_size)
460 			return false;
461 		amdgpu_res_next(&cursor, cursor.size);
462 	}
463 
464 	return true;
465 }
466 
467 /*
468  * amdgpu_res_copyable - Check that memory can be accessed by ttm_bo_move_memcpy
469  *
470  * Called by amdgpu_bo_move()
471  */
472 static bool amdgpu_res_copyable(struct amdgpu_device *adev,
473 				struct ttm_resource *mem)
474 {
475 	if (!amdgpu_res_cpu_visible(adev, mem))
476 		return false;
477 
478 	/* ttm_resource_ioremap only supports contiguous memory */
479 	if (mem->mem_type == TTM_PL_VRAM &&
480 	    !(mem->placement & TTM_PL_FLAG_CONTIGUOUS))
481 		return false;
482 
483 	return true;
484 }
485 
486 /*
487  * amdgpu_bo_move - Move a buffer object to a new memory location
488  *
489  * Called by ttm_bo_handle_move_mem()
490  */
491 static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
492 			  struct ttm_operation_ctx *ctx,
493 			  struct ttm_resource *new_mem,
494 			  struct ttm_place *hop)
495 {
496 	struct amdgpu_device *adev;
497 	struct amdgpu_bo *abo;
498 	struct ttm_resource *old_mem = bo->resource;
499 	int r;
500 
501 	if (new_mem->mem_type == TTM_PL_TT ||
502 	    new_mem->mem_type == AMDGPU_PL_PREEMPT) {
503 		r = amdgpu_ttm_backend_bind(bo->bdev, bo->ttm, new_mem);
504 		if (r)
505 			return r;
506 	}
507 
508 	abo = ttm_to_amdgpu_bo(bo);
509 	adev = amdgpu_ttm_adev(bo->bdev);
510 
511 	if (!old_mem || (old_mem->mem_type == TTM_PL_SYSTEM &&
512 			 bo->ttm == NULL)) {
513 		amdgpu_bo_move_notify(bo, evict, new_mem);
514 		ttm_bo_move_null(bo, new_mem);
515 		return 0;
516 	}
517 	if (old_mem->mem_type == TTM_PL_SYSTEM &&
518 	    (new_mem->mem_type == TTM_PL_TT ||
519 	     new_mem->mem_type == AMDGPU_PL_PREEMPT)) {
520 		amdgpu_bo_move_notify(bo, evict, new_mem);
521 		ttm_bo_move_null(bo, new_mem);
522 		return 0;
523 	}
524 	if ((old_mem->mem_type == TTM_PL_TT ||
525 	     old_mem->mem_type == AMDGPU_PL_PREEMPT) &&
526 	    new_mem->mem_type == TTM_PL_SYSTEM) {
527 		r = ttm_bo_wait_ctx(bo, ctx);
528 		if (r)
529 			return r;
530 
531 		amdgpu_ttm_backend_unbind(bo->bdev, bo->ttm);
532 		amdgpu_bo_move_notify(bo, evict, new_mem);
533 		ttm_resource_free(bo, &bo->resource);
534 		ttm_bo_assign_mem(bo, new_mem);
535 		return 0;
536 	}
537 
538 	if (old_mem->mem_type == AMDGPU_PL_GDS ||
539 	    old_mem->mem_type == AMDGPU_PL_GWS ||
540 	    old_mem->mem_type == AMDGPU_PL_OA ||
541 	    old_mem->mem_type == AMDGPU_PL_DOORBELL ||
542 	    new_mem->mem_type == AMDGPU_PL_GDS ||
543 	    new_mem->mem_type == AMDGPU_PL_GWS ||
544 	    new_mem->mem_type == AMDGPU_PL_OA ||
545 	    new_mem->mem_type == AMDGPU_PL_DOORBELL) {
546 		/* Nothing to save here */
547 		amdgpu_bo_move_notify(bo, evict, new_mem);
548 		ttm_bo_move_null(bo, new_mem);
549 		return 0;
550 	}
551 
552 	if (bo->type == ttm_bo_type_device &&
553 	    new_mem->mem_type == TTM_PL_VRAM &&
554 	    old_mem->mem_type != TTM_PL_VRAM) {
555 		/* amdgpu_bo_fault_reserve_notify will re-set this if the CPU
556 		 * accesses the BO after it's moved.
557 		 */
558 		abo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
559 	}
560 
561 	if (adev->mman.buffer_funcs_enabled &&
562 	    ((old_mem->mem_type == TTM_PL_SYSTEM &&
563 	      new_mem->mem_type == TTM_PL_VRAM) ||
564 	     (old_mem->mem_type == TTM_PL_VRAM &&
565 	      new_mem->mem_type == TTM_PL_SYSTEM))) {
566 		hop->fpfn = 0;
567 		hop->lpfn = 0;
568 		hop->mem_type = TTM_PL_TT;
569 		hop->flags = TTM_PL_FLAG_TEMPORARY;
570 		return -EMULTIHOP;
571 	}
572 
573 	amdgpu_bo_move_notify(bo, evict, new_mem);
574 	if (adev->mman.buffer_funcs_enabled)
575 		r = amdgpu_move_blit(bo, evict, new_mem, old_mem);
576 	else
577 		r = -ENODEV;
578 
579 	if (r) {
580 		/* Check that all memory is CPU accessible */
581 		if (!amdgpu_res_copyable(adev, old_mem) ||
582 		    !amdgpu_res_copyable(adev, new_mem)) {
583 			pr_err("Move buffer fallback to memcpy unavailable\n");
584 			return r;
585 		}
586 
587 		r = ttm_bo_move_memcpy(bo, ctx, new_mem);
588 		if (r)
589 			return r;
590 	}
591 
592 	/* update statistics after the move */
593 	if (evict)
594 		atomic64_inc(&adev->num_evictions);
595 	atomic64_add(bo->base.size, &adev->num_bytes_moved);
596 	return 0;
597 }
598 
599 /*
600  * amdgpu_ttm_io_mem_reserve - Reserve a block of memory during a fault
601  *
602  * Called by ttm_mem_io_reserve() ultimately via ttm_bo_vm_fault()
603  */
604 static int amdgpu_ttm_io_mem_reserve(struct ttm_device *bdev,
605 				     struct ttm_resource *mem)
606 {
607 	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
608 
609 	switch (mem->mem_type) {
610 	case TTM_PL_SYSTEM:
611 		/* system memory */
612 		return 0;
613 	case TTM_PL_TT:
614 	case AMDGPU_PL_PREEMPT:
615 		break;
616 	case TTM_PL_VRAM:
617 		mem->bus.offset = mem->start << PAGE_SHIFT;
618 
619 		if (adev->mman.aper_base_kaddr &&
620 		    mem->placement & TTM_PL_FLAG_CONTIGUOUS)
621 			mem->bus.addr = (u8 *)adev->mman.aper_base_kaddr +
622 					mem->bus.offset;
623 
624 		mem->bus.offset += adev->gmc.aper_base;
625 		mem->bus.is_iomem = true;
626 		break;
627 	case AMDGPU_PL_DOORBELL:
628 		mem->bus.offset = mem->start << PAGE_SHIFT;
629 		mem->bus.offset += adev->doorbell.base;
630 		mem->bus.is_iomem = true;
631 		mem->bus.caching = ttm_uncached;
632 		break;
633 	default:
634 		return -EINVAL;
635 	}
636 	return 0;
637 }
638 
639 static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,
640 					   unsigned long page_offset)
641 {
642 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
643 	struct amdgpu_res_cursor cursor;
644 
645 	amdgpu_res_first(bo->resource, (u64)page_offset << PAGE_SHIFT, 0,
646 			 &cursor);
647 
648 	if (bo->resource->mem_type == AMDGPU_PL_DOORBELL)
649 		return ((uint64_t)(adev->doorbell.base + cursor.start)) >> PAGE_SHIFT;
650 
651 	return (adev->gmc.aper_base + cursor.start) >> PAGE_SHIFT;
652 }
653 
654 /**
655  * amdgpu_ttm_domain_start - Returns GPU start address
656  * @adev: amdgpu device object
657  * @type: type of the memory
658  *
659  * Returns:
660  * GPU start address of a memory domain
661  */
662 
663 uint64_t amdgpu_ttm_domain_start(struct amdgpu_device *adev, uint32_t type)
664 {
665 	switch (type) {
666 	case TTM_PL_TT:
667 		return adev->gmc.gart_start;
668 	case TTM_PL_VRAM:
669 		return adev->gmc.vram_start;
670 	}
671 
672 	return 0;
673 }
674 
675 /*
676  * TTM backend functions.
677  */
678 struct amdgpu_ttm_tt {
679 	struct ttm_tt	ttm;
680 	struct drm_gem_object	*gobj;
681 	u64			offset;
682 	uint64_t		userptr;
683 	struct task_struct	*usertask;
684 	uint32_t		userflags;
685 	bool			bound;
686 	int32_t			pool_id;
687 };
688 
689 #define ttm_to_amdgpu_ttm_tt(ptr)	container_of(ptr, struct amdgpu_ttm_tt, ttm)
690 
691 #ifdef CONFIG_DRM_AMDGPU_USERPTR
692 /*
693  * amdgpu_ttm_tt_get_user_pages - get device accessible pages that back user
694  * memory and start HMM tracking CPU page table update
695  *
696  * Calling function must call amdgpu_ttm_tt_userptr_range_done() once and only
697  * once afterwards to stop HMM tracking
698  */
699 int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages,
700 				 struct hmm_range **range)
701 {
702 	struct ttm_tt *ttm = bo->tbo.ttm;
703 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
704 	unsigned long start = gtt->userptr;
705 	struct vm_area_struct *vma;
706 	struct mm_struct *mm;
707 	bool readonly;
708 	int r = 0;
709 
710 	/* Make sure get_user_pages_done() can cleanup gracefully */
711 	*range = NULL;
712 
713 	mm = bo->notifier.mm;
714 	if (unlikely(!mm)) {
715 		DRM_DEBUG_DRIVER("BO is not registered?\n");
716 		return -EFAULT;
717 	}
718 
719 	if (!mmget_not_zero(mm)) /* Happens during process shutdown */
720 		return -ESRCH;
721 
722 	mmap_read_lock(mm);
723 	vma = vma_lookup(mm, start);
724 	if (unlikely(!vma)) {
725 		r = -EFAULT;
726 		goto out_unlock;
727 	}
728 	if (unlikely((gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) &&
729 		vma->vm_file)) {
730 		r = -EPERM;
731 		goto out_unlock;
732 	}
733 
734 	readonly = amdgpu_ttm_tt_is_readonly(ttm);
735 	r = amdgpu_hmm_range_get_pages(&bo->notifier, start, ttm->num_pages,
736 				       readonly, NULL, pages, range);
737 out_unlock:
738 	mmap_read_unlock(mm);
739 	if (r)
740 		pr_debug("failed %d to get user pages 0x%lx\n", r, start);
741 
742 	mmput(mm);
743 
744 	return r;
745 }
746 
747 /* amdgpu_ttm_tt_discard_user_pages - Discard range and pfn array allocations
748  */
749 void amdgpu_ttm_tt_discard_user_pages(struct ttm_tt *ttm,
750 				      struct hmm_range *range)
751 {
752 	struct amdgpu_ttm_tt *gtt = (void *)ttm;
753 
754 	if (gtt && gtt->userptr && range)
755 		amdgpu_hmm_range_get_pages_done(range);
756 }
757 
758 /*
759  * amdgpu_ttm_tt_get_user_pages_done - stop HMM track the CPU page table change
760  * Check if the pages backing this ttm range have been invalidated
761  *
762  * Returns: true if pages are still valid
763  */
764 bool amdgpu_ttm_tt_get_user_pages_done(struct ttm_tt *ttm,
765 				       struct hmm_range *range)
766 {
767 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
768 
769 	if (!gtt || !gtt->userptr || !range)
770 		return false;
771 
772 	DRM_DEBUG_DRIVER("user_pages_done 0x%llx pages 0x%x\n",
773 		gtt->userptr, ttm->num_pages);
774 
775 	WARN_ONCE(!range->hmm_pfns, "No user pages to check\n");
776 
777 	return !amdgpu_hmm_range_get_pages_done(range);
778 }
779 #endif
780 
781 /*
782  * amdgpu_ttm_tt_set_user_pages - Copy pages in, putting old pages as necessary.
783  *
784  * Called by amdgpu_cs_list_validate(). This creates the page list
785  * that backs user memory and will ultimately be mapped into the device
786  * address space.
787  */
788 void amdgpu_ttm_tt_set_user_pages(struct ttm_tt *ttm, struct page **pages)
789 {
790 	unsigned long i;
791 
792 	for (i = 0; i < ttm->num_pages; ++i)
793 		ttm->pages[i] = pages ? pages[i] : NULL;
794 }
795 
796 /*
797  * amdgpu_ttm_tt_pin_userptr - prepare the sg table with the user pages
798  *
799  * Called by amdgpu_ttm_backend_bind()
800  **/
801 static int amdgpu_ttm_tt_pin_userptr(struct ttm_device *bdev,
802 				     struct ttm_tt *ttm)
803 {
804 	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
805 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
806 	int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
807 	enum dma_data_direction direction = write ?
808 		DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
809 	int r;
810 
811 	/* Allocate an SG array and squash pages into it */
812 	r = sg_alloc_table_from_pages(ttm->sg, ttm->pages, ttm->num_pages, 0,
813 				      (u64)ttm->num_pages << PAGE_SHIFT,
814 				      GFP_KERNEL);
815 	if (r)
816 		goto release_sg;
817 
818 	/* Map SG to device */
819 	r = dma_map_sgtable(adev->dev, ttm->sg, direction, 0);
820 	if (r)
821 		goto release_sg_table;
822 
823 	/* convert SG to linear array of pages and dma addresses */
824 	drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
825 				       ttm->num_pages);
826 
827 	return 0;
828 
829 release_sg_table:
830 	sg_free_table(ttm->sg);
831 release_sg:
832 	kfree(ttm->sg);
833 	ttm->sg = NULL;
834 	return r;
835 }
836 
837 /*
838  * amdgpu_ttm_tt_unpin_userptr - Unpin and unmap userptr pages
839  */
840 static void amdgpu_ttm_tt_unpin_userptr(struct ttm_device *bdev,
841 					struct ttm_tt *ttm)
842 {
843 	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
844 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
845 	int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
846 	enum dma_data_direction direction = write ?
847 		DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
848 
849 	/* double check that we don't free the table twice */
850 	if (!ttm->sg || !ttm->sg->sgl)
851 		return;
852 
853 	/* unmap the pages mapped to the device */
854 	dma_unmap_sgtable(adev->dev, ttm->sg, direction, 0);
855 	sg_free_table(ttm->sg);
856 }
857 
858 /*
859  * total_pages is constructed as MQD0+CtrlStack0 + MQD1+CtrlStack1 + ...
860  * MQDn+CtrlStackn where n is the number of XCCs per partition.
861  * pages_per_xcc is the size of one MQD+CtrlStack. The first page is MQD
862  * and uses memory type default, UC. The rest of pages_per_xcc are
863  * Ctrl stack and modify their memory type to NC.
864  */
865 static void amdgpu_ttm_gart_bind_gfx9_mqd(struct amdgpu_device *adev,
866 				struct ttm_tt *ttm, uint64_t flags)
867 {
868 	struct amdgpu_ttm_tt *gtt = (void *)ttm;
869 	uint64_t total_pages = ttm->num_pages;
870 	int num_xcc = max(1U, adev->gfx.num_xcc_per_xcp);
871 	uint64_t page_idx, pages_per_xcc;
872 	int i;
873 	uint64_t ctrl_flags = AMDGPU_PTE_MTYPE_VG10(flags, AMDGPU_MTYPE_NC);
874 
875 	pages_per_xcc = total_pages;
876 	do_div(pages_per_xcc, num_xcc);
877 
878 	for (i = 0, page_idx = 0; i < num_xcc; i++, page_idx += pages_per_xcc) {
879 		/* MQD page: use default flags */
880 		amdgpu_gart_bind(adev,
881 				gtt->offset + (page_idx << PAGE_SHIFT),
882 				1, &gtt->ttm.dma_address[page_idx], flags);
883 		/*
884 		 * Ctrl pages - modify the memory type to NC (ctrl_flags) from
885 		 * the second page of the BO onward.
886 		 */
887 		amdgpu_gart_bind(adev,
888 				gtt->offset + ((page_idx + 1) << PAGE_SHIFT),
889 				pages_per_xcc - 1,
890 				&gtt->ttm.dma_address[page_idx + 1],
891 				ctrl_flags);
892 	}
893 }
894 
895 static void amdgpu_ttm_gart_bind(struct amdgpu_device *adev,
896 				 struct ttm_buffer_object *tbo,
897 				 uint64_t flags)
898 {
899 	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(tbo);
900 	struct ttm_tt *ttm = tbo->ttm;
901 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
902 
903 	if (amdgpu_bo_encrypted(abo))
904 		flags |= AMDGPU_PTE_TMZ;
905 
906 	if (abo->flags & AMDGPU_GEM_CREATE_CP_MQD_GFX9) {
907 		amdgpu_ttm_gart_bind_gfx9_mqd(adev, ttm, flags);
908 	} else {
909 		amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
910 				 gtt->ttm.dma_address, flags);
911 	}
912 	gtt->bound = true;
913 }
914 
915 /*
916  * amdgpu_ttm_backend_bind - Bind GTT memory
917  *
918  * Called by ttm_tt_bind() on behalf of ttm_bo_handle_move_mem().
919  * This handles binding GTT memory to the device address space.
920  */
921 static int amdgpu_ttm_backend_bind(struct ttm_device *bdev,
922 				   struct ttm_tt *ttm,
923 				   struct ttm_resource *bo_mem)
924 {
925 	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
926 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
927 	uint64_t flags;
928 	int r;
929 
930 	if (!bo_mem)
931 		return -EINVAL;
932 
933 	if (gtt->bound)
934 		return 0;
935 
936 	if (gtt->userptr) {
937 		r = amdgpu_ttm_tt_pin_userptr(bdev, ttm);
938 		if (r) {
939 			dev_err(adev->dev, "failed to pin userptr\n");
940 			return r;
941 		}
942 	} else if (ttm->page_flags & TTM_TT_FLAG_EXTERNAL) {
943 		if (!ttm->sg) {
944 			struct dma_buf_attachment *attach;
945 			struct sg_table *sgt;
946 
947 			attach = gtt->gobj->import_attach;
948 			sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
949 			if (IS_ERR(sgt))
950 				return PTR_ERR(sgt);
951 
952 			ttm->sg = sgt;
953 		}
954 
955 		drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
956 					       ttm->num_pages);
957 	}
958 
959 	if (!ttm->num_pages) {
960 		WARN(1, "nothing to bind %u pages for mreg %p back %p!\n",
961 		     ttm->num_pages, bo_mem, ttm);
962 	}
963 
964 	if (bo_mem->mem_type != TTM_PL_TT ||
965 	    !amdgpu_gtt_mgr_has_gart_addr(bo_mem)) {
966 		gtt->offset = AMDGPU_BO_INVALID_OFFSET;
967 		return 0;
968 	}
969 
970 	/* compute PTE flags relevant to this BO memory */
971 	flags = amdgpu_ttm_tt_pte_flags(adev, ttm, bo_mem);
972 
973 	/* bind pages into GART page tables */
974 	gtt->offset = (u64)bo_mem->start << PAGE_SHIFT;
975 	amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,
976 			 gtt->ttm.dma_address, flags);
977 	gtt->bound = true;
978 	return 0;
979 }
980 
981 /*
982  * amdgpu_ttm_alloc_gart - Make sure buffer object is accessible either
983  * through AGP or GART aperture.
984  *
985  * If bo is accessible through AGP aperture, then use AGP aperture
986  * to access bo; otherwise allocate logical space in GART aperture
987  * and map bo to GART aperture.
988  */
989 int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo)
990 {
991 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
992 	struct ttm_operation_ctx ctx = { false, false };
993 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(bo->ttm);
994 	struct ttm_placement placement;
995 	struct ttm_place placements;
996 	struct ttm_resource *tmp;
997 	uint64_t addr, flags;
998 	int r;
999 
1000 	if (bo->resource->start != AMDGPU_BO_INVALID_OFFSET)
1001 		return 0;
1002 
1003 	addr = amdgpu_gmc_agp_addr(bo);
1004 	if (addr != AMDGPU_BO_INVALID_OFFSET)
1005 		return 0;
1006 
1007 	/* allocate GART space */
1008 	placement.num_placement = 1;
1009 	placement.placement = &placements;
1010 	placements.fpfn = 0;
1011 	placements.lpfn = adev->gmc.gart_size >> PAGE_SHIFT;
1012 	placements.mem_type = TTM_PL_TT;
1013 	placements.flags = bo->resource->placement;
1014 
1015 	r = ttm_bo_mem_space(bo, &placement, &tmp, &ctx);
1016 	if (unlikely(r))
1017 		return r;
1018 
1019 	/* compute PTE flags for this buffer object */
1020 	flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, tmp);
1021 
1022 	/* Bind pages */
1023 	gtt->offset = (u64)tmp->start << PAGE_SHIFT;
1024 	amdgpu_ttm_gart_bind(adev, bo, flags);
1025 	amdgpu_gart_invalidate_tlb(adev);
1026 	ttm_resource_free(bo, &bo->resource);
1027 	ttm_bo_assign_mem(bo, tmp);
1028 
1029 	return 0;
1030 }
1031 
1032 /*
1033  * amdgpu_ttm_recover_gart - Rebind GTT pages
1034  *
1035  * Called by amdgpu_gtt_mgr_recover() from amdgpu_device_reset() to
1036  * rebind GTT pages during a GPU reset.
1037  */
1038 void amdgpu_ttm_recover_gart(struct ttm_buffer_object *tbo)
1039 {
1040 	struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
1041 	uint64_t flags;
1042 
1043 	if (!tbo->ttm)
1044 		return;
1045 
1046 	flags = amdgpu_ttm_tt_pte_flags(adev, tbo->ttm, tbo->resource);
1047 	amdgpu_ttm_gart_bind(adev, tbo, flags);
1048 }
1049 
1050 /*
1051  * amdgpu_ttm_backend_unbind - Unbind GTT mapped pages
1052  *
1053  * Called by ttm_tt_unbind() on behalf of ttm_bo_move_ttm() and
1054  * ttm_tt_destroy().
1055  */
1056 static void amdgpu_ttm_backend_unbind(struct ttm_device *bdev,
1057 				      struct ttm_tt *ttm)
1058 {
1059 	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
1060 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
1061 
1062 	/* if the pages have userptr pinning then clear that first */
1063 	if (gtt->userptr) {
1064 		amdgpu_ttm_tt_unpin_userptr(bdev, ttm);
1065 	} else if (ttm->sg && drm_gem_is_imported(gtt->gobj)) {
1066 		struct dma_buf_attachment *attach;
1067 
1068 		attach = gtt->gobj->import_attach;
1069 		dma_buf_unmap_attachment(attach, ttm->sg, DMA_BIDIRECTIONAL);
1070 		ttm->sg = NULL;
1071 	}
1072 
1073 	if (!gtt->bound)
1074 		return;
1075 
1076 	if (gtt->offset == AMDGPU_BO_INVALID_OFFSET)
1077 		return;
1078 
1079 	/* unbind shouldn't be done for GDS/GWS/OA in ttm_bo_clean_mm */
1080 	amdgpu_gart_unbind(adev, gtt->offset, ttm->num_pages);
1081 	gtt->bound = false;
1082 }
1083 
1084 static void amdgpu_ttm_backend_destroy(struct ttm_device *bdev,
1085 				       struct ttm_tt *ttm)
1086 {
1087 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
1088 
1089 	if (gtt->usertask)
1090 		put_task_struct(gtt->usertask);
1091 
1092 	ttm_tt_fini(&gtt->ttm);
1093 	kfree(gtt);
1094 }
1095 
1096 /**
1097  * amdgpu_ttm_tt_create - Create a ttm_tt object for a given BO
1098  *
1099  * @bo: The buffer object to create a GTT ttm_tt object around
1100  * @page_flags: Page flags to be added to the ttm_tt object
1101  *
1102  * Called by ttm_tt_create().
1103  */
1104 static struct ttm_tt *amdgpu_ttm_tt_create(struct ttm_buffer_object *bo,
1105 					   uint32_t page_flags)
1106 {
1107 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
1108 	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
1109 	struct amdgpu_ttm_tt *gtt;
1110 	enum ttm_caching caching;
1111 
1112 	gtt = kzalloc(sizeof(struct amdgpu_ttm_tt), GFP_KERNEL);
1113 	if (!gtt)
1114 		return NULL;
1115 
1116 	gtt->gobj = &bo->base;
1117 	if (adev->gmc.mem_partitions && abo->xcp_id >= 0)
1118 		gtt->pool_id = KFD_XCP_MEM_ID(adev, abo->xcp_id);
1119 	else
1120 		gtt->pool_id = abo->xcp_id;
1121 
1122 	if (abo->flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
1123 		caching = ttm_write_combined;
1124 	else
1125 		caching = ttm_cached;
1126 
1127 	/* allocate space for the uninitialized page entries */
1128 	if (ttm_sg_tt_init(&gtt->ttm, bo, page_flags, caching)) {
1129 		kfree(gtt);
1130 		return NULL;
1131 	}
1132 	return &gtt->ttm;
1133 }
1134 
1135 /*
1136  * amdgpu_ttm_tt_populate - Map GTT pages visible to the device
1137  *
1138  * Map the pages of a ttm_tt object to an address space visible
1139  * to the underlying device.
1140  */
1141 static int amdgpu_ttm_tt_populate(struct ttm_device *bdev,
1142 				  struct ttm_tt *ttm,
1143 				  struct ttm_operation_ctx *ctx)
1144 {
1145 	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
1146 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
1147 	struct ttm_pool *pool;
1148 	pgoff_t i;
1149 	int ret;
1150 
1151 	/* user pages are bound by amdgpu_ttm_tt_pin_userptr() */
1152 	if (gtt->userptr) {
1153 		ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
1154 		if (!ttm->sg)
1155 			return -ENOMEM;
1156 		return 0;
1157 	}
1158 
1159 	if (ttm->page_flags & TTM_TT_FLAG_EXTERNAL)
1160 		return 0;
1161 
1162 	if (adev->mman.ttm_pools && gtt->pool_id >= 0)
1163 		pool = &adev->mman.ttm_pools[gtt->pool_id];
1164 	else
1165 		pool = &adev->mman.bdev.pool;
1166 	ret = ttm_pool_alloc(pool, ttm, ctx);
1167 	if (ret)
1168 		return ret;
1169 
1170 	for (i = 0; i < ttm->num_pages; ++i)
1171 		ttm->pages[i]->mapping = bdev->dev_mapping;
1172 
1173 	return 0;
1174 }
1175 
1176 /*
1177  * amdgpu_ttm_tt_unpopulate - unmap GTT pages and unpopulate page arrays
1178  *
1179  * Unmaps pages of a ttm_tt object from the device address space and
1180  * unpopulates the page array backing it.
1181  */
1182 static void amdgpu_ttm_tt_unpopulate(struct ttm_device *bdev,
1183 				     struct ttm_tt *ttm)
1184 {
1185 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
1186 	struct amdgpu_device *adev;
1187 	struct ttm_pool *pool;
1188 	pgoff_t i;
1189 
1190 	amdgpu_ttm_backend_unbind(bdev, ttm);
1191 
1192 	if (gtt->userptr) {
1193 		amdgpu_ttm_tt_set_user_pages(ttm, NULL);
1194 		kfree(ttm->sg);
1195 		ttm->sg = NULL;
1196 		return;
1197 	}
1198 
1199 	if (ttm->page_flags & TTM_TT_FLAG_EXTERNAL)
1200 		return;
1201 
1202 	for (i = 0; i < ttm->num_pages; ++i)
1203 		ttm->pages[i]->mapping = NULL;
1204 
1205 	adev = amdgpu_ttm_adev(bdev);
1206 
1207 	if (adev->mman.ttm_pools && gtt->pool_id >= 0)
1208 		pool = &adev->mman.ttm_pools[gtt->pool_id];
1209 	else
1210 		pool = &adev->mman.bdev.pool;
1211 
1212 	return ttm_pool_free(pool, ttm);
1213 }
1214 
1215 /**
1216  * amdgpu_ttm_tt_get_userptr - Return the userptr GTT ttm_tt for the current
1217  * task
1218  *
1219  * @tbo: The ttm_buffer_object that contains the userptr
1220  * @user_addr:  The returned value
1221  */
1222 int amdgpu_ttm_tt_get_userptr(const struct ttm_buffer_object *tbo,
1223 			      uint64_t *user_addr)
1224 {
1225 	struct amdgpu_ttm_tt *gtt;
1226 
1227 	if (!tbo->ttm)
1228 		return -EINVAL;
1229 
1230 	gtt = (void *)tbo->ttm;
1231 	*user_addr = gtt->userptr;
1232 	return 0;
1233 }
1234 
1235 /**
1236  * amdgpu_ttm_tt_set_userptr - Initialize userptr GTT ttm_tt for the current
1237  * task
1238  *
1239  * @bo: The ttm_buffer_object to bind this userptr to
1240  * @addr:  The address in the current tasks VM space to use
1241  * @flags: Requirements of userptr object.
1242  *
1243  * Called by amdgpu_gem_userptr_ioctl() and kfd_ioctl_alloc_memory_of_gpu() to
1244  * bind userptr pages to current task and by kfd_ioctl_acquire_vm() to
1245  * initialize GPU VM for a KFD process.
1246  */
1247 int amdgpu_ttm_tt_set_userptr(struct ttm_buffer_object *bo,
1248 			      uint64_t addr, uint32_t flags)
1249 {
1250 	struct amdgpu_ttm_tt *gtt;
1251 
1252 	if (!bo->ttm) {
1253 		/* TODO: We want a separate TTM object type for userptrs */
1254 		bo->ttm = amdgpu_ttm_tt_create(bo, 0);
1255 		if (bo->ttm == NULL)
1256 			return -ENOMEM;
1257 	}
1258 
1259 	/* Set TTM_TT_FLAG_EXTERNAL before populate but after create. */
1260 	bo->ttm->page_flags |= TTM_TT_FLAG_EXTERNAL;
1261 
1262 	gtt = ttm_to_amdgpu_ttm_tt(bo->ttm);
1263 	gtt->userptr = addr;
1264 	gtt->userflags = flags;
1265 
1266 	if (gtt->usertask)
1267 		put_task_struct(gtt->usertask);
1268 	gtt->usertask = current->group_leader;
1269 	get_task_struct(gtt->usertask);
1270 
1271 	return 0;
1272 }
1273 
1274 /*
1275  * amdgpu_ttm_tt_get_usermm - Return memory manager for ttm_tt object
1276  */
1277 struct mm_struct *amdgpu_ttm_tt_get_usermm(struct ttm_tt *ttm)
1278 {
1279 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
1280 
1281 	if (gtt == NULL)
1282 		return NULL;
1283 
1284 	if (gtt->usertask == NULL)
1285 		return NULL;
1286 
1287 	return gtt->usertask->mm;
1288 }
1289 
1290 /*
1291  * amdgpu_ttm_tt_affect_userptr - Determine if a ttm_tt object lays inside an
1292  * address range for the current task.
1293  *
1294  */
1295 bool amdgpu_ttm_tt_affect_userptr(struct ttm_tt *ttm, unsigned long start,
1296 				  unsigned long end, unsigned long *userptr)
1297 {
1298 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
1299 	unsigned long size;
1300 
1301 	if (gtt == NULL || !gtt->userptr)
1302 		return false;
1303 
1304 	/* Return false if no part of the ttm_tt object lies within
1305 	 * the range
1306 	 */
1307 	size = (unsigned long)gtt->ttm.num_pages * PAGE_SIZE;
1308 	if (gtt->userptr > end || gtt->userptr + size <= start)
1309 		return false;
1310 
1311 	if (userptr)
1312 		*userptr = gtt->userptr;
1313 	return true;
1314 }
1315 
1316 /*
1317  * amdgpu_ttm_tt_is_userptr - Have the pages backing by userptr?
1318  */
1319 bool amdgpu_ttm_tt_is_userptr(struct ttm_tt *ttm)
1320 {
1321 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
1322 
1323 	if (gtt == NULL || !gtt->userptr)
1324 		return false;
1325 
1326 	return true;
1327 }
1328 
1329 /*
1330  * amdgpu_ttm_tt_is_readonly - Is the ttm_tt object read only?
1331  */
1332 bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm)
1333 {
1334 	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);
1335 
1336 	if (gtt == NULL)
1337 		return false;
1338 
1339 	return !!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
1340 }
1341 
1342 /**
1343  * amdgpu_ttm_tt_pde_flags - Compute PDE flags for ttm_tt object
1344  *
1345  * @ttm: The ttm_tt object to compute the flags for
1346  * @mem: The memory registry backing this ttm_tt object
1347  *
1348  * Figure out the flags to use for a VM PDE (Page Directory Entry).
1349  */
1350 uint64_t amdgpu_ttm_tt_pde_flags(struct ttm_tt *ttm, struct ttm_resource *mem)
1351 {
1352 	uint64_t flags = 0;
1353 
1354 	if (mem && mem->mem_type != TTM_PL_SYSTEM)
1355 		flags |= AMDGPU_PTE_VALID;
1356 
1357 	if (mem && (mem->mem_type == TTM_PL_TT ||
1358 		    mem->mem_type == AMDGPU_PL_DOORBELL ||
1359 		    mem->mem_type == AMDGPU_PL_PREEMPT)) {
1360 		flags |= AMDGPU_PTE_SYSTEM;
1361 
1362 		if (ttm->caching == ttm_cached)
1363 			flags |= AMDGPU_PTE_SNOOPED;
1364 	}
1365 
1366 	if (mem && mem->mem_type == TTM_PL_VRAM &&
1367 			mem->bus.caching == ttm_cached)
1368 		flags |= AMDGPU_PTE_SNOOPED;
1369 
1370 	return flags;
1371 }
1372 
1373 /**
1374  * amdgpu_ttm_tt_pte_flags - Compute PTE flags for ttm_tt object
1375  *
1376  * @adev: amdgpu_device pointer
1377  * @ttm: The ttm_tt object to compute the flags for
1378  * @mem: The memory registry backing this ttm_tt object
1379  *
1380  * Figure out the flags to use for a VM PTE (Page Table Entry).
1381  */
1382 uint64_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
1383 				 struct ttm_resource *mem)
1384 {
1385 	uint64_t flags = amdgpu_ttm_tt_pde_flags(ttm, mem);
1386 
1387 	flags |= adev->gart.gart_pte_flags;
1388 	flags |= AMDGPU_PTE_READABLE;
1389 
1390 	if (!amdgpu_ttm_tt_is_readonly(ttm))
1391 		flags |= AMDGPU_PTE_WRITEABLE;
1392 
1393 	return flags;
1394 }
1395 
1396 /*
1397  * amdgpu_ttm_bo_eviction_valuable - Check to see if we can evict a buffer
1398  * object.
1399  *
1400  * Return true if eviction is sensible. Called by ttm_mem_evict_first() on
1401  * behalf of ttm_bo_mem_force_space() which tries to evict buffer objects until
1402  * it can find space for a new object and by ttm_bo_force_list_clean() which is
1403  * used to clean out a memory space.
1404  */
1405 static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
1406 					    const struct ttm_place *place)
1407 {
1408 	struct dma_resv_iter resv_cursor;
1409 	struct dma_fence *f;
1410 
1411 	if (!amdgpu_bo_is_amdgpu_bo(bo))
1412 		return ttm_bo_eviction_valuable(bo, place);
1413 
1414 	/* Swapout? */
1415 	if (bo->resource->mem_type == TTM_PL_SYSTEM)
1416 		return true;
1417 
1418 	if (bo->type == ttm_bo_type_kernel &&
1419 	    !amdgpu_vm_evictable(ttm_to_amdgpu_bo(bo)))
1420 		return false;
1421 
1422 	/* If bo is a KFD BO, check if the bo belongs to the current process.
1423 	 * If true, then return false as any KFD process needs all its BOs to
1424 	 * be resident to run successfully
1425 	 */
1426 	dma_resv_for_each_fence(&resv_cursor, bo->base.resv,
1427 				DMA_RESV_USAGE_BOOKKEEP, f) {
1428 		if (amdkfd_fence_check_mm(f, current->mm) &&
1429 		    !(place->flags & TTM_PL_FLAG_CONTIGUOUS))
1430 			return false;
1431 	}
1432 
1433 	/* Preemptible BOs don't own system resources managed by the
1434 	 * driver (pages, VRAM, GART space). They point to resources
1435 	 * owned by someone else (e.g. pageable memory in user mode
1436 	 * or a DMABuf). They are used in a preemptible context so we
1437 	 * can guarantee no deadlocks and good QoS in case of MMU
1438 	 * notifiers or DMABuf move notifiers from the resource owner.
1439 	 */
1440 	if (bo->resource->mem_type == AMDGPU_PL_PREEMPT)
1441 		return false;
1442 
1443 	if (bo->resource->mem_type == TTM_PL_TT &&
1444 	    amdgpu_bo_encrypted(ttm_to_amdgpu_bo(bo)))
1445 		return false;
1446 
1447 	return ttm_bo_eviction_valuable(bo, place);
1448 }
1449 
1450 static void amdgpu_ttm_vram_mm_access(struct amdgpu_device *adev, loff_t pos,
1451 				      void *buf, size_t size, bool write)
1452 {
1453 	while (size) {
1454 		uint64_t aligned_pos = ALIGN_DOWN(pos, 4);
1455 		uint64_t bytes = 4 - (pos & 0x3);
1456 		uint32_t shift = (pos & 0x3) * 8;
1457 		uint32_t mask = 0xffffffff << shift;
1458 		uint32_t value = 0;
1459 
1460 		if (size < bytes) {
1461 			mask &= 0xffffffff >> (bytes - size) * 8;
1462 			bytes = size;
1463 		}
1464 
1465 		if (mask != 0xffffffff) {
1466 			amdgpu_device_mm_access(adev, aligned_pos, &value, 4, false);
1467 			if (write) {
1468 				value &= ~mask;
1469 				value |= (*(uint32_t *)buf << shift) & mask;
1470 				amdgpu_device_mm_access(adev, aligned_pos, &value, 4, true);
1471 			} else {
1472 				value = (value & mask) >> shift;
1473 				memcpy(buf, &value, bytes);
1474 			}
1475 		} else {
1476 			amdgpu_device_mm_access(adev, aligned_pos, buf, 4, write);
1477 		}
1478 
1479 		pos += bytes;
1480 		buf += bytes;
1481 		size -= bytes;
1482 	}
1483 }
1484 
1485 static int amdgpu_ttm_access_memory_sdma(struct ttm_buffer_object *bo,
1486 					unsigned long offset, void *buf,
1487 					int len, int write)
1488 {
1489 	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
1490 	struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev);
1491 	struct amdgpu_res_cursor src_mm;
1492 	struct amdgpu_job *job;
1493 	struct dma_fence *fence;
1494 	uint64_t src_addr, dst_addr;
1495 	unsigned int num_dw;
1496 	int r, idx;
1497 
1498 	if (len != PAGE_SIZE)
1499 		return -EINVAL;
1500 
1501 	if (!adev->mman.sdma_access_ptr)
1502 		return -EACCES;
1503 
1504 	if (!drm_dev_enter(adev_to_drm(adev), &idx))
1505 		return -ENODEV;
1506 
1507 	if (write)
1508 		memcpy(adev->mman.sdma_access_ptr, buf, len);
1509 
1510 	num_dw = ALIGN(adev->mman.buffer_funcs->copy_num_dw, 8);
1511 	r = amdgpu_job_alloc_with_ib(adev, &adev->mman.high_pr,
1512 				     AMDGPU_FENCE_OWNER_UNDEFINED,
1513 				     num_dw * 4, AMDGPU_IB_POOL_DELAYED,
1514 				     &job,
1515 				     AMDGPU_KERNEL_JOB_ID_TTM_ACCESS_MEMORY_SDMA);
1516 	if (r)
1517 		goto out;
1518 
1519 	amdgpu_res_first(abo->tbo.resource, offset, len, &src_mm);
1520 	src_addr = amdgpu_ttm_domain_start(adev, bo->resource->mem_type) +
1521 		src_mm.start;
1522 	dst_addr = amdgpu_bo_gpu_offset(adev->mman.sdma_access_bo);
1523 	if (write)
1524 		swap(src_addr, dst_addr);
1525 
1526 	amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_addr, dst_addr,
1527 				PAGE_SIZE, 0);
1528 
1529 	amdgpu_ring_pad_ib(adev->mman.buffer_funcs_ring, &job->ibs[0]);
1530 	WARN_ON(job->ibs[0].length_dw > num_dw);
1531 
1532 	fence = amdgpu_job_submit(job);
1533 
1534 	if (!dma_fence_wait_timeout(fence, false, adev->sdma_timeout))
1535 		r = -ETIMEDOUT;
1536 	dma_fence_put(fence);
1537 
1538 	if (!(r || write))
1539 		memcpy(buf, adev->mman.sdma_access_ptr, len);
1540 out:
1541 	drm_dev_exit(idx);
1542 	return r;
1543 }
1544 
1545 /**
1546  * amdgpu_ttm_access_memory - Read or Write memory that backs a buffer object.
1547  *
1548  * @bo:  The buffer object to read/write
1549  * @offset:  Offset into buffer object
1550  * @buf:  Secondary buffer to write/read from
1551  * @len: Length in bytes of access
1552  * @write:  true if writing
1553  *
1554  * This is used to access VRAM that backs a buffer object via MMIO
1555  * access for debugging purposes.
1556  */
1557 static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,
1558 				    unsigned long offset, void *buf, int len,
1559 				    int write)
1560 {
1561 	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
1562 	struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev);
1563 	struct amdgpu_res_cursor cursor;
1564 	int ret = 0;
1565 
1566 	if (bo->resource->mem_type != TTM_PL_VRAM)
1567 		return -EIO;
1568 
1569 	if (amdgpu_device_has_timeouts_enabled(adev) &&
1570 			!amdgpu_ttm_access_memory_sdma(bo, offset, buf, len, write))
1571 		return len;
1572 
1573 	amdgpu_res_first(bo->resource, offset, len, &cursor);
1574 	while (cursor.remaining) {
1575 		size_t count, size = cursor.size;
1576 		loff_t pos = cursor.start;
1577 
1578 		count = amdgpu_device_aper_access(adev, pos, buf, size, write);
1579 		size -= count;
1580 		if (size) {
1581 			/* using MM to access rest vram and handle un-aligned address */
1582 			pos += count;
1583 			buf += count;
1584 			amdgpu_ttm_vram_mm_access(adev, pos, buf, size, write);
1585 		}
1586 
1587 		ret += cursor.size;
1588 		buf += cursor.size;
1589 		amdgpu_res_next(&cursor, cursor.size);
1590 	}
1591 
1592 	return ret;
1593 }
1594 
1595 static void
1596 amdgpu_bo_delete_mem_notify(struct ttm_buffer_object *bo)
1597 {
1598 	amdgpu_bo_move_notify(bo, false, NULL);
1599 }
1600 
1601 static struct ttm_device_funcs amdgpu_bo_driver = {
1602 	.ttm_tt_create = &amdgpu_ttm_tt_create,
1603 	.ttm_tt_populate = &amdgpu_ttm_tt_populate,
1604 	.ttm_tt_unpopulate = &amdgpu_ttm_tt_unpopulate,
1605 	.ttm_tt_destroy = &amdgpu_ttm_backend_destroy,
1606 	.eviction_valuable = amdgpu_ttm_bo_eviction_valuable,
1607 	.evict_flags = &amdgpu_evict_flags,
1608 	.move = &amdgpu_bo_move,
1609 	.delete_mem_notify = &amdgpu_bo_delete_mem_notify,
1610 	.release_notify = &amdgpu_bo_release_notify,
1611 	.io_mem_reserve = &amdgpu_ttm_io_mem_reserve,
1612 	.io_mem_pfn = amdgpu_ttm_io_mem_pfn,
1613 	.access_memory = &amdgpu_ttm_access_memory,
1614 };
1615 
1616 /*
1617  * Firmware Reservation functions
1618  */
1619 /**
1620  * amdgpu_ttm_fw_reserve_vram_fini - free fw reserved vram
1621  *
1622  * @adev: amdgpu_device pointer
1623  *
1624  * free fw reserved vram if it has been reserved.
1625  */
1626 static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev)
1627 {
1628 	amdgpu_bo_free_kernel(&adev->mman.fw_vram_usage_reserved_bo,
1629 		NULL, &adev->mman.fw_vram_usage_va);
1630 }
1631 
1632 /*
1633  * Driver Reservation functions
1634  */
1635 /**
1636  * amdgpu_ttm_drv_reserve_vram_fini - free drv reserved vram
1637  *
1638  * @adev: amdgpu_device pointer
1639  *
1640  * free drv reserved vram if it has been reserved.
1641  */
1642 static void amdgpu_ttm_drv_reserve_vram_fini(struct amdgpu_device *adev)
1643 {
1644 	amdgpu_bo_free_kernel(&adev->mman.drv_vram_usage_reserved_bo,
1645 						  NULL,
1646 						  &adev->mman.drv_vram_usage_va);
1647 }
1648 
1649 /**
1650  * amdgpu_ttm_fw_reserve_vram_init - create bo vram reservation from fw
1651  *
1652  * @adev: amdgpu_device pointer
1653  *
1654  * create bo vram reservation from fw.
1655  */
1656 static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev)
1657 {
1658 	uint64_t vram_size = adev->gmc.visible_vram_size;
1659 
1660 	adev->mman.fw_vram_usage_va = NULL;
1661 	adev->mman.fw_vram_usage_reserved_bo = NULL;
1662 
1663 	if (adev->mman.fw_vram_usage_size == 0 ||
1664 	    adev->mman.fw_vram_usage_size > vram_size)
1665 		return 0;
1666 
1667 	return amdgpu_bo_create_kernel_at(adev,
1668 					  adev->mman.fw_vram_usage_start_offset,
1669 					  adev->mman.fw_vram_usage_size,
1670 					  &adev->mman.fw_vram_usage_reserved_bo,
1671 					  &adev->mman.fw_vram_usage_va);
1672 }
1673 
1674 /**
1675  * amdgpu_ttm_drv_reserve_vram_init - create bo vram reservation from driver
1676  *
1677  * @adev: amdgpu_device pointer
1678  *
1679  * create bo vram reservation from drv.
1680  */
1681 static int amdgpu_ttm_drv_reserve_vram_init(struct amdgpu_device *adev)
1682 {
1683 	u64 vram_size = adev->gmc.visible_vram_size;
1684 
1685 	adev->mman.drv_vram_usage_va = NULL;
1686 	adev->mman.drv_vram_usage_reserved_bo = NULL;
1687 
1688 	if (adev->mman.drv_vram_usage_size == 0 ||
1689 	    adev->mman.drv_vram_usage_size > vram_size)
1690 		return 0;
1691 
1692 	return amdgpu_bo_create_kernel_at(adev,
1693 					  adev->mman.drv_vram_usage_start_offset,
1694 					  adev->mman.drv_vram_usage_size,
1695 					  &adev->mman.drv_vram_usage_reserved_bo,
1696 					  &adev->mman.drv_vram_usage_va);
1697 }
1698 
1699 /*
1700  * Memoy training reservation functions
1701  */
1702 
1703 /**
1704  * amdgpu_ttm_training_reserve_vram_fini - free memory training reserved vram
1705  *
1706  * @adev: amdgpu_device pointer
1707  *
1708  * free memory training reserved vram if it has been reserved.
1709  */
1710 static int amdgpu_ttm_training_reserve_vram_fini(struct amdgpu_device *adev)
1711 {
1712 	struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;
1713 
1714 	ctx->init = PSP_MEM_TRAIN_NOT_SUPPORT;
1715 	amdgpu_bo_free_kernel(&ctx->c2p_bo, NULL, NULL);
1716 	ctx->c2p_bo = NULL;
1717 
1718 	return 0;
1719 }
1720 
1721 static void amdgpu_ttm_training_data_block_init(struct amdgpu_device *adev,
1722 						uint32_t reserve_size)
1723 {
1724 	struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;
1725 
1726 	memset(ctx, 0, sizeof(*ctx));
1727 
1728 	ctx->c2p_train_data_offset =
1729 		ALIGN((adev->gmc.mc_vram_size - reserve_size - SZ_1M), SZ_1M);
1730 	ctx->p2c_train_data_offset =
1731 		(adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET);
1732 	ctx->train_data_size =
1733 		GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES;
1734 
1735 	DRM_DEBUG("train_data_size:%llx,p2c_train_data_offset:%llx,c2p_train_data_offset:%llx.\n",
1736 			ctx->train_data_size,
1737 			ctx->p2c_train_data_offset,
1738 			ctx->c2p_train_data_offset);
1739 }
1740 
1741 /*
1742  * reserve TMR memory at the top of VRAM which holds
1743  * IP Discovery data and is protected by PSP.
1744  */
1745 static int amdgpu_ttm_reserve_tmr(struct amdgpu_device *adev)
1746 {
1747 	struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;
1748 	bool mem_train_support = false;
1749 	uint32_t reserve_size = 0;
1750 	int ret;
1751 
1752 	if (adev->bios && !amdgpu_sriov_vf(adev)) {
1753 		if (amdgpu_atomfirmware_mem_training_supported(adev))
1754 			mem_train_support = true;
1755 		else
1756 			DRM_DEBUG("memory training does not support!\n");
1757 	}
1758 
1759 	/*
1760 	 * Query reserved tmr size through atom firmwareinfo for Sienna_Cichlid and onwards for all
1761 	 * the use cases (IP discovery/G6 memory training/profiling/diagnostic data.etc)
1762 	 *
1763 	 * Otherwise, fallback to legacy approach to check and reserve tmr block for ip
1764 	 * discovery data and G6 memory training data respectively
1765 	 */
1766 	if (adev->bios)
1767 		reserve_size =
1768 			amdgpu_atomfirmware_get_fw_reserved_fb_size(adev);
1769 
1770 	if (!adev->bios &&
1771 	    (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||
1772 	     amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4) ||
1773 	     amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 5, 0)))
1774 		reserve_size = max(reserve_size, (uint32_t)280 << 20);
1775 	else if (!reserve_size)
1776 		reserve_size = DISCOVERY_TMR_OFFSET;
1777 
1778 	if (mem_train_support) {
1779 		/* reserve vram for mem train according to TMR location */
1780 		amdgpu_ttm_training_data_block_init(adev, reserve_size);
1781 		ret = amdgpu_bo_create_kernel_at(adev,
1782 						 ctx->c2p_train_data_offset,
1783 						 ctx->train_data_size,
1784 						 &ctx->c2p_bo,
1785 						 NULL);
1786 		if (ret) {
1787 			dev_err(adev->dev, "alloc c2p_bo failed(%d)!\n", ret);
1788 			amdgpu_ttm_training_reserve_vram_fini(adev);
1789 			return ret;
1790 		}
1791 		ctx->init = PSP_MEM_TRAIN_RESERVE_SUCCESS;
1792 	}
1793 
1794 	if (!adev->gmc.is_app_apu) {
1795 		ret = amdgpu_bo_create_kernel_at(
1796 			adev, adev->gmc.real_vram_size - reserve_size,
1797 			reserve_size, &adev->mman.fw_reserved_memory, NULL);
1798 		if (ret) {
1799 			dev_err(adev->dev, "alloc tmr failed(%d)!\n", ret);
1800 			amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory,
1801 					      NULL, NULL);
1802 			return ret;
1803 		}
1804 	} else {
1805 		DRM_DEBUG_DRIVER("backdoor fw loading path for PSP TMR, no reservation needed\n");
1806 	}
1807 
1808 	return 0;
1809 }
1810 
1811 static int amdgpu_ttm_pools_init(struct amdgpu_device *adev)
1812 {
1813 	int i;
1814 
1815 	if (!adev->gmc.is_app_apu || !adev->gmc.num_mem_partitions)
1816 		return 0;
1817 
1818 	adev->mman.ttm_pools = kcalloc(adev->gmc.num_mem_partitions,
1819 				       sizeof(*adev->mman.ttm_pools),
1820 				       GFP_KERNEL);
1821 	if (!adev->mman.ttm_pools)
1822 		return -ENOMEM;
1823 
1824 	for (i = 0; i < adev->gmc.num_mem_partitions; i++) {
1825 		ttm_pool_init(&adev->mman.ttm_pools[i], adev->dev,
1826 			      adev->gmc.mem_partitions[i].numa.node,
1827 			      false, false);
1828 	}
1829 	return 0;
1830 }
1831 
1832 static void amdgpu_ttm_pools_fini(struct amdgpu_device *adev)
1833 {
1834 	int i;
1835 
1836 	if (!adev->gmc.is_app_apu || !adev->mman.ttm_pools)
1837 		return;
1838 
1839 	for (i = 0; i < adev->gmc.num_mem_partitions; i++)
1840 		ttm_pool_fini(&adev->mman.ttm_pools[i]);
1841 
1842 	kfree(adev->mman.ttm_pools);
1843 	adev->mman.ttm_pools = NULL;
1844 }
1845 
1846 /*
1847  * amdgpu_ttm_init - Init the memory management (ttm) as well as various
1848  * gtt/vram related fields.
1849  *
1850  * This initializes all of the memory space pools that the TTM layer
1851  * will need such as the GTT space (system memory mapped to the device),
1852  * VRAM (on-board memory), and on-chip memories (GDS, GWS, OA) which
1853  * can be mapped per VMID.
1854  */
1855 int amdgpu_ttm_init(struct amdgpu_device *adev)
1856 {
1857 	uint64_t gtt_size;
1858 	int r;
1859 
1860 	mutex_init(&adev->mman.gtt_window_lock);
1861 
1862 	dma_set_max_seg_size(adev->dev, UINT_MAX);
1863 	/* No others user of address space so set it to 0 */
1864 	r = ttm_device_init(&adev->mman.bdev, &amdgpu_bo_driver, adev->dev,
1865 			       adev_to_drm(adev)->anon_inode->i_mapping,
1866 			       adev_to_drm(adev)->vma_offset_manager,
1867 			       adev->need_swiotlb,
1868 			       dma_addressing_limited(adev->dev));
1869 	if (r) {
1870 		dev_err(adev->dev,
1871 			"failed initializing buffer object driver(%d).\n", r);
1872 		return r;
1873 	}
1874 
1875 	r = amdgpu_ttm_pools_init(adev);
1876 	if (r) {
1877 		dev_err(adev->dev, "failed to init ttm pools(%d).\n", r);
1878 		return r;
1879 	}
1880 	adev->mman.initialized = true;
1881 
1882 	/* Initialize VRAM pool with all of VRAM divided into pages */
1883 	r = amdgpu_vram_mgr_init(adev);
1884 	if (r) {
1885 		dev_err(adev->dev, "Failed initializing VRAM heap.\n");
1886 		return r;
1887 	}
1888 
1889 	/* Change the size here instead of the init above so only lpfn is affected */
1890 	amdgpu_ttm_set_buffer_funcs_status(adev, false);
1891 #ifdef CONFIG_64BIT
1892 #ifdef CONFIG_X86
1893 	if (adev->gmc.xgmi.connected_to_cpu)
1894 		adev->mman.aper_base_kaddr = ioremap_cache(adev->gmc.aper_base,
1895 				adev->gmc.visible_vram_size);
1896 
1897 	else if (adev->gmc.is_app_apu)
1898 		DRM_DEBUG_DRIVER(
1899 			"No need to ioremap when real vram size is 0\n");
1900 	else
1901 #endif
1902 		adev->mman.aper_base_kaddr = ioremap_wc(adev->gmc.aper_base,
1903 				adev->gmc.visible_vram_size);
1904 #endif
1905 
1906 	/*
1907 	 *The reserved vram for firmware must be pinned to the specified
1908 	 *place on the VRAM, so reserve it early.
1909 	 */
1910 	r = amdgpu_ttm_fw_reserve_vram_init(adev);
1911 	if (r)
1912 		return r;
1913 
1914 	/*
1915 	 *The reserved vram for driver must be pinned to the specified
1916 	 *place on the VRAM, so reserve it early.
1917 	 */
1918 	r = amdgpu_ttm_drv_reserve_vram_init(adev);
1919 	if (r)
1920 		return r;
1921 
1922 	/*
1923 	 * only NAVI10 and onwards ASIC support for IP discovery.
1924 	 * If IP discovery enabled, a block of memory should be
1925 	 * reserved for IP discovey.
1926 	 */
1927 	if (adev->mman.discovery_bin) {
1928 		r = amdgpu_ttm_reserve_tmr(adev);
1929 		if (r)
1930 			return r;
1931 	}
1932 
1933 	/* allocate memory as required for VGA
1934 	 * This is used for VGA emulation and pre-OS scanout buffers to
1935 	 * avoid display artifacts while transitioning between pre-OS
1936 	 * and driver.
1937 	 */
1938 	if (!adev->gmc.is_app_apu) {
1939 		r = amdgpu_bo_create_kernel_at(adev, 0,
1940 					       adev->mman.stolen_vga_size,
1941 					       &adev->mman.stolen_vga_memory,
1942 					       NULL);
1943 		if (r)
1944 			return r;
1945 
1946 		r = amdgpu_bo_create_kernel_at(adev, adev->mman.stolen_vga_size,
1947 					       adev->mman.stolen_extended_size,
1948 					       &adev->mman.stolen_extended_memory,
1949 					       NULL);
1950 
1951 		if (r)
1952 			return r;
1953 
1954 		r = amdgpu_bo_create_kernel_at(adev,
1955 					       adev->mman.stolen_reserved_offset,
1956 					       adev->mman.stolen_reserved_size,
1957 					       &adev->mman.stolen_reserved_memory,
1958 					       NULL);
1959 		if (r)
1960 			return r;
1961 	} else {
1962 		DRM_DEBUG_DRIVER("Skipped stolen memory reservation\n");
1963 	}
1964 
1965 	dev_info(adev->dev, "amdgpu: %uM of VRAM memory ready\n",
1966 		 (unsigned int)(adev->gmc.real_vram_size / (1024 * 1024)));
1967 
1968 	/* Compute GTT size, either based on TTM limit
1969 	 * or whatever the user passed on module init.
1970 	 */
1971 	gtt_size = ttm_tt_pages_limit() << PAGE_SHIFT;
1972 	if (amdgpu_gtt_size != -1) {
1973 		uint64_t configured_size = (uint64_t)amdgpu_gtt_size << 20;
1974 
1975 		drm_warn(&adev->ddev,
1976 			"Configuring gttsize via module parameter is deprecated, please use ttm.pages_limit\n");
1977 		if (gtt_size != configured_size)
1978 			drm_warn(&adev->ddev,
1979 				"GTT size has been set as %llu but TTM size has been set as %llu, this is unusual\n",
1980 				configured_size, gtt_size);
1981 
1982 		gtt_size = configured_size;
1983 	}
1984 
1985 	/* Initialize GTT memory pool */
1986 	r = amdgpu_gtt_mgr_init(adev, gtt_size);
1987 	if (r) {
1988 		dev_err(adev->dev, "Failed initializing GTT heap.\n");
1989 		return r;
1990 	}
1991 	dev_info(adev->dev, "amdgpu: %uM of GTT memory ready.\n",
1992 		 (unsigned int)(gtt_size / (1024 * 1024)));
1993 
1994 	if (adev->flags & AMD_IS_APU) {
1995 		if (adev->gmc.real_vram_size < gtt_size)
1996 			adev->apu_prefer_gtt = true;
1997 	}
1998 
1999 	/* Initialize doorbell pool on PCI BAR */
2000 	r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_DOORBELL, adev->doorbell.size / PAGE_SIZE);
2001 	if (r) {
2002 		dev_err(adev->dev, "Failed initializing doorbell heap.\n");
2003 		return r;
2004 	}
2005 
2006 	/* Create a boorbell page for kernel usages */
2007 	r = amdgpu_doorbell_create_kernel_doorbells(adev);
2008 	if (r) {
2009 		dev_err(adev->dev, "Failed to initialize kernel doorbells.\n");
2010 		return r;
2011 	}
2012 
2013 	/* Initialize preemptible memory pool */
2014 	r = amdgpu_preempt_mgr_init(adev);
2015 	if (r) {
2016 		dev_err(adev->dev, "Failed initializing PREEMPT heap.\n");
2017 		return r;
2018 	}
2019 
2020 	/* Initialize various on-chip memory pools */
2021 	r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_GDS, adev->gds.gds_size);
2022 	if (r) {
2023 		dev_err(adev->dev, "Failed initializing GDS heap.\n");
2024 		return r;
2025 	}
2026 
2027 	r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_GWS, adev->gds.gws_size);
2028 	if (r) {
2029 		dev_err(adev->dev, "Failed initializing gws heap.\n");
2030 		return r;
2031 	}
2032 
2033 	r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_OA, adev->gds.oa_size);
2034 	if (r) {
2035 		dev_err(adev->dev, "Failed initializing oa heap.\n");
2036 		return r;
2037 	}
2038 	if (amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE,
2039 				AMDGPU_GEM_DOMAIN_GTT,
2040 				&adev->mman.sdma_access_bo, NULL,
2041 				&adev->mman.sdma_access_ptr))
2042 		DRM_WARN("Debug VRAM access will use slowpath MM access\n");
2043 
2044 	return 0;
2045 }
2046 
2047 /*
2048  * amdgpu_ttm_fini - De-initialize the TTM memory pools
2049  */
2050 void amdgpu_ttm_fini(struct amdgpu_device *adev)
2051 {
2052 	int idx;
2053 
2054 	if (!adev->mman.initialized)
2055 		return;
2056 
2057 	amdgpu_ttm_pools_fini(adev);
2058 
2059 	amdgpu_ttm_training_reserve_vram_fini(adev);
2060 	/* return the stolen vga memory back to VRAM */
2061 	if (!adev->gmc.is_app_apu) {
2062 		amdgpu_bo_free_kernel(&adev->mman.stolen_vga_memory, NULL, NULL);
2063 		amdgpu_bo_free_kernel(&adev->mman.stolen_extended_memory, NULL, NULL);
2064 		/* return the FW reserved memory back to VRAM */
2065 		amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory, NULL,
2066 				      NULL);
2067 		amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory_extend, NULL,
2068 				      NULL);
2069 		if (adev->mman.stolen_reserved_size)
2070 			amdgpu_bo_free_kernel(&adev->mman.stolen_reserved_memory,
2071 					      NULL, NULL);
2072 	}
2073 	amdgpu_bo_free_kernel(&adev->mman.sdma_access_bo, NULL,
2074 					&adev->mman.sdma_access_ptr);
2075 	amdgpu_ttm_fw_reserve_vram_fini(adev);
2076 	amdgpu_ttm_drv_reserve_vram_fini(adev);
2077 
2078 	if (drm_dev_enter(adev_to_drm(adev), &idx)) {
2079 
2080 		if (adev->mman.aper_base_kaddr)
2081 			iounmap(adev->mman.aper_base_kaddr);
2082 		adev->mman.aper_base_kaddr = NULL;
2083 
2084 		drm_dev_exit(idx);
2085 	}
2086 
2087 	amdgpu_vram_mgr_fini(adev);
2088 	amdgpu_gtt_mgr_fini(adev);
2089 	amdgpu_preempt_mgr_fini(adev);
2090 	amdgpu_doorbell_fini(adev);
2091 
2092 	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GDS);
2093 	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GWS);
2094 	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_OA);
2095 	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_DOORBELL);
2096 	ttm_device_fini(&adev->mman.bdev);
2097 	adev->mman.initialized = false;
2098 	dev_info(adev->dev, "amdgpu: ttm finalized\n");
2099 }
2100 
2101 /**
2102  * amdgpu_ttm_set_buffer_funcs_status - enable/disable use of buffer functions
2103  *
2104  * @adev: amdgpu_device pointer
2105  * @enable: true when we can use buffer functions.
2106  *
2107  * Enable/disable use of buffer functions during suspend/resume. This should
2108  * only be called at bootup or when userspace isn't running.
2109  */
2110 void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
2111 {
2112 	struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM);
2113 	uint64_t size;
2114 	int r;
2115 
2116 	if (!adev->mman.initialized || amdgpu_in_reset(adev) ||
2117 	    adev->mman.buffer_funcs_enabled == enable || adev->gmc.is_app_apu)
2118 		return;
2119 
2120 	if (enable) {
2121 		struct amdgpu_ring *ring;
2122 		struct drm_gpu_scheduler *sched;
2123 
2124 		ring = adev->mman.buffer_funcs_ring;
2125 		sched = &ring->sched;
2126 		r = drm_sched_entity_init(&adev->mman.high_pr,
2127 					  DRM_SCHED_PRIORITY_KERNEL, &sched,
2128 					  1, NULL);
2129 		if (r) {
2130 			dev_err(adev->dev,
2131 				"Failed setting up TTM BO move entity (%d)\n",
2132 				r);
2133 			return;
2134 		}
2135 
2136 		r = drm_sched_entity_init(&adev->mman.low_pr,
2137 					  DRM_SCHED_PRIORITY_NORMAL, &sched,
2138 					  1, NULL);
2139 		if (r) {
2140 			dev_err(adev->dev,
2141 				"Failed setting up TTM BO move entity (%d)\n",
2142 				r);
2143 			goto error_free_entity;
2144 		}
2145 	} else {
2146 		drm_sched_entity_destroy(&adev->mman.high_pr);
2147 		drm_sched_entity_destroy(&adev->mman.low_pr);
2148 		dma_fence_put(man->move);
2149 		man->move = NULL;
2150 	}
2151 
2152 	/* this just adjusts TTM size idea, which sets lpfn to the correct value */
2153 	if (enable)
2154 		size = adev->gmc.real_vram_size;
2155 	else
2156 		size = adev->gmc.visible_vram_size;
2157 	man->size = size;
2158 	adev->mman.buffer_funcs_enabled = enable;
2159 
2160 	return;
2161 
2162 error_free_entity:
2163 	drm_sched_entity_destroy(&adev->mman.high_pr);
2164 }
2165 
2166 static int amdgpu_ttm_prepare_job(struct amdgpu_device *adev,
2167 				  bool direct_submit,
2168 				  unsigned int num_dw,
2169 				  struct dma_resv *resv,
2170 				  bool vm_needs_flush,
2171 				  struct amdgpu_job **job,
2172 				  bool delayed, u64 k_job_id)
2173 {
2174 	enum amdgpu_ib_pool_type pool = direct_submit ?
2175 		AMDGPU_IB_POOL_DIRECT :
2176 		AMDGPU_IB_POOL_DELAYED;
2177 	int r;
2178 	struct drm_sched_entity *entity = delayed ? &adev->mman.low_pr :
2179 						    &adev->mman.high_pr;
2180 	r = amdgpu_job_alloc_with_ib(adev, entity,
2181 				     AMDGPU_FENCE_OWNER_UNDEFINED,
2182 				     num_dw * 4, pool, job, k_job_id);
2183 	if (r)
2184 		return r;
2185 
2186 	if (vm_needs_flush) {
2187 		(*job)->vm_pd_addr = amdgpu_gmc_pd_addr(adev->gmc.pdb0_bo ?
2188 							adev->gmc.pdb0_bo :
2189 							adev->gart.bo);
2190 		(*job)->vm_needs_flush = true;
2191 	}
2192 	if (!resv)
2193 		return 0;
2194 
2195 	return drm_sched_job_add_resv_dependencies(&(*job)->base, resv,
2196 						   DMA_RESV_USAGE_BOOKKEEP);
2197 }
2198 
2199 int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,
2200 		       uint64_t dst_offset, uint32_t byte_count,
2201 		       struct dma_resv *resv,
2202 		       struct dma_fence **fence, bool direct_submit,
2203 		       bool vm_needs_flush, uint32_t copy_flags)
2204 {
2205 	struct amdgpu_device *adev = ring->adev;
2206 	unsigned int num_loops, num_dw;
2207 	struct amdgpu_job *job;
2208 	uint32_t max_bytes;
2209 	unsigned int i;
2210 	int r;
2211 
2212 	if (!direct_submit && !ring->sched.ready) {
2213 		dev_err(adev->dev,
2214 			"Trying to move memory with ring turned off.\n");
2215 		return -EINVAL;
2216 	}
2217 
2218 	max_bytes = adev->mman.buffer_funcs->copy_max_bytes;
2219 	num_loops = DIV_ROUND_UP(byte_count, max_bytes);
2220 	num_dw = ALIGN(num_loops * adev->mman.buffer_funcs->copy_num_dw, 8);
2221 	r = amdgpu_ttm_prepare_job(adev, direct_submit, num_dw,
2222 				   resv, vm_needs_flush, &job, false,
2223 				   AMDGPU_KERNEL_JOB_ID_TTM_COPY_BUFFER);
2224 	if (r)
2225 		return r;
2226 
2227 	for (i = 0; i < num_loops; i++) {
2228 		uint32_t cur_size_in_bytes = min(byte_count, max_bytes);
2229 
2230 		amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_offset,
2231 					dst_offset, cur_size_in_bytes, copy_flags);
2232 		src_offset += cur_size_in_bytes;
2233 		dst_offset += cur_size_in_bytes;
2234 		byte_count -= cur_size_in_bytes;
2235 	}
2236 
2237 	amdgpu_ring_pad_ib(ring, &job->ibs[0]);
2238 	WARN_ON(job->ibs[0].length_dw > num_dw);
2239 	if (direct_submit)
2240 		r = amdgpu_job_submit_direct(job, ring, fence);
2241 	else
2242 		*fence = amdgpu_job_submit(job);
2243 	if (r)
2244 		goto error_free;
2245 
2246 	return r;
2247 
2248 error_free:
2249 	amdgpu_job_free(job);
2250 	dev_err(adev->dev, "Error scheduling IBs (%d)\n", r);
2251 	return r;
2252 }
2253 
2254 static int amdgpu_ttm_fill_mem(struct amdgpu_ring *ring, uint32_t src_data,
2255 			       uint64_t dst_addr, uint32_t byte_count,
2256 			       struct dma_resv *resv,
2257 			       struct dma_fence **fence,
2258 			       bool vm_needs_flush, bool delayed,
2259 			       u64 k_job_id)
2260 {
2261 	struct amdgpu_device *adev = ring->adev;
2262 	unsigned int num_loops, num_dw;
2263 	struct amdgpu_job *job;
2264 	uint32_t max_bytes;
2265 	unsigned int i;
2266 	int r;
2267 
2268 	max_bytes = adev->mman.buffer_funcs->fill_max_bytes;
2269 	num_loops = DIV_ROUND_UP_ULL(byte_count, max_bytes);
2270 	num_dw = ALIGN(num_loops * adev->mman.buffer_funcs->fill_num_dw, 8);
2271 	r = amdgpu_ttm_prepare_job(adev, false, num_dw, resv, vm_needs_flush,
2272 				   &job, delayed, k_job_id);
2273 	if (r)
2274 		return r;
2275 
2276 	for (i = 0; i < num_loops; i++) {
2277 		uint32_t cur_size = min(byte_count, max_bytes);
2278 
2279 		amdgpu_emit_fill_buffer(adev, &job->ibs[0], src_data, dst_addr,
2280 					cur_size);
2281 
2282 		dst_addr += cur_size;
2283 		byte_count -= cur_size;
2284 	}
2285 
2286 	amdgpu_ring_pad_ib(ring, &job->ibs[0]);
2287 	WARN_ON(job->ibs[0].length_dw > num_dw);
2288 	*fence = amdgpu_job_submit(job);
2289 	return 0;
2290 }
2291 
2292 /**
2293  * amdgpu_ttm_clear_buffer - clear memory buffers
2294  * @bo: amdgpu buffer object
2295  * @resv: reservation object
2296  * @fence: dma_fence associated with the operation
2297  *
2298  * Clear the memory buffer resource.
2299  *
2300  * Returns:
2301  * 0 for success or a negative error code on failure.
2302  */
2303 int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo,
2304 			    struct dma_resv *resv,
2305 			    struct dma_fence **fence)
2306 {
2307 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
2308 	struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
2309 	struct amdgpu_res_cursor cursor;
2310 	u64 addr;
2311 	int r = 0;
2312 
2313 	if (!adev->mman.buffer_funcs_enabled)
2314 		return -EINVAL;
2315 
2316 	if (!fence)
2317 		return -EINVAL;
2318 
2319 	*fence = dma_fence_get_stub();
2320 
2321 	amdgpu_res_first(bo->tbo.resource, 0, amdgpu_bo_size(bo), &cursor);
2322 
2323 	mutex_lock(&adev->mman.gtt_window_lock);
2324 	while (cursor.remaining) {
2325 		struct dma_fence *next = NULL;
2326 		u64 size;
2327 
2328 		if (amdgpu_res_cleared(&cursor)) {
2329 			amdgpu_res_next(&cursor, cursor.size);
2330 			continue;
2331 		}
2332 
2333 		/* Never clear more than 256MiB at once to avoid timeouts */
2334 		size = min(cursor.size, 256ULL << 20);
2335 
2336 		r = amdgpu_ttm_map_buffer(&bo->tbo, bo->tbo.resource, &cursor,
2337 					  1, ring, false, &size, &addr);
2338 		if (r)
2339 			goto err;
2340 
2341 		r = amdgpu_ttm_fill_mem(ring, 0, addr, size, resv,
2342 					&next, true, true,
2343 					AMDGPU_KERNEL_JOB_ID_TTM_CLEAR_BUFFER);
2344 		if (r)
2345 			goto err;
2346 
2347 		dma_fence_put(*fence);
2348 		*fence = next;
2349 
2350 		amdgpu_res_next(&cursor, size);
2351 	}
2352 err:
2353 	mutex_unlock(&adev->mman.gtt_window_lock);
2354 
2355 	return r;
2356 }
2357 
2358 int amdgpu_fill_buffer(struct amdgpu_bo *bo,
2359 			uint32_t src_data,
2360 			struct dma_resv *resv,
2361 			struct dma_fence **f,
2362 			bool delayed,
2363 			u64 k_job_id)
2364 {
2365 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
2366 	struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
2367 	struct dma_fence *fence = NULL;
2368 	struct amdgpu_res_cursor dst;
2369 	int r;
2370 
2371 	if (!adev->mman.buffer_funcs_enabled) {
2372 		dev_err(adev->dev,
2373 			"Trying to clear memory with ring turned off.\n");
2374 		return -EINVAL;
2375 	}
2376 
2377 	amdgpu_res_first(bo->tbo.resource, 0, amdgpu_bo_size(bo), &dst);
2378 
2379 	mutex_lock(&adev->mman.gtt_window_lock);
2380 	while (dst.remaining) {
2381 		struct dma_fence *next;
2382 		uint64_t cur_size, to;
2383 
2384 		/* Never fill more than 256MiB at once to avoid timeouts */
2385 		cur_size = min(dst.size, 256ULL << 20);
2386 
2387 		r = amdgpu_ttm_map_buffer(&bo->tbo, bo->tbo.resource, &dst,
2388 					  1, ring, false, &cur_size, &to);
2389 		if (r)
2390 			goto error;
2391 
2392 		r = amdgpu_ttm_fill_mem(ring, src_data, to, cur_size, resv,
2393 					&next, true, delayed, k_job_id);
2394 		if (r)
2395 			goto error;
2396 
2397 		dma_fence_put(fence);
2398 		fence = next;
2399 
2400 		amdgpu_res_next(&dst, cur_size);
2401 	}
2402 error:
2403 	mutex_unlock(&adev->mman.gtt_window_lock);
2404 	if (f)
2405 		*f = dma_fence_get(fence);
2406 	dma_fence_put(fence);
2407 	return r;
2408 }
2409 
2410 /**
2411  * amdgpu_ttm_evict_resources - evict memory buffers
2412  * @adev: amdgpu device object
2413  * @mem_type: evicted BO's memory type
2414  *
2415  * Evicts all @mem_type buffers on the lru list of the memory type.
2416  *
2417  * Returns:
2418  * 0 for success or a negative error code on failure.
2419  */
2420 int amdgpu_ttm_evict_resources(struct amdgpu_device *adev, int mem_type)
2421 {
2422 	struct ttm_resource_manager *man;
2423 
2424 	switch (mem_type) {
2425 	case TTM_PL_VRAM:
2426 	case TTM_PL_TT:
2427 	case AMDGPU_PL_GWS:
2428 	case AMDGPU_PL_GDS:
2429 	case AMDGPU_PL_OA:
2430 		man = ttm_manager_type(&adev->mman.bdev, mem_type);
2431 		break;
2432 	default:
2433 		dev_err(adev->dev, "Trying to evict invalid memory type\n");
2434 		return -EINVAL;
2435 	}
2436 
2437 	return ttm_resource_manager_evict_all(&adev->mman.bdev, man);
2438 }
2439 
2440 #if defined(CONFIG_DEBUG_FS)
2441 
2442 static int amdgpu_ttm_page_pool_show(struct seq_file *m, void *unused)
2443 {
2444 	struct amdgpu_device *adev = m->private;
2445 
2446 	return ttm_pool_debugfs(&adev->mman.bdev.pool, m);
2447 }
2448 
2449 DEFINE_SHOW_ATTRIBUTE(amdgpu_ttm_page_pool);
2450 
2451 /*
2452  * amdgpu_ttm_vram_read - Linear read access to VRAM
2453  *
2454  * Accesses VRAM via MMIO for debugging purposes.
2455  */
2456 static ssize_t amdgpu_ttm_vram_read(struct file *f, char __user *buf,
2457 				    size_t size, loff_t *pos)
2458 {
2459 	struct amdgpu_device *adev = file_inode(f)->i_private;
2460 	ssize_t result = 0;
2461 
2462 	if (size & 0x3 || *pos & 0x3)
2463 		return -EINVAL;
2464 
2465 	if (*pos >= adev->gmc.mc_vram_size)
2466 		return -ENXIO;
2467 
2468 	size = min(size, (size_t)(adev->gmc.mc_vram_size - *pos));
2469 	while (size) {
2470 		size_t bytes = min(size, AMDGPU_TTM_VRAM_MAX_DW_READ * 4);
2471 		uint32_t value[AMDGPU_TTM_VRAM_MAX_DW_READ];
2472 
2473 		amdgpu_device_vram_access(adev, *pos, value, bytes, false);
2474 		if (copy_to_user(buf, value, bytes))
2475 			return -EFAULT;
2476 
2477 		result += bytes;
2478 		buf += bytes;
2479 		*pos += bytes;
2480 		size -= bytes;
2481 	}
2482 
2483 	return result;
2484 }
2485 
2486 /*
2487  * amdgpu_ttm_vram_write - Linear write access to VRAM
2488  *
2489  * Accesses VRAM via MMIO for debugging purposes.
2490  */
2491 static ssize_t amdgpu_ttm_vram_write(struct file *f, const char __user *buf,
2492 				    size_t size, loff_t *pos)
2493 {
2494 	struct amdgpu_device *adev = file_inode(f)->i_private;
2495 	ssize_t result = 0;
2496 	int r;
2497 
2498 	if (size & 0x3 || *pos & 0x3)
2499 		return -EINVAL;
2500 
2501 	if (*pos >= adev->gmc.mc_vram_size)
2502 		return -ENXIO;
2503 
2504 	while (size) {
2505 		uint32_t value;
2506 
2507 		if (*pos >= adev->gmc.mc_vram_size)
2508 			return result;
2509 
2510 		r = get_user(value, (uint32_t *)buf);
2511 		if (r)
2512 			return r;
2513 
2514 		amdgpu_device_mm_access(adev, *pos, &value, 4, true);
2515 
2516 		result += 4;
2517 		buf += 4;
2518 		*pos += 4;
2519 		size -= 4;
2520 	}
2521 
2522 	return result;
2523 }
2524 
2525 static const struct file_operations amdgpu_ttm_vram_fops = {
2526 	.owner = THIS_MODULE,
2527 	.read = amdgpu_ttm_vram_read,
2528 	.write = amdgpu_ttm_vram_write,
2529 	.llseek = default_llseek,
2530 };
2531 
2532 /*
2533  * amdgpu_iomem_read - Virtual read access to GPU mapped memory
2534  *
2535  * This function is used to read memory that has been mapped to the
2536  * GPU and the known addresses are not physical addresses but instead
2537  * bus addresses (e.g., what you'd put in an IB or ring buffer).
2538  */
2539 static ssize_t amdgpu_iomem_read(struct file *f, char __user *buf,
2540 				 size_t size, loff_t *pos)
2541 {
2542 	struct amdgpu_device *adev = file_inode(f)->i_private;
2543 	struct iommu_domain *dom;
2544 	ssize_t result = 0;
2545 	int r;
2546 
2547 	/* retrieve the IOMMU domain if any for this device */
2548 	dom = iommu_get_domain_for_dev(adev->dev);
2549 
2550 	while (size) {
2551 		phys_addr_t addr = *pos & PAGE_MASK;
2552 		loff_t off = *pos & ~PAGE_MASK;
2553 		size_t bytes = PAGE_SIZE - off;
2554 		unsigned long pfn;
2555 		struct page *p;
2556 		void *ptr;
2557 
2558 		bytes = min(bytes, size);
2559 
2560 		/* Translate the bus address to a physical address.  If
2561 		 * the domain is NULL it means there is no IOMMU active
2562 		 * and the address translation is the identity
2563 		 */
2564 		addr = dom ? iommu_iova_to_phys(dom, addr) : addr;
2565 
2566 		pfn = addr >> PAGE_SHIFT;
2567 		if (!pfn_valid(pfn))
2568 			return -EPERM;
2569 
2570 		p = pfn_to_page(pfn);
2571 		if (p->mapping != adev->mman.bdev.dev_mapping)
2572 			return -EPERM;
2573 
2574 		ptr = kmap_local_page(p);
2575 		r = copy_to_user(buf, ptr + off, bytes);
2576 		kunmap_local(ptr);
2577 		if (r)
2578 			return -EFAULT;
2579 
2580 		size -= bytes;
2581 		*pos += bytes;
2582 		result += bytes;
2583 	}
2584 
2585 	return result;
2586 }
2587 
2588 /*
2589  * amdgpu_iomem_write - Virtual write access to GPU mapped memory
2590  *
2591  * This function is used to write memory that has been mapped to the
2592  * GPU and the known addresses are not physical addresses but instead
2593  * bus addresses (e.g., what you'd put in an IB or ring buffer).
2594  */
2595 static ssize_t amdgpu_iomem_write(struct file *f, const char __user *buf,
2596 				 size_t size, loff_t *pos)
2597 {
2598 	struct amdgpu_device *adev = file_inode(f)->i_private;
2599 	struct iommu_domain *dom;
2600 	ssize_t result = 0;
2601 	int r;
2602 
2603 	dom = iommu_get_domain_for_dev(adev->dev);
2604 
2605 	while (size) {
2606 		phys_addr_t addr = *pos & PAGE_MASK;
2607 		loff_t off = *pos & ~PAGE_MASK;
2608 		size_t bytes = PAGE_SIZE - off;
2609 		unsigned long pfn;
2610 		struct page *p;
2611 		void *ptr;
2612 
2613 		bytes = min(bytes, size);
2614 
2615 		addr = dom ? iommu_iova_to_phys(dom, addr) : addr;
2616 
2617 		pfn = addr >> PAGE_SHIFT;
2618 		if (!pfn_valid(pfn))
2619 			return -EPERM;
2620 
2621 		p = pfn_to_page(pfn);
2622 		if (p->mapping != adev->mman.bdev.dev_mapping)
2623 			return -EPERM;
2624 
2625 		ptr = kmap_local_page(p);
2626 		r = copy_from_user(ptr + off, buf, bytes);
2627 		kunmap_local(ptr);
2628 		if (r)
2629 			return -EFAULT;
2630 
2631 		size -= bytes;
2632 		*pos += bytes;
2633 		result += bytes;
2634 	}
2635 
2636 	return result;
2637 }
2638 
2639 static const struct file_operations amdgpu_ttm_iomem_fops = {
2640 	.owner = THIS_MODULE,
2641 	.read = amdgpu_iomem_read,
2642 	.write = amdgpu_iomem_write,
2643 	.llseek = default_llseek
2644 };
2645 
2646 #endif
2647 
2648 void amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
2649 {
2650 #if defined(CONFIG_DEBUG_FS)
2651 	struct drm_minor *minor = adev_to_drm(adev)->primary;
2652 	struct dentry *root = minor->debugfs_root;
2653 
2654 	debugfs_create_file_size("amdgpu_vram", 0444, root, adev,
2655 				 &amdgpu_ttm_vram_fops, adev->gmc.mc_vram_size);
2656 	debugfs_create_file("amdgpu_iomem", 0444, root, adev,
2657 			    &amdgpu_ttm_iomem_fops);
2658 	debugfs_create_file("ttm_page_pool", 0444, root, adev,
2659 			    &amdgpu_ttm_page_pool_fops);
2660 	ttm_resource_manager_create_debugfs(ttm_manager_type(&adev->mman.bdev,
2661 							     TTM_PL_VRAM),
2662 					    root, "amdgpu_vram_mm");
2663 	ttm_resource_manager_create_debugfs(ttm_manager_type(&adev->mman.bdev,
2664 							     TTM_PL_TT),
2665 					    root, "amdgpu_gtt_mm");
2666 	ttm_resource_manager_create_debugfs(ttm_manager_type(&adev->mman.bdev,
2667 							     AMDGPU_PL_GDS),
2668 					    root, "amdgpu_gds_mm");
2669 	ttm_resource_manager_create_debugfs(ttm_manager_type(&adev->mman.bdev,
2670 							     AMDGPU_PL_GWS),
2671 					    root, "amdgpu_gws_mm");
2672 	ttm_resource_manager_create_debugfs(ttm_manager_type(&adev->mman.bdev,
2673 							     AMDGPU_PL_OA),
2674 					    root, "amdgpu_oa_mm");
2675 
2676 #endif
2677 }
2678