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.koe...@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

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to