]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/radeon/radeon_prime.c
Merge tag 'usb-4.3-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[karo-tx-linux.git] / drivers / gpu / drm / radeon / radeon_prime.c
index 0b16f2cbcf170b5a9a6d23b6683eedb827b890b4..f3609c97496b2f56bf35cfbe2cf52f76b30b9f79 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "radeon.h"
 #include <drm/radeon_drm.h>
+#include <linux/dma-buf.h>
 
 struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj)
 {
@@ -57,15 +58,18 @@ void radeon_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 }
 
 struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
-                                                       size_t size,
+                                                       struct dma_buf_attachment *attach,
                                                        struct sg_table *sg)
 {
+       struct reservation_object *resv = attach->dmabuf->resv;
        struct radeon_device *rdev = dev->dev_private;
        struct radeon_bo *bo;
        int ret;
 
-       ret = radeon_bo_create(rdev, size, PAGE_SIZE, false,
-                              RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
+       ww_mutex_lock(&resv->lock, NULL);
+       ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
+                              RADEON_GEM_DOMAIN_GTT, 0, sg, resv, &bo);
+       ww_mutex_unlock(&resv->lock);
        if (ret)
                return ERR_PTR(ret);
 
@@ -111,3 +115,13 @@ struct reservation_object *radeon_gem_prime_res_obj(struct drm_gem_object *obj)
 
        return bo->tbo.resv;
 }
+
+struct dma_buf *radeon_gem_prime_export(struct drm_device *dev,
+                                       struct drm_gem_object *gobj,
+                                       int flags)
+{
+       struct radeon_bo *bo = gem_to_radeon_bo(gobj);
+       if (radeon_ttm_tt_has_userptr(bo->tbo.ttm))
+               return ERR_PTR(-EPERM);
+       return drm_gem_prime_export(dev, gobj, flags);
+}