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