2 * Copyright 2009 Jerome Glisse.
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:
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.
21 * The above copyright notice and this permission notice (including the
22 * next paragraph) shall be included in all copies or substantial portions
28 * Jerome Glisse <glisse@freedesktop.org>
29 * Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
32 #include <linux/list.h>
33 #include <linux/slab.h>
35 #include <drm/amdgpu_drm.h>
36 #include <drm/drm_cache.h>
38 #include "amdgpu_trace.h"
40 static bool amdgpu_need_backup(struct amdgpu_device
*adev
)
42 if (adev
->flags
& AMD_IS_APU
)
45 if (amdgpu_gpu_recovery
== 0 ||
46 (amdgpu_gpu_recovery
== -1 && !amdgpu_sriov_vf(adev
)))
52 static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object
*tbo
)
54 struct amdgpu_device
*adev
= amdgpu_ttm_adev(tbo
->bdev
);
55 struct amdgpu_bo
*bo
= ttm_to_amdgpu_bo(tbo
);
59 drm_gem_object_release(&bo
->gem_base
);
60 amdgpu_bo_unref(&bo
->parent
);
61 if (!list_empty(&bo
->shadow_list
)) {
62 mutex_lock(&adev
->shadow_list_lock
);
63 list_del_init(&bo
->shadow_list
);
64 mutex_unlock(&adev
->shadow_list_lock
);
70 bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object
*bo
)
72 if (bo
->destroy
== &amdgpu_ttm_bo_destroy
)
77 void amdgpu_ttm_placement_from_domain(struct amdgpu_bo
*abo
, u32 domain
)
79 struct amdgpu_device
*adev
= amdgpu_ttm_adev(abo
->tbo
.bdev
);
80 struct ttm_placement
*placement
= &abo
->placement
;
81 struct ttm_place
*places
= abo
->placements
;
82 u64 flags
= abo
->flags
;
85 if (domain
& AMDGPU_GEM_DOMAIN_VRAM
) {
86 unsigned visible_pfn
= adev
->mc
.visible_vram_size
>> PAGE_SHIFT
;
90 places
[c
].flags
= TTM_PL_FLAG_WC
| TTM_PL_FLAG_UNCACHED
|
93 if (flags
& AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
)
94 places
[c
].lpfn
= visible_pfn
;
96 places
[c
].flags
|= TTM_PL_FLAG_TOPDOWN
;
98 if (flags
& AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS
)
99 places
[c
].flags
|= TTM_PL_FLAG_CONTIGUOUS
;
103 if (domain
& AMDGPU_GEM_DOMAIN_GTT
) {
105 if (flags
& AMDGPU_GEM_CREATE_SHADOW
)
106 places
[c
].lpfn
= adev
->mc
.gart_size
>> PAGE_SHIFT
;
109 places
[c
].flags
= TTM_PL_FLAG_TT
;
110 if (flags
& AMDGPU_GEM_CREATE_CPU_GTT_USWC
)
111 places
[c
].flags
|= TTM_PL_FLAG_WC
|
112 TTM_PL_FLAG_UNCACHED
;
114 places
[c
].flags
|= TTM_PL_FLAG_CACHED
;
118 if (domain
& AMDGPU_GEM_DOMAIN_CPU
) {
121 places
[c
].flags
= TTM_PL_FLAG_SYSTEM
;
122 if (flags
& AMDGPU_GEM_CREATE_CPU_GTT_USWC
)
123 places
[c
].flags
|= TTM_PL_FLAG_WC
|
124 TTM_PL_FLAG_UNCACHED
;
126 places
[c
].flags
|= TTM_PL_FLAG_CACHED
;
130 if (domain
& AMDGPU_GEM_DOMAIN_GDS
) {
133 places
[c
].flags
= TTM_PL_FLAG_UNCACHED
| AMDGPU_PL_FLAG_GDS
;
137 if (domain
& AMDGPU_GEM_DOMAIN_GWS
) {
140 places
[c
].flags
= TTM_PL_FLAG_UNCACHED
| AMDGPU_PL_FLAG_GWS
;
144 if (domain
& AMDGPU_GEM_DOMAIN_OA
) {
147 places
[c
].flags
= TTM_PL_FLAG_UNCACHED
| AMDGPU_PL_FLAG_OA
;
154 places
[c
].flags
= TTM_PL_MASK_CACHING
| TTM_PL_FLAG_SYSTEM
;
158 placement
->num_placement
= c
;
159 placement
->placement
= places
;
161 placement
->num_busy_placement
= c
;
162 placement
->busy_placement
= places
;
166 * amdgpu_bo_create_reserved - create reserved BO for kernel use
168 * @adev: amdgpu device object
169 * @size: size for the new BO
170 * @align: alignment for the new BO
171 * @domain: where to place it
172 * @bo_ptr: resulting BO
173 * @gpu_addr: GPU addr of the pinned BO
174 * @cpu_addr: optional CPU address mapping
176 * Allocates and pins a BO for kernel internal use, and returns it still
179 * Returns 0 on success, negative error code otherwise.
181 int amdgpu_bo_create_reserved(struct amdgpu_device
*adev
,
182 unsigned long size
, int align
,
183 u32 domain
, struct amdgpu_bo
**bo_ptr
,
184 u64
*gpu_addr
, void **cpu_addr
)
190 r
= amdgpu_bo_create(adev
, size
, align
, true, domain
,
191 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
|
192 AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS
,
193 NULL
, NULL
, 0, bo_ptr
);
195 dev_err(adev
->dev
, "(%d) failed to allocate kernel bo\n",
202 r
= amdgpu_bo_reserve(*bo_ptr
, false);
204 dev_err(adev
->dev
, "(%d) failed to reserve kernel bo\n", r
);
208 r
= amdgpu_bo_pin(*bo_ptr
, domain
, gpu_addr
);
210 dev_err(adev
->dev
, "(%d) kernel bo pin failed\n", r
);
211 goto error_unreserve
;
215 r
= amdgpu_bo_kmap(*bo_ptr
, cpu_addr
);
217 dev_err(adev
->dev
, "(%d) kernel bo map failed\n", r
);
218 goto error_unreserve
;
225 amdgpu_bo_unreserve(*bo_ptr
);
229 amdgpu_bo_unref(bo_ptr
);
235 * amdgpu_bo_create_kernel - create BO for kernel use
237 * @adev: amdgpu device object
238 * @size: size for the new BO
239 * @align: alignment for the new BO
240 * @domain: where to place it
241 * @bo_ptr: resulting BO
242 * @gpu_addr: GPU addr of the pinned BO
243 * @cpu_addr: optional CPU address mapping
245 * Allocates and pins a BO for kernel internal use.
247 * Returns 0 on success, negative error code otherwise.
249 int amdgpu_bo_create_kernel(struct amdgpu_device
*adev
,
250 unsigned long size
, int align
,
251 u32 domain
, struct amdgpu_bo
**bo_ptr
,
252 u64
*gpu_addr
, void **cpu_addr
)
256 r
= amdgpu_bo_create_reserved(adev
, size
, align
, domain
, bo_ptr
,
262 amdgpu_bo_unreserve(*bo_ptr
);
268 * amdgpu_bo_free_kernel - free BO for kernel use
270 * @bo: amdgpu BO to free
272 * unmaps and unpin a BO for kernel internal use.
274 void amdgpu_bo_free_kernel(struct amdgpu_bo
**bo
, u64
*gpu_addr
,
280 if (likely(amdgpu_bo_reserve(*bo
, true) == 0)) {
282 amdgpu_bo_kunmap(*bo
);
284 amdgpu_bo_unpin(*bo
);
285 amdgpu_bo_unreserve(*bo
);
296 /* Validate bo size is bit bigger then the request domain */
297 static bool amdgpu_bo_validate_size(struct amdgpu_device
*adev
,
298 unsigned long size
, u32 domain
)
300 struct ttm_mem_type_manager
*man
= NULL
;
303 * If GTT is part of requested domains the check must succeed to
304 * allow fall back to GTT
306 if (domain
& AMDGPU_GEM_DOMAIN_GTT
) {
307 man
= &adev
->mman
.bdev
.man
[TTM_PL_TT
];
309 if (size
< (man
->size
<< PAGE_SHIFT
))
315 if (domain
& AMDGPU_GEM_DOMAIN_VRAM
) {
316 man
= &adev
->mman
.bdev
.man
[TTM_PL_VRAM
];
318 if (size
< (man
->size
<< PAGE_SHIFT
))
325 /* TODO add more domains checks, such as AMDGPU_GEM_DOMAIN_CPU */
329 DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size
,
330 man
->size
<< PAGE_SHIFT
);
334 static int amdgpu_bo_do_create(struct amdgpu_device
*adev
,
335 unsigned long size
, int byte_align
,
336 bool kernel
, u32 domain
, u64 flags
,
338 struct reservation_object
*resv
,
340 struct amdgpu_bo
**bo_ptr
)
342 struct ttm_operation_ctx ctx
= {
343 .interruptible
= !kernel
,
344 .no_wait_gpu
= false,
345 .allow_reserved_eviction
= true,
348 struct amdgpu_bo
*bo
;
349 enum ttm_bo_type type
;
350 unsigned long page_align
;
354 page_align
= roundup(byte_align
, PAGE_SIZE
) >> PAGE_SHIFT
;
355 size
= ALIGN(size
, PAGE_SIZE
);
357 if (!amdgpu_bo_validate_size(adev
, size
, domain
))
361 type
= ttm_bo_type_kernel
;
363 type
= ttm_bo_type_sg
;
365 type
= ttm_bo_type_device
;
369 acc_size
= ttm_bo_dma_acc_size(&adev
->mman
.bdev
, size
,
370 sizeof(struct amdgpu_bo
));
372 bo
= kzalloc(sizeof(struct amdgpu_bo
), GFP_KERNEL
);
375 r
= drm_gem_object_init(adev
->ddev
, &bo
->gem_base
, size
);
380 INIT_LIST_HEAD(&bo
->shadow_list
);
381 INIT_LIST_HEAD(&bo
->va
);
382 bo
->preferred_domains
= domain
& (AMDGPU_GEM_DOMAIN_VRAM
|
383 AMDGPU_GEM_DOMAIN_GTT
|
384 AMDGPU_GEM_DOMAIN_CPU
|
385 AMDGPU_GEM_DOMAIN_GDS
|
386 AMDGPU_GEM_DOMAIN_GWS
|
387 AMDGPU_GEM_DOMAIN_OA
);
388 bo
->allowed_domains
= bo
->preferred_domains
;
389 if (!kernel
&& bo
->allowed_domains
== AMDGPU_GEM_DOMAIN_VRAM
)
390 bo
->allowed_domains
|= AMDGPU_GEM_DOMAIN_GTT
;
395 /* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
396 * See https://bugs.freedesktop.org/show_bug.cgi?id=84627
398 bo
->flags
&= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC
;
399 #elif defined(CONFIG_X86) && !defined(CONFIG_X86_PAT)
400 /* Don't try to enable write-combining when it can't work, or things
402 * See https://bugs.freedesktop.org/show_bug.cgi?id=88758
405 #ifndef CONFIG_COMPILE_TEST
406 #warning Please enable CONFIG_MTRR and CONFIG_X86_PAT for better performance \
407 thanks to write-combining
410 if (bo
->flags
& AMDGPU_GEM_CREATE_CPU_GTT_USWC
)
411 DRM_INFO_ONCE("Please enable CONFIG_MTRR and CONFIG_X86_PAT for "
412 "better performance thanks to write-combining\n");
413 bo
->flags
&= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC
;
415 /* For architectures that don't support WC memory,
416 * mask out the WC flag from the BO
418 if (!drm_arch_can_wc_memory())
419 bo
->flags
&= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC
;
422 bo
->tbo
.bdev
= &adev
->mman
.bdev
;
423 amdgpu_ttm_placement_from_domain(bo
, domain
);
425 r
= ttm_bo_init_reserved(&adev
->mman
.bdev
, &bo
->tbo
, size
, type
,
426 &bo
->placement
, page_align
, &ctx
, NULL
,
427 acc_size
, sg
, resv
, &amdgpu_ttm_bo_destroy
);
428 if (unlikely(r
!= 0))
431 if (adev
->mc
.visible_vram_size
< adev
->mc
.real_vram_size
&&
432 bo
->tbo
.mem
.mem_type
== TTM_PL_VRAM
&&
433 bo
->tbo
.mem
.start
< adev
->mc
.visible_vram_size
>> PAGE_SHIFT
)
434 amdgpu_cs_report_moved_bytes(adev
, ctx
.bytes_moved
,
437 amdgpu_cs_report_moved_bytes(adev
, ctx
.bytes_moved
, 0);
440 bo
->tbo
.priority
= 1;
442 if (flags
& AMDGPU_GEM_CREATE_VRAM_CLEARED
&&
443 bo
->tbo
.mem
.placement
& TTM_PL_FLAG_VRAM
) {
444 struct dma_fence
*fence
;
446 r
= amdgpu_fill_buffer(bo
, init_value
, bo
->tbo
.resv
, &fence
);
450 amdgpu_bo_fence(bo
, fence
, false);
451 dma_fence_put(bo
->tbo
.moving
);
452 bo
->tbo
.moving
= dma_fence_get(fence
);
453 dma_fence_put(fence
);
456 amdgpu_bo_unreserve(bo
);
459 trace_amdgpu_bo_create(bo
);
461 /* Treat CPU_ACCESS_REQUIRED only as a hint if given by UMD */
462 if (type
== ttm_bo_type_device
)
463 bo
->flags
&= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
;
469 ww_mutex_unlock(&bo
->tbo
.resv
->lock
);
470 amdgpu_bo_unref(&bo
);
474 static int amdgpu_bo_create_shadow(struct amdgpu_device
*adev
,
475 unsigned long size
, int byte_align
,
476 struct amdgpu_bo
*bo
)
483 r
= amdgpu_bo_do_create(adev
, size
, byte_align
, true,
484 AMDGPU_GEM_DOMAIN_GTT
,
485 AMDGPU_GEM_CREATE_CPU_GTT_USWC
|
486 AMDGPU_GEM_CREATE_SHADOW
,
487 NULL
, bo
->tbo
.resv
, 0,
490 bo
->shadow
->parent
= amdgpu_bo_ref(bo
);
491 mutex_lock(&adev
->shadow_list_lock
);
492 list_add_tail(&bo
->shadow_list
, &adev
->shadow_list
);
493 mutex_unlock(&adev
->shadow_list_lock
);
499 /* init_value will only take effect when flags contains
500 * AMDGPU_GEM_CREATE_VRAM_CLEARED.
502 int amdgpu_bo_create(struct amdgpu_device
*adev
,
503 unsigned long size
, int byte_align
,
504 bool kernel
, u32 domain
, u64 flags
,
506 struct reservation_object
*resv
,
508 struct amdgpu_bo
**bo_ptr
)
510 uint64_t parent_flags
= flags
& ~AMDGPU_GEM_CREATE_SHADOW
;
513 r
= amdgpu_bo_do_create(adev
, size
, byte_align
, kernel
, domain
,
514 parent_flags
, sg
, resv
, init_value
, bo_ptr
);
518 if ((flags
& AMDGPU_GEM_CREATE_SHADOW
) && amdgpu_need_backup(adev
)) {
520 WARN_ON(reservation_object_lock((*bo_ptr
)->tbo
.resv
,
523 r
= amdgpu_bo_create_shadow(adev
, size
, byte_align
, (*bo_ptr
));
526 reservation_object_unlock((*bo_ptr
)->tbo
.resv
);
529 amdgpu_bo_unref(bo_ptr
);
535 int amdgpu_bo_backup_to_shadow(struct amdgpu_device
*adev
,
536 struct amdgpu_ring
*ring
,
537 struct amdgpu_bo
*bo
,
538 struct reservation_object
*resv
,
539 struct dma_fence
**fence
,
543 struct amdgpu_bo
*shadow
= bo
->shadow
;
544 uint64_t bo_addr
, shadow_addr
;
550 bo_addr
= amdgpu_bo_gpu_offset(bo
);
551 shadow_addr
= amdgpu_bo_gpu_offset(bo
->shadow
);
553 r
= reservation_object_reserve_shared(bo
->tbo
.resv
);
557 r
= amdgpu_copy_buffer(ring
, bo_addr
, shadow_addr
,
558 amdgpu_bo_size(bo
), resv
, fence
,
561 amdgpu_bo_fence(bo
, *fence
, true);
567 int amdgpu_bo_validate(struct amdgpu_bo
*bo
)
569 struct ttm_operation_ctx ctx
= { false, false };
576 domain
= bo
->preferred_domains
;
579 amdgpu_ttm_placement_from_domain(bo
, domain
);
580 r
= ttm_bo_validate(&bo
->tbo
, &bo
->placement
, &ctx
);
581 if (unlikely(r
== -ENOMEM
) && domain
!= bo
->allowed_domains
) {
582 domain
= bo
->allowed_domains
;
589 int amdgpu_bo_restore_from_shadow(struct amdgpu_device
*adev
,
590 struct amdgpu_ring
*ring
,
591 struct amdgpu_bo
*bo
,
592 struct reservation_object
*resv
,
593 struct dma_fence
**fence
,
597 struct amdgpu_bo
*shadow
= bo
->shadow
;
598 uint64_t bo_addr
, shadow_addr
;
604 bo_addr
= amdgpu_bo_gpu_offset(bo
);
605 shadow_addr
= amdgpu_bo_gpu_offset(bo
->shadow
);
607 r
= reservation_object_reserve_shared(bo
->tbo
.resv
);
611 r
= amdgpu_copy_buffer(ring
, shadow_addr
, bo_addr
,
612 amdgpu_bo_size(bo
), resv
, fence
,
615 amdgpu_bo_fence(bo
, *fence
, true);
621 int amdgpu_bo_kmap(struct amdgpu_bo
*bo
, void **ptr
)
626 if (bo
->flags
& AMDGPU_GEM_CREATE_NO_CPU_ACCESS
)
629 kptr
= amdgpu_bo_kptr(bo
);
636 r
= reservation_object_wait_timeout_rcu(bo
->tbo
.resv
, false, false,
637 MAX_SCHEDULE_TIMEOUT
);
641 r
= ttm_bo_kmap(&bo
->tbo
, 0, bo
->tbo
.num_pages
, &bo
->kmap
);
646 *ptr
= amdgpu_bo_kptr(bo
);
651 void *amdgpu_bo_kptr(struct amdgpu_bo
*bo
)
655 return ttm_kmap_obj_virtual(&bo
->kmap
, &is_iomem
);
658 void amdgpu_bo_kunmap(struct amdgpu_bo
*bo
)
661 ttm_bo_kunmap(&bo
->kmap
);
664 struct amdgpu_bo
*amdgpu_bo_ref(struct amdgpu_bo
*bo
)
669 ttm_bo_reference(&bo
->tbo
);
673 void amdgpu_bo_unref(struct amdgpu_bo
**bo
)
675 struct ttm_buffer_object
*tbo
;
686 int amdgpu_bo_pin_restricted(struct amdgpu_bo
*bo
, u32 domain
,
687 u64 min_offset
, u64 max_offset
,
690 struct amdgpu_device
*adev
= amdgpu_ttm_adev(bo
->tbo
.bdev
);
691 struct ttm_operation_ctx ctx
= { false, false };
694 if (amdgpu_ttm_tt_get_usermm(bo
->tbo
.ttm
))
697 if (WARN_ON_ONCE(min_offset
> max_offset
))
700 /* A shared bo cannot be migrated to VRAM */
701 if (bo
->prime_shared_count
&& (domain
== AMDGPU_GEM_DOMAIN_VRAM
))
705 uint32_t mem_type
= bo
->tbo
.mem
.mem_type
;
707 if (!(domain
& amdgpu_mem_type_to_domain(mem_type
)))
712 *gpu_addr
= amdgpu_bo_gpu_offset(bo
);
714 if (max_offset
!= 0) {
715 u64 domain_start
= bo
->tbo
.bdev
->man
[mem_type
].gpu_offset
;
716 WARN_ON_ONCE(max_offset
<
717 (amdgpu_bo_gpu_offset(bo
) - domain_start
));
723 bo
->flags
|= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS
;
724 /* force to pin into visible video ram */
725 if (!(bo
->flags
& AMDGPU_GEM_CREATE_NO_CPU_ACCESS
))
726 bo
->flags
|= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
;
727 amdgpu_ttm_placement_from_domain(bo
, domain
);
728 for (i
= 0; i
< bo
->placement
.num_placement
; i
++) {
731 fpfn
= min_offset
>> PAGE_SHIFT
;
732 lpfn
= max_offset
>> PAGE_SHIFT
;
734 if (fpfn
> bo
->placements
[i
].fpfn
)
735 bo
->placements
[i
].fpfn
= fpfn
;
736 if (!bo
->placements
[i
].lpfn
||
737 (lpfn
&& lpfn
< bo
->placements
[i
].lpfn
))
738 bo
->placements
[i
].lpfn
= lpfn
;
739 bo
->placements
[i
].flags
|= TTM_PL_FLAG_NO_EVICT
;
742 r
= ttm_bo_validate(&bo
->tbo
, &bo
->placement
, &ctx
);
744 dev_err(adev
->dev
, "%p pin failed\n", bo
);
748 r
= amdgpu_ttm_alloc_gart(&bo
->tbo
);
750 dev_err(adev
->dev
, "%p bind failed\n", bo
);
755 if (gpu_addr
!= NULL
)
756 *gpu_addr
= amdgpu_bo_gpu_offset(bo
);
758 domain
= amdgpu_mem_type_to_domain(bo
->tbo
.mem
.mem_type
);
759 if (domain
== AMDGPU_GEM_DOMAIN_VRAM
) {
760 adev
->vram_pin_size
+= amdgpu_bo_size(bo
);
761 if (bo
->flags
& AMDGPU_GEM_CREATE_NO_CPU_ACCESS
)
762 adev
->invisible_pin_size
+= amdgpu_bo_size(bo
);
763 } else if (domain
== AMDGPU_GEM_DOMAIN_GTT
) {
764 adev
->gart_pin_size
+= amdgpu_bo_size(bo
);
771 int amdgpu_bo_pin(struct amdgpu_bo
*bo
, u32 domain
, u64
*gpu_addr
)
773 return amdgpu_bo_pin_restricted(bo
, domain
, 0, 0, gpu_addr
);
776 int amdgpu_bo_unpin(struct amdgpu_bo
*bo
)
778 struct amdgpu_device
*adev
= amdgpu_ttm_adev(bo
->tbo
.bdev
);
779 struct ttm_operation_ctx ctx
= { false, false };
782 if (!bo
->pin_count
) {
783 dev_warn(adev
->dev
, "%p unpin not necessary\n", bo
);
789 for (i
= 0; i
< bo
->placement
.num_placement
; i
++) {
790 bo
->placements
[i
].lpfn
= 0;
791 bo
->placements
[i
].flags
&= ~TTM_PL_FLAG_NO_EVICT
;
793 r
= ttm_bo_validate(&bo
->tbo
, &bo
->placement
, &ctx
);
795 dev_err(adev
->dev
, "%p validate failed for unpin\n", bo
);
799 if (bo
->tbo
.mem
.mem_type
== TTM_PL_VRAM
) {
800 adev
->vram_pin_size
-= amdgpu_bo_size(bo
);
801 if (bo
->flags
& AMDGPU_GEM_CREATE_NO_CPU_ACCESS
)
802 adev
->invisible_pin_size
-= amdgpu_bo_size(bo
);
803 } else if (bo
->tbo
.mem
.mem_type
== TTM_PL_TT
) {
804 adev
->gart_pin_size
-= amdgpu_bo_size(bo
);
811 int amdgpu_bo_evict_vram(struct amdgpu_device
*adev
)
813 /* late 2.6.33 fix IGP hibernate - we need pm ops to do this correct */
814 if (0 && (adev
->flags
& AMD_IS_APU
)) {
815 /* Useless to evict on IGP chips */
818 return ttm_bo_evict_mm(&adev
->mman
.bdev
, TTM_PL_VRAM
);
821 static const char *amdgpu_vram_names
[] = {
832 int amdgpu_bo_init(struct amdgpu_device
*adev
)
834 /* reserve PAT memory space to WC for VRAM */
835 arch_io_reserve_memtype_wc(adev
->mc
.aper_base
,
838 /* Add an MTRR for the VRAM */
839 adev
->mc
.vram_mtrr
= arch_phys_wc_add(adev
->mc
.aper_base
,
841 DRM_INFO("Detected VRAM RAM=%lluM, BAR=%lluM\n",
842 adev
->mc
.mc_vram_size
>> 20,
843 (unsigned long long)adev
->mc
.aper_size
>> 20);
844 DRM_INFO("RAM width %dbits %s\n",
845 adev
->mc
.vram_width
, amdgpu_vram_names
[adev
->mc
.vram_type
]);
846 return amdgpu_ttm_init(adev
);
849 void amdgpu_bo_fini(struct amdgpu_device
*adev
)
851 amdgpu_ttm_fini(adev
);
852 arch_phys_wc_del(adev
->mc
.vram_mtrr
);
853 arch_io_free_memtype_wc(adev
->mc
.aper_base
, adev
->mc
.aper_size
);
856 int amdgpu_bo_fbdev_mmap(struct amdgpu_bo
*bo
,
857 struct vm_area_struct
*vma
)
859 return ttm_fbdev_mmap(vma
, &bo
->tbo
);
862 int amdgpu_bo_set_tiling_flags(struct amdgpu_bo
*bo
, u64 tiling_flags
)
864 struct amdgpu_device
*adev
= amdgpu_ttm_adev(bo
->tbo
.bdev
);
866 if (adev
->family
<= AMDGPU_FAMILY_CZ
&&
867 AMDGPU_TILING_GET(tiling_flags
, TILE_SPLIT
) > 6)
870 bo
->tiling_flags
= tiling_flags
;
874 void amdgpu_bo_get_tiling_flags(struct amdgpu_bo
*bo
, u64
*tiling_flags
)
876 lockdep_assert_held(&bo
->tbo
.resv
->lock
.base
);
879 *tiling_flags
= bo
->tiling_flags
;
882 int amdgpu_bo_set_metadata (struct amdgpu_bo
*bo
, void *metadata
,
883 uint32_t metadata_size
, uint64_t flags
)
887 if (!metadata_size
) {
888 if (bo
->metadata_size
) {
891 bo
->metadata_size
= 0;
896 if (metadata
== NULL
)
899 buffer
= kmemdup(metadata
, metadata_size
, GFP_KERNEL
);
904 bo
->metadata_flags
= flags
;
905 bo
->metadata
= buffer
;
906 bo
->metadata_size
= metadata_size
;
911 int amdgpu_bo_get_metadata(struct amdgpu_bo
*bo
, void *buffer
,
912 size_t buffer_size
, uint32_t *metadata_size
,
915 if (!buffer
&& !metadata_size
)
919 if (buffer_size
< bo
->metadata_size
)
922 if (bo
->metadata_size
)
923 memcpy(buffer
, bo
->metadata
, bo
->metadata_size
);
927 *metadata_size
= bo
->metadata_size
;
929 *flags
= bo
->metadata_flags
;
934 void amdgpu_bo_move_notify(struct ttm_buffer_object
*bo
,
936 struct ttm_mem_reg
*new_mem
)
938 struct amdgpu_device
*adev
= amdgpu_ttm_adev(bo
->bdev
);
939 struct amdgpu_bo
*abo
;
940 struct ttm_mem_reg
*old_mem
= &bo
->mem
;
942 if (!amdgpu_ttm_bo_is_amdgpu_bo(bo
))
945 abo
= ttm_to_amdgpu_bo(bo
);
946 amdgpu_vm_bo_invalidate(adev
, abo
, evict
);
948 amdgpu_bo_kunmap(abo
);
950 /* remember the eviction */
952 atomic64_inc(&adev
->num_evictions
);
954 /* update statistics */
958 /* move_notify is called before move happens */
959 trace_amdgpu_ttm_bo_move(abo
, new_mem
->mem_type
, old_mem
->mem_type
);
962 int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object
*bo
)
964 struct amdgpu_device
*adev
= amdgpu_ttm_adev(bo
->bdev
);
965 struct ttm_operation_ctx ctx
= { false, false };
966 struct amdgpu_bo
*abo
;
967 unsigned long offset
, size
;
970 if (!amdgpu_ttm_bo_is_amdgpu_bo(bo
))
973 abo
= ttm_to_amdgpu_bo(bo
);
975 /* Remember that this BO was accessed by the CPU */
976 abo
->flags
|= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
;
978 if (bo
->mem
.mem_type
!= TTM_PL_VRAM
)
981 size
= bo
->mem
.num_pages
<< PAGE_SHIFT
;
982 offset
= bo
->mem
.start
<< PAGE_SHIFT
;
983 if ((offset
+ size
) <= adev
->mc
.visible_vram_size
)
986 /* Can't move a pinned BO to visible VRAM */
987 if (abo
->pin_count
> 0)
990 /* hurrah the memory is not visible ! */
991 atomic64_inc(&adev
->num_vram_cpu_page_faults
);
992 amdgpu_ttm_placement_from_domain(abo
, AMDGPU_GEM_DOMAIN_VRAM
|
993 AMDGPU_GEM_DOMAIN_GTT
);
995 /* Avoid costly evictions; only set GTT as a busy placement */
996 abo
->placement
.num_busy_placement
= 1;
997 abo
->placement
.busy_placement
= &abo
->placements
[1];
999 r
= ttm_bo_validate(bo
, &abo
->placement
, &ctx
);
1000 if (unlikely(r
!= 0))
1003 offset
= bo
->mem
.start
<< PAGE_SHIFT
;
1004 /* this should never happen */
1005 if (bo
->mem
.mem_type
== TTM_PL_VRAM
&&
1006 (offset
+ size
) > adev
->mc
.visible_vram_size
)
1013 * amdgpu_bo_fence - add fence to buffer object
1015 * @bo: buffer object in question
1016 * @fence: fence to add
1017 * @shared: true if fence should be added shared
1020 void amdgpu_bo_fence(struct amdgpu_bo
*bo
, struct dma_fence
*fence
,
1023 struct reservation_object
*resv
= bo
->tbo
.resv
;
1026 reservation_object_add_shared_fence(resv
, fence
);
1028 reservation_object_add_excl_fence(resv
, fence
);
1032 * amdgpu_bo_gpu_offset - return GPU offset of bo
1033 * @bo: amdgpu object for which we query the offset
1035 * Returns current GPU offset of the object.
1037 * Note: object should either be pinned or reserved when calling this
1038 * function, it might be useful to add check for this for debugging.
1040 u64
amdgpu_bo_gpu_offset(struct amdgpu_bo
*bo
)
1042 WARN_ON_ONCE(bo
->tbo
.mem
.mem_type
== TTM_PL_SYSTEM
);
1043 WARN_ON_ONCE(bo
->tbo
.mem
.mem_type
== TTM_PL_TT
&&
1044 !amdgpu_gtt_mgr_has_gart_addr(&bo
->tbo
.mem
));
1045 WARN_ON_ONCE(!ww_mutex_is_locked(&bo
->tbo
.resv
->lock
) &&
1047 WARN_ON_ONCE(bo
->tbo
.mem
.start
== AMDGPU_BO_INVALID_OFFSET
);
1048 WARN_ON_ONCE(bo
->tbo
.mem
.mem_type
== TTM_PL_VRAM
&&
1049 !(bo
->flags
& AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS
));
1051 return bo
->tbo
.offset
;