aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2697-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2697-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2697-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch260
1 files changed, 260 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2697-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2697-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch
new file mode 100644
index 00000000..c11deec1
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2697-drm-amd-Interface-change-to-support-64-bit-page_tabl.patch
@@ -0,0 +1,260 @@
+From bb5d356dc3b7962b998cdc338dc40450261e4ba2 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 2697/2940] 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.
+
+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>
+Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Acked-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 6e40de7bff8c..e19766cd6130 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -172,7 +172,7 @@ 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);
+ void amdgpu_amdkfd_gpuvm_release_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 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 bfe78bb65e70..3621d7a1b543 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+@@ -143,7 +143,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
+ static void set_scratch_backing_va(struct kgd_dev *kgd,
+ uint64_t va, uint32_t vmid);
+ 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);
+ static uint32_t read_vmid_from_vmfault_reg(struct kgd_dev *kgd);
+@@ -875,7 +875,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);
+
+@@ -883,7 +883,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));
+ }
+
+ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+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 1a55096e0fe7..d2f854357c7b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+@@ -99,7 +99,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
+ static void set_scratch_backing_va(struct kgd_dev *kgd,
+ uint64_t va, uint32_t vmid);
+ 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);
+
+@@ -834,7 +834,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);
+
+@@ -842,7 +842,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));
+ }
+
+ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+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 a7129ac58639..5e3abf293833 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+@@ -139,7 +139,7 @@ static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd,
+ static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
+ uint8_t vmid);
+ 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 uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
+ static void set_scratch_backing_va(struct kgd_dev *kgd,
+ uint64_t va, uint32_t vmid);
+@@ -1013,11 +1013,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 315cee608c77..b46b79742c4e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -1142,11 +1142,15 @@ void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm)
+ amdgpu_vm_release_compute(adev, avm);
+ }
+
+-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 bc2103bc1968..d77b660d6a95 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+@@ -667,7 +667,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm,
+ struct queue *q;
+ struct mqd_manager *mqd_mgr;
+ struct kfd_process_device *pdd;
+- uint32_t pd_base;
++ uint64_t pd_base;
+ int retval = 0;
+
+ pdd = qpd_to_pdd(qpd);
+@@ -687,7 +687,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(
+@@ -738,7 +738,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);
+@@ -758,7 +758,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) {
+@@ -782,7 +782,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);
+@@ -800,6 +800,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 684a3bf07efd..33830b1a5a54 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 5c25a3f49b12..87f9aee48c87 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+@@ -535,11 +535,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 c8e8d8c164ae..b2e3c195382d 100644
+--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+@@ -380,9 +380,9 @@ struct kfd2kgd_calls {
+ void **vm, void **process_info, struct dma_fence **ef);
+ void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm);
+ void (*release_process_vm)(struct kgd_dev *kgd, void *vm);
+- uint32_t (*get_process_page_dir)(void *vm);
++ uint64_t (*get_process_page_dir)(void *vm);
+ void (*set_vm_context_page_table_base)(struct kgd_dev *kgd,
+- uint32_t vmid, uint32_t page_table_base);
++ uint32_t vmid, uint64_t page_table_base);
+ int (*alloc_memory_of_gpu)(struct kgd_dev *kgd, uint64_t va,
+ uint64_t size, void *vm,
+ struct kgd_mem **mem, uint64_t *offset,
+--
+2.17.1
+