diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2018-06-22 21:20:35 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2018-06-22 21:20:35 +0200 | 
| commit | 7731b8bc94e599c9a79e428f3359ff2c34b7576a (patch) | |
| tree | 879f18ccbe274122f2d4f095b43cbc7f953e0ada /drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | |
| parent | 48e315618dc4dc8904182cd221e3d395d5d97005 (diff) | |
| parent | 9ffc59d57228d74809700be6f7ecb1db10292f05 (diff) | |
Merge branch 'linus' into x86/urgent
Required to queue a dependent fix.
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 105 | 
1 files changed, 90 insertions, 15 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 4d36203ffb11..305143fcc1ce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -50,15 +50,21 @@ int amdgpu_amdkfd_init(void)  		kgd2kfd = NULL;  	} +  #elif defined(CONFIG_HSA_AMD) +  	ret = kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd);  	if (ret)  		kgd2kfd = NULL;  #else +	kgd2kfd = NULL;  	ret = -ENOENT;  #endif + +#if defined(CONFIG_HSA_AMD_MODULE) || defined(CONFIG_HSA_AMD)  	amdgpu_amdkfd_gpuvm_init_mem_limits(); +#endif  	return ret;  } @@ -92,8 +98,12 @@ void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev)  	case CHIP_POLARIS11:  		kfd2kgd = amdgpu_amdkfd_gfx_8_0_get_functions();  		break; +	case CHIP_VEGA10: +	case CHIP_RAVEN: +		kfd2kgd = amdgpu_amdkfd_gfx_9_0_get_functions(); +		break;  	default: -		dev_dbg(adev->dev, "kfd not supported on this ASIC\n"); +		dev_info(adev->dev, "kfd not supported on this ASIC\n");  		return;  	} @@ -175,6 +185,28 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)  				&gpu_resources.doorbell_physical_address,  				&gpu_resources.doorbell_aperture_size,  				&gpu_resources.doorbell_start_offset); +		if (adev->asic_type >= CHIP_VEGA10) { +			/* On SOC15 the BIF is involved in routing +			 * doorbells using the low 12 bits of the +			 * address. Communicate the assignments to +			 * KFD. KFD uses two doorbell pages per +			 * process in case of 64-bit doorbells so we +			 * can use each doorbell assignment twice. +			 */ +			gpu_resources.sdma_doorbell[0][0] = +				AMDGPU_DOORBELL64_sDMA_ENGINE0; +			gpu_resources.sdma_doorbell[0][1] = +				AMDGPU_DOORBELL64_sDMA_ENGINE0 + 0x200; +			gpu_resources.sdma_doorbell[1][0] = +				AMDGPU_DOORBELL64_sDMA_ENGINE1; +			gpu_resources.sdma_doorbell[1][1] = +				AMDGPU_DOORBELL64_sDMA_ENGINE1 + 0x200; +			/* Doorbells 0x0f0-0ff and 0x2f0-2ff are reserved for +			 * SDMA, IH and VCN. So don't use them for the CP. +			 */ +			gpu_resources.reserved_doorbell_mask = 0x1f0; +			gpu_resources.reserved_doorbell_val  = 0x0f0; +		}  		kgd2kfd->device_init(adev->kfd, &gpu_resources);  	} @@ -217,13 +249,19 @@ int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,  {  	struct amdgpu_device *adev = (struct amdgpu_device *)kgd;  	struct amdgpu_bo *bo = NULL; +	struct amdgpu_bo_param bp;  	int r;  	uint64_t gpu_addr_tmp = 0;  	void *cpu_ptr_tmp = NULL; -	r = amdgpu_bo_create(adev, size, PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT, -			     AMDGPU_GEM_CREATE_CPU_GTT_USWC, ttm_bo_type_kernel, -			     NULL, &bo); +	memset(&bp, 0, sizeof(bp)); +	bp.size = size; +	bp.byte_align = PAGE_SIZE; +	bp.domain = AMDGPU_GEM_DOMAIN_GTT; +	bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC; +	bp.type = ttm_bo_type_kernel; +	bp.resv = NULL; +	r = amdgpu_bo_create(adev, &bp, &bo);  	if (r) {  		dev_err(adev->dev,  			"failed to allocate BO for amdkfd (%d)\n", r); @@ -304,15 +342,12 @@ void get_local_mem_info(struct kgd_dev *kgd,  			mem_info->local_mem_size_public,  			mem_info->local_mem_size_private); -	if (amdgpu_emu_mode == 1) { -		mem_info->mem_clk_max = 100; -		return; -	} -  	if (amdgpu_sriov_vf(adev))  		mem_info->mem_clk_max = adev->clock.default_mclk / 100; -	else +	else if (adev->powerplay.pp_funcs)  		mem_info->mem_clk_max = amdgpu_dpm_get_mclk(adev, false) / 100; +	else +		mem_info->mem_clk_max = 100;  }  uint64_t get_gpu_clock_counter(struct kgd_dev *kgd) @@ -329,13 +364,12 @@ uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd)  	struct amdgpu_device *adev = (struct amdgpu_device *)kgd;  	/* the sclk is in quantas of 10kHz */ -	if (amdgpu_emu_mode == 1) -		return 100; -  	if (amdgpu_sriov_vf(adev))  		return adev->clock.default_sclk / 100; - -	return amdgpu_dpm_get_sclk(adev, false) / 100; +	else if (adev->powerplay.pp_funcs) +		return amdgpu_dpm_get_sclk(adev, false) / 100; +	else +		return 100;  }  void get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info) @@ -432,3 +466,44 @@ bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid)  	return false;  } + +#if !defined(CONFIG_HSA_AMD_MODULE) && !defined(CONFIG_HSA_AMD) +bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm) +{ +	return false; +} + +void amdgpu_amdkfd_unreserve_system_memory_limit(struct amdgpu_bo *bo) +{ +} + +void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, +					struct amdgpu_vm *vm) +{ +} + +struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f) +{ +	return NULL; +} + +int amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm) +{ +	return 0; +} + +struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void) +{ +	return NULL; +} + +struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void) +{ +	return NULL; +} + +struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void) +{ +	return NULL; +} +#endif  | 
