18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 2008 Advanced Micro Devices, Inc. 38c2ecf20Sopenharmony_ci * Copyright 2008 Red Hat Inc. 48c2ecf20Sopenharmony_ci * Copyright 2009 Jerome Glisse. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 78c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 88c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 98c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 108c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 118c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 148c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software. 158c2ecf20Sopenharmony_ci * 168c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 178c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 188c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 198c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 208c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 218c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 228c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 238c2ecf20Sopenharmony_ci * 248c2ecf20Sopenharmony_ci * Authors: Dave Airlie 258c2ecf20Sopenharmony_ci * Alex Deucher 268c2ecf20Sopenharmony_ci * Jerome Glisse 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_ci#ifndef __AMDGPU_OBJECT_H__ 298c2ecf20Sopenharmony_ci#define __AMDGPU_OBJECT_H__ 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#include <drm/amdgpu_drm.h> 328c2ecf20Sopenharmony_ci#include "amdgpu.h" 338c2ecf20Sopenharmony_ci#ifdef CONFIG_MMU_NOTIFIER 348c2ecf20Sopenharmony_ci#include <linux/mmu_notifier.h> 358c2ecf20Sopenharmony_ci#endif 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#define AMDGPU_BO_INVALID_OFFSET LONG_MAX 388c2ecf20Sopenharmony_ci#define AMDGPU_BO_MAX_PLACEMENTS 3 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistruct amdgpu_bo_param { 418c2ecf20Sopenharmony_ci unsigned long size; 428c2ecf20Sopenharmony_ci int byte_align; 438c2ecf20Sopenharmony_ci u32 domain; 448c2ecf20Sopenharmony_ci u32 preferred_domain; 458c2ecf20Sopenharmony_ci u64 flags; 468c2ecf20Sopenharmony_ci enum ttm_bo_type type; 478c2ecf20Sopenharmony_ci bool no_wait_gpu; 488c2ecf20Sopenharmony_ci struct dma_resv *resv; 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* bo virtual addresses in a vm */ 528c2ecf20Sopenharmony_cistruct amdgpu_bo_va_mapping { 538c2ecf20Sopenharmony_ci struct amdgpu_bo_va *bo_va; 548c2ecf20Sopenharmony_ci struct list_head list; 558c2ecf20Sopenharmony_ci struct rb_node rb; 568c2ecf20Sopenharmony_ci uint64_t start; 578c2ecf20Sopenharmony_ci uint64_t last; 588c2ecf20Sopenharmony_ci uint64_t __subtree_last; 598c2ecf20Sopenharmony_ci uint64_t offset; 608c2ecf20Sopenharmony_ci uint64_t flags; 618c2ecf20Sopenharmony_ci}; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci/* User space allocated BO in a VM */ 648c2ecf20Sopenharmony_cistruct amdgpu_bo_va { 658c2ecf20Sopenharmony_ci struct amdgpu_vm_bo_base base; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci /* protected by bo being reserved */ 688c2ecf20Sopenharmony_ci unsigned ref_count; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci /* all other members protected by the VM PD being reserved */ 718c2ecf20Sopenharmony_ci struct dma_fence *last_pt_update; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci /* mappings for this bo_va */ 748c2ecf20Sopenharmony_ci struct list_head invalids; 758c2ecf20Sopenharmony_ci struct list_head valids; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci /* If the mappings are cleared or filled */ 788c2ecf20Sopenharmony_ci bool cleared; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci bool is_xgmi; 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistruct amdgpu_bo { 848c2ecf20Sopenharmony_ci /* Protected by tbo.reserved */ 858c2ecf20Sopenharmony_ci u32 preferred_domains; 868c2ecf20Sopenharmony_ci u32 allowed_domains; 878c2ecf20Sopenharmony_ci struct ttm_place placements[AMDGPU_BO_MAX_PLACEMENTS]; 888c2ecf20Sopenharmony_ci struct ttm_placement placement; 898c2ecf20Sopenharmony_ci struct ttm_buffer_object tbo; 908c2ecf20Sopenharmony_ci struct ttm_bo_kmap_obj kmap; 918c2ecf20Sopenharmony_ci u64 flags; 928c2ecf20Sopenharmony_ci unsigned pin_count; 938c2ecf20Sopenharmony_ci u64 tiling_flags; 948c2ecf20Sopenharmony_ci u64 metadata_flags; 958c2ecf20Sopenharmony_ci void *metadata; 968c2ecf20Sopenharmony_ci u32 metadata_size; 978c2ecf20Sopenharmony_ci unsigned prime_shared_count; 988c2ecf20Sopenharmony_ci /* per VM structure for page tables and with virtual addresses */ 998c2ecf20Sopenharmony_ci struct amdgpu_vm_bo_base *vm_bo; 1008c2ecf20Sopenharmony_ci /* Constant after initialization */ 1018c2ecf20Sopenharmony_ci struct amdgpu_bo *parent; 1028c2ecf20Sopenharmony_ci struct amdgpu_bo *shadow; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci struct ttm_bo_kmap_obj dma_buf_vmap; 1058c2ecf20Sopenharmony_ci struct amdgpu_mn *mn; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci#ifdef CONFIG_MMU_NOTIFIER 1098c2ecf20Sopenharmony_ci struct mmu_interval_notifier notifier; 1108c2ecf20Sopenharmony_ci#endif 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci struct list_head shadow_list; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci struct kgd_mem *kfd_bo; 1158c2ecf20Sopenharmony_ci}; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistatic inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo) 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci return container_of(tbo, struct amdgpu_bo, tbo); 1208c2ecf20Sopenharmony_ci} 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci/** 1238c2ecf20Sopenharmony_ci * amdgpu_mem_type_to_domain - return domain corresponding to mem_type 1248c2ecf20Sopenharmony_ci * @mem_type: ttm memory type 1258c2ecf20Sopenharmony_ci * 1268c2ecf20Sopenharmony_ci * Returns corresponding domain of the ttm mem_type 1278c2ecf20Sopenharmony_ci */ 1288c2ecf20Sopenharmony_cistatic inline unsigned amdgpu_mem_type_to_domain(u32 mem_type) 1298c2ecf20Sopenharmony_ci{ 1308c2ecf20Sopenharmony_ci switch (mem_type) { 1318c2ecf20Sopenharmony_ci case TTM_PL_VRAM: 1328c2ecf20Sopenharmony_ci return AMDGPU_GEM_DOMAIN_VRAM; 1338c2ecf20Sopenharmony_ci case TTM_PL_TT: 1348c2ecf20Sopenharmony_ci return AMDGPU_GEM_DOMAIN_GTT; 1358c2ecf20Sopenharmony_ci case TTM_PL_SYSTEM: 1368c2ecf20Sopenharmony_ci return AMDGPU_GEM_DOMAIN_CPU; 1378c2ecf20Sopenharmony_ci case AMDGPU_PL_GDS: 1388c2ecf20Sopenharmony_ci return AMDGPU_GEM_DOMAIN_GDS; 1398c2ecf20Sopenharmony_ci case AMDGPU_PL_GWS: 1408c2ecf20Sopenharmony_ci return AMDGPU_GEM_DOMAIN_GWS; 1418c2ecf20Sopenharmony_ci case AMDGPU_PL_OA: 1428c2ecf20Sopenharmony_ci return AMDGPU_GEM_DOMAIN_OA; 1438c2ecf20Sopenharmony_ci default: 1448c2ecf20Sopenharmony_ci break; 1458c2ecf20Sopenharmony_ci } 1468c2ecf20Sopenharmony_ci return 0; 1478c2ecf20Sopenharmony_ci} 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci/** 1508c2ecf20Sopenharmony_ci * amdgpu_bo_reserve - reserve bo 1518c2ecf20Sopenharmony_ci * @bo: bo structure 1528c2ecf20Sopenharmony_ci * @no_intr: don't return -ERESTARTSYS on pending signal 1538c2ecf20Sopenharmony_ci * 1548c2ecf20Sopenharmony_ci * Returns: 1558c2ecf20Sopenharmony_ci * -ERESTARTSYS: A wait for the buffer to become unreserved was interrupted by 1568c2ecf20Sopenharmony_ci * a signal. Release all buffer reservations and return to user-space. 1578c2ecf20Sopenharmony_ci */ 1588c2ecf20Sopenharmony_cistatic inline int amdgpu_bo_reserve(struct amdgpu_bo *bo, bool no_intr) 1598c2ecf20Sopenharmony_ci{ 1608c2ecf20Sopenharmony_ci struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 1618c2ecf20Sopenharmony_ci int r; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci r = ttm_bo_reserve(&bo->tbo, !no_intr, false, NULL); 1648c2ecf20Sopenharmony_ci if (unlikely(r != 0)) { 1658c2ecf20Sopenharmony_ci if (r != -ERESTARTSYS) 1668c2ecf20Sopenharmony_ci dev_err(adev->dev, "%p reserve failed\n", bo); 1678c2ecf20Sopenharmony_ci return r; 1688c2ecf20Sopenharmony_ci } 1698c2ecf20Sopenharmony_ci return 0; 1708c2ecf20Sopenharmony_ci} 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_cistatic inline void amdgpu_bo_unreserve(struct amdgpu_bo *bo) 1738c2ecf20Sopenharmony_ci{ 1748c2ecf20Sopenharmony_ci ttm_bo_unreserve(&bo->tbo); 1758c2ecf20Sopenharmony_ci} 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cistatic inline unsigned long amdgpu_bo_size(struct amdgpu_bo *bo) 1788c2ecf20Sopenharmony_ci{ 1798c2ecf20Sopenharmony_ci return bo->tbo.num_pages << PAGE_SHIFT; 1808c2ecf20Sopenharmony_ci} 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_cistatic inline unsigned amdgpu_bo_ngpu_pages(struct amdgpu_bo *bo) 1838c2ecf20Sopenharmony_ci{ 1848c2ecf20Sopenharmony_ci return (bo->tbo.num_pages << PAGE_SHIFT) / AMDGPU_GPU_PAGE_SIZE; 1858c2ecf20Sopenharmony_ci} 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_cistatic inline unsigned amdgpu_bo_gpu_page_alignment(struct amdgpu_bo *bo) 1888c2ecf20Sopenharmony_ci{ 1898c2ecf20Sopenharmony_ci return (bo->tbo.mem.page_alignment << PAGE_SHIFT) / AMDGPU_GPU_PAGE_SIZE; 1908c2ecf20Sopenharmony_ci} 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/** 1938c2ecf20Sopenharmony_ci * amdgpu_bo_mmap_offset - return mmap offset of bo 1948c2ecf20Sopenharmony_ci * @bo: amdgpu object for which we query the offset 1958c2ecf20Sopenharmony_ci * 1968c2ecf20Sopenharmony_ci * Returns mmap offset of the object. 1978c2ecf20Sopenharmony_ci */ 1988c2ecf20Sopenharmony_cistatic inline u64 amdgpu_bo_mmap_offset(struct amdgpu_bo *bo) 1998c2ecf20Sopenharmony_ci{ 2008c2ecf20Sopenharmony_ci return drm_vma_node_offset_addr(&bo->tbo.base.vma_node); 2018c2ecf20Sopenharmony_ci} 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci/** 2048c2ecf20Sopenharmony_ci * amdgpu_bo_in_cpu_visible_vram - check if BO is (partly) in visible VRAM 2058c2ecf20Sopenharmony_ci */ 2068c2ecf20Sopenharmony_cistatic inline bool amdgpu_bo_in_cpu_visible_vram(struct amdgpu_bo *bo) 2078c2ecf20Sopenharmony_ci{ 2088c2ecf20Sopenharmony_ci struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 2098c2ecf20Sopenharmony_ci unsigned fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT; 2108c2ecf20Sopenharmony_ci struct drm_mm_node *node = bo->tbo.mem.mm_node; 2118c2ecf20Sopenharmony_ci unsigned long pages_left; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci if (bo->tbo.mem.mem_type != TTM_PL_VRAM) 2148c2ecf20Sopenharmony_ci return false; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci for (pages_left = bo->tbo.mem.num_pages; pages_left; 2178c2ecf20Sopenharmony_ci pages_left -= node->size, node++) 2188c2ecf20Sopenharmony_ci if (node->start < fpfn) 2198c2ecf20Sopenharmony_ci return true; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci return false; 2228c2ecf20Sopenharmony_ci} 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci/** 2258c2ecf20Sopenharmony_ci * amdgpu_bo_explicit_sync - return whether the bo is explicitly synced 2268c2ecf20Sopenharmony_ci */ 2278c2ecf20Sopenharmony_cistatic inline bool amdgpu_bo_explicit_sync(struct amdgpu_bo *bo) 2288c2ecf20Sopenharmony_ci{ 2298c2ecf20Sopenharmony_ci return bo->flags & AMDGPU_GEM_CREATE_EXPLICIT_SYNC; 2308c2ecf20Sopenharmony_ci} 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci/** 2338c2ecf20Sopenharmony_ci * amdgpu_bo_encrypted - test if the BO is encrypted 2348c2ecf20Sopenharmony_ci * @bo: pointer to a buffer object 2358c2ecf20Sopenharmony_ci * 2368c2ecf20Sopenharmony_ci * Return true if the buffer object is encrypted, false otherwise. 2378c2ecf20Sopenharmony_ci */ 2388c2ecf20Sopenharmony_cistatic inline bool amdgpu_bo_encrypted(struct amdgpu_bo *bo) 2398c2ecf20Sopenharmony_ci{ 2408c2ecf20Sopenharmony_ci return bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED; 2418c2ecf20Sopenharmony_ci} 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_cibool amdgpu_bo_is_amdgpu_bo(struct ttm_buffer_object *bo); 2448c2ecf20Sopenharmony_civoid amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain); 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ciint amdgpu_bo_create(struct amdgpu_device *adev, 2478c2ecf20Sopenharmony_ci struct amdgpu_bo_param *bp, 2488c2ecf20Sopenharmony_ci struct amdgpu_bo **bo_ptr); 2498c2ecf20Sopenharmony_ciint amdgpu_bo_create_reserved(struct amdgpu_device *adev, 2508c2ecf20Sopenharmony_ci unsigned long size, int align, 2518c2ecf20Sopenharmony_ci u32 domain, struct amdgpu_bo **bo_ptr, 2528c2ecf20Sopenharmony_ci u64 *gpu_addr, void **cpu_addr); 2538c2ecf20Sopenharmony_ciint amdgpu_bo_create_kernel(struct amdgpu_device *adev, 2548c2ecf20Sopenharmony_ci unsigned long size, int align, 2558c2ecf20Sopenharmony_ci u32 domain, struct amdgpu_bo **bo_ptr, 2568c2ecf20Sopenharmony_ci u64 *gpu_addr, void **cpu_addr); 2578c2ecf20Sopenharmony_ciint amdgpu_bo_create_kernel_at(struct amdgpu_device *adev, 2588c2ecf20Sopenharmony_ci uint64_t offset, uint64_t size, uint32_t domain, 2598c2ecf20Sopenharmony_ci struct amdgpu_bo **bo_ptr, void **cpu_addr); 2608c2ecf20Sopenharmony_civoid amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, 2618c2ecf20Sopenharmony_ci void **cpu_addr); 2628c2ecf20Sopenharmony_ciint amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); 2638c2ecf20Sopenharmony_civoid *amdgpu_bo_kptr(struct amdgpu_bo *bo); 2648c2ecf20Sopenharmony_civoid amdgpu_bo_kunmap(struct amdgpu_bo *bo); 2658c2ecf20Sopenharmony_cistruct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo); 2668c2ecf20Sopenharmony_civoid amdgpu_bo_unref(struct amdgpu_bo **bo); 2678c2ecf20Sopenharmony_ciint amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain); 2688c2ecf20Sopenharmony_ciint amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain, 2698c2ecf20Sopenharmony_ci u64 min_offset, u64 max_offset); 2708c2ecf20Sopenharmony_ciint amdgpu_bo_unpin(struct amdgpu_bo *bo); 2718c2ecf20Sopenharmony_ciint amdgpu_bo_evict_vram(struct amdgpu_device *adev); 2728c2ecf20Sopenharmony_ciint amdgpu_bo_init(struct amdgpu_device *adev); 2738c2ecf20Sopenharmony_ciint amdgpu_bo_late_init(struct amdgpu_device *adev); 2748c2ecf20Sopenharmony_civoid amdgpu_bo_fini(struct amdgpu_device *adev); 2758c2ecf20Sopenharmony_ciint amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo, 2768c2ecf20Sopenharmony_ci struct vm_area_struct *vma); 2778c2ecf20Sopenharmony_ciint amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags); 2788c2ecf20Sopenharmony_civoid amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags); 2798c2ecf20Sopenharmony_ciint amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata, 2808c2ecf20Sopenharmony_ci uint32_t metadata_size, uint64_t flags); 2818c2ecf20Sopenharmony_ciint amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer, 2828c2ecf20Sopenharmony_ci size_t buffer_size, uint32_t *metadata_size, 2838c2ecf20Sopenharmony_ci uint64_t *flags); 2848c2ecf20Sopenharmony_civoid amdgpu_bo_move_notify(struct ttm_buffer_object *bo, 2858c2ecf20Sopenharmony_ci bool evict, 2868c2ecf20Sopenharmony_ci struct ttm_resource *new_mem); 2878c2ecf20Sopenharmony_civoid amdgpu_bo_release_notify(struct ttm_buffer_object *bo); 2888c2ecf20Sopenharmony_ciint amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo); 2898c2ecf20Sopenharmony_civoid amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence, 2908c2ecf20Sopenharmony_ci bool shared); 2918c2ecf20Sopenharmony_ciint amdgpu_bo_sync_wait_resv(struct amdgpu_device *adev, struct dma_resv *resv, 2928c2ecf20Sopenharmony_ci enum amdgpu_sync_mode sync_mode, void *owner, 2938c2ecf20Sopenharmony_ci bool intr); 2948c2ecf20Sopenharmony_ciint amdgpu_bo_sync_wait(struct amdgpu_bo *bo, void *owner, bool intr); 2958c2ecf20Sopenharmony_ciu64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo); 2968c2ecf20Sopenharmony_ciu64 amdgpu_bo_gpu_offset_no_check(struct amdgpu_bo *bo); 2978c2ecf20Sopenharmony_ciint amdgpu_bo_validate(struct amdgpu_bo *bo); 2988c2ecf20Sopenharmony_ciint amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow, 2998c2ecf20Sopenharmony_ci struct dma_fence **fence); 3008c2ecf20Sopenharmony_ciuint32_t amdgpu_bo_get_preferred_pin_domain(struct amdgpu_device *adev, 3018c2ecf20Sopenharmony_ci uint32_t domain); 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci/* 3048c2ecf20Sopenharmony_ci * sub allocation 3058c2ecf20Sopenharmony_ci */ 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_cistatic inline uint64_t amdgpu_sa_bo_gpu_addr(struct amdgpu_sa_bo *sa_bo) 3088c2ecf20Sopenharmony_ci{ 3098c2ecf20Sopenharmony_ci return sa_bo->manager->gpu_addr + sa_bo->soffset; 3108c2ecf20Sopenharmony_ci} 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_cistatic inline void * amdgpu_sa_bo_cpu_addr(struct amdgpu_sa_bo *sa_bo) 3138c2ecf20Sopenharmony_ci{ 3148c2ecf20Sopenharmony_ci return sa_bo->manager->cpu_ptr + sa_bo->soffset; 3158c2ecf20Sopenharmony_ci} 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ciint amdgpu_sa_bo_manager_init(struct amdgpu_device *adev, 3188c2ecf20Sopenharmony_ci struct amdgpu_sa_manager *sa_manager, 3198c2ecf20Sopenharmony_ci unsigned size, u32 align, u32 domain); 3208c2ecf20Sopenharmony_civoid amdgpu_sa_bo_manager_fini(struct amdgpu_device *adev, 3218c2ecf20Sopenharmony_ci struct amdgpu_sa_manager *sa_manager); 3228c2ecf20Sopenharmony_ciint amdgpu_sa_bo_manager_start(struct amdgpu_device *adev, 3238c2ecf20Sopenharmony_ci struct amdgpu_sa_manager *sa_manager); 3248c2ecf20Sopenharmony_ciint amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager, 3258c2ecf20Sopenharmony_ci struct amdgpu_sa_bo **sa_bo, 3268c2ecf20Sopenharmony_ci unsigned size, unsigned align); 3278c2ecf20Sopenharmony_civoid amdgpu_sa_bo_free(struct amdgpu_device *adev, 3288c2ecf20Sopenharmony_ci struct amdgpu_sa_bo **sa_bo, 3298c2ecf20Sopenharmony_ci struct dma_fence *fence); 3308c2ecf20Sopenharmony_ci#if defined(CONFIG_DEBUG_FS) 3318c2ecf20Sopenharmony_civoid amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, 3328c2ecf20Sopenharmony_ci struct seq_file *m); 3338c2ecf20Sopenharmony_ci#endif 3348c2ecf20Sopenharmony_ciint amdgpu_debugfs_sa_init(struct amdgpu_device *adev); 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_cibool amdgpu_bo_support_uswc(u64 bo_flags); 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci#endif 340