Merge v6.9-rc6 into drm-next
[linux-block.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_object.c
CommitLineData
d38ceaf9
AD
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#include <linux/list.h>
33#include <linux/slab.h>
2d4dad27 34#include <linux/dma-buf.h>
fdf2f6c5 35
62d5f9f7 36#include <drm/drm_drv.h>
d38ceaf9 37#include <drm/amdgpu_drm.h>
a187f17f 38#include <drm/drm_cache.h>
d38ceaf9
AD
39#include "amdgpu.h"
40#include "amdgpu_trace.h"
a46a2cd1 41#include "amdgpu_amdkfd.h"
a68c7eaa 42#include "amdgpu_vram_mgr.h"
d38ceaf9 43
6f4e8d6e
SL
44/**
45 * DOC: amdgpu_object
46 *
47 * This defines the interfaces to operate on an &amdgpu_bo buffer object which
48 * represents memory used by driver (VRAM, system memory, etc.). The driver
49 * provides DRM/GEM APIs to userspace. DRM/GEM APIs then use these interfaces
50 * to create/destroy/set buffer object which are then managed by the kernel TTM
51 * memory manager.
52 * The interfaces are also used internally by kernel clients, including gfx,
53 * uvd, etc. for kernel managed allocations used by the GPU.
54 *
55 */
56
c704ab18 57static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
d38ceaf9 58{
b82485fd 59 struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
d38ceaf9 60
6375bbb4 61 amdgpu_bo_kunmap(bo);
d38ceaf9 62
c105de28
GH
63 if (bo->tbo.base.import_attach)
64 drm_prime_gem_destroy(&bo->tbo.base, bo->tbo.sg);
65 drm_gem_object_release(&bo->tbo.base);
23e24fbb
ND
66 amdgpu_bo_unref(&bo->parent);
67 kvfree(bo);
68}
69
70static void amdgpu_bo_user_destroy(struct ttm_buffer_object *tbo)
71{
72 struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
73 struct amdgpu_bo_user *ubo;
74
75 ubo = to_amdgpu_bo_user(bo);
76 kfree(ubo->metadata);
77 amdgpu_bo_destroy(tbo);
78}
79
80static void amdgpu_bo_vm_destroy(struct ttm_buffer_object *tbo)
81{
82 struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
cbb63ecc 83 struct amdgpu_bo *shadow_bo = ttm_to_amdgpu_bo(tbo), *bo;
e18aaea7 84 struct amdgpu_bo_vm *vmbo;
23e24fbb 85
cbb63ecc 86 bo = shadow_bo->parent;
e18aaea7 87 vmbo = to_amdgpu_bo_vm(bo);
36e499b2 88 /* in case amdgpu_device_recover_vram got NULL of bo->parent */
e18aaea7 89 if (!list_empty(&vmbo->shadow_list)) {
a7d64de6 90 mutex_lock(&adev->shadow_list_lock);
e18aaea7 91 list_del_init(&vmbo->shadow_list);
a7d64de6 92 mutex_unlock(&adev->shadow_list_lock);
0c4e7fa5 93 }
36e499b2 94
23e24fbb 95 amdgpu_bo_destroy(tbo);
d38ceaf9
AD
96}
97
6f4e8d6e 98/**
c704ab18 99 * amdgpu_bo_is_amdgpu_bo - check if the buffer object is an &amdgpu_bo
6f4e8d6e
SL
100 * @bo: buffer object to be checked
101 *
102 * Uses destroy function associated with the object to determine if this is
103 * an &amdgpu_bo.
104 *
2472e11b
MD
105 * Returns:
106 * true if the object belongs to &amdgpu_bo, false if not.
6f4e8d6e 107 */
c704ab18 108bool amdgpu_bo_is_amdgpu_bo(struct ttm_buffer_object *bo)
d38ceaf9 109{
23e24fbb
ND
110 if (bo->destroy == &amdgpu_bo_destroy ||
111 bo->destroy == &amdgpu_bo_user_destroy ||
112 bo->destroy == &amdgpu_bo_vm_destroy)
d38ceaf9 113 return true;
23e24fbb 114
d38ceaf9
AD
115 return false;
116}
117
6f4e8d6e 118/**
c704ab18 119 * amdgpu_bo_placement_from_domain - set buffer's placement
6f4e8d6e
SL
120 * @abo: &amdgpu_bo buffer object whose placement is to be set
121 * @domain: requested domain
122 *
123 * Sets buffer's placement according to requested domain and the buffer's
124 * flags.
125 */
c704ab18 126void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)
d38ceaf9 127{
c09312a6
CK
128 struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev);
129 struct ttm_placement *placement = &abo->placement;
130 struct ttm_place *places = abo->placements;
131 u64 flags = abo->flags;
6369f6f1 132 u32 c = 0;
7e5a547f 133
d38ceaf9 134 if (domain & AMDGPU_GEM_DOMAIN_VRAM) {
1d6ecab1 135 unsigned int visible_pfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
3ebfd221 136 int8_t mem_id = KFD_XCP_MEM_ID(adev, abo->xcp_id);
faceaf6a 137
3ebfd221
PY
138 if (adev->gmc.mem_partitions && mem_id >= 0) {
139 places[c].fpfn = adev->gmc.mem_partitions[mem_id].range.fpfn;
6cfba94a
PY
140 /*
141 * memory partition range lpfn is inclusive start + size - 1
142 * TTM place lpfn is exclusive start + size
143 */
3ebfd221 144 places[c].lpfn = adev->gmc.mem_partitions[mem_id].range.lpfn + 1;
7f6db894
PY
145 } else {
146 places[c].fpfn = 0;
147 places[c].lpfn = 0;
148 }
48e07c23 149 places[c].mem_type = TTM_PL_VRAM;
ce65b874 150 places[c].flags = 0;
89bb5752 151
faceaf6a 152 if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
7f6db894 153 places[c].lpfn = min_not_zero(places[c].lpfn, visible_pfn);
59eddd4e 154 else
faceaf6a 155 places[c].flags |= TTM_PL_FLAG_TOPDOWN;
89bb5752
CK
156
157 if (flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)
158 places[c].flags |= TTM_PL_FLAG_CONTIGUOUS;
faceaf6a 159 c++;
d38ceaf9
AD
160 }
161
dc3499c7
AD
162 if (domain & AMDGPU_GEM_DOMAIN_DOORBELL) {
163 places[c].fpfn = 0;
164 places[c].lpfn = 0;
165 places[c].mem_type = AMDGPU_PL_DOORBELL;
166 places[c].flags = 0;
167 c++;
168 }
169
d38ceaf9 170 if (domain & AMDGPU_GEM_DOMAIN_GTT) {
faceaf6a 171 places[c].fpfn = 0;
3d5fe658 172 places[c].lpfn = 0;
b453e42a
FK
173 places[c].mem_type =
174 abo->flags & AMDGPU_GEM_CREATE_PREEMPTIBLE ?
175 AMDGPU_PL_PREEMPT : TTM_PL_TT;
48e07c23 176 places[c].flags = 0;
216c1282
CK
177 /*
178 * When GTT is just an alternative to VRAM make sure that we
179 * only use it as fallback and still try to fill up VRAM first.
180 */
181 if (domain & abo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM)
182 places[c].flags |= TTM_PL_FLAG_FALLBACK;
faceaf6a 183 c++;
d38ceaf9
AD
184 }
185
186 if (domain & AMDGPU_GEM_DOMAIN_CPU) {
faceaf6a
CK
187 places[c].fpfn = 0;
188 places[c].lpfn = 0;
48e07c23
CK
189 places[c].mem_type = TTM_PL_SYSTEM;
190 places[c].flags = 0;
faceaf6a 191 c++;
d38ceaf9
AD
192 }
193
194 if (domain & AMDGPU_GEM_DOMAIN_GDS) {
faceaf6a
CK
195 places[c].fpfn = 0;
196 places[c].lpfn = 0;
48e07c23 197 places[c].mem_type = AMDGPU_PL_GDS;
ce65b874 198 places[c].flags = 0;
faceaf6a 199 c++;
d38ceaf9 200 }
faceaf6a 201
d38ceaf9 202 if (domain & AMDGPU_GEM_DOMAIN_GWS) {
faceaf6a
CK
203 places[c].fpfn = 0;
204 places[c].lpfn = 0;
48e07c23 205 places[c].mem_type = AMDGPU_PL_GWS;
ce65b874 206 places[c].flags = 0;
faceaf6a 207 c++;
d38ceaf9 208 }
faceaf6a 209
d38ceaf9 210 if (domain & AMDGPU_GEM_DOMAIN_OA) {
faceaf6a
CK
211 places[c].fpfn = 0;
212 places[c].lpfn = 0;
48e07c23 213 places[c].mem_type = AMDGPU_PL_OA;
ce65b874 214 places[c].flags = 0;
faceaf6a 215 c++;
d38ceaf9
AD
216 }
217
218 if (!c) {
faceaf6a
CK
219 places[c].fpfn = 0;
220 places[c].lpfn = 0;
48e07c23 221 places[c].mem_type = TTM_PL_SYSTEM;
ce65b874 222 places[c].flags = 0;
faceaf6a 223 c++;
d38ceaf9 224 }
faceaf6a 225
ea7acd7c 226 BUG_ON(c > AMDGPU_BO_MAX_PLACEMENTS);
bf314ca3 227
7e5a547f 228 placement->num_placement = c;
faceaf6a 229 placement->placement = places;
d38ceaf9
AD
230}
231
7c204889 232/**
9d903cbd 233 * amdgpu_bo_create_reserved - create reserved BO for kernel use
7c204889
CK
234 *
235 * @adev: amdgpu device object
236 * @size: size for the new BO
237 * @align: alignment for the new BO
238 * @domain: where to place it
64350f1b 239 * @bo_ptr: used to initialize BOs in structures
7c204889
CK
240 * @gpu_addr: GPU addr of the pinned BO
241 * @cpu_addr: optional CPU address mapping
242 *
9d903cbd
CK
243 * Allocates and pins a BO for kernel internal use, and returns it still
244 * reserved.
7c204889 245 *
64350f1b
AG
246 * Note: For bo_ptr new BO is only created if bo_ptr points to NULL.
247 *
2472e11b
MD
248 * Returns:
249 * 0 on success, negative error code otherwise.
7c204889 250 */
9d903cbd
CK
251int amdgpu_bo_create_reserved(struct amdgpu_device *adev,
252 unsigned long size, int align,
253 u32 domain, struct amdgpu_bo **bo_ptr,
254 u64 *gpu_addr, void **cpu_addr)
7c204889 255{
3216c6b7 256 struct amdgpu_bo_param bp;
53766e5a 257 bool free = false;
7c204889
CK
258 int r;
259
21a7e77f
CK
260 if (!size) {
261 amdgpu_bo_unref(bo_ptr);
262 return 0;
263 }
264
3216c6b7
CZ
265 memset(&bp, 0, sizeof(bp));
266 bp.size = size;
267 bp.byte_align = align;
268 bp.domain = domain;
828d6fde
TY
269 bp.flags = cpu_addr ? AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
270 : AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
271 bp.flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
3216c6b7
CZ
272 bp.type = ttm_bo_type_kernel;
273 bp.resv = NULL;
9fd5543e 274 bp.bo_ptr_size = sizeof(struct amdgpu_bo);
3216c6b7 275
53766e5a 276 if (!*bo_ptr) {
3216c6b7 277 r = amdgpu_bo_create(adev, &bp, bo_ptr);
53766e5a
CK
278 if (r) {
279 dev_err(adev->dev, "(%d) failed to allocate kernel bo\n",
280 r);
281 return r;
282 }
283 free = true;
7c204889
CK
284 }
285
286 r = amdgpu_bo_reserve(*bo_ptr, false);
287 if (r) {
288 dev_err(adev->dev, "(%d) failed to reserve kernel bo\n", r);
289 goto error_free;
290 }
291
7b7c6c81 292 r = amdgpu_bo_pin(*bo_ptr, domain);
7c204889
CK
293 if (r) {
294 dev_err(adev->dev, "(%d) kernel bo pin failed\n", r);
295 goto error_unreserve;
296 }
bb812f1e
JZ
297
298 r = amdgpu_ttm_alloc_gart(&(*bo_ptr)->tbo);
299 if (r) {
300 dev_err(adev->dev, "%p bind failed\n", *bo_ptr);
301 goto error_unpin;
302 }
303
7b7c6c81
JZ
304 if (gpu_addr)
305 *gpu_addr = amdgpu_bo_gpu_offset(*bo_ptr);
7c204889
CK
306
307 if (cpu_addr) {
308 r = amdgpu_bo_kmap(*bo_ptr, cpu_addr);
309 if (r) {
310 dev_err(adev->dev, "(%d) kernel bo map failed\n", r);
dc407ee0 311 goto error_unpin;
7c204889
CK
312 }
313 }
314
7c204889
CK
315 return 0;
316
bb812f1e
JZ
317error_unpin:
318 amdgpu_bo_unpin(*bo_ptr);
7c204889
CK
319error_unreserve:
320 amdgpu_bo_unreserve(*bo_ptr);
321
322error_free:
53766e5a
CK
323 if (free)
324 amdgpu_bo_unref(bo_ptr);
7c204889
CK
325
326 return r;
327}
328
9d903cbd
CK
329/**
330 * amdgpu_bo_create_kernel - create BO for kernel use
331 *
332 * @adev: amdgpu device object
333 * @size: size for the new BO
334 * @align: alignment for the new BO
335 * @domain: where to place it
64350f1b 336 * @bo_ptr: used to initialize BOs in structures
9d903cbd
CK
337 * @gpu_addr: GPU addr of the pinned BO
338 * @cpu_addr: optional CPU address mapping
339 *
340 * Allocates and pins a BO for kernel internal use.
341 *
64350f1b
AG
342 * Note: For bo_ptr new BO is only created if bo_ptr points to NULL.
343 *
2472e11b
MD
344 * Returns:
345 * 0 on success, negative error code otherwise.
9d903cbd
CK
346 */
347int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
348 unsigned long size, int align,
349 u32 domain, struct amdgpu_bo **bo_ptr,
350 u64 *gpu_addr, void **cpu_addr)
351{
352 int r;
353
354 r = amdgpu_bo_create_reserved(adev, size, align, domain, bo_ptr,
355 gpu_addr, cpu_addr);
356
357 if (r)
358 return r;
359
ddaf5013
TSD
360 if (*bo_ptr)
361 amdgpu_bo_unreserve(*bo_ptr);
9d903cbd
CK
362
363 return 0;
364}
365
de7b45ba
CK
366/**
367 * amdgpu_bo_create_kernel_at - create BO for kernel use at specific location
368 *
369 * @adev: amdgpu device object
370 * @offset: offset of the BO
371 * @size: size of the BO
de7b45ba
CK
372 * @bo_ptr: used to initialize BOs in structures
373 * @cpu_addr: optional CPU address mapping
374 *
3273f116 375 * Creates a kernel BO at a specific offset in VRAM.
de7b45ba
CK
376 *
377 * Returns:
378 * 0 on success, negative error code otherwise.
379 */
380int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev,
3273f116 381 uint64_t offset, uint64_t size,
de7b45ba
CK
382 struct amdgpu_bo **bo_ptr, void **cpu_addr)
383{
384 struct ttm_operation_ctx ctx = { false, false };
385 unsigned int i;
386 int r;
387
388 offset &= PAGE_MASK;
389 size = ALIGN(size, PAGE_SIZE);
390
3273f116
LT
391 r = amdgpu_bo_create_reserved(adev, size, PAGE_SIZE,
392 AMDGPU_GEM_DOMAIN_VRAM, bo_ptr, NULL,
393 cpu_addr);
de7b45ba
CK
394 if (r)
395 return r;
396
37912e96
AD
397 if ((*bo_ptr) == NULL)
398 return 0;
399
de7b45ba
CK
400 /*
401 * Remove the original mem node and create a new one at the request
402 * position.
403 */
4a246528
CK
404 if (cpu_addr)
405 amdgpu_bo_kunmap(*bo_ptr);
406
bfa3357e 407 ttm_resource_free(&(*bo_ptr)->tbo, &(*bo_ptr)->tbo.resource);
4a246528 408
de7b45ba
CK
409 for (i = 0; i < (*bo_ptr)->placement.num_placement; ++i) {
410 (*bo_ptr)->placements[i].fpfn = offset >> PAGE_SHIFT;
411 (*bo_ptr)->placements[i].lpfn = (offset + size) >> PAGE_SHIFT;
412 }
de7b45ba 413 r = ttm_bo_mem_space(&(*bo_ptr)->tbo, &(*bo_ptr)->placement,
bfa3357e 414 &(*bo_ptr)->tbo.resource, &ctx);
de7b45ba
CK
415 if (r)
416 goto error;
417
418 if (cpu_addr) {
419 r = amdgpu_bo_kmap(*bo_ptr, cpu_addr);
420 if (r)
421 goto error;
422 }
423
424 amdgpu_bo_unreserve(*bo_ptr);
425 return 0;
426
427error:
428 amdgpu_bo_unreserve(*bo_ptr);
429 amdgpu_bo_unref(bo_ptr);
430 return r;
431}
432
aa1d562e
JZ
433/**
434 * amdgpu_bo_free_kernel - free BO for kernel use
435 *
436 * @bo: amdgpu BO to free
2472e11b
MD
437 * @gpu_addr: pointer to where the BO's GPU memory space address was stored
438 * @cpu_addr: pointer to where the BO's CPU memory space address was stored
aa1d562e
JZ
439 *
440 * unmaps and unpin a BO for kernel internal use.
441 */
442void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
443 void **cpu_addr)
444{
445 if (*bo == NULL)
446 return;
447
4d2ccd96
CK
448 WARN_ON(amdgpu_ttm_adev((*bo)->tbo.bdev)->in_suspend);
449
f3aa745e 450 if (likely(amdgpu_bo_reserve(*bo, true) == 0)) {
aa1d562e
JZ
451 if (cpu_addr)
452 amdgpu_bo_kunmap(*bo);
453
454 amdgpu_bo_unpin(*bo);
455 amdgpu_bo_unreserve(*bo);
456 }
457 amdgpu_bo_unref(bo);
458
459 if (gpu_addr)
460 *gpu_addr = 0;
461
462 if (cpu_addr)
463 *cpu_addr = NULL;
464}
465
8f9a9a09 466/* Validate bo size is bit bigger than the request domain */
79c63123
AG
467static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
468 unsigned long size, u32 domain)
469{
9de59bc2 470 struct ttm_resource_manager *man = NULL;
79c63123
AG
471
472 /*
473 * If GTT is part of requested domains the check must succeed to
7554886d 474 * allow fall back to GTT.
79c63123 475 */
8f9a9a09 476 if (domain & AMDGPU_GEM_DOMAIN_GTT)
6c28aed6 477 man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT);
8f9a9a09 478 else if (domain & AMDGPU_GEM_DOMAIN_VRAM)
6c28aed6 479 man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM);
8f9a9a09
MJ
480 else
481 return true;
79c63123 482
8f9a9a09
MJ
483 if (!man) {
484 if (domain & AMDGPU_GEM_DOMAIN_GTT)
485 WARN_ON_ONCE("GTT domain requested but GTT mem manager uninitialized");
486 return false;
79c63123
AG
487 }
488
dc3499c7 489 /* TODO add more domains checks, such as AMDGPU_GEM_DOMAIN_CPU, _DOMAIN_DOORBELL */
8f9a9a09
MJ
490 if (size < man->size)
491 return true;
79c63123 492
8f9a9a09 493 DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, man->size);
79c63123
AG
494 return false;
495}
496
3d1b8ec7
AG
497bool amdgpu_bo_support_uswc(u64 bo_flags)
498{
499
500#ifdef CONFIG_X86_32
501 /* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
502 * See https://bugs.freedesktop.org/show_bug.cgi?id=84627
503 */
504 return false;
505#elif defined(CONFIG_X86) && !defined(CONFIG_X86_PAT)
506 /* Don't try to enable write-combining when it can't work, or things
507 * may be slow
508 * See https://bugs.freedesktop.org/show_bug.cgi?id=88758
509 */
510
511#ifndef CONFIG_COMPILE_TEST
512#warning Please enable CONFIG_MTRR and CONFIG_X86_PAT for better performance \
513 thanks to write-combining
514#endif
515
516 if (bo_flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
517 DRM_INFO_ONCE("Please enable CONFIG_MTRR and CONFIG_X86_PAT for "
518 "better performance thanks to write-combining\n");
519 return false;
520#else
521 /* For architectures that don't support WC memory,
522 * mask out the WC flag from the BO
523 */
524 if (!drm_arch_can_wc_memory())
525 return false;
526
527 return true;
528#endif
529}
530
cd2454d6
ND
531/**
532 * amdgpu_bo_create - create an &amdgpu_bo buffer object
533 * @adev: amdgpu device object
534 * @bp: parameters to be used for the buffer object
535 * @bo_ptr: pointer to the buffer object pointer
536 *
537 * Creates an &amdgpu_bo buffer object.
538 *
539 * Returns:
540 * 0 for success or a negative error code on failure.
541 */
542int amdgpu_bo_create(struct amdgpu_device *adev,
a906dbb1 543 struct amdgpu_bo_param *bp,
c09312a6 544 struct amdgpu_bo **bo_ptr)
d38ceaf9 545{
9251859a 546 struct ttm_operation_ctx ctx = {
a906dbb1 547 .interruptible = (bp->type != ttm_bo_type_kernel),
061468c4 548 .no_wait_gpu = bp->no_wait_gpu,
586052b0
CK
549 /* We opt to avoid OOM on system pages allocations */
550 .gfp_retry_mayfail = true,
c44dfe4d
CK
551 .allow_res_evict = bp->type != ttm_bo_type_kernel,
552 .resv = bp->resv
9251859a 553 };
d38ceaf9 554 struct amdgpu_bo *bo;
a906dbb1 555 unsigned long page_align, size = bp->size;
d38ceaf9
AD
556 int r;
557
fe57085a
MO
558 /* Note that GDS/GWS/OA allocates 1 page per byte/resource. */
559 if (bp->domain & (AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
560 /* GWS and OA don't need any alignment. */
561 page_align = bp->byte_align;
77a2faa5 562 size <<= PAGE_SHIFT;
e3c92eb4 563
fe57085a
MO
564 } else if (bp->domain & AMDGPU_GEM_DOMAIN_GDS) {
565 /* Both size and alignment must be a multiple of 4. */
566 page_align = ALIGN(bp->byte_align, 4);
567 size = ALIGN(size, 4) << PAGE_SHIFT;
568 } else {
569 /* Memory should be aligned at least to a page size. */
570 page_align = ALIGN(bp->byte_align, PAGE_SIZE) >> PAGE_SHIFT;
77a2faa5 571 size = ALIGN(size, PAGE_SIZE);
fe57085a 572 }
d38ceaf9 573
a906dbb1 574 if (!amdgpu_bo_validate_size(adev, size, bp->domain))
79c63123
AG
575 return -ENOMEM;
576
9fd5543e 577 BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo));
d38ceaf9 578
9fd5543e 579 *bo_ptr = NULL;
31c759bb 580 bo = kvzalloc(bp->bo_ptr_size, GFP_KERNEL);
d38ceaf9
AD
581 if (bo == NULL)
582 return -ENOMEM;
4a580877 583 drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
646b9025 584 bo->vm_bo = NULL;
3f188453 585 bo->preferred_domains = bp->preferred_domain ? bp->preferred_domain :
aa2b2e28 586 bp->domain;
08082104 587 bo->allowed_domains = bo->preferred_domains;
a906dbb1 588 if (bp->type != ttm_bo_type_kernel &&
fab2cc83 589 !(bp->flags & AMDGPU_GEM_CREATE_DISCARDABLE) &&
08082104
CK
590 bo->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
591 bo->allowed_domains |= AMDGPU_GEM_DOMAIN_GTT;
d38ceaf9 592
a906dbb1 593 bo->flags = bp->flags;
a187f17f 594
3ebfd221
PY
595 if (adev->gmc.mem_partitions)
596 /* For GPUs with spatial partitioning, bo->xcp_id=-1 means any partition */
597 bo->xcp_id = bp->xcp_id_plus1 - 1;
598 else
599 /* For GPUs without spatial partitioning */
600 bo->xcp_id = 0;
f24e924b 601
3d1b8ec7 602 if (!amdgpu_bo_support_uswc(bo->flags))
a187f17f
OG
603 bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC;
604
a68c7eaa 605 bo->flags |= AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE;
fc6ea4be 606
c09312a6 607 bo->tbo.bdev = &adev->mman.bdev;
47722220
CK
608 if (bp->domain & (AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA |
609 AMDGPU_GEM_DOMAIN_GDS))
610 amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_CPU);
611 else
612 amdgpu_bo_placement_from_domain(bo, bp->domain);
a50cb948 613 if (bp->type == ttm_bo_type_kernel)
b0b13d53
FK
614 bo->tbo.priority = 2;
615 else if (!(bp->flags & AMDGPU_GEM_CREATE_DISCARDABLE))
a50cb948 616 bo->tbo.priority = 1;
08082104 617
23e24fbb
ND
618 if (!bp->destroy)
619 bp->destroy = &amdgpu_bo_destroy;
620
347987a2 621 r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, bp->type,
f07069da 622 &bo->placement, page_align, &ctx, NULL,
23e24fbb 623 bp->resv, bp->destroy);
08082104 624 if (unlikely(r != 0))
a695e437
CK
625 return r;
626
c8c5e569 627 if (!amdgpu_gmc_vram_full_visible(&adev->gmc) &&
394ae060 628 amdgpu_res_cpu_visible(adev, bo->tbo.resource))
6af046d2
CK
629 amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved,
630 ctx.bytes_moved);
00f06b24 631 else
6af046d2 632 amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved, 0);
fad06127 633
a906dbb1 634 if (bp->flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
d3116756 635 bo->tbo.resource->mem_type == TTM_PL_VRAM) {
f54d1867 636 struct dma_fence *fence;
4fea83ff 637
a68c7eaa 638 r = amdgpu_ttm_clear_buffer(bo, bo->tbo.base.resv, &fence);
c3af1258
CK
639 if (unlikely(r))
640 goto fail_unreserve;
641
8bb31587
CK
642 dma_resv_add_fence(bo->tbo.base.resv, fence,
643 DMA_RESV_USAGE_KERNEL);
f54d1867 644 dma_fence_put(fence);
4fea83ff 645 }
a906dbb1 646 if (!bp->resv)
59c66c91 647 amdgpu_bo_unreserve(bo);
d38ceaf9
AD
648 *bo_ptr = bo;
649
650 trace_amdgpu_bo_create(bo);
651
96cf8271 652 /* Treat CPU_ACCESS_REQUIRED only as a hint if given by UMD */
a906dbb1 653 if (bp->type == ttm_bo_type_device)
96cf8271
JB
654 bo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
655
d38ceaf9 656 return 0;
4fea83ff
FC
657
658fail_unreserve:
a906dbb1 659 if (!bp->resv)
52791eee 660 dma_resv_unlock(bo->tbo.base.resv);
4fea83ff
FC
661 amdgpu_bo_unref(&bo);
662 return r;
d38ceaf9
AD
663}
664
9ad0d033
ND
665/**
666 * amdgpu_bo_create_user - create an &amdgpu_bo_user buffer object
667 * @adev: amdgpu device object
668 * @bp: parameters to be used for the buffer object
669 * @ubo_ptr: pointer to the buffer object pointer
670 *
671 * Create a BO to be used by user application;
672 *
673 * Returns:
674 * 0 for success or a negative error code on failure.
675 */
676
677int amdgpu_bo_create_user(struct amdgpu_device *adev,
678 struct amdgpu_bo_param *bp,
679 struct amdgpu_bo_user **ubo_ptr)
680{
681 struct amdgpu_bo *bo_ptr;
682 int r;
683
9ad0d033 684 bp->bo_ptr_size = sizeof(struct amdgpu_bo_user);
23e24fbb 685 bp->destroy = &amdgpu_bo_user_destroy;
cd2454d6 686 r = amdgpu_bo_create(adev, bp, &bo_ptr);
9ad0d033
ND
687 if (r)
688 return r;
689
690 *ubo_ptr = to_amdgpu_bo_user(bo_ptr);
691 return r;
692}
6fdd6f4a
ND
693
694/**
695 * amdgpu_bo_create_vm - create an &amdgpu_bo_vm buffer object
696 * @adev: amdgpu device object
697 * @bp: parameters to be used for the buffer object
698 * @vmbo_ptr: pointer to the buffer object pointer
699 *
700 * Create a BO to be for GPUVM.
701 *
702 * Returns:
703 * 0 for success or a negative error code on failure.
704 */
705
706int amdgpu_bo_create_vm(struct amdgpu_device *adev,
707 struct amdgpu_bo_param *bp,
708 struct amdgpu_bo_vm **vmbo_ptr)
709{
710 struct amdgpu_bo *bo_ptr;
711 int r;
712
713 /* bo_ptr_size will be determined by the caller and it depends on
714 * num of amdgpu_vm_pt entries.
715 */
716 BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo_vm));
717 r = amdgpu_bo_create(adev, bp, &bo_ptr);
718 if (r)
719 return r;
720
721 *vmbo_ptr = to_amdgpu_bo_vm(bo_ptr);
722 return r;
723}
724
1fdc79f6
ND
725/**
726 * amdgpu_bo_add_to_shadow_list - add a BO to the shadow list
727 *
d8c33180 728 * @vmbo: BO that will be inserted into the shadow list
1fdc79f6
ND
729 *
730 * Insert a BO to the shadow list.
731 */
e18aaea7 732void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo_vm *vmbo)
1fdc79f6 733{
e18aaea7 734 struct amdgpu_device *adev = amdgpu_ttm_adev(vmbo->bo.tbo.bdev);
1fdc79f6
ND
735
736 mutex_lock(&adev->shadow_list_lock);
e18aaea7 737 list_add_tail(&vmbo->shadow_list, &adev->shadow_list);
cbb63ecc
HZ
738 vmbo->shadow->parent = amdgpu_bo_ref(&vmbo->bo);
739 vmbo->shadow->tbo.destroy = &amdgpu_bo_vm_destroy;
1fdc79f6
ND
740 mutex_unlock(&adev->shadow_list_lock);
741}
742
6f4e8d6e 743/**
403009bf
CK
744 * amdgpu_bo_restore_shadow - restore an &amdgpu_bo shadow
745 *
746 * @shadow: &amdgpu_bo shadow to be restored
6f4e8d6e 747 * @fence: dma_fence associated with the operation
6f4e8d6e
SL
748 *
749 * Copies a buffer object's shadow content back to the object.
750 * This is used for recovering a buffer from its shadow in case of a gpu
751 * reset where vram context may be lost.
752 *
2472e11b
MD
753 * Returns:
754 * 0 for success or a negative error code on failure.
6f4e8d6e 755 */
403009bf 756int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow, struct dma_fence **fence)
20f4eff1
CZ
757
758{
403009bf
CK
759 struct amdgpu_device *adev = amdgpu_ttm_adev(shadow->tbo.bdev);
760 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
761 uint64_t shadow_addr, parent_addr;
20f4eff1 762
403009bf
CK
763 shadow_addr = amdgpu_bo_gpu_offset(shadow);
764 parent_addr = amdgpu_bo_gpu_offset(shadow->parent);
20f4eff1 765
403009bf
CK
766 return amdgpu_copy_buffer(ring, shadow_addr, parent_addr,
767 amdgpu_bo_size(shadow), NULL, fence,
c9dc9cfe 768 true, false, false);
20f4eff1
CZ
769}
770
6f4e8d6e
SL
771/**
772 * amdgpu_bo_kmap - map an &amdgpu_bo buffer object
773 * @bo: &amdgpu_bo buffer object to be mapped
774 * @ptr: kernel virtual address to be returned
775 *
776 * Calls ttm_bo_kmap() to set up the kernel virtual mapping; calls
777 * amdgpu_bo_kptr() to get the kernel virtual address.
778 *
2472e11b
MD
779 * Returns:
780 * 0 for success or a negative error code on failure.
6f4e8d6e 781 */
d38ceaf9
AD
782int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr)
783{
f5e1c740 784 void *kptr;
587f3c70 785 long r;
d38ceaf9 786
271c8125
CK
787 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
788 return -EPERM;
789
c35fcfa3
CK
790 r = dma_resv_wait_timeout(bo->tbo.base.resv, DMA_RESV_USAGE_KERNEL,
791 false, MAX_SCHEDULE_TIMEOUT);
792 if (r < 0)
793 return r;
794
f5e1c740
CK
795 kptr = amdgpu_bo_kptr(bo);
796 if (kptr) {
797 if (ptr)
798 *ptr = kptr;
d38ceaf9
AD
799 return 0;
800 }
587f3c70 801
e3c92eb4 802 r = ttm_bo_kmap(&bo->tbo, 0, PFN_UP(bo->tbo.base.size), &bo->kmap);
587f3c70 803 if (r)
d38ceaf9 804 return r;
587f3c70 805
587f3c70 806 if (ptr)
f5e1c740 807 *ptr = amdgpu_bo_kptr(bo);
587f3c70 808
d38ceaf9
AD
809 return 0;
810}
811
6f4e8d6e
SL
812/**
813 * amdgpu_bo_kptr - returns a kernel virtual address of the buffer object
814 * @bo: &amdgpu_bo buffer object
815 *
816 * Calls ttm_kmap_obj_virtual() to get the kernel virtual address
817 *
2472e11b
MD
818 * Returns:
819 * the virtual address of a buffer object area.
6f4e8d6e 820 */
f5e1c740
CK
821void *amdgpu_bo_kptr(struct amdgpu_bo *bo)
822{
823 bool is_iomem;
824
825 return ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
826}
827
6f4e8d6e
SL
828/**
829 * amdgpu_bo_kunmap - unmap an &amdgpu_bo buffer object
830 * @bo: &amdgpu_bo buffer object to be unmapped
831 *
832 * Unmaps a kernel map set up by amdgpu_bo_kmap().
833 */
d38ceaf9
AD
834void amdgpu_bo_kunmap(struct amdgpu_bo *bo)
835{
f5e1c740
CK
836 if (bo->kmap.bo)
837 ttm_bo_kunmap(&bo->kmap);
d38ceaf9
AD
838}
839
6f4e8d6e
SL
840/**
841 * amdgpu_bo_ref - reference an &amdgpu_bo buffer object
842 * @bo: &amdgpu_bo buffer object
843 *
844 * References the contained &ttm_buffer_object.
845 *
2472e11b
MD
846 * Returns:
847 * a refcounted pointer to the &amdgpu_bo buffer object.
6f4e8d6e 848 */
d38ceaf9
AD
849struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo)
850{
851 if (bo == NULL)
852 return NULL;
853
71d5ef11 854 ttm_bo_get(&bo->tbo);
d38ceaf9
AD
855 return bo;
856}
857
6f4e8d6e
SL
858/**
859 * amdgpu_bo_unref - unreference an &amdgpu_bo buffer object
860 * @bo: &amdgpu_bo buffer object
861 *
862 * Unreferences the contained &ttm_buffer_object and clear the pointer
863 */
d38ceaf9
AD
864void amdgpu_bo_unref(struct amdgpu_bo **bo)
865{
866 struct ttm_buffer_object *tbo;
867
868 if ((*bo) == NULL)
869 return;
870
871 tbo = &((*bo)->tbo);
fea872b2
TZ
872 ttm_bo_put(tbo);
873 *bo = NULL;
d38ceaf9
AD
874}
875
6f4e8d6e
SL
876/**
877 * amdgpu_bo_pin_restricted - pin an &amdgpu_bo buffer object
878 * @bo: &amdgpu_bo buffer object to be pinned
879 * @domain: domain to be pinned to
880 * @min_offset: the start of requested address range
881 * @max_offset: the end of requested address range
6f4e8d6e
SL
882 *
883 * Pins the buffer object according to requested domain and address range. If
884 * the memory is unbound gart memory, binds the pages into gart table. Adjusts
885 * pin_count and pin_size accordingly.
886 *
887 * Pinning means to lock pages in memory along with keeping them at a fixed
888 * offset. It is required when a buffer can not be moved, for example, when
889 * a display buffer is being scanned out.
890 *
891 * Compared with amdgpu_bo_pin(), this function gives more flexibility on
892 * where to pin a buffer if there are specific restrictions on where a buffer
893 * must be located.
894 *
2472e11b
MD
895 * Returns:
896 * 0 for success or a negative error code on failure.
6f4e8d6e 897 */
7e5a547f 898int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
7b7c6c81 899 u64 min_offset, u64 max_offset)
d38ceaf9 900{
a7d64de6 901 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
19be5570 902 struct ttm_operation_ctx ctx = { false, false };
d38ceaf9
AD
903 int r, i;
904
cc325d19 905 if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm))
d38ceaf9
AD
906 return -EPERM;
907
7e5a547f
CZ
908 if (WARN_ON_ONCE(min_offset > max_offset))
909 return -EINVAL;
910
f5ba1404
LL
911 /* Check domain to be pinned to against preferred domains */
912 if (bo->preferred_domains & domain)
913 domain = bo->preferred_domains & domain;
914
803d89ad 915 /* A shared bo cannot be migrated to VRAM */
8c505bdc 916 if (bo->tbo.base.import_attach) {
9b3f217f
SL
917 if (domain & AMDGPU_GEM_DOMAIN_GTT)
918 domain = AMDGPU_GEM_DOMAIN_GTT;
919 else
920 return -EINVAL;
921 }
803d89ad 922
4671078e 923 if (bo->tbo.pin_count) {
d3116756
CK
924 uint32_t mem_type = bo->tbo.resource->mem_type;
925 uint32_t mem_flags = bo->tbo.resource->placement;
408778e8 926
f5318959 927 if (!(domain & amdgpu_mem_type_to_domain(mem_type)))
408778e8
FC
928 return -EINVAL;
929
e1a4b67a 930 if ((mem_type == TTM_PL_VRAM) &&
931 (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) &&
eda1068d
FK
932 !(mem_flags & TTM_PL_FLAG_CONTIGUOUS))
933 return -EINVAL;
934
4671078e 935 ttm_bo_pin(&bo->tbo);
d38ceaf9
AD
936
937 if (max_offset != 0) {
b1a8ef95
ND
938 u64 domain_start = amdgpu_ttm_domain_start(adev,
939 mem_type);
d38ceaf9
AD
940 WARN_ON_ONCE(max_offset <
941 (amdgpu_bo_gpu_offset(bo) - domain_start));
942 }
943
944 return 0;
945 }
03f48dd5 946
9deb0b3d
CK
947 /* This assumes only APU display buffers are pinned with (VRAM|GTT).
948 * See function amdgpu_display_supported_domains()
949 */
d035f84d 950 domain = amdgpu_bo_get_preferred_domain(adev, domain);
9deb0b3d 951
a448cb00
CK
952 if (bo->tbo.base.import_attach)
953 dma_buf_pin(bo->tbo.base.import_attach);
954
e9c7577c
CK
955 /* force to pin into visible video ram */
956 if (!(bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS))
957 bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
c704ab18 958 amdgpu_bo_placement_from_domain(bo, domain);
d38ceaf9 959 for (i = 0; i < bo->placement.num_placement; i++) {
1d6ecab1 960 unsigned int fpfn, lpfn;
e9c7577c
CK
961
962 fpfn = min_offset >> PAGE_SHIFT;
963 lpfn = max_offset >> PAGE_SHIFT;
964
7e5a547f
CZ
965 if (fpfn > bo->placements[i].fpfn)
966 bo->placements[i].fpfn = fpfn;
78d0e182
CK
967 if (!bo->placements[i].lpfn ||
968 (lpfn && lpfn < bo->placements[i].lpfn))
7e5a547f 969 bo->placements[i].lpfn = lpfn;
d38ceaf9
AD
970 }
971
19be5570 972 r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
6681c5eb 973 if (unlikely(r)) {
a7d64de6 974 dev_err(adev->dev, "%p pin failed\n", bo);
6681c5eb
CK
975 goto error;
976 }
977
4671078e 978 ttm_bo_pin(&bo->tbo);
5e91fb57 979
d3116756 980 domain = amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type);
6681c5eb 981 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
a5ccfe5c
MD
982 atomic64_add(amdgpu_bo_size(bo), &adev->vram_pin_size);
983 atomic64_add(amdgpu_vram_mgr_bo_visible_size(bo),
984 &adev->visible_pin_size);
32ab75f0 985 } else if (domain == AMDGPU_GEM_DOMAIN_GTT) {
a5ccfe5c 986 atomic64_add(amdgpu_bo_size(bo), &adev->gart_pin_size);
d38ceaf9 987 }
6681c5eb
CK
988
989error:
d38ceaf9
AD
990 return r;
991}
992
6f4e8d6e
SL
993/**
994 * amdgpu_bo_pin - pin an &amdgpu_bo buffer object
995 * @bo: &amdgpu_bo buffer object to be pinned
996 * @domain: domain to be pinned to
6f4e8d6e
SL
997 *
998 * A simple wrapper to amdgpu_bo_pin_restricted().
999 * Provides a simpler API for buffers that do not have any strict restrictions
1000 * on where a buffer must be located.
1001 *
2472e11b
MD
1002 * Returns:
1003 * 0 for success or a negative error code on failure.
6f4e8d6e 1004 */
7b7c6c81 1005int amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain)
d38ceaf9 1006{
eda1068d 1007 bo->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
7b7c6c81 1008 return amdgpu_bo_pin_restricted(bo, domain, 0, 0);
d38ceaf9
AD
1009}
1010
6f4e8d6e
SL
1011/**
1012 * amdgpu_bo_unpin - unpin an &amdgpu_bo buffer object
1013 * @bo: &amdgpu_bo buffer object to be unpinned
1014 *
1015 * Decreases the pin_count, and clears the flags if pin_count reaches 0.
1016 * Changes placement and pin size accordingly.
1017 *
2472e11b
MD
1018 * Returns:
1019 * 0 for success or a negative error code on failure.
6f4e8d6e 1020 */
4671078e 1021void amdgpu_bo_unpin(struct amdgpu_bo *bo)
d38ceaf9 1022{
e2ac8531
CK
1023 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
1024
4671078e
CK
1025 ttm_bo_unpin(&bo->tbo);
1026 if (bo->tbo.pin_count)
1027 return;
6681c5eb 1028
a448cb00
CK
1029 if (bo->tbo.base.import_attach)
1030 dma_buf_unpin(bo->tbo.base.import_attach);
e2ac8531 1031
d3116756 1032 if (bo->tbo.resource->mem_type == TTM_PL_VRAM) {
e2ac8531
CK
1033 atomic64_sub(amdgpu_bo_size(bo), &adev->vram_pin_size);
1034 atomic64_sub(amdgpu_vram_mgr_bo_visible_size(bo),
1035 &adev->visible_pin_size);
d3116756 1036 } else if (bo->tbo.resource->mem_type == TTM_PL_TT) {
e2ac8531
CK
1037 atomic64_sub(amdgpu_bo_size(bo), &adev->gart_pin_size);
1038 }
dc3499c7 1039
d38ceaf9
AD
1040}
1041
1d6ecab1 1042static const char * const amdgpu_vram_names[] = {
1f8628c7
AD
1043 "UNKNOWN",
1044 "GDDR1",
1045 "DDR2",
1046 "GDDR3",
1047 "GDDR4",
1048 "GDDR5",
1049 "HBM",
bc227cfa
TSD
1050 "DDR3",
1051 "DDR4",
5228fe30 1052 "GDDR6",
d534ca71
AD
1053 "DDR5",
1054 "LPDDR4",
1055 "LPDDR5"
1f8628c7
AD
1056};
1057
6f4e8d6e
SL
1058/**
1059 * amdgpu_bo_init - initialize memory manager
1060 * @adev: amdgpu device object
1061 *
1062 * Calls amdgpu_ttm_init() to initialize amdgpu memory manager.
1063 *
2472e11b
MD
1064 * Returns:
1065 * 0 for success or a negative error code on failure.
6f4e8d6e 1066 */
d38ceaf9
AD
1067int amdgpu_bo_init(struct amdgpu_device *adev)
1068{
35d5f224 1069 /* On A+A platform, VRAM can be mapped as WB */
228ce176 1070 if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu) {
35d5f224 1071 /* reserve PAT memory space to WC for VRAM */
26db557e 1072 int r = arch_io_reserve_memtype_wc(adev->gmc.aper_base,
35d5f224
OZ
1073 adev->gmc.aper_size);
1074
26db557e
ND
1075 if (r) {
1076 DRM_ERROR("Unable to set WC memtype for the aperture base\n");
1077 return r;
1078 }
1079
35d5f224
OZ
1080 /* Add an MTRR for the VRAM */
1081 adev->gmc.vram_mtrr = arch_phys_wc_add(adev->gmc.aper_base,
1082 adev->gmc.aper_size);
1083 }
7cf321d1 1084
d38ceaf9 1085 DRM_INFO("Detected VRAM RAM=%lluM, BAR=%lluM\n",
770d13b1
CK
1086 adev->gmc.mc_vram_size >> 20,
1087 (unsigned long long)adev->gmc.aper_size >> 20);
1f8628c7 1088 DRM_INFO("RAM width %dbits %s\n",
770d13b1 1089 adev->gmc.vram_width, amdgpu_vram_names[adev->gmc.vram_type]);
d38ceaf9
AD
1090 return amdgpu_ttm_init(adev);
1091}
1092
6f4e8d6e
SL
1093/**
1094 * amdgpu_bo_fini - tear down memory manager
1095 * @adev: amdgpu device object
1096 *
1097 * Reverses amdgpu_bo_init() to tear down memory manager.
1098 */
d38ceaf9
AD
1099void amdgpu_bo_fini(struct amdgpu_device *adev)
1100{
62d5f9f7
LS
1101 int idx;
1102
d38ceaf9 1103 amdgpu_ttm_fini(adev);
62d5f9f7
LS
1104
1105 if (drm_dev_enter(adev_to_drm(adev), &idx)) {
a0ba1279 1106 if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu) {
62d5f9f7
LS
1107 arch_phys_wc_del(adev->gmc.vram_mtrr);
1108 arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size);
1109 }
1110 drm_dev_exit(idx);
1111 }
d38ceaf9
AD
1112}
1113
6f4e8d6e
SL
1114/**
1115 * amdgpu_bo_set_tiling_flags - set tiling flags
1116 * @bo: &amdgpu_bo buffer object
1117 * @tiling_flags: new flags
1118 *
1119 * Sets buffer object's tiling flags with the new one. Used by GEM ioctl or
1120 * kernel driver to set the tiling flags on a buffer.
1121 *
2472e11b
MD
1122 * Returns:
1123 * 0 for success or a negative error code on failure.
6f4e8d6e 1124 */
d38ceaf9
AD
1125int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)
1126{
9079ac76 1127 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
cc1bcf85 1128 struct amdgpu_bo_user *ubo;
9079ac76 1129
030bb4ad 1130 BUG_ON(bo->tbo.type == ttm_bo_type_kernel);
9079ac76
MO
1131 if (adev->family <= AMDGPU_FAMILY_CZ &&
1132 AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT) > 6)
d38ceaf9 1133 return -EINVAL;
d38ceaf9 1134
cc1bcf85
ND
1135 ubo = to_amdgpu_bo_user(bo);
1136 ubo->tiling_flags = tiling_flags;
d38ceaf9
AD
1137 return 0;
1138}
1139
6f4e8d6e
SL
1140/**
1141 * amdgpu_bo_get_tiling_flags - get tiling flags
1142 * @bo: &amdgpu_bo buffer object
1143 * @tiling_flags: returned flags
1144 *
1145 * Gets buffer object's tiling flags. Used by GEM ioctl or kernel driver to
1146 * set the tiling flags on a buffer.
1147 */
d38ceaf9
AD
1148void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)
1149{
cc1bcf85
ND
1150 struct amdgpu_bo_user *ubo;
1151
030bb4ad 1152 BUG_ON(bo->tbo.type == ttm_bo_type_kernel);
52791eee 1153 dma_resv_assert_held(bo->tbo.base.resv);
cc1bcf85 1154 ubo = to_amdgpu_bo_user(bo);
d38ceaf9
AD
1155
1156 if (tiling_flags)
cc1bcf85 1157 *tiling_flags = ubo->tiling_flags;
d38ceaf9
AD
1158}
1159
6f4e8d6e
SL
1160/**
1161 * amdgpu_bo_set_metadata - set metadata
1162 * @bo: &amdgpu_bo buffer object
1163 * @metadata: new metadata
1164 * @metadata_size: size of the new metadata
1165 * @flags: flags of the new metadata
1166 *
1167 * Sets buffer object's metadata, its size and flags.
1168 * Used via GEM ioctl.
1169 *
2472e11b
MD
1170 * Returns:
1171 * 0 for success or a negative error code on failure.
6f4e8d6e 1172 */
1d6ecab1
SS
1173int amdgpu_bo_set_metadata(struct amdgpu_bo *bo, void *metadata,
1174 u32 metadata_size, uint64_t flags)
d38ceaf9 1175{
cc1bcf85 1176 struct amdgpu_bo_user *ubo;
d38ceaf9
AD
1177 void *buffer;
1178
030bb4ad 1179 BUG_ON(bo->tbo.type == ttm_bo_type_kernel);
cc1bcf85 1180 ubo = to_amdgpu_bo_user(bo);
d38ceaf9 1181 if (!metadata_size) {
cc1bcf85
ND
1182 if (ubo->metadata_size) {
1183 kfree(ubo->metadata);
1184 ubo->metadata = NULL;
1185 ubo->metadata_size = 0;
d38ceaf9
AD
1186 }
1187 return 0;
1188 }
1189
1190 if (metadata == NULL)
1191 return -EINVAL;
1192
71affda5 1193 buffer = kmemdup(metadata, metadata_size, GFP_KERNEL);
d38ceaf9
AD
1194 if (buffer == NULL)
1195 return -ENOMEM;
1196
cc1bcf85
ND
1197 kfree(ubo->metadata);
1198 ubo->metadata_flags = flags;
1199 ubo->metadata = buffer;
1200 ubo->metadata_size = metadata_size;
d38ceaf9
AD
1201
1202 return 0;
1203}
1204
6f4e8d6e
SL
1205/**
1206 * amdgpu_bo_get_metadata - get metadata
1207 * @bo: &amdgpu_bo buffer object
1208 * @buffer: returned metadata
1209 * @buffer_size: size of the buffer
1210 * @metadata_size: size of the returned metadata
1211 * @flags: flags of the returned metadata
1212 *
1213 * Gets buffer object's metadata, its size and flags. buffer_size shall not be
1214 * less than metadata_size.
1215 * Used via GEM ioctl.
1216 *
2472e11b
MD
1217 * Returns:
1218 * 0 for success or a negative error code on failure.
6f4e8d6e 1219 */
d38ceaf9
AD
1220int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
1221 size_t buffer_size, uint32_t *metadata_size,
1222 uint64_t *flags)
1223{
cc1bcf85
ND
1224 struct amdgpu_bo_user *ubo;
1225
d38ceaf9
AD
1226 if (!buffer && !metadata_size)
1227 return -EINVAL;
1228
030bb4ad 1229 BUG_ON(bo->tbo.type == ttm_bo_type_kernel);
cc1bcf85 1230 ubo = to_amdgpu_bo_user(bo);
eba98523
SZ
1231 if (metadata_size)
1232 *metadata_size = ubo->metadata_size;
1233
d38ceaf9 1234 if (buffer) {
cc1bcf85 1235 if (buffer_size < ubo->metadata_size)
d38ceaf9
AD
1236 return -EINVAL;
1237
cc1bcf85
ND
1238 if (ubo->metadata_size)
1239 memcpy(buffer, ubo->metadata, ubo->metadata_size);
d38ceaf9
AD
1240 }
1241
d38ceaf9 1242 if (flags)
cc1bcf85 1243 *flags = ubo->metadata_flags;
d38ceaf9
AD
1244
1245 return 0;
1246}
1247
6f4e8d6e
SL
1248/**
1249 * amdgpu_bo_move_notify - notification about a memory move
1250 * @bo: pointer to a buffer object
1251 * @evict: if this move is evicting the buffer from the graphics address space
6f4e8d6e
SL
1252 *
1253 * Marks the corresponding &amdgpu_bo buffer object as invalid, also performs
1254 * bookkeeping.
1255 * TTM driver callback which is called when ttm moves a buffer.
1256 */
94aeb411 1257void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict)
d38ceaf9 1258{
a7d64de6 1259 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
765e7fbf 1260 struct amdgpu_bo *abo;
d38ceaf9 1261
c704ab18 1262 if (!amdgpu_bo_is_amdgpu_bo(bo))
d38ceaf9
AD
1263 return;
1264
b82485fd 1265 abo = ttm_to_amdgpu_bo(bo);
3f3333f8 1266 amdgpu_vm_bo_invalidate(adev, abo, evict);
d38ceaf9 1267
6375bbb4
CK
1268 amdgpu_bo_kunmap(abo);
1269
2d4dad27 1270 if (abo->tbo.base.dma_buf && !abo->tbo.base.import_attach &&
d3116756 1271 bo->resource->mem_type != TTM_PL_SYSTEM)
2d4dad27
CK
1272 dma_buf_move_notify(abo->tbo.base.dma_buf);
1273
661a7606
NH
1274 /* remember the eviction */
1275 if (evict)
1276 atomic64_inc(&adev->num_evictions);
d38ceaf9
AD
1277}
1278
d6530c33
MO
1279void amdgpu_bo_get_memory(struct amdgpu_bo *bo,
1280 struct amdgpu_mem_stats *stats)
87444254 1281{
394ae060
CK
1282 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
1283 struct ttm_resource *res = bo->tbo.resource;
d6530c33 1284 uint64_t size = amdgpu_bo_size(bo);
ba1a58d5 1285 struct drm_gem_object *obj;
ca0b954a 1286 unsigned int domain;
ba1a58d5 1287 bool shared;
ca0b954a
CK
1288
1289 /* Abort if the BO doesn't currently have a backing store */
394ae060 1290 if (!res)
ca0b954a 1291 return;
87444254 1292
ba1a58d5
AD
1293 obj = &bo->tbo.base;
1294 shared = drm_gem_object_is_shared_for_memory_stats(obj);
1295
394ae060 1296 domain = amdgpu_mem_type_to_domain(res->mem_type);
87444254
RS
1297 switch (domain) {
1298 case AMDGPU_GEM_DOMAIN_VRAM:
d6530c33 1299 stats->vram += size;
394ae060 1300 if (amdgpu_res_cpu_visible(adev, bo->tbo.resource))
d6530c33 1301 stats->visible_vram += size;
ba1a58d5
AD
1302 if (shared)
1303 stats->vram_shared += size;
87444254
RS
1304 break;
1305 case AMDGPU_GEM_DOMAIN_GTT:
d6530c33 1306 stats->gtt += size;
ba1a58d5
AD
1307 if (shared)
1308 stats->gtt_shared += size;
87444254
RS
1309 break;
1310 case AMDGPU_GEM_DOMAIN_CPU:
1311 default:
d6530c33 1312 stats->cpu += size;
ba1a58d5
AD
1313 if (shared)
1314 stats->cpu_shared += size;
87444254
RS
1315 break;
1316 }
d6530c33
MO
1317
1318 if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) {
1319 stats->requested_vram += size;
1320 if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
1321 stats->requested_visible_vram += size;
1322
1323 if (domain != AMDGPU_GEM_DOMAIN_VRAM) {
1324 stats->evicted_vram += size;
1325 if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
1326 stats->evicted_visible_vram += size;
1327 }
1328 } else if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT) {
1329 stats->requested_gtt += size;
1330 }
87444254
RS
1331}
1332
ab2f7a5c 1333/**
736b1729 1334 * amdgpu_bo_release_notify - notification about a BO being released
ab2f7a5c
FK
1335 * @bo: pointer to a buffer object
1336 *
1337 * Wipes VRAM buffers whose contents should not be leaked before the
1338 * memory is released.
1339 */
1340void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)
1341{
32f90e65 1342 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
ab2f7a5c
FK
1343 struct dma_fence *fence = NULL;
1344 struct amdgpu_bo *abo;
1345 int r;
1346
1347 if (!amdgpu_bo_is_amdgpu_bo(bo))
1348 return;
1349
1350 abo = ttm_to_amdgpu_bo(bo);
1351
65d2765d
CK
1352 WARN_ON(abo->vm_bo);
1353
ab2f7a5c 1354 if (abo->kfd_bo)
5702d052 1355 amdgpu_amdkfd_release_notify(abo);
ab2f7a5c 1356
f4a3c42b 1357 /* We only remove the fence if the resv has individualized. */
9fe58d0b 1358 WARN_ON_ONCE(bo->type == ttm_bo_type_kernel
1359 && bo->base.resv != &bo->base._resv);
f4a3c42b 1360 if (bo->base.resv == &bo->base._resv)
1361 amdgpu_amdkfd_remove_fence_on_pt_pd_bos(abo);
1362
63af82cf 1363 if (!bo->resource || bo->resource->mem_type != TTM_PL_VRAM ||
32f90e65 1364 !(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE) ||
93bb18d2 1365 adev->in_suspend || drm_dev_is_unplugged(adev_to_drm(adev)))
ab2f7a5c
FK
1366 return;
1367
447c7997
RB
1368 if (WARN_ON_ONCE(!dma_resv_trylock(bo->base.resv)))
1369 return;
ab2f7a5c 1370
a68c7eaa 1371 r = amdgpu_fill_buffer(abo, 0, bo->base.resv, &fence, true);
ab2f7a5c 1372 if (!WARN_ON(r)) {
a68c7eaa 1373 amdgpu_vram_mgr_set_cleared(bo->resource);
ab2f7a5c
FK
1374 amdgpu_bo_fence(abo, fence, false);
1375 dma_fence_put(fence);
1376 }
1377
5f680625 1378 dma_resv_unlock(bo->base.resv);
ab2f7a5c
FK
1379}
1380
6f4e8d6e
SL
1381/**
1382 * amdgpu_bo_fault_reserve_notify - notification about a memory fault
1383 * @bo: pointer to a buffer object
1384 *
1385 * Notifies the driver we are taking a fault on this BO and have reserved it,
1386 * also performs bookkeeping.
1387 * TTM driver callback for dealing with vm faults.
1388 *
2472e11b
MD
1389 * Returns:
1390 * 0 for success or a negative error code on failure.
6f4e8d6e 1391 */
d3ef581a 1392vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
d38ceaf9 1393{
a7d64de6 1394 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
19be5570 1395 struct ttm_operation_ctx ctx = { false, false };
d3ef581a 1396 struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
96cf8271 1397 int r;
d38ceaf9 1398
96cf8271
JB
1399 /* Remember that this BO was accessed by the CPU */
1400 abo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
1401
394ae060 1402 if (amdgpu_res_cpu_visible(adev, bo->resource))
5fb1941d
CK
1403 return 0;
1404
104ece97 1405 /* Can't move a pinned BO to visible VRAM */
4671078e 1406 if (abo->tbo.pin_count > 0)
d3ef581a 1407 return VM_FAULT_SIGBUS;
104ece97 1408
5fb1941d 1409 /* hurrah the memory is not visible ! */
68e2c5ff 1410 atomic64_inc(&adev->num_vram_cpu_page_faults);
c704ab18
CK
1411 amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM |
1412 AMDGPU_GEM_DOMAIN_GTT);
41d9a6a7
JB
1413
1414 /* Avoid costly evictions; only set GTT as a busy placement */
a78a8da5 1415 abo->placements[0].flags |= TTM_PL_FLAG_DESIRED;
41d9a6a7 1416
19be5570 1417 r = ttm_bo_validate(bo, &abo->placement, &ctx);
d3ef581a
CK
1418 if (unlikely(r == -EBUSY || r == -ERESTARTSYS))
1419 return VM_FAULT_NOPAGE;
1420 else if (unlikely(r))
1421 return VM_FAULT_SIGBUS;
5fb1941d 1422
5fb1941d 1423 /* this should never happen */
d3116756 1424 if (bo->resource->mem_type == TTM_PL_VRAM &&
394ae060 1425 !amdgpu_res_cpu_visible(adev, bo->resource))
d3ef581a 1426 return VM_FAULT_SIGBUS;
5fb1941d 1427
d3ef581a 1428 ttm_bo_move_to_lru_tail_unlocked(bo);
d38ceaf9
AD
1429 return 0;
1430}
1431
1432/**
1433 * amdgpu_bo_fence - add fence to buffer object
1434 *
1435 * @bo: buffer object in question
1436 * @fence: fence to add
1437 * @shared: true if fence should be added shared
1438 *
1439 */
f54d1867 1440void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
d38ceaf9
AD
1441 bool shared)
1442{
52791eee 1443 struct dma_resv *resv = bo->tbo.base.resv;
c8d4c18b
CK
1444 int r;
1445
1446 r = dma_resv_reserve_fences(resv, 1);
1447 if (r) {
1448 /* As last resort on OOM we block for the fence */
1449 dma_fence_wait(fence, false);
1450 return;
1451 }
d38ceaf9 1452
73511edf
CK
1453 dma_resv_add_fence(resv, fence, shared ? DMA_RESV_USAGE_READ :
1454 DMA_RESV_USAGE_WRITE);
d38ceaf9 1455}
cdb7e8f2 1456
e8e32426 1457/**
9f3cc18d 1458 * amdgpu_bo_sync_wait_resv - Wait for BO reservation fences
e8e32426 1459 *
9f3cc18d
CK
1460 * @adev: amdgpu device pointer
1461 * @resv: reservation object to sync to
1462 * @sync_mode: synchronization mode
e8e32426
FK
1463 * @owner: fence owner
1464 * @intr: Whether the wait is interruptible
1465 *
9f3cc18d
CK
1466 * Extract the fences from the reservation object and waits for them to finish.
1467 *
e8e32426
FK
1468 * Returns:
1469 * 0 on success, errno otherwise.
1470 */
9f3cc18d
CK
1471int amdgpu_bo_sync_wait_resv(struct amdgpu_device *adev, struct dma_resv *resv,
1472 enum amdgpu_sync_mode sync_mode, void *owner,
1473 bool intr)
e8e32426 1474{
e8e32426
FK
1475 struct amdgpu_sync sync;
1476 int r;
1477
1478 amdgpu_sync_create(&sync);
9f3cc18d 1479 amdgpu_sync_resv(adev, &sync, resv, sync_mode, owner);
e8e32426
FK
1480 r = amdgpu_sync_wait(&sync, intr);
1481 amdgpu_sync_free(&sync);
e8e32426
FK
1482 return r;
1483}
1484
9f3cc18d
CK
1485/**
1486 * amdgpu_bo_sync_wait - Wrapper for amdgpu_bo_sync_wait_resv
1487 * @bo: buffer object to wait for
1488 * @owner: fence owner
1489 * @intr: Whether the wait is interruptible
1490 *
1491 * Wrapper to wait for fences in a BO.
1492 * Returns:
1493 * 0 on success, errno otherwise.
1494 */
1495int amdgpu_bo_sync_wait(struct amdgpu_bo *bo, void *owner, bool intr)
1496{
1497 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
1498
1499 return amdgpu_bo_sync_wait_resv(adev, bo->tbo.base.resv,
1500 AMDGPU_SYNC_NE_OWNER, owner, intr);
1501}
1502
cdb7e8f2
CK
1503/**
1504 * amdgpu_bo_gpu_offset - return GPU offset of bo
1505 * @bo: amdgpu object for which we query the offset
1506 *
cdb7e8f2
CK
1507 * Note: object should either be pinned or reserved when calling this
1508 * function, it might be useful to add check for this for debugging.
2472e11b
MD
1509 *
1510 * Returns:
1511 * current GPU offset of the object.
cdb7e8f2
CK
1512 */
1513u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo)
1514{
d3116756 1515 WARN_ON_ONCE(bo->tbo.resource->mem_type == TTM_PL_SYSTEM);
52791eee 1516 WARN_ON_ONCE(!dma_resv_is_locked(bo->tbo.base.resv) &&
4671078e 1517 !bo->tbo.pin_count && bo->tbo.type != ttm_bo_type_kernel);
d3116756
CK
1518 WARN_ON_ONCE(bo->tbo.resource->start == AMDGPU_BO_INVALID_OFFSET);
1519 WARN_ON_ONCE(bo->tbo.resource->mem_type == TTM_PL_VRAM &&
03f48dd5 1520 !(bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS));
cdb7e8f2 1521
b1a8ef95
ND
1522 return amdgpu_bo_gpu_offset_no_check(bo);
1523}
1524
1525/**
1526 * amdgpu_bo_gpu_offset_no_check - return GPU offset of bo
1527 * @bo: amdgpu object for which we query the offset
1528 *
1529 * Returns:
1530 * current GPU offset of the object without raising warnings.
1531 */
1532u64 amdgpu_bo_gpu_offset_no_check(struct amdgpu_bo *bo)
1533{
1534 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
ca0b0069 1535 uint64_t offset = AMDGPU_BO_INVALID_OFFSET;
b1a8ef95 1536
ca0b0069
AD
1537 if (bo->tbo.resource->mem_type == TTM_PL_TT)
1538 offset = amdgpu_gmc_agp_addr(&bo->tbo);
b1a8ef95 1539
ca0b0069
AD
1540 if (offset == AMDGPU_BO_INVALID_OFFSET)
1541 offset = (bo->tbo.resource->start << PAGE_SHIFT) +
1542 amdgpu_ttm_domain_start(adev, bo->tbo.resource->mem_type);
b1a8ef95
ND
1543
1544 return amdgpu_gmc_sign_extend(offset);
cdb7e8f2 1545}
84b74608 1546
2472e11b 1547/**
d035f84d 1548 * amdgpu_bo_get_preferred_domain - get preferred domain
2472e11b
MD
1549 * @adev: amdgpu device object
1550 * @domain: allowed :ref:`memory domains <amdgpu_memory_domains>`
1551 *
1552 * Returns:
d035f84d 1553 * Which of the allowed domains is preferred for allocating the BO.
2472e11b 1554 */
d035f84d 1555uint32_t amdgpu_bo_get_preferred_domain(struct amdgpu_device *adev,
84b74608
DS
1556 uint32_t domain)
1557{
81d0bcf9
AD
1558 if ((domain == (AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT)) &&
1559 ((adev->asic_type == CHIP_CARRIZO) || (adev->asic_type == CHIP_STONEY))) {
84b74608
DS
1560 domain = AMDGPU_GEM_DOMAIN_VRAM;
1561 if (adev->gmc.real_vram_size <= AMDGPU_SG_THRESHOLD)
1562 domain = AMDGPU_GEM_DOMAIN_GTT;
1563 }
1564 return domain;
1565}
ff72bc40
MBP
1566
1567#if defined(CONFIG_DEBUG_FS)
1568#define amdgpu_bo_print_flag(m, bo, flag) \
1569 do { \
1570 if (bo->flags & (AMDGPU_GEM_CREATE_ ## flag)) { \
1571 seq_printf((m), " " #flag); \
1572 } \
1573 } while (0)
1574
1575/**
25dd7a44 1576 * amdgpu_bo_print_info - print BO info in debugfs file
ff72bc40
MBP
1577 *
1578 * @id: Index or Id of the BO
1579 * @bo: Requested BO for printing info
1580 * @m: debugfs file
1581 *
1582 * Print BO information in debugfs file
1583 *
1584 * Returns:
1585 * Size of the BO in bytes.
1586 */
1587u64 amdgpu_bo_print_info(int id, struct amdgpu_bo *bo, struct seq_file *m)
1588{
394ae060 1589 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
ff72bc40
MBP
1590 struct dma_buf_attachment *attachment;
1591 struct dma_buf *dma_buf;
ff72bc40
MBP
1592 const char *placement;
1593 unsigned int pin_count;
1594 u64 size;
1595
818c158f
PEPP
1596 if (dma_resv_trylock(bo->tbo.base.resv)) {
1597 unsigned int domain;
394ae060 1598
818c158f
PEPP
1599 domain = amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type);
1600 switch (domain) {
1601 case AMDGPU_GEM_DOMAIN_VRAM:
394ae060 1602 if (amdgpu_res_cpu_visible(adev, bo->tbo.resource))
818c158f
PEPP
1603 placement = "VRAM VISIBLE";
1604 else
1605 placement = "VRAM";
1606 break;
1607 case AMDGPU_GEM_DOMAIN_GTT:
1608 placement = "GTT";
1609 break;
1610 case AMDGPU_GEM_DOMAIN_CPU:
1611 default:
1612 placement = "CPU";
1613 break;
1614 }
1615 dma_resv_unlock(bo->tbo.base.resv);
1616 } else {
1617 placement = "UNKNOWN";
ff72bc40
MBP
1618 }
1619
1620 size = amdgpu_bo_size(bo);
1621 seq_printf(m, "\t\t0x%08x: %12lld byte %s",
1622 id, size, placement);
1623
5b8c5969 1624 pin_count = READ_ONCE(bo->tbo.pin_count);
ff72bc40
MBP
1625 if (pin_count)
1626 seq_printf(m, " pin count %d", pin_count);
1627
1628 dma_buf = READ_ONCE(bo->tbo.base.dma_buf);
1629 attachment = READ_ONCE(bo->tbo.base.import_attach);
1630
1631 if (attachment)
26fd808b 1632 seq_printf(m, " imported from ino:%lu", file_inode(dma_buf->file)->i_ino);
ff72bc40 1633 else if (dma_buf)
26fd808b 1634 seq_printf(m, " exported as ino:%lu", file_inode(dma_buf->file)->i_ino);
ff72bc40
MBP
1635
1636 amdgpu_bo_print_flag(m, bo, CPU_ACCESS_REQUIRED);
1637 amdgpu_bo_print_flag(m, bo, NO_CPU_ACCESS);
1638 amdgpu_bo_print_flag(m, bo, CPU_GTT_USWC);
1639 amdgpu_bo_print_flag(m, bo, VRAM_CLEARED);
ff72bc40
MBP
1640 amdgpu_bo_print_flag(m, bo, VRAM_CONTIGUOUS);
1641 amdgpu_bo_print_flag(m, bo, VM_ALWAYS_VALID);
1642 amdgpu_bo_print_flag(m, bo, EXPLICIT_SYNC);
1643
1644 seq_puts(m, "\n");
1645
1646 return size;
1647}
1648#endif