Move amd_iommu_v2 initialization into amdgpu when it is enabled. This is WIP and really ugly since amdgpu should not depend directly on amd_iommu_v2. Signed-off-by: Christian König <christian.koenig at amd.com> --- drivers/gpu/drm/amd/amdgpu/Kconfig | 8 ++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 12 ++++++++++++ drivers/gpu/drm/amd/amdkfd/kfd_device.c | 11 ++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig index e8af1f5e8a79..7d3fdcbf0acb 100644 --- a/drivers/gpu/drm/amd/amdgpu/Kconfig +++ b/drivers/gpu/drm/amd/amdgpu/Kconfig @@ -40,5 +40,13 @@ config DRM_AMDGPU_GART_DEBUGFS Selecting this option creates a debugfs file to inspect the mapped pages. Uses more memory for housekeeping, enable only for debugging. +config DRM_AMDGPU_ATC + bool "Enable the ATC to provide SVM support" + depends on DRM_AMDGPU + depends on AMD_IOMMU_V2 + default y + help + This enables support for the ATC to provide a shared virtual memory implementation. + source "drivers/gpu/drm/amd/acp/Kconfig" source "drivers/gpu/drm/amd/display/Kconfig" diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 84281ee34a25..04205236cc5e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -35,6 +35,7 @@ #include <linux/vgaarb.h> #include <linux/vga_switcheroo.h> #include <linux/efi.h> +#include <linux/amd-iommu.h> #include "amdgpu.h" #include "amdgpu_trace.h" #include "amdgpu_i2c.h" @@ -1355,6 +1356,12 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) adev->ip_blocks[i].status.hw = true; } +#ifdef CONFIG_DRM_AMDGPU_ATC + r = amd_iommu_init_device(adev->pdev, 0x10000); + if (r) + DRM_ERROR("amd_iommu_init_device error %d\n", r); +#endif + amdgpu_amdkfd_device_init(adev); if (amdgpu_sriov_vf(adev)) @@ -1428,6 +1435,11 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev) int i, r; amdgpu_amdkfd_device_fini(adev); + +#ifdef CONFIG_DRM_AMDGPU_ATC + amd_iommu_free_device(adev->pdev); +#endif + /* need to disable SMC first */ for (i = 0; i < adev->num_ip_blocks; i++) { if (!adev->ip_blocks[i].status.hw) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index a8fa33a08de3..7ed090f7c5f0 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c @@ -373,7 +373,10 @@ void kgd2kfd_suspend(struct kfd_dev *kfd) amd_iommu_set_invalidate_ctx_cb(kfd->pdev, NULL); amd_iommu_set_invalid_ppr_cb(kfd->pdev, NULL); + +#ifndef CONFIG_DRM_AMDGPU_ATC amd_iommu_free_device(kfd->pdev); +#endif } int kgd2kfd_resume(struct kfd_dev *kfd) @@ -388,11 +391,15 @@ int kgd2kfd_resume(struct kfd_dev *kfd) static int kfd_resume(struct kfd_dev *kfd) { int err = 0; + +#ifndef CONFIG_DRM_AMDGPU_ATC unsigned int pasid_limit = kfd_get_pasid_limit(); err = amd_iommu_init_device(kfd->pdev, pasid_limit); if (err) return -ENXIO; +#endif + amd_iommu_set_invalidate_ctx_cb(kfd->pdev, iommu_pasid_shutdown_callback); amd_iommu_set_invalid_ppr_cb(kfd->pdev, @@ -414,8 +421,10 @@ static int kfd_resume(struct kfd_dev *kfd) dqm_start_error: processes_bind_error: - amd_iommu_free_device(kfd->pdev); +#ifndef CONFIG_DRM_AMDGPU_ATC + amd_iommu_free_device(kfd->pdev); +#endif return err; } -- 2.14.1