diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch new file mode 100644 index 00000000..42ec9e84 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch @@ -0,0 +1,307 @@ +From 522fb50ef41ce9f57f6dd2db0ca29dacb0cde6ee Mon Sep 17 00:00:00 2001 +From: Felix Kuehling <Felix.Kuehling@amd.com> +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 <Felix.Kuehling@amd.com> +--- + 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 + |