diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 95 | 
1 files changed, 79 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index fa8ac9d19a7a..9dff792c9290 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -29,6 +29,7 @@  #include "amdgpu_vm.h"  #include "amdgpu_amdkfd.h"  #include "amdgpu_dma_buf.h" +#include <uapi/linux/kfd_ioctl.h>  /* BO flag to indicate a KFD userptr BO */  #define AMDGPU_AMDKFD_USERPTR_BO (1ULL << 63) @@ -276,6 +277,42 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo,  	return 0;  } +int amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo) +{ +	struct amdgpu_bo *root = bo; +	struct amdgpu_vm_bo_base *vm_bo; +	struct amdgpu_vm *vm; +	struct amdkfd_process_info *info; +	struct amdgpu_amdkfd_fence *ef; +	int ret; + +	/* we can always get vm_bo from root PD bo.*/ +	while (root->parent) +		root = root->parent; + +	vm_bo = root->vm_bo; +	if (!vm_bo) +		return 0; + +	vm = vm_bo->vm; +	if (!vm) +		return 0; + +	info = vm->process_info; +	if (!info || !info->eviction_fence) +		return 0; + +	ef = container_of(dma_fence_get(&info->eviction_fence->base), +			struct amdgpu_amdkfd_fence, base); + +	BUG_ON(!dma_resv_trylock(bo->tbo.base.resv)); +	ret = amdgpu_amdkfd_remove_eviction_fence(bo, ef); +	dma_resv_unlock(bo->tbo.base.resv); + +	dma_fence_put(&ef->base); +	return ret; +} +  static int amdgpu_amdkfd_bo_validate(struct amdgpu_bo *bo, uint32_t domain,  				     bool wait)  { @@ -364,18 +401,18 @@ static int vm_update_pds(struct amdgpu_vm *vm, struct amdgpu_sync *sync)  static uint64_t get_pte_flags(struct amdgpu_device *adev, struct kgd_mem *mem)  {  	struct amdgpu_device *bo_adev = amdgpu_ttm_adev(mem->bo->tbo.bdev); -	bool coherent = mem->alloc_flags & ALLOC_MEM_FLAGS_COHERENT; +	bool coherent = mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_COHERENT;  	uint32_t mapping_flags;  	mapping_flags = AMDGPU_VM_PAGE_READABLE; -	if (mem->alloc_flags & ALLOC_MEM_FLAGS_WRITABLE) +	if (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE)  		mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE; -	if (mem->alloc_flags & ALLOC_MEM_FLAGS_EXECUTABLE) +	if (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE)  		mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE;  	switch (adev->asic_type) {  	case CHIP_ARCTURUS: -		if (mem->alloc_flags & ALLOC_MEM_FLAGS_VRAM) { +		if (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) {  			if (bo_adev == adev)  				mapping_flags |= coherent ?  					AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW; @@ -847,9 +884,9 @@ static int process_sync_pds_resv(struct amdkfd_process_info *process_info,  			    vm_list_node) {  		struct amdgpu_bo *pd = peer_vm->root.base.bo; -		ret = amdgpu_sync_resv(NULL, -					sync, pd->tbo.base.resv, -					AMDGPU_FENCE_OWNER_KFD, false); +		ret = amdgpu_sync_resv(NULL, sync, pd->tbo.base.resv, +				       AMDGPU_SYNC_NE_OWNER, +				       AMDGPU_FENCE_OWNER_KFD);  		if (ret)  			return ret;  	} @@ -1044,6 +1081,8 @@ void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,  	list_del(&vm->vm_list_node);  	mutex_unlock(&process_info->lock); +	vm->process_info = NULL; +  	/* Release per-process resources when last compute VM is destroyed */  	if (!process_info->n_vms) {  		WARN_ON(!list_empty(&process_info->kfd_bo_list)); @@ -1122,24 +1161,24 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	/*  	 * Check on which domain to allocate BO  	 */ -	if (flags & ALLOC_MEM_FLAGS_VRAM) { +	if (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) {  		domain = alloc_domain = AMDGPU_GEM_DOMAIN_VRAM;  		alloc_flags = AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE; -		alloc_flags |= (flags & ALLOC_MEM_FLAGS_PUBLIC) ? +		alloc_flags |= (flags & KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC) ?  			AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED :  			AMDGPU_GEM_CREATE_NO_CPU_ACCESS; -	} else if (flags & ALLOC_MEM_FLAGS_GTT) { +	} else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_GTT) {  		domain = alloc_domain = AMDGPU_GEM_DOMAIN_GTT;  		alloc_flags = 0; -	} else if (flags & ALLOC_MEM_FLAGS_USERPTR) { +	} else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) {  		domain = AMDGPU_GEM_DOMAIN_GTT;  		alloc_domain = AMDGPU_GEM_DOMAIN_CPU;  		alloc_flags = 0;  		if (!offset || !*offset)  			return -EINVAL;  		user_addr = untagged_addr(*offset); -	} else if (flags & (ALLOC_MEM_FLAGS_DOORBELL | -			ALLOC_MEM_FLAGS_MMIO_REMAP)) { +	} else if (flags & (KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL | +			KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP)) {  		domain = AMDGPU_GEM_DOMAIN_GTT;  		alloc_domain = AMDGPU_GEM_DOMAIN_CPU;  		bo_type = ttm_bo_type_sg; @@ -1160,7 +1199,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	}  	INIT_LIST_HEAD(&(*mem)->bo_va_list);  	mutex_init(&(*mem)->lock); -	(*mem)->aql_queue = !!(flags & ALLOC_MEM_FLAGS_AQL_QUEUE_MEM); +	(*mem)->aql_queue = !!(flags & KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM);  	/* Workaround for AQL queue wraparound bug. Map the same  	 * memory twice. That means we only actually allocate half @@ -1642,10 +1681,12 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,  	INIT_LIST_HEAD(&(*mem)->bo_va_list);  	mutex_init(&(*mem)->lock); +	  	(*mem)->alloc_flags =  		((bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ? -		 ALLOC_MEM_FLAGS_VRAM : ALLOC_MEM_FLAGS_GTT) | -		ALLOC_MEM_FLAGS_WRITABLE | ALLOC_MEM_FLAGS_EXECUTABLE; +		KFD_IOC_ALLOC_MEM_FLAGS_VRAM : KFD_IOC_ALLOC_MEM_FLAGS_GTT) +		| KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE +		| KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;  	(*mem)->bo = amdgpu_bo_ref(bo);  	(*mem)->va = va; @@ -2204,3 +2245,25 @@ int amdgpu_amdkfd_remove_gws_from_process(void *info, void *mem)  	kfree(mem);  	return 0;  } + +/* Returns GPU-specific tiling mode information */ +int amdgpu_amdkfd_get_tile_config(struct kgd_dev *kgd, +				struct tile_config *config) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)kgd; + +	config->gb_addr_config = adev->gfx.config.gb_addr_config; +	config->tile_config_ptr = adev->gfx.config.tile_mode_array; +	config->num_tile_configs = +			ARRAY_SIZE(adev->gfx.config.tile_mode_array); +	config->macro_tile_config_ptr = +			adev->gfx.config.macrotile_mode_array; +	config->num_macro_tile_configs = +			ARRAY_SIZE(adev->gfx.config.macrotile_mode_array); + +	/* Those values are not set from GFX9 onwards */ +	config->num_banks = adev->gfx.config.num_banks; +	config->num_ranks = adev->gfx.config.num_ranks; + +	return 0; +}  | 
