From: Felix Kuehling <felix.kuehl...@amd.com>

[ Upstream commit a92741e72f91b904c1d8c3d409ed8dbe9c1f2b26 ]

If peer memory is accessible through XGMI, allow leaving it in VRAM
rather than forcing its migration to GTT on DMABuf attachment.

Signed-off-by: Felix Kuehling <felix.kuehl...@amd.com>
Tested-by: Hao (Claire) Zhou <hao.z...@amd.com>
Reviewed-by: Christian König <christian.koe...@amd.com>
Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
(cherry picked from commit 372c8d72c3680fdea3fbb2d6b089f76b4a6d596a)
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 30 ++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
index ab06cb4d7b358..4dcc7de961d08 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
@@ -42,6 +42,29 @@
 #include <linux/pci-p2pdma.h>
 #include <linux/pm_runtime.h>
 
+static const struct dma_buf_attach_ops amdgpu_dma_buf_attach_ops;
+
+/**
+ * dma_buf_attach_adev - Helper to get adev of an attachment
+ *
+ * @attach: attachment
+ *
+ * Returns:
+ * A struct amdgpu_device * if the attaching device is an amdgpu device or
+ * partition, NULL otherwise.
+ */
+static struct amdgpu_device *dma_buf_attach_adev(struct dma_buf_attachment 
*attach)
+{
+       if (attach->importer_ops == &amdgpu_dma_buf_attach_ops) {
+               struct drm_gem_object *obj = attach->importer_priv;
+               struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
+
+               return amdgpu_ttm_adev(bo->tbo.bdev);
+       }
+
+       return NULL;
+}
+
 /**
  * amdgpu_dma_buf_attach - &dma_buf_ops.attach implementation
  *
@@ -53,12 +76,14 @@
 static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf,
                                 struct dma_buf_attachment *attach)
 {
+       struct amdgpu_device *attach_adev = dma_buf_attach_adev(attach);
        struct drm_gem_object *obj = dmabuf->priv;
        struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
        struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
        int r;
 
-       if (pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0)
+       if (!amdgpu_dmabuf_is_xgmi_accessible(attach_adev, bo) &&
+           pci_p2pdma_distance(adev->pdev, attach->dev, false) < 0)
                attach->peer2peer = false;
 
        r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
@@ -479,6 +504,9 @@ bool amdgpu_dmabuf_is_xgmi_accessible(struct amdgpu_device 
*adev,
        struct drm_gem_object *obj = &bo->tbo.base;
        struct drm_gem_object *gobj;
 
+       if (!adev)
+               return false;
+
        if (obj->import_attach) {
                struct dma_buf *dma_buf = obj->import_attach->dmabuf;
 
-- 
2.39.5

Reply via email to