From 522fb50ef41ce9f57f6dd2db0ca29dacb0cde6ee Mon Sep 17 00:00:00 2001 From: Felix Kuehling Date: Fri, 22 Apr 2016 16:20:36 -0400 Subject: [PATCH 1419/4131] drm/amdgpu: Add GPUVM and Hawaii to gfx_v7 KFD support Change-Id: If328aa3db713b6a2590035c19e22928b5db2d10c Signed-off-by: Felix Kuehling --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 7 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 2 - drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 148 ++++------------------ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 1 - drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 3 +- 5 files changed, 25 insertions(+), 136 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 62e7145..ea5372b 100755 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -67,6 +67,7 @@ bool amdgpu_amdkfd_load_interface(struct amdgpu_device *adev) { switch (adev->asic_type) { case CHIP_KAVERI: + case CHIP_HAWAII: kfd2kgd = amdgpu_amdkfd_gfx_7_get_functions(); break; case CHIP_CARRIZO: @@ -423,12 +424,6 @@ void get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info) cu_info->lds_size = acu_info.lds_size; } -int map_gtt_bo_to_kernel(struct kgd_dev *kgd, - struct kgd_mem *mem, void **kptr) -{ - return 0; -} - int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd, struct kgd_dev **dma_buf_kgd, uint64_t *bo_size, void *metadata_buffer, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index 5fa506d..b7b30af 100755 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -108,8 +108,6 @@ uint64_t get_gpu_clock_counter(struct kgd_dev *kgd); uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd); void get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info); -int map_gtt_bo_to_kernel(struct kgd_dev *kgd, - struct kgd_mem *mem, void **kptr); int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd, struct kgd_dev **dmabuf_kgd, uint64_t *bo_size, void *metadata_buffer, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c index 9eca46f..1051556 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c @@ -83,21 +83,7 @@ union TCP_WATCH_CNTL_BITS { float f32All; }; -static int create_process_vm(struct kgd_dev *kgd, void **vm); -static void destroy_process_vm(struct kgd_dev *kgd, void *vm); - -static uint32_t get_process_page_dir(void *vm); - static int open_graphic_handle(struct kgd_dev *kgd, uint64_t va, void *vm, int fd, uint32_t handle, struct kgd_mem **mem); -static int map_memory_to_gpu(struct kgd_dev *kgd, struct kgd_mem *mem, - void *vm); -static int unmap_memory_from_gpu(struct kgd_dev *kgd, struct kgd_mem *mem, - void *vm); -static int alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, size_t size, - void *vm, struct kgd_mem **mem, - uint64_t *offset, void **kptr, struct kfd_process_device *pdd, - uint32_t flags); -static int free_memory_of_gpu(struct kgd_dev *kgd, struct kgd_mem *mem); static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); @@ -144,7 +130,6 @@ static int alloc_memory_of_scratch(struct kgd_dev *kgd, uint64_t va, uint32_t vmid); static int write_config_static_mem(struct kgd_dev *kgd, bool swizzle_enable, uint8_t element_size, uint8_t index_stride, uint8_t mtype); -static int mmap_bo(struct kgd_dev *kgd, struct vm_area_struct *vma); static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, uint32_t page_table_base); @@ -154,9 +139,9 @@ static const struct kfd2kgd_calls kfd2kgd = { .get_local_mem_info = get_local_mem_info, .get_gpu_clock_counter = get_gpu_clock_counter, .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz, - .create_process_vm = create_process_vm, - .destroy_process_vm = destroy_process_vm, - .get_process_page_dir = get_process_page_dir, + .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm, + .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm, + .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir, .open_graphic_handle = open_graphic_handle, .program_sh_mem_settings = kgd_program_sh_mem_settings, .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping, @@ -172,22 +157,30 @@ static const struct kfd2kgd_calls kfd2kgd = { .address_watch_execute = kgd_address_watch_execute, .wave_control_execute = kgd_wave_control_execute, .address_watch_get_offset = kgd_address_watch_get_offset, - .get_atc_vmid_pasid_mapping_pasid = get_atc_vmid_pasid_mapping_pasid, - .get_atc_vmid_pasid_mapping_valid = get_atc_vmid_pasid_mapping_valid, + .get_atc_vmid_pasid_mapping_pasid = + get_atc_vmid_pasid_mapping_pasid, + .get_atc_vmid_pasid_mapping_valid = + get_atc_vmid_pasid_mapping_valid, .write_vmid_invalidate_request = write_vmid_invalidate_request, - .alloc_memory_of_gpu = alloc_memory_of_gpu, - .free_memory_of_gpu = free_memory_of_gpu, - .map_memory_to_gpu = map_memory_to_gpu, - .unmap_memory_to_gpu = unmap_memory_from_gpu, + .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu, + .free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu, + .map_memory_to_gpu = amdgpu_amdkfd_gpuvm_map_memory_to_gpu, + .unmap_memory_to_gpu = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu, .get_fw_version = get_fw_version, .set_num_of_requests = set_num_of_requests, .get_cu_info = get_cu_info, .alloc_memory_of_scratch = alloc_memory_of_scratch, .write_config_static_mem = write_config_static_mem, - .mmap_bo = mmap_bo, - .map_gtt_bo_to_kernel = map_gtt_bo_to_kernel, + .mmap_bo = amdgpu_amdkfd_gpuvm_mmap_bo, + .map_gtt_bo_to_kernel = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel, .set_vm_context_page_table_base = set_vm_context_page_table_base, + .get_pdd_from_buffer_object = + amdgpu_amdkfd_gpuvm_get_pdd_from_buffer_object, + .return_bo_size = amdgpu_amdkfd_gpuvm_return_bo_size, + .pin_get_sg_table_bo = amdgpu_amdkfd_gpuvm_pin_get_sg_table, + .unpin_put_sg_table_bo = amdgpu_amdkfd_gpuvm_unpin_put_sg_table, .get_dmabuf_info = amdgpu_amdkfd_get_dmabuf_info, + .import_dmabuf = amdgpu_amdkfd_gpuvm_import_dmabuf, .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info }; @@ -196,76 +189,6 @@ struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions() return (struct kfd2kgd_calls *)&kfd2kgd; } -/* - * Creates a VM context for HSA process - */ -static int create_process_vm(struct kgd_dev *kgd, void **vm) -{ - int ret; - struct amdgpu_vm *new_vm; - struct amdgpu_device *adev = (struct amdgpu_device *) kgd; - - BUG_ON(kgd == NULL); - BUG_ON(vm == NULL); - - new_vm = kzalloc(sizeof(struct amdgpu_vm), GFP_KERNEL); - if (new_vm == NULL) - return -ENOMEM; - - /* Initialize the VM context, allocate the page directory and zero it */ - ret = amdgpu_vm_init(adev, new_vm); - if (ret != 0) { - /* Undo everything related to the new VM context */ - amdgpu_vm_fini(adev, new_vm); - kfree(new_vm); - new_vm = NULL; - } - - /* Pin the PD directory*/ - amdgpu_bo_reserve(new_vm->page_directory, true); - amdgpu_bo_pin(new_vm->page_directory, AMDGPU_GEM_DOMAIN_VRAM, NULL); - amdgpu_bo_unreserve(new_vm->page_directory); -#if 0 - new_vm->pd_gpu_addr = amdgpu_bo_gpu_offset(new_vm->page_directory); -#endif - *vm = (void *) new_vm; - - return ret; -} - -/* - * Destroys a VM context of HSA process - */ -static void destroy_process_vm(struct kgd_dev *kgd, void *vm) -{ - struct amdgpu_device *adev = (struct amdgpu_device *) kgd; - struct amdgpu_vm *rvm = (struct amdgpu_vm *) vm; - - BUG_ON(kgd == NULL); - BUG_ON(vm == NULL); - - /* Unpin the PD directory*/ - amdgpu_bo_reserve(rvm->page_directory, true); - amdgpu_bo_unpin(rvm->page_directory); - amdgpu_bo_unreserve(rvm->page_directory); - - /* Release the VM context */ - amdgpu_vm_fini(adev, rvm); - kfree(vm); -} - -static uint32_t get_process_page_dir(void *vm) -{ -#if 0 - struct amdgpu_vm *rvm = (struct amdgpu_vm *) vm; - - BUG_ON(vm == NULL); - - return rvm->pd_gpu_addr >> AMDGPU_GPU_PAGE_SHIFT; -#endif - return 0; -} - static int open_graphic_handle(struct kgd_dev *kgd, uint64_t va, void *vm, int fd, uint32_t handle, struct kgd_mem **mem) { @@ -386,7 +309,7 @@ static inline uint32_t get_sdma_base_addr(struct cik_sdma_rlc_registers *m) retval = m->sdma_engine_id * SDMA1_REGISTER_OFFSET + m->sdma_queue_id * KFD_CIK_SDMA_QUEUE_OFFSET; - pr_err("kfd: sdma base address: 0x%x\n", retval); + pr_debug("kfd: sdma base address: 0x%x\n", retval); return retval; } @@ -543,7 +466,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, while (true) { temp = RREG32(mmCP_HQD_ACTIVE); - if (temp & CP_HQD_ACTIVE__ACTIVE__SHIFT) + /* FIXME: this looks backwards */ + if (temp & CP_HQD_ACTIVE__ACTIVE_MASK) break; if (timeout <= 0) { pr_err("kfd: cp queue preemption time out (%dms)\n", @@ -730,29 +654,6 @@ static int alloc_memory_of_scratch(struct kgd_dev *kgd, } -static int alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, size_t size, - void *vm, struct kgd_mem **mem, uint64_t *offset, - void **kptr, struct kfd_process_device *pdd, uint32_t flags) -{ - return -EFAULT; -} - -static int free_memory_of_gpu(struct kgd_dev *kgd, struct kgd_mem *mem) -{ - return -EFAULT; -} - -static int map_memory_to_gpu(struct kgd_dev *kgd, struct kgd_mem *mem, void *vm) -{ - return -EFAULT; -} - -static int unmap_memory_from_gpu(struct kgd_dev *kgd, struct kgd_mem *mem, - void *vm) -{ - return -EFAULT; -} - static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) { struct amdgpu_device *adev = (struct amdgpu_device *) kgd; @@ -824,11 +725,6 @@ static void set_num_of_requests(struct kgd_dev *dev, uint8_t num_of_req) WREG32(mmATC_ATS_DEBUG, value); } -static int mmap_bo(struct kgd_dev *kgd, struct vm_area_struct *vma) -{ - return 0; -} - static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, uint32_t page_table_base) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c index 41925d3..0c6e3a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c @@ -149,7 +149,6 @@ static const struct kfd2kgd_calls kfd2kgd = { .get_fw_version = get_fw_version, .set_num_of_requests = set_num_of_requests, .get_cu_info = get_cu_info, - .set_num_of_requests = set_num_of_requests, .alloc_memory_of_scratch = alloc_memory_of_scratch, .write_config_static_mem = write_config_static_mem, .mmap_bo = amdgpu_amdkfd_gpuvm_mmap_bo, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 896b9df..c9f7af6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -333,7 +333,8 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, } adev = get_amdgpu_device(kgd); - byte_align = adev->asic_type != CHIP_FIJI ? VI_BO_SIZE_ALIGN : 1; + byte_align = (adev->family == AMDGPU_FAMILY_VI && + adev->asic_type != CHIP_FIJI) ? VI_BO_SIZE_ALIGN : 1; *mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL); if (*mem == NULL) { -- 2.7.4