aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdkfd
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdkfd')
-rw-r--r--drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c3
-rw-r--r--drivers/gpu/drm/amd/amdkfd/cik_regs.h2
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_chardev.c21
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_crat.c9
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device.c12
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c24
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c3
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c5
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_pasid.c5
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_priv.h1
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_process.c34
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_topology.c10
12 files changed, 65 insertions, 64 deletions
diff --git a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
index 5d2475d5392c..177d1e5329a5 100644
--- a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
+++ b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
@@ -23,6 +23,7 @@
23#include "kfd_priv.h" 23#include "kfd_priv.h"
24#include "kfd_events.h" 24#include "kfd_events.h"
25#include "cik_int.h" 25#include "cik_int.h"
26#include "amdgpu_amdkfd.h"
26 27
27static bool cik_event_interrupt_isr(struct kfd_dev *dev, 28static bool cik_event_interrupt_isr(struct kfd_dev *dev,
28 const uint32_t *ih_ring_entry, 29 const uint32_t *ih_ring_entry,
@@ -107,7 +108,7 @@ static void cik_event_interrupt_wq(struct kfd_dev *dev,
107 kfd_process_vm_fault(dev->dqm, pasid); 108 kfd_process_vm_fault(dev->dqm, pasid);
108 109
109 memset(&info, 0, sizeof(info)); 110 memset(&info, 0, sizeof(info));
110 dev->kfd2kgd->get_vm_fault_info(dev->kgd, &info); 111 amdgpu_amdkfd_gpuvm_get_vm_fault_info(dev->kgd, &info);
111 if (!info.page_addr && !info.status) 112 if (!info.page_addr && !info.status)
112 return; 113 return;
113 114
diff --git a/drivers/gpu/drm/amd/amdkfd/cik_regs.h b/drivers/gpu/drm/amd/amdkfd/cik_regs.h
index 37ce6dd65391..8e2a1663c4db 100644
--- a/drivers/gpu/drm/amd/amdkfd/cik_regs.h
+++ b/drivers/gpu/drm/amd/amdkfd/cik_regs.h
@@ -68,6 +68,4 @@
68 68
69#define GRBM_GFX_INDEX 0x30800 69#define GRBM_GFX_INDEX 0x30800
70 70
71#define ATC_VMID_PASID_MAPPING_VALID (1U << 31)
72
73#endif 71#endif
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
index 14d5b5fa822d..5f4062b41add 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
@@ -37,6 +37,7 @@
37#include "kfd_priv.h" 37#include "kfd_priv.h"
38#include "kfd_device_queue_manager.h" 38#include "kfd_device_queue_manager.h"
39#include "kfd_dbgmgr.h" 39#include "kfd_dbgmgr.h"
40#include "amdgpu_amdkfd.h"
40 41
41static long kfd_ioctl(struct file *, unsigned int, unsigned long); 42static long kfd_ioctl(struct file *, unsigned int, unsigned long);
42static int kfd_open(struct inode *, struct file *); 43static int kfd_open(struct inode *, struct file *);
@@ -834,8 +835,7 @@ static int kfd_ioctl_get_clock_counters(struct file *filep,
834 dev = kfd_device_by_id(args->gpu_id); 835 dev = kfd_device_by_id(args->gpu_id);
835 if (dev) 836 if (dev)
836 /* Reading GPU clock counter from KGD */ 837 /* Reading GPU clock counter from KGD */
837 args->gpu_clock_counter = 838 args->gpu_clock_counter = amdgpu_amdkfd_get_gpu_clock_counter(dev->kgd);
838 dev->kfd2kgd->get_gpu_clock_counter(dev->kgd);
839 else 839 else
840 /* Node without GPU resource */ 840 /* Node without GPU resource */
841 args->gpu_clock_counter = 0; 841 args->gpu_clock_counter = 0;
@@ -1042,7 +1042,7 @@ static int kfd_ioctl_create_event(struct file *filp, struct kfd_process *p,
1042 } 1042 }
1043 mutex_unlock(&p->mutex); 1043 mutex_unlock(&p->mutex);
1044 1044
1045 err = kfd->kfd2kgd->map_gtt_bo_to_kernel(kfd->kgd, 1045 err = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(kfd->kgd,
1046 mem, &kern_addr, &size); 1046 mem, &kern_addr, &size);
1047 if (err) { 1047 if (err) {
1048 pr_err("Failed to map event page to kernel\n"); 1048 pr_err("Failed to map event page to kernel\n");
@@ -1240,7 +1240,7 @@ bool kfd_dev_is_large_bar(struct kfd_dev *dev)
1240 if (dev->device_info->needs_iommu_device) 1240 if (dev->device_info->needs_iommu_device)
1241 return false; 1241 return false;
1242 1242
1243 dev->kfd2kgd->get_local_mem_info(dev->kgd, &mem_info); 1243 amdgpu_amdkfd_get_local_mem_info(dev->kgd, &mem_info);
1244 if (mem_info.local_mem_size_private == 0 && 1244 if (mem_info.local_mem_size_private == 0 &&
1245 mem_info.local_mem_size_public > 0) 1245 mem_info.local_mem_size_public > 0)
1246 return true; 1246 return true;
@@ -1281,7 +1281,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,
1281 goto err_unlock; 1281 goto err_unlock;
1282 } 1282 }
1283 1283
1284 err = dev->kfd2kgd->alloc_memory_of_gpu( 1284 err = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
1285 dev->kgd, args->va_addr, args->size, 1285 dev->kgd, args->va_addr, args->size,
1286 pdd->vm, (struct kgd_mem **) &mem, &offset, 1286 pdd->vm, (struct kgd_mem **) &mem, &offset,
1287 flags); 1287 flags);
@@ -1303,7 +1303,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,
1303 return 0; 1303 return 0;
1304 1304
1305err_free: 1305err_free:
1306 dev->kfd2kgd->free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem); 1306 amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem);
1307err_unlock: 1307err_unlock:
1308 mutex_unlock(&p->mutex); 1308 mutex_unlock(&p->mutex);
1309 return err; 1309 return err;
@@ -1338,7 +1338,8 @@ static int kfd_ioctl_free_memory_of_gpu(struct file *filep,
1338 goto err_unlock; 1338 goto err_unlock;
1339 } 1339 }
1340 1340
1341 ret = dev->kfd2kgd->free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem); 1341 ret = amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd,
1342 (struct kgd_mem *)mem);
1342 1343
1343 /* If freeing the buffer failed, leave the handle in place for 1344 /* If freeing the buffer failed, leave the handle in place for
1344 * clean-up during process tear-down. 1345 * clean-up during process tear-down.
@@ -1418,7 +1419,7 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
1418 err = PTR_ERR(peer_pdd); 1419 err = PTR_ERR(peer_pdd);
1419 goto get_mem_obj_from_handle_failed; 1420 goto get_mem_obj_from_handle_failed;
1420 } 1421 }
1421 err = peer->kfd2kgd->map_memory_to_gpu( 1422 err = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
1422 peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm); 1423 peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm);
1423 if (err) { 1424 if (err) {
1424 pr_err("Failed to map to gpu %d/%d\n", 1425 pr_err("Failed to map to gpu %d/%d\n",
@@ -1430,7 +1431,7 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
1430 1431
1431 mutex_unlock(&p->mutex); 1432 mutex_unlock(&p->mutex);
1432 1433
1433 err = dev->kfd2kgd->sync_memory(dev->kgd, (struct kgd_mem *) mem, true); 1434 err = amdgpu_amdkfd_gpuvm_sync_memory(dev->kgd, (struct kgd_mem *) mem, true);
1434 if (err) { 1435 if (err) {
1435 pr_debug("Sync memory failed, wait interrupted by user signal\n"); 1436 pr_debug("Sync memory failed, wait interrupted by user signal\n");
1436 goto sync_memory_failed; 1437 goto sync_memory_failed;
@@ -1525,7 +1526,7 @@ static int kfd_ioctl_unmap_memory_from_gpu(struct file *filep,
1525 err = -ENODEV; 1526 err = -ENODEV;
1526 goto get_mem_obj_from_handle_failed; 1527 goto get_mem_obj_from_handle_failed;
1527 } 1528 }
1528 err = dev->kfd2kgd->unmap_memory_to_gpu( 1529 err = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
1529 peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm); 1530 peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm);
1530 if (err) { 1531 if (err) {
1531 pr_err("Failed to unmap from gpu %d/%d\n", 1532 pr_err("Failed to unmap from gpu %d/%d\n",
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
index 56412b0e7e1c..3783d122f283 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -26,6 +26,7 @@
26#include "kfd_priv.h" 26#include "kfd_priv.h"
27#include "kfd_topology.h" 27#include "kfd_topology.h"
28#include "kfd_iommu.h" 28#include "kfd_iommu.h"
29#include "amdgpu_amdkfd.h"
29 30
30/* GPU Processor ID base for dGPUs for which VCRAT needs to be created. 31/* GPU Processor ID base for dGPUs for which VCRAT needs to be created.
31 * GPU processor ID are expressed with Bit[31]=1. 32 * GPU processor ID are expressed with Bit[31]=1.
@@ -753,12 +754,10 @@ int kfd_create_crat_image_acpi(void **crat_image, size_t *size)
753 return -ENODATA; 754 return -ENODATA;
754 } 755 }
755 756
756 pcrat_image = kmalloc(crat_table->length, GFP_KERNEL); 757 pcrat_image = kmemdup(crat_table, crat_table->length, GFP_KERNEL);
757 if (!pcrat_image) 758 if (!pcrat_image)
758 return -ENOMEM; 759 return -ENOMEM;
759 760
760 memcpy(pcrat_image, crat_table, crat_table->length);
761
762 *crat_image = pcrat_image; 761 *crat_image = pcrat_image;
763 *size = crat_table->length; 762 *size = crat_table->length;
764 763
@@ -1161,7 +1160,7 @@ static int kfd_create_vcrat_image_gpu(void *pcrat_image,
1161 cu->flags |= CRAT_CU_FLAGS_GPU_PRESENT; 1160 cu->flags |= CRAT_CU_FLAGS_GPU_PRESENT;
1162 cu->proximity_domain = proximity_domain; 1161 cu->proximity_domain = proximity_domain;
1163 1162
1164 kdev->kfd2kgd->get_cu_info(kdev->kgd, &cu_info); 1163 amdgpu_amdkfd_get_cu_info(kdev->kgd, &cu_info);
1165 cu->num_simd_per_cu = cu_info.simd_per_cu; 1164 cu->num_simd_per_cu = cu_info.simd_per_cu;
1166 cu->num_simd_cores = cu_info.simd_per_cu * cu_info.cu_active_number; 1165 cu->num_simd_cores = cu_info.simd_per_cu * cu_info.cu_active_number;
1167 cu->max_waves_simd = cu_info.max_waves_per_simd; 1166 cu->max_waves_simd = cu_info.max_waves_per_simd;
@@ -1192,7 +1191,7 @@ static int kfd_create_vcrat_image_gpu(void *pcrat_image,
1192 * report the total FB size (public+private) as a single 1191 * report the total FB size (public+private) as a single
1193 * private heap. 1192 * private heap.
1194 */ 1193 */
1195 kdev->kfd2kgd->get_local_mem_info(kdev->kgd, &local_mem_info); 1194 amdgpu_amdkfd_get_local_mem_info(kdev->kgd, &local_mem_info);
1196 sub_type_hdr = (typeof(sub_type_hdr))((char *)sub_type_hdr + 1195 sub_type_hdr = (typeof(sub_type_hdr))((char *)sub_type_hdr +
1197 sub_type_hdr->length); 1196 sub_type_hdr->length);
1198 1197
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index a9f18ea7e354..c004647c8cb4 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -28,6 +28,7 @@
28#include "kfd_pm4_headers_vi.h" 28#include "kfd_pm4_headers_vi.h"
29#include "cwsr_trap_handler.h" 29#include "cwsr_trap_handler.h"
30#include "kfd_iommu.h" 30#include "kfd_iommu.h"
31#include "amdgpu_amdkfd.h"
31 32
32#define MQD_SIZE_ALIGNED 768 33#define MQD_SIZE_ALIGNED 768
33 34
@@ -478,7 +479,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
478 /* add another 512KB for all other allocations on gart (HPD, fences) */ 479 /* add another 512KB for all other allocations on gart (HPD, fences) */
479 size += 512 * 1024; 480 size += 512 * 1024;
480 481
481 if (kfd->kfd2kgd->init_gtt_mem_allocation( 482 if (amdgpu_amdkfd_alloc_gtt_mem(
482 kfd->kgd, size, &kfd->gtt_mem, 483 kfd->kgd, size, &kfd->gtt_mem,
483 &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr, 484 &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr,
484 false)) { 485 false)) {
@@ -552,7 +553,7 @@ kfd_topology_add_device_error:
552kfd_doorbell_error: 553kfd_doorbell_error:
553 kfd_gtt_sa_fini(kfd); 554 kfd_gtt_sa_fini(kfd);
554kfd_gtt_sa_init_error: 555kfd_gtt_sa_init_error:
555 kfd->kfd2kgd->free_gtt_mem(kfd->kgd, kfd->gtt_mem); 556 amdgpu_amdkfd_free_gtt_mem(kfd->kgd, kfd->gtt_mem);
556 dev_err(kfd_device, 557 dev_err(kfd_device,
557 "device %x:%x NOT added due to errors\n", 558 "device %x:%x NOT added due to errors\n",
558 kfd->pdev->vendor, kfd->pdev->device); 559 kfd->pdev->vendor, kfd->pdev->device);
@@ -569,7 +570,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
569 kfd_topology_remove_device(kfd); 570 kfd_topology_remove_device(kfd);
570 kfd_doorbell_fini(kfd); 571 kfd_doorbell_fini(kfd);
571 kfd_gtt_sa_fini(kfd); 572 kfd_gtt_sa_fini(kfd);
572 kfd->kfd2kgd->free_gtt_mem(kfd->kgd, kfd->gtt_mem); 573 amdgpu_amdkfd_free_gtt_mem(kfd->kgd, kfd->gtt_mem);
573 } 574 }
574 575
575 kfree(kfd); 576 kfree(kfd);
@@ -681,6 +682,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
681{ 682{
682 uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE]; 683 uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE];
683 bool is_patched = false; 684 bool is_patched = false;
685 unsigned long flags;
684 686
685 if (!kfd->init_complete) 687 if (!kfd->init_complete)
686 return; 688 return;
@@ -690,7 +692,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
690 return; 692 return;
691 } 693 }
692 694
693 spin_lock(&kfd->interrupt_lock); 695 spin_lock_irqsave(&kfd->interrupt_lock, flags);
694 696
695 if (kfd->interrupts_active 697 if (kfd->interrupts_active
696 && interrupt_is_wanted(kfd, ih_ring_entry, 698 && interrupt_is_wanted(kfd, ih_ring_entry,
@@ -699,7 +701,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
699 is_patched ? patched_ihre : ih_ring_entry)) 701 is_patched ? patched_ihre : ih_ring_entry))
700 queue_work(kfd->ih_wq, &kfd->interrupt_work); 702 queue_work(kfd->ih_wq, &kfd->interrupt_work);
701 703
702 spin_unlock(&kfd->interrupt_lock); 704 spin_unlock_irqrestore(&kfd->interrupt_lock, flags);
703} 705}
704 706
705int kgd2kfd_quiesce_mm(struct mm_struct *mm) 707int kgd2kfd_quiesce_mm(struct mm_struct *mm)
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 a3b933967171..fb9d66ea13b7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -33,6 +33,7 @@
33#include "kfd_mqd_manager.h" 33#include "kfd_mqd_manager.h"
34#include "cik_regs.h" 34#include "cik_regs.h"
35#include "kfd_kernel_queue.h" 35#include "kfd_kernel_queue.h"
36#include "amdgpu_amdkfd.h"
36 37
37/* Size of the per-pipe EOP queue */ 38/* Size of the per-pipe EOP queue */
38#define CIK_HPD_EOP_BYTES_LOG2 11 39#define CIK_HPD_EOP_BYTES_LOG2 11
@@ -219,7 +220,7 @@ static int flush_texture_cache_nocpsch(struct kfd_dev *kdev,
219 if (ret) 220 if (ret)
220 return ret; 221 return ret;
221 222
222 return kdev->kfd2kgd->submit_ib(kdev->kgd, KGD_ENGINE_MEC1, qpd->vmid, 223 return amdgpu_amdkfd_submit_ib(kdev->kgd, KGD_ENGINE_MEC1, qpd->vmid,
223 qpd->ib_base, (uint32_t *)qpd->ib_kaddr, 224 qpd->ib_base, (uint32_t *)qpd->ib_kaddr,
224 pmf->release_mem_size / sizeof(uint32_t)); 225 pmf->release_mem_size / sizeof(uint32_t));
225} 226}
@@ -672,7 +673,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm,
672 673
673 pdd = qpd_to_pdd(qpd); 674 pdd = qpd_to_pdd(qpd);
674 /* Retrieve PD base */ 675 /* Retrieve PD base */
675 pd_base = dqm->dev->kfd2kgd->get_process_page_dir(pdd->vm); 676 pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->vm);
676 677
677 dqm_lock(dqm); 678 dqm_lock(dqm);
678 if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */ 679 if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */
@@ -743,7 +744,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,
743 744
744 pdd = qpd_to_pdd(qpd); 745 pdd = qpd_to_pdd(qpd);
745 /* Retrieve PD base */ 746 /* Retrieve PD base */
746 pd_base = dqm->dev->kfd2kgd->get_process_page_dir(pdd->vm); 747 pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->vm);
747 748
748 dqm_lock(dqm); 749 dqm_lock(dqm);
749 if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */ 750 if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */
@@ -793,7 +794,7 @@ static int register_process(struct device_queue_manager *dqm,
793 794
794 pdd = qpd_to_pdd(qpd); 795 pdd = qpd_to_pdd(qpd);
795 /* Retrieve PD base */ 796 /* Retrieve PD base */
796 pd_base = dqm->dev->kfd2kgd->get_process_page_dir(pdd->vm); 797 pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->vm);
797 798
798 dqm_lock(dqm); 799 dqm_lock(dqm);
799 list_add(&n->list, &dqm->queues); 800 list_add(&n->list, &dqm->queues);
@@ -805,7 +806,7 @@ static int register_process(struct device_queue_manager *dqm,
805 retval = dqm->asic_ops.update_qpd(dqm, qpd); 806 retval = dqm->asic_ops.update_qpd(dqm, qpd);
806 807
807 if (dqm->processes_count++ == 0) 808 if (dqm->processes_count++ == 0)
808 dqm->dev->kfd2kgd->set_compute_idle(dqm->dev->kgd, false); 809 amdgpu_amdkfd_set_compute_idle(dqm->dev->kgd, false);
809 810
810 dqm_unlock(dqm); 811 dqm_unlock(dqm);
811 812
@@ -829,7 +830,7 @@ static int unregister_process(struct device_queue_manager *dqm,
829 list_del(&cur->list); 830 list_del(&cur->list);
830 kfree(cur); 831 kfree(cur);
831 if (--dqm->processes_count == 0) 832 if (--dqm->processes_count == 0)
832 dqm->dev->kfd2kgd->set_compute_idle( 833 amdgpu_amdkfd_set_compute_idle(
833 dqm->dev->kgd, true); 834 dqm->dev->kgd, true);
834 goto out; 835 goto out;
835 } 836 }
@@ -845,15 +846,8 @@ static int
845set_pasid_vmid_mapping(struct device_queue_manager *dqm, unsigned int pasid, 846set_pasid_vmid_mapping(struct device_queue_manager *dqm, unsigned int pasid,
846 unsigned int vmid) 847 unsigned int vmid)
847{ 848{
848 uint32_t pasid_mapping;
849
850 pasid_mapping = (pasid == 0) ? 0 :
851 (uint32_t)pasid |
852 ATC_VMID_PASID_MAPPING_VALID;
853
854 return dqm->dev->kfd2kgd->set_pasid_vmid_mapping( 849 return dqm->dev->kfd2kgd->set_pasid_vmid_mapping(
855 dqm->dev->kgd, pasid_mapping, 850 dqm->dev->kgd, pasid, vmid);
856 vmid);
857} 851}
858 852
859static void init_interrupts(struct device_queue_manager *dqm) 853static void init_interrupts(struct device_queue_manager *dqm)
@@ -1796,7 +1790,7 @@ static void kfd_process_hw_exception(struct work_struct *work)
1796{ 1790{
1797 struct device_queue_manager *dqm = container_of(work, 1791 struct device_queue_manager *dqm = container_of(work,
1798 struct device_queue_manager, hw_exception_work); 1792 struct device_queue_manager, hw_exception_work);
1799 dqm->dev->kfd2kgd->gpu_recover(dqm->dev->kgd); 1793 amdgpu_amdkfd_gpu_reset(dqm->dev->kgd);
1800} 1794}
1801 1795
1802#if defined(CONFIG_DEBUG_FS) 1796#if defined(CONFIG_DEBUG_FS)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
index e33019a7a883..6910028010d6 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
@@ -22,6 +22,7 @@
22 */ 22 */
23 23
24#include "kfd_mqd_manager.h" 24#include "kfd_mqd_manager.h"
25#include "amdgpu_amdkfd.h"
25 26
26struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type, 27struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type,
27 struct kfd_dev *dev) 28 struct kfd_dev *dev)
@@ -58,7 +59,7 @@ void mqd_symmetrically_map_cu_mask(struct mqd_manager *mm,
58 uint32_t cu_per_sh[4] = {0}; 59 uint32_t cu_per_sh[4] = {0};
59 int i, se, cu = 0; 60 int i, se, cu = 0;
60 61
61 mm->dev->kfd2kgd->get_cu_info(mm->dev->kgd, &cu_info); 62 amdgpu_amdkfd_get_cu_info(mm->dev->kgd, &cu_info);
62 63
63 if (cu_mask_count > cu_info.cu_active_number) 64 if (cu_mask_count > cu_info.cu_active_number)
64 cu_mask_count = cu_info.cu_active_number; 65 cu_mask_count = cu_info.cu_active_number;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
index f381c1cb27bd..9dbba609450e 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
@@ -30,6 +30,7 @@
30#include "gc/gc_9_0_offset.h" 30#include "gc/gc_9_0_offset.h"
31#include "gc/gc_9_0_sh_mask.h" 31#include "gc/gc_9_0_sh_mask.h"
32#include "sdma0/sdma0_4_0_sh_mask.h" 32#include "sdma0/sdma0_4_0_sh_mask.h"
33#include "amdgpu_amdkfd.h"
33 34
34static inline struct v9_mqd *get_mqd(void *mqd) 35static inline struct v9_mqd *get_mqd(void *mqd)
35{ 36{
@@ -83,7 +84,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
83 *mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL); 84 *mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL);
84 if (!*mqd_mem_obj) 85 if (!*mqd_mem_obj)
85 return -ENOMEM; 86 return -ENOMEM;
86 retval = kfd->kfd2kgd->init_gtt_mem_allocation(kfd->kgd, 87 retval = amdgpu_amdkfd_alloc_gtt_mem(kfd->kgd,
87 ALIGN(q->ctl_stack_size, PAGE_SIZE) + 88 ALIGN(q->ctl_stack_size, PAGE_SIZE) +
88 ALIGN(sizeof(struct v9_mqd), PAGE_SIZE), 89 ALIGN(sizeof(struct v9_mqd), PAGE_SIZE),
89 &((*mqd_mem_obj)->gtt_mem), 90 &((*mqd_mem_obj)->gtt_mem),
@@ -250,7 +251,7 @@ static void uninit_mqd(struct mqd_manager *mm, void *mqd,
250 struct kfd_dev *kfd = mm->dev; 251 struct kfd_dev *kfd = mm->dev;
251 252
252 if (mqd_mem_obj->gtt_mem) { 253 if (mqd_mem_obj->gtt_mem) {
253 kfd->kfd2kgd->free_gtt_mem(kfd->kgd, mqd_mem_obj->gtt_mem); 254 amdgpu_amdkfd_free_gtt_mem(kfd->kgd, mqd_mem_obj->gtt_mem);
254 kfree(mqd_mem_obj); 255 kfree(mqd_mem_obj);
255 } else { 256 } else {
256 kfd_gtt_sa_free(mm->dev, mqd_mem_obj); 257 kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c b/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
index 15fff4420e53..33b08ff00b50 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
@@ -22,6 +22,7 @@
22 22
23#include <linux/types.h> 23#include <linux/types.h>
24#include "kfd_priv.h" 24#include "kfd_priv.h"
25#include "amdgpu_ids.h"
25 26
26static unsigned int pasid_bits = 16; 27static unsigned int pasid_bits = 16;
27static const struct kfd2kgd_calls *kfd2kgd; 28static const struct kfd2kgd_calls *kfd2kgd;
@@ -71,7 +72,7 @@ unsigned int kfd_pasid_alloc(void)
71 return false; 72 return false;
72 } 73 }
73 74
74 r = kfd2kgd->alloc_pasid(pasid_bits); 75 r = amdgpu_pasid_alloc(pasid_bits);
75 76
76 return r > 0 ? r : 0; 77 return r > 0 ? r : 0;
77} 78}
@@ -79,5 +80,5 @@ unsigned int kfd_pasid_alloc(void)
79void kfd_pasid_free(unsigned int pasid) 80void kfd_pasid_free(unsigned int pasid)
80{ 81{
81 if (kfd2kgd) 82 if (kfd2kgd)
82 kfd2kgd->free_pasid(pasid); 83 amdgpu_pasid_free(pasid);
83} 84}
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index 53ff86d45d91..dec8e64f36bd 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -507,6 +507,7 @@ struct qcm_process_device {
507 * All the memory management data should be here too 507 * All the memory management data should be here too
508 */ 508 */
509 uint64_t gds_context_area; 509 uint64_t gds_context_area;
510 /* Contains page table flags such as AMDGPU_PTE_VALID since gfx9 */
510 uint64_t page_table_base; 511 uint64_t page_table_base;
511 uint32_t sh_mem_config; 512 uint32_t sh_mem_config;
512 uint32_t sh_mem_bases; 513 uint32_t sh_mem_bases;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 0039e451d9af..80b36e860a0a 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -31,6 +31,7 @@
31#include <linux/compat.h> 31#include <linux/compat.h>
32#include <linux/mman.h> 32#include <linux/mman.h>
33#include <linux/file.h> 33#include <linux/file.h>
34#include "amdgpu_amdkfd.h"
34 35
35struct mm_struct; 36struct mm_struct;
36 37
@@ -100,8 +101,8 @@ static void kfd_process_free_gpuvm(struct kgd_mem *mem,
100{ 101{
101 struct kfd_dev *dev = pdd->dev; 102 struct kfd_dev *dev = pdd->dev;
102 103
103 dev->kfd2kgd->unmap_memory_to_gpu(dev->kgd, mem, pdd->vm); 104 amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(dev->kgd, mem, pdd->vm);
104 dev->kfd2kgd->free_memory_of_gpu(dev->kgd, mem); 105 amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, mem);
105} 106}
106 107
107/* kfd_process_alloc_gpuvm - Allocate GPU VM for the KFD process 108/* kfd_process_alloc_gpuvm - Allocate GPU VM for the KFD process
@@ -119,16 +120,16 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,
119 int handle; 120 int handle;
120 int err; 121 int err;
121 122
122 err = kdev->kfd2kgd->alloc_memory_of_gpu(kdev->kgd, gpu_va, size, 123 err = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(kdev->kgd, gpu_va, size,
123 pdd->vm, &mem, NULL, flags); 124 pdd->vm, &mem, NULL, flags);
124 if (err) 125 if (err)
125 goto err_alloc_mem; 126 goto err_alloc_mem;
126 127
127 err = kdev->kfd2kgd->map_memory_to_gpu(kdev->kgd, mem, pdd->vm); 128 err = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(kdev->kgd, mem, pdd->vm);
128 if (err) 129 if (err)
129 goto err_map_mem; 130 goto err_map_mem;
130 131
131 err = kdev->kfd2kgd->sync_memory(kdev->kgd, mem, true); 132 err = amdgpu_amdkfd_gpuvm_sync_memory(kdev->kgd, mem, true);
132 if (err) { 133 if (err) {
133 pr_debug("Sync memory failed, wait interrupted by user signal\n"); 134 pr_debug("Sync memory failed, wait interrupted by user signal\n");
134 goto sync_memory_failed; 135 goto sync_memory_failed;
@@ -147,7 +148,7 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,
147 } 148 }
148 149
149 if (kptr) { 150 if (kptr) {
150 err = kdev->kfd2kgd->map_gtt_bo_to_kernel(kdev->kgd, 151 err = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(kdev->kgd,
151 (struct kgd_mem *)mem, kptr, NULL); 152 (struct kgd_mem *)mem, kptr, NULL);
152 if (err) { 153 if (err) {
153 pr_debug("Map GTT BO to kernel failed\n"); 154 pr_debug("Map GTT BO to kernel failed\n");
@@ -165,7 +166,7 @@ sync_memory_failed:
165 return err; 166 return err;
166 167
167err_map_mem: 168err_map_mem:
168 kdev->kfd2kgd->free_memory_of_gpu(kdev->kgd, mem); 169 amdgpu_amdkfd_gpuvm_free_memory_of_gpu(kdev->kgd, mem);
169err_alloc_mem: 170err_alloc_mem:
170 *kptr = NULL; 171 *kptr = NULL;
171 return err; 172 return err;
@@ -296,11 +297,11 @@ static void kfd_process_device_free_bos(struct kfd_process_device *pdd)
296 per_device_list) { 297 per_device_list) {
297 if (!peer_pdd->vm) 298 if (!peer_pdd->vm)
298 continue; 299 continue;
299 peer_pdd->dev->kfd2kgd->unmap_memory_to_gpu( 300 amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
300 peer_pdd->dev->kgd, mem, peer_pdd->vm); 301 peer_pdd->dev->kgd, mem, peer_pdd->vm);
301 } 302 }
302 303
303 pdd->dev->kfd2kgd->free_memory_of_gpu(pdd->dev->kgd, mem); 304 amdgpu_amdkfd_gpuvm_free_memory_of_gpu(pdd->dev->kgd, mem);
304 kfd_process_device_remove_obj_handle(pdd, id); 305 kfd_process_device_remove_obj_handle(pdd, id);
305 } 306 }
306} 307}
@@ -323,11 +324,12 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
323 pdd->dev->id, p->pasid); 324 pdd->dev->id, p->pasid);
324 325
325 if (pdd->drm_file) { 326 if (pdd->drm_file) {
326 pdd->dev->kfd2kgd->release_process_vm(pdd->dev->kgd, pdd->vm); 327 amdgpu_amdkfd_gpuvm_release_process_vm(
328 pdd->dev->kgd, pdd->vm);
327 fput(pdd->drm_file); 329 fput(pdd->drm_file);
328 } 330 }
329 else if (pdd->vm) 331 else if (pdd->vm)
330 pdd->dev->kfd2kgd->destroy_process_vm( 332 amdgpu_amdkfd_gpuvm_destroy_process_vm(
331 pdd->dev->kgd, pdd->vm); 333 pdd->dev->kgd, pdd->vm);
332 334
333 list_del(&pdd->per_device_list); 335 list_del(&pdd->per_device_list);
@@ -688,12 +690,12 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,
688 dev = pdd->dev; 690 dev = pdd->dev;
689 691
690 if (drm_file) 692 if (drm_file)
691 ret = dev->kfd2kgd->acquire_process_vm( 693 ret = amdgpu_amdkfd_gpuvm_acquire_process_vm(
692 dev->kgd, drm_file, p->pasid, 694 dev->kgd, drm_file, p->pasid,
693 &pdd->vm, &p->kgd_process_info, &p->ef); 695 &pdd->vm, &p->kgd_process_info, &p->ef);
694 else 696 else
695 ret = dev->kfd2kgd->create_process_vm( 697 ret = amdgpu_amdkfd_gpuvm_create_process_vm(dev->kgd, p->pasid,
696 dev->kgd, p->pasid, &pdd->vm, &p->kgd_process_info, &p->ef); 698 &pdd->vm, &p->kgd_process_info, &p->ef);
697 if (ret) { 699 if (ret) {
698 pr_err("Failed to create process VM object\n"); 700 pr_err("Failed to create process VM object\n");
699 return ret; 701 return ret;
@@ -714,7 +716,7 @@ err_init_cwsr:
714err_reserve_ib_mem: 716err_reserve_ib_mem:
715 kfd_process_device_free_bos(pdd); 717 kfd_process_device_free_bos(pdd);
716 if (!drm_file) 718 if (!drm_file)
717 dev->kfd2kgd->destroy_process_vm(dev->kgd, pdd->vm); 719 amdgpu_amdkfd_gpuvm_destroy_process_vm(dev->kgd, pdd->vm);
718 pdd->vm = NULL; 720 pdd->vm = NULL;
719 721
720 return ret; 722 return ret;
@@ -972,7 +974,7 @@ static void restore_process_worker(struct work_struct *work)
972 */ 974 */
973 975
974 p->last_restore_timestamp = get_jiffies_64(); 976 p->last_restore_timestamp = get_jiffies_64();
975 ret = pdd->dev->kfd2kgd->restore_process_bos(p->kgd_process_info, 977 ret = amdgpu_amdkfd_gpuvm_restore_process_bos(p->kgd_process_info,
976 &p->ef); 978 &p->ef);
977 if (ret) { 979 if (ret) {
978 pr_debug("Failed to restore BOs of pasid %d, retry after %d ms\n", 980 pr_debug("Failed to restore BOs of pasid %d, retry after %d ms\n",
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index e3843c5929ed..c73b4ff61f99 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -36,6 +36,7 @@
36#include "kfd_topology.h" 36#include "kfd_topology.h"
37#include "kfd_device_queue_manager.h" 37#include "kfd_device_queue_manager.h"
38#include "kfd_iommu.h" 38#include "kfd_iommu.h"
39#include "amdgpu_amdkfd.h"
39 40
40/* topology_device_list - Master list of all topology devices */ 41/* topology_device_list - Master list of all topology devices */
41static struct list_head topology_device_list; 42static struct list_head topology_device_list;
@@ -1052,7 +1053,7 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
1052 if (!gpu) 1053 if (!gpu)
1053 return 0; 1054 return 0;
1054 1055
1055 gpu->kfd2kgd->get_local_mem_info(gpu->kgd, &local_mem_info); 1056 amdgpu_amdkfd_get_local_mem_info(gpu->kgd, &local_mem_info);
1056 1057
1057 local_mem_size = local_mem_info.local_mem_size_private + 1058 local_mem_size = local_mem_info.local_mem_size_private +
1058 local_mem_info.local_mem_size_public; 1059 local_mem_info.local_mem_size_public;
@@ -1118,8 +1119,7 @@ static void kfd_fill_mem_clk_max_info(struct kfd_topology_device *dev)
1118 * for APUs - If CRAT from ACPI reports more than one bank, then 1119 * for APUs - If CRAT from ACPI reports more than one bank, then
1119 * all the banks will report the same mem_clk_max information 1120 * all the banks will report the same mem_clk_max information
1120 */ 1121 */
1121 dev->gpu->kfd2kgd->get_local_mem_info(dev->gpu->kgd, 1122 amdgpu_amdkfd_get_local_mem_info(dev->gpu->kgd, &local_mem_info);
1122 &local_mem_info);
1123 1123
1124 list_for_each_entry(mem, &dev->mem_props, list) 1124 list_for_each_entry(mem, &dev->mem_props, list)
1125 mem->mem_clk_max = local_mem_info.mem_clk_max; 1125 mem->mem_clk_max = local_mem_info.mem_clk_max;
@@ -1240,7 +1240,7 @@ int kfd_topology_add_device(struct kfd_dev *gpu)
1240 * needed for the topology 1240 * needed for the topology
1241 */ 1241 */
1242 1242
1243 dev->gpu->kfd2kgd->get_cu_info(dev->gpu->kgd, &cu_info); 1243 amdgpu_amdkfd_get_cu_info(dev->gpu->kgd, &cu_info);
1244 dev->node_props.simd_arrays_per_engine = 1244 dev->node_props.simd_arrays_per_engine =
1245 cu_info.num_shader_arrays_per_engine; 1245 cu_info.num_shader_arrays_per_engine;
1246 1246
@@ -1249,7 +1249,7 @@ int kfd_topology_add_device(struct kfd_dev *gpu)
1249 dev->node_props.location_id = PCI_DEVID(gpu->pdev->bus->number, 1249 dev->node_props.location_id = PCI_DEVID(gpu->pdev->bus->number,
1250 gpu->pdev->devfn); 1250 gpu->pdev->devfn);
1251 dev->node_props.max_engine_clk_fcompute = 1251 dev->node_props.max_engine_clk_fcompute =
1252 dev->gpu->kfd2kgd->get_max_engine_clock_in_mhz(dev->gpu->kgd); 1252 amdgpu_amdkfd_get_max_engine_clock_in_mhz(dev->gpu->kgd);
1253 dev->node_props.max_engine_clk_ccompute = 1253 dev->node_props.max_engine_clk_ccompute =
1254 cpufreq_quick_get_max(0) / 1000; 1254 cpufreq_quick_get_max(0) / 1000;
1255 dev->node_props.drm_render_minor = 1255 dev->node_props.drm_render_minor =