aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch307
1 files changed, 307 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch b/common/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/common/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
+