aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-10-28 20:49:53 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-10-28 20:49:53 -0400
commit53b3b6bbfde6aae8d1ededc86ad4e0e1e00eb5f8 (patch)
treeb29473f21270aefd113b298c9402be8b4b3c91b4 /drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
parent746bb4ed6d626f3f9e431a7f9b20504538e62ded (diff)
parentf2bfc71aee75feff33ca659322b72ffeed5a243d (diff)
Merge tag 'drm-next-2018-10-24' of git://anongit.freedesktop.org/drm/drm
Pull drm updates from Dave Airlie: "This is going to rebuild more than drm as it adds a new helper to list.h for doing bulk updates. Seemed like a reasonable addition to me. Otherwise the usual merge window stuff lots of i915 and amdgpu, not so much nouveau, and piles of everything else. Core: - Adds a new list.h helper for doing bulk list updates for TTM. - Don't leak fb address in smem_start to userspace (comes with EXPORT workaround for people using mali out of tree hacks) - udmabuf device to turn memfd regions into dma-buf - Per-plane blend mode property - ref/unref replacements with get/put - fbdev conflicting framebuffers code cleaned up - host-endian format variants - panel orientation quirk for Acer One 10 bridge: - TI SN65DSI86 chip support vkms: - GEM support. - Cursor support amdgpu: - Merge amdkfd and amdgpu into one module - CEC over DP AUX support - Picasso APU support + VCN dynamic powergating - Raven2 APU support - Vega20 enablement + kfd support - ACP powergating improvements - ABGR/XBGR display support - VCN jpeg support - xGMI support - DC i2c/aux cleanup - Ycbcr 4:2:0 support - GPUVM improvements - Powerplay and powerplay endian fixes - Display underflow fixes vmwgfx: - Move vmwgfx specific TTM code to vmwgfx - Split out vmwgfx buffer/resource validation code - Atomic operation rework bochs: - use more helpers - format/byteorder improvements qxl: - use more helpers i915: - GGTT coherency getparam - Turn off resource streamer API - More Icelake enablement + DMC firmware - Full PPGTT for Ivybridge, Haswell and Valleyview - DDB distribution based on resolution - Limited range DP display support nouveau: - CEC over DP AUX support - Initial HDMI 2.0 support virtio-gpu: - vmap support for PRIME objects tegra: - Initial Tegra194 support - DMA/IOMMU integration fixes msm: - a6xx perf improvements + clock prefix - GPU preemption optimisations - a6xx devfreq support - cursor support rockchip: - PX30 support - rgb output interface support mediatek: - HDMI output support on mt2701 and mt7623 rcar-du: - Interlaced modes on Gen3 - LVDS on R8A77980 - D3 and E3 SoC support hisilicon: - misc fixes mxsfb: - runtime pm support sun4i: - R40 TCON support - Allwinner A64 support - R40 HDMI support omapdrm: - Driver rework changing display pipeline ordering to use common code - DMM memory barrier and irq fixes - Errata workarounds exynos: - out-bridge support for LVDS bridge driver - Samsung 16x16 tiled format support - Plane alpha and pixel blend mode support tilcdc: - suspend/resume update mali-dp: - misc updates" * tag 'drm-next-2018-10-24' of git://anongit.freedesktop.org/drm/drm: (1382 commits) firmware/dmc/icl: Add missing MODULE_FIRMWARE() for Icelake. drm/i915/icl: Fix signal_levels drm/i915/icl: Fix DDI/TC port clk_off bits drm/i915/icl: create function to identify combophy port drm/i915/gen9+: Fix initial readout for Y tiled framebuffers drm/i915: Large page offsets for pread/pwrite drm/i915/selftests: Disable shrinker across mmap-exhaustion drm/i915/dp: Link train Fallback on eDP only if fallback link BW can fit panel's native mode drm/i915: Fix intel_dp_mst_best_encoder() drm/i915: Skip vcpi allocation for MSTB ports that are gone drm/i915: Don't unset intel_connector->mst_port drm/i915: Only reset seqno if actually idle drm/i915: Use the correct crtc when sanitizing plane mapping drm/i915: Restore vblank interrupts earlier drm/i915: Check fb stride against plane max stride drm/amdgpu/vcn:Fix uninitialized symbol error drm: panel-orientation-quirks: Add quirk for Acer One 10 (S1003) drm/amd/amdgpu: Fix debugfs error handling drm/amdgpu: Update gc_9_0 golden settings. drm/amd/powerplay: update PPtable with DC BTC and Tvr SocLimit fields ...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c44
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
1006int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm, 1001int 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
1041int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd, 1036int 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
1120uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) 1115void 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
1134uint64_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
1127int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( 1145int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(