diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index f92597c292fe..df0a059565f9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | |||
| @@ -364,7 +364,6 @@ static int vm_validate_pt_pd_bos(struct amdgpu_vm *vm) | |||
| 364 | struct amdgpu_bo *pd = vm->root.base.bo; | 364 | struct amdgpu_bo *pd = vm->root.base.bo; |
| 365 | struct amdgpu_device *adev = amdgpu_ttm_adev(pd->tbo.bdev); | 365 | struct amdgpu_device *adev = amdgpu_ttm_adev(pd->tbo.bdev); |
| 366 | struct amdgpu_vm_parser param; | 366 | struct amdgpu_vm_parser param; |
| 367 | uint64_t addr, flags = AMDGPU_PTE_VALID; | ||
| 368 | int ret; | 367 | int ret; |
| 369 | 368 | ||
| 370 | param.domain = AMDGPU_GEM_DOMAIN_VRAM; | 369 | param.domain = AMDGPU_GEM_DOMAIN_VRAM; |
| @@ -383,9 +382,7 @@ static int vm_validate_pt_pd_bos(struct amdgpu_vm *vm) | |||
| 383 | return ret; | 382 | return ret; |
| 384 | } | 383 | } |
| 385 | 384 | ||
| 386 | addr = amdgpu_bo_gpu_offset(vm->root.base.bo); | 385 | vm->pd_phys_addr = amdgpu_gmc_pd_addr(vm->root.base.bo); |
| 387 | amdgpu_gmc_get_vm_pde(adev, -1, &addr, &flags); | ||
| 388 | vm->pd_phys_addr = addr; | ||
| 389 | 386 | ||
| 390 | if (vm->use_cpu_for_update) { | 387 | if (vm->use_cpu_for_update) { |
| 391 | ret = amdgpu_bo_kmap(pd, NULL); | 388 | ret = amdgpu_bo_kmap(pd, NULL); |
| @@ -678,7 +675,6 @@ static int reserve_bo_and_vm(struct kgd_mem *mem, | |||
| 678 | if (!ctx->vm_pd) | 675 | if (!ctx->vm_pd) |
| 679 | return -ENOMEM; | 676 | return -ENOMEM; |
| 680 | 677 | ||
| 681 | ctx->kfd_bo.robj = bo; | ||
| 682 | ctx->kfd_bo.priority = 0; | 678 | ctx->kfd_bo.priority = 0; |
| 683 | ctx->kfd_bo.tv.bo = &bo->tbo; | 679 | ctx->kfd_bo.tv.bo = &bo->tbo; |
| 684 | ctx->kfd_bo.tv.shared = true; | 680 | ctx->kfd_bo.tv.shared = true; |
| @@ -743,7 +739,6 @@ static int reserve_bo_and_cond_vms(struct kgd_mem *mem, | |||
| 743 | return -ENOMEM; | 739 | return -ENOMEM; |
| 744 | } | 740 | } |
| 745 | 741 | ||
| 746 | ctx->kfd_bo.robj = bo; | ||
| 747 | ctx->kfd_bo.priority = 0; | 742 | ctx->kfd_bo.priority = 0; |
| 748 | ctx->kfd_bo.tv.bo = &bo->tbo; | 743 | ctx->kfd_bo.tv.bo = &bo->tbo; |
| 749 | ctx->kfd_bo.tv.shared = true; | 744 | ctx->kfd_bo.tv.shared = true; |
| @@ -1003,8 +998,8 @@ create_evict_fence_fail: | |||
| 1003 | return ret; | 998 | return ret; |
| 1004 | } | 999 | } |
| 1005 | 1000 | ||
| 1006 | int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm, | 1001 | int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, unsigned int pasid, |
| 1007 | void **process_info, | 1002 | void **vm, void **process_info, |
| 1008 | struct dma_fence **ef) | 1003 | struct dma_fence **ef) |
| 1009 | { | 1004 | { |
| 1010 | struct amdgpu_device *adev = get_amdgpu_device(kgd); | 1005 | struct amdgpu_device *adev = get_amdgpu_device(kgd); |
| @@ -1016,7 +1011,7 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm, | |||
| 1016 | return -ENOMEM; | 1011 | return -ENOMEM; |
| 1017 | 1012 | ||
| 1018 | /* Initialize AMDGPU part of the VM */ | 1013 | /* Initialize AMDGPU part of the VM */ |
| 1019 | ret = amdgpu_vm_init(adev, new_vm, AMDGPU_VM_CONTEXT_COMPUTE, 0); | 1014 | ret = amdgpu_vm_init(adev, new_vm, AMDGPU_VM_CONTEXT_COMPUTE, pasid); |
| 1020 | if (ret) { | 1015 | if (ret) { |
| 1021 | pr_err("Failed init vm ret %d\n", ret); | 1016 | pr_err("Failed init vm ret %d\n", ret); |
| 1022 | goto amdgpu_vm_init_fail; | 1017 | goto amdgpu_vm_init_fail; |
| @@ -1039,7 +1034,7 @@ amdgpu_vm_init_fail: | |||
| 1039 | } | 1034 | } |
| 1040 | 1035 | ||
| 1041 | int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd, | 1036 | int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd, |
| 1042 | struct file *filp, | 1037 | struct file *filp, unsigned int pasid, |
| 1043 | void **vm, void **process_info, | 1038 | void **vm, void **process_info, |
| 1044 | struct dma_fence **ef) | 1039 | struct dma_fence **ef) |
| 1045 | { | 1040 | { |
| @@ -1054,7 +1049,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd, | |||
| 1054 | return -EINVAL; | 1049 | return -EINVAL; |
| 1055 | 1050 | ||
| 1056 | /* Convert VM into a compute VM */ | 1051 | /* Convert VM into a compute VM */ |
| 1057 | ret = amdgpu_vm_make_compute(adev, avm); | 1052 | ret = amdgpu_vm_make_compute(adev, avm, pasid); |
| 1058 | if (ret) | 1053 | if (ret) |
| 1059 | return ret; | 1054 | return ret; |
| 1060 | 1055 | ||
| @@ -1117,11 +1112,34 @@ void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm) | |||
| 1117 | kfree(vm); | 1112 | kfree(vm); |
| 1118 | } | 1113 | } |
| 1119 | 1114 | ||
| 1120 | uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) | 1115 | void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm) |
| 1116 | { | ||
| 1117 | struct amdgpu_device *adev = get_amdgpu_device(kgd); | ||
| 1118 | struct amdgpu_vm *avm = (struct amdgpu_vm *)vm; | ||
| 1119 | |||
| 1120 | if (WARN_ON(!kgd || !vm)) | ||
| 1121 | return; | ||
| 1122 | |||
| 1123 | pr_debug("Releasing process vm %p\n", vm); | ||
| 1124 | |||
| 1125 | /* The original pasid of amdgpu vm has already been | ||
| 1126 | * released during making a amdgpu vm to a compute vm | ||
| 1127 | * The current pasid is managed by kfd and will be | ||
| 1128 | * released on kfd process destroy. Set amdgpu pasid | ||
| 1129 | * to 0 to avoid duplicate release. | ||
| 1130 | */ | ||
| 1131 | amdgpu_vm_release_compute(adev, avm); | ||
| 1132 | } | ||
| 1133 | |||
| 1134 | uint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) | ||
| 1121 | { | 1135 | { |
| 1122 | struct amdgpu_vm *avm = (struct amdgpu_vm *)vm; | 1136 | struct amdgpu_vm *avm = (struct amdgpu_vm *)vm; |
| 1137 | struct amdgpu_bo *pd = avm->root.base.bo; | ||
| 1138 | struct amdgpu_device *adev = amdgpu_ttm_adev(pd->tbo.bdev); | ||
| 1123 | 1139 | ||
| 1124 | return avm->pd_phys_addr >> AMDGPU_GPU_PAGE_SHIFT; | 1140 | if (adev->asic_type < CHIP_VEGA10) |
| 1141 | return avm->pd_phys_addr >> AMDGPU_GPU_PAGE_SHIFT; | ||
| 1142 | return avm->pd_phys_addr; | ||
| 1125 | } | 1143 | } |
| 1126 | 1144 | ||
| 1127 | int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( | 1145 | int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( |
