Merge tag 'amd-drm-next-5.10-2020-09-03' of git://people.freedesktop.org/~agd5f/linux...
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_dma_buf.c
index 519ce44..427a7c5 100644 (file)
@@ -35,6 +35,7 @@
 #include "amdgpu_display.h"
 #include "amdgpu_gem.h"
 #include "amdgpu_dma_buf.h"
+#include "amdgpu_xgmi.h"
 #include <drm/amdgpu_drm.h>
 #include <linux/dma-buf.h>
 #include <linux/dma-fence-array.h>
@@ -454,7 +455,7 @@ static struct drm_gem_object *
 amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
 {
        struct dma_resv *resv = dma_buf->resv;
-       struct amdgpu_device *adev = dev->dev_private;
+       struct amdgpu_device *adev = drm_to_adev(dev);
        struct amdgpu_bo *bo;
        struct amdgpu_bo_param bp;
        int ret;
@@ -595,3 +596,36 @@ struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev,
        obj->import_attach = attach;
        return obj;
 }
+
+/**
+ * amdgpu_dmabuf_is_xgmi_accessible - Check if xgmi available for P2P transfer
+ *
+ * @adev: amdgpu_device pointer of the importer
+ * @bo: amdgpu buffer object
+ *
+ * Returns:
+ * True if dmabuf accessible over xgmi, false otherwise.
+ */
+bool amdgpu_dmabuf_is_xgmi_accessible(struct amdgpu_device *adev,
+                                     struct amdgpu_bo *bo)
+{
+       struct drm_gem_object *obj = &bo->tbo.base;
+       struct drm_gem_object *gobj;
+
+       if (obj->import_attach) {
+               struct dma_buf *dma_buf = obj->import_attach->dmabuf;
+
+               if (dma_buf->ops != &amdgpu_dmabuf_ops)
+                       /* No XGMI with non AMD GPUs */
+                       return false;
+
+               gobj = dma_buf->priv;
+               bo = gem_to_amdgpu_bo(gobj);
+       }
+
+       if (amdgpu_xgmi_same_hive(adev, amdgpu_ttm_adev(bo->tbo.bdev)) &&
+                       (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM))
+               return true;
+
+       return false;
+}