[PATCH 5/6] drm/amdgpu: add checks if DMA-buf P2P is supported
Christian König
ckoenig.leichtzumerken at gmail.com
Thu Apr 18 12:09:27 UTC 2019
Check if we can do peer2peer on the PCIe bus.
Signed-off-by: Christian König <christian.koenig at amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
index af103b7e21e8..a290ae830b11 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
@@ -39,6 +39,7 @@
#include <drm/amdgpu_drm.h>
#include <linux/dma-buf.h>
#include <linux/dma-fence-array.h>
+#include <linux/pci-p2pdma.h>
/**
* amdgpu_gem_prime_vmap - &dma_buf_ops.vmap implementation
@@ -254,13 +255,27 @@ static int amdgpu_gem_dma_buf_attach(struct dma_buf *dma_buf,
{
struct drm_gem_object *obj = dma_buf->priv;
struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
+ struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
+
+ if (!attach->peer2peer)
+ goto no_peer2peer;
+
+ if (!dev_is_pci(attach->dev))
+ goto no_peer2peer;
+
+ if (pci_p2pdma_distance_many(adev->pdev, &attach->dev, 1, true) < 0)
+ goto no_peer2peer;
+
+ return 0;
+
+no_peer2peer:
+ attach->peer2peer = false;
/* Make sure the buffer is pinned when userspace didn't set GTT as
* preferred domain. This avoid ping/pong situations with scan out BOs.
*/
if (!(bo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT))
attach->invalidate = NULL;
-
return 0;
}
--
2.17.1
More information about the dri-devel
mailing list