summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Qu <Jim.Qu@amd.com>2018-01-16 13:40:45 +0800
committerJim Qu <Jim.Qu@amd.com>2018-01-16 14:00:30 +0800
commit65aef37ab80e5129b4b4fce825cf26bf6f92cdb9 (patch)
treea3af5328708ca1cccea6d60596bc1886c62a18be
parent0955e1b914d159c0be713f734ad24ca35b0417a2 (diff)
amd/amdgpu: keep amdgpu_gem_prime_foreign_bo() for KFDamd-17.50
Change-Id: Id9cf262c8af087be57c5b9cf436d4c7cd0ec7c76 Signed-off-by: Jim Qu <Jim.Qu@amd.com> Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c40
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 53690c3eb481..546f420046a7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -421,6 +421,8 @@ amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
struct drm_gem_object *gobj,
int flags);
+struct drm_gem_object *
+amdgpu_gem_prime_foreign_bo(struct amdgpu_device *adev, struct amdgpu_bo *bo);
int amdgpu_gem_prime_pin(struct drm_gem_object *obj);
void amdgpu_gem_prime_unpin(struct drm_gem_object *obj);
struct reservation_object *amdgpu_gem_prime_res_obj(struct drm_gem_object *);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
index 3d37740eec2a..47cb7537157b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
@@ -160,3 +160,43 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
return drm_gem_prime_export(dev, gobj, flags);
}
+
+struct drm_gem_object *
+amdgpu_gem_prime_foreign_bo(struct amdgpu_device *adev, struct amdgpu_bo *bo)
+{
+ struct amdgpu_gem_object *gobj;
+ int r;
+
+ ww_mutex_lock(&bo->tbo.resv->lock, NULL);
+
+ list_for_each_entry(gobj, &bo->gem_objects, list) {
+ if (gobj->base.dev != adev->ddev)
+ continue;
+
+ ww_mutex_unlock(&bo->tbo.resv->lock);
+ drm_gem_object_reference(&gobj->base);
+ return &gobj->base;
+ }
+
+
+ gobj = kzalloc(sizeof(struct amdgpu_gem_object), GFP_KERNEL);
+ if (unlikely(!gobj)) {
+ ww_mutex_unlock(&bo->tbo.resv->lock);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ r = drm_gem_object_init(adev->ddev, &gobj->base, amdgpu_bo_size(bo));
+ if (unlikely(r)) {
+ kfree(gobj);
+ ww_mutex_unlock(&bo->tbo.resv->lock);
+ return ERR_PTR(r);
+ }
+
+ list_add(&gobj->list, &bo->gem_objects);
+ gobj->bo = amdgpu_bo_ref(bo);
+ bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
+
+ ww_mutex_unlock(&bo->tbo.resv->lock);
+
+ return &gobj->base;
+}