Commit e715c6d0 authored by Shaoyun Liu's avatar Shaoyun Liu Committed by Alex Deucher

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: default avatarShaoyun Liu <Shaoyun.Liu@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent d5094189
...@@ -174,7 +174,7 @@ void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, ...@@ -174,7 +174,7 @@ void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
struct amdgpu_vm *vm); struct amdgpu_vm *vm);
void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *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); 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( int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
struct kgd_dev *kgd, uint64_t va, uint64_t size, struct kgd_dev *kgd, uint64_t va, uint64_t size,
void *vm, struct kgd_mem **mem, void *vm, struct kgd_mem **mem,
......
...@@ -142,7 +142,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); ...@@ -142,7 +142,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, static void set_scratch_backing_va(struct kgd_dev *kgd,
uint64_t va, uint32_t vmid); uint64_t va, uint32_t vmid);
static void set_vm_context_page_table_base(struct kgd_dev *kgd, 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(struct kgd_dev *kgd, uint16_t pasid);
static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid); static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
static uint32_t read_vmid_from_vmfault_reg(struct kgd_dev *kgd); static uint32_t read_vmid_from_vmfault_reg(struct kgd_dev *kgd);
...@@ -874,7 +874,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) ...@@ -874,7 +874,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, 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); struct amdgpu_device *adev = get_amdgpu_device(kgd);
...@@ -882,7 +882,8 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, ...@@ -882,7 +882,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"); pr_err("trying to set page table base for wrong VMID\n");
return; 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) static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
......
...@@ -98,7 +98,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); ...@@ -98,7 +98,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, static void set_scratch_backing_va(struct kgd_dev *kgd,
uint64_t va, uint32_t vmid); uint64_t va, uint32_t vmid);
static void set_vm_context_page_table_base(struct kgd_dev *kgd, 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(struct kgd_dev *kgd, uint16_t pasid);
static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid); static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
...@@ -833,7 +833,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) ...@@ -833,7 +833,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, 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); struct amdgpu_device *adev = get_amdgpu_device(kgd);
...@@ -841,7 +841,8 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, ...@@ -841,7 +841,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"); pr_err("trying to set page table base for wrong VMID\n");
return; 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) static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
......
...@@ -138,7 +138,7 @@ static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, ...@@ -138,7 +138,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, static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
uint8_t vmid); uint8_t vmid);
static void set_vm_context_page_table_base(struct kgd_dev *kgd, 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 uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); 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, static void set_scratch_backing_va(struct kgd_dev *kgd,
uint64_t va, uint32_t vmid); 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) ...@@ -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, 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); struct amdgpu_device *adev = get_amdgpu_device(kgd);
uint64_t base = (uint64_t)page_table_base << PAGE_SHIFT | uint64_t base = page_table_base | AMDGPU_PTE_VALID;
AMDGPU_PTE_VALID;
if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) { if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
pr_err("trying to set page table base for wrong VMID %u\n", pr_err("trying to set page table base for wrong VMID %u\n",
......
...@@ -1131,11 +1131,15 @@ void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm) ...@@ -1131,11 +1131,15 @@ void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm)
amdgpu_vm_release_compute(adev, avm); 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_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( int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
......
...@@ -656,7 +656,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm, ...@@ -656,7 +656,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm,
struct queue *q; struct queue *q;
struct mqd_manager *mqd_mgr; struct mqd_manager *mqd_mgr;
struct kfd_process_device *pdd; struct kfd_process_device *pdd;
uint32_t pd_base; uint64_t pd_base;
int retval = 0; int retval = 0;
pdd = qpd_to_pdd(qpd); pdd = qpd_to_pdd(qpd);
...@@ -676,7 +676,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm, ...@@ -676,7 +676,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm,
/* Update PD Base in QPD */ /* Update PD Base in QPD */
qpd->page_table_base = pd_base; 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)) { if (!list_empty(&qpd->queues_list)) {
dqm->dev->kfd2kgd->set_vm_context_page_table_base( dqm->dev->kfd2kgd->set_vm_context_page_table_base(
...@@ -717,7 +717,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm, ...@@ -717,7 +717,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,
{ {
struct queue *q; struct queue *q;
struct kfd_process_device *pdd; struct kfd_process_device *pdd;
uint32_t pd_base; uint64_t pd_base;
int retval = 0; int retval = 0;
pdd = qpd_to_pdd(qpd); pdd = qpd_to_pdd(qpd);
...@@ -737,7 +737,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm, ...@@ -737,7 +737,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,
/* Update PD Base in QPD */ /* Update PD Base in QPD */
qpd->page_table_base = pd_base; 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 */ /* activate all active queues on the qpd */
list_for_each_entry(q, &qpd->queues_list, list) { list_for_each_entry(q, &qpd->queues_list, list) {
...@@ -761,7 +761,7 @@ static int register_process(struct device_queue_manager *dqm, ...@@ -761,7 +761,7 @@ static int register_process(struct device_queue_manager *dqm,
{ {
struct device_process_node *n; struct device_process_node *n;
struct kfd_process_device *pdd; struct kfd_process_device *pdd;
uint32_t pd_base; uint64_t pd_base;
int retval; int retval;
n = kzalloc(sizeof(*n), GFP_KERNEL); n = kzalloc(sizeof(*n), GFP_KERNEL);
...@@ -779,6 +779,7 @@ static int register_process(struct device_queue_manager *dqm, ...@@ -779,6 +779,7 @@ static int register_process(struct device_queue_manager *dqm,
/* Update PD Base in QPD */ /* Update PD Base in QPD */
qpd->page_table_base = pd_base; 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); retval = dqm->asic_ops.update_qpd(dqm, qpd);
......
...@@ -71,8 +71,7 @@ static int pm_map_process_v9(struct packet_manager *pm, ...@@ -71,8 +71,7 @@ static int pm_map_process_v9(struct packet_manager *pm,
uint32_t *buffer, struct qcm_process_device *qpd) uint32_t *buffer, struct qcm_process_device *qpd)
{ {
struct pm4_mes_map_process *packet; struct pm4_mes_map_process *packet;
uint64_t vm_page_table_base_addr = uint64_t vm_page_table_base_addr = qpd->page_table_base;
(uint64_t)(qpd->page_table_base) << 12;
packet = (struct pm4_mes_map_process *)buffer; packet = (struct pm4_mes_map_process *)buffer;
memset(buffer, 0, sizeof(struct pm4_mes_map_process)); memset(buffer, 0, sizeof(struct pm4_mes_map_process));
......
...@@ -507,11 +507,11 @@ struct qcm_process_device { ...@@ -507,11 +507,11 @@ struct qcm_process_device {
* All the memory management data should be here too * All the memory management data should be here too
*/ */
uint64_t gds_context_area; uint64_t gds_context_area;
uint64_t page_table_base;
uint32_t sh_mem_config; uint32_t sh_mem_config;
uint32_t sh_mem_bases; uint32_t sh_mem_bases;
uint32_t sh_mem_ape1_base; uint32_t sh_mem_ape1_base;
uint32_t sh_mem_ape1_limit; uint32_t sh_mem_ape1_limit;
uint32_t page_table_base;
uint32_t gds_size; uint32_t gds_size;
uint32_t num_gws; uint32_t num_gws;
uint32_t num_oac; uint32_t num_oac;
......
...@@ -409,9 +409,9 @@ struct kfd2kgd_calls { ...@@ -409,9 +409,9 @@ struct kfd2kgd_calls {
struct dma_fence **ef); struct dma_fence **ef);
void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm); void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm);
void (*release_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, 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, int (*alloc_memory_of_gpu)(struct kgd_dev *kgd, uint64_t va,
uint64_t size, void *vm, uint64_t size, void *vm,
struct kgd_mem **mem, uint64_t *offset, struct kgd_mem **mem, uint64_t *offset,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment