diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4625-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4625-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4625-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4625-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch new file mode 100644 index 00000000..e57606f6 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4625-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch @@ -0,0 +1,263 @@ +From 80db7dbe15404c86fb466ef22a8dd47882fa197e Mon Sep 17 00:00:00 2001 +From: Shaoyun Liu <Shaoyun.Liu@amd.com> +Date: Tue, 13 Mar 2018 17:44:09 -0400 +Subject: [PATCH 4625/5725] drm/amd: Interface change to support 64 bit + page_table_base + +amdgpu_gpuvm_get_process_page_dir should return the page table address +in the format expected by the pm4_map_process packet for all ASIC +generations + +Change-Id: I1ac76285ce94cb73444c867b87f38a58160342c6 +Signed-off-by: Shaoyun Liu <Shaoyun.Liu@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 2 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 7 ++++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 7 ++++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 7 +++---- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 8 ++++++-- + drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 11 ++++++----- + drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c | 3 +-- + drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 2 +- + drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 4 ++-- + 9 files changed, 28 insertions(+), 23 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +index c7116f6..cb0588d 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +@@ -178,7 +178,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd, + void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, + struct amdgpu_vm *vm); + void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); +-uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); ++uint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); + int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( + struct kgd_dev *kgd, uint64_t va, uint64_t size, + void *vm, struct sg_table *sg, struct kgd_mem **mem, +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 468b940..c36a1ce 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +@@ -145,7 +145,7 @@ static int alloc_memory_of_scratch(struct kgd_dev *kgd, + 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 void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, +- uint32_t page_table_base); ++ uint64_t page_table_base); + static uint32_t read_vmid_from_vmfault_reg(struct kgd_dev *kgd); + + /* Because of REG_GET_FIELD() being used, we put this function in the +@@ -935,7 +935,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) + } + + static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, +- uint32_t page_table_base) ++ uint64_t page_table_base) + { + struct amdgpu_device *adev = get_amdgpu_device(kgd); + +@@ -943,7 +943,8 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, + pr_err("trying to set page table base for wrong VMID\n"); + return; + } +- WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, page_table_base); ++ WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, ++ lower_32_bits(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 e0c0e97..69ac7be 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +@@ -116,7 +116,7 @@ static int alloc_memory_of_scratch(struct kgd_dev *kgd, + 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 void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, +- uint32_t page_table_base); ++ uint64_t page_table_base); + static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid); + static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid); + +@@ -1006,7 +1006,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) + } + + static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, +- uint32_t page_table_base) ++ uint64_t page_table_base) + { + struct amdgpu_device *adev = get_amdgpu_device(kgd); + +@@ -1014,5 +1014,6 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, + pr_err("trying to set page table base for wrong VMID\n"); + return; + } +- WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, page_table_base); ++ WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, ++ lower_32_bits(page_table_base)); + } +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c +index adef83d..b6852a1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c +@@ -159,7 +159,7 @@ static int alloc_memory_of_scratch(struct kgd_dev *kgd, + 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 void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, +- uint32_t page_table_base); ++ uint64_t page_table_base); + static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid); + static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid); + +@@ -1188,11 +1188,10 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) + } + + static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, +- uint32_t page_table_base) ++ uint64_t page_table_base) + { + struct amdgpu_device *adev = get_amdgpu_device(kgd); +- uint64_t base = (uint64_t)page_table_base << PAGE_SHIFT | +- AMDGPU_PTE_VALID; ++ uint64_t base = page_table_base | AMDGPU_PTE_VALID; + + if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) { + pr_err("trying to set page table base for wrong VMID %u\n", +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +index 85d0bfb..0572e2d 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +@@ -1160,11 +1160,15 @@ void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm) + kfree(vm); + } + +-uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) ++uint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) + { + struct amdgpu_vm *avm = (struct amdgpu_vm *)vm; ++ struct amdgpu_bo *pd = avm->root.base.bo; ++ struct amdgpu_device *adev = amdgpu_ttm_adev(pd->tbo.bdev); + +- return avm->pd_phys_addr >> AMDGPU_GPU_PAGE_SHIFT; ++ if (adev->asic_type < CHIP_VEGA10) ++ return avm->pd_phys_addr >> AMDGPU_GPU_PAGE_SHIFT; ++ return avm->pd_phys_addr; + } + + int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +index 91b88d2..bc80f28 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +@@ -656,7 +656,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm, + struct queue *q; + struct mqd_manager *mqd; + struct kfd_process_device *pdd; +- uint32_t pd_base; ++ uint64_t pd_base; + int retval = 0; + + pdd = qpd_to_pdd(qpd); +@@ -676,7 +676,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm, + + /* Update PD Base in QPD */ + qpd->page_table_base = pd_base; +- pr_debug("Updated PD address to 0x%08x\n", pd_base); ++ pr_debug("Updated PD address to 0x%llx\n", pd_base); + + if (!list_empty(&qpd->queues_list)) { + dqm->dev->kfd2kgd->set_vm_context_page_table_base( +@@ -717,7 +717,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm, + { + struct queue *q; + struct kfd_process_device *pdd; +- uint32_t pd_base; ++ uint64_t pd_base; + int retval = 0; + + pdd = qpd_to_pdd(qpd); +@@ -737,7 +737,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm, + + /* Update PD Base in QPD */ + qpd->page_table_base = pd_base; +- pr_debug("Updated PD address to 0x%08x\n", pd_base); ++ pr_debug("Updated PD address to 0x%llx\n", pd_base); + + /* activate all active queues on the qpd */ + list_for_each_entry(q, &qpd->queues_list, list) { +@@ -761,7 +761,7 @@ static int register_process(struct device_queue_manager *dqm, + { + struct device_process_node *n; + struct kfd_process_device *pdd; +- uint32_t pd_base; ++ uint64_t pd_base; + int retval; + + n = kzalloc(sizeof(*n), GFP_KERNEL); +@@ -779,6 +779,7 @@ static int register_process(struct device_queue_manager *dqm, + + /* Update PD Base in QPD */ + qpd->page_table_base = pd_base; ++ pr_debug("Updated PD address to 0x%llx\n", pd_base); + + retval = dqm->asic_ops.update_qpd(dqm, qpd); + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c +index 684a3bf..33830b1 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c +@@ -71,8 +71,7 @@ static int pm_map_process_v9(struct packet_manager *pm, + uint32_t *buffer, struct qcm_process_device *qpd) + { + struct pm4_mes_map_process *packet; +- uint64_t vm_page_table_base_addr = +- (uint64_t)(qpd->page_table_base) << 12; ++ uint64_t vm_page_table_base_addr = qpd->page_table_base; + + packet = (struct pm4_mes_map_process *)buffer; + memset(buffer, 0, sizeof(struct pm4_mes_map_process)); +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +index 6b7f962..7e55085 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +@@ -600,11 +600,11 @@ struct qcm_process_device { + * All the memory management data should be here too + */ + uint64_t gds_context_area; ++ uint64_t page_table_base; + uint32_t sh_mem_config; + uint32_t sh_mem_bases; + uint32_t sh_mem_ape1_base; + uint32_t sh_mem_ape1_limit; +- uint32_t page_table_base; + uint32_t gds_size; + uint32_t num_gws; + uint32_t num_oac; +diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +index 0069b26..e81fdbc 100644 +--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h ++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +@@ -277,7 +277,7 @@ struct kfd2kgd_calls { + int (*create_process_gpumem)(struct kgd_dev *kgd, uint64_t va, size_t size, void *vm, struct kgd_mem **mem); + void (*destroy_process_gpumem)(struct kgd_dev *kgd, struct kgd_mem *mem); + +- uint32_t (*get_process_page_dir)(void *vm); ++ uint64_t (*get_process_page_dir)(void *vm); + + int (*alloc_pasid)(unsigned int bits); + void (*free_pasid)(unsigned int pasid); +@@ -368,7 +368,7 @@ struct kfd2kgd_calls { + int (*map_gtt_bo_to_kernel)(struct kgd_dev *kgd, + struct kgd_mem *mem, void **kptr, uint64_t *size); + void (*set_vm_context_page_table_base)(struct kgd_dev *kgd, uint32_t vmid, +- uint32_t page_table_base); ++ uint64_t page_table_base); + + int (*pin_get_sg_table_bo)(struct kgd_dev *kgd, + struct kgd_mem *mem, uint64_t offset, +-- +2.7.4 + |