1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
From 48ed61e8949ea55e17e55d36a3b98e60a4b3d755 Mon Sep 17 00:00:00 2001
From: Jim Qu <Jim.Qu@amd.com>
Date: Tue, 16 Jan 2018 13:40:45 +0800
Subject: [PATCH 1098/4131] amd/amdgpu: keep amdgpu_gem_prime_foreign_bo() for
KFD
Change-Id: Id9cf262c8af087be57c5b9cf436d4c7cd0ec7c76
Signed-off-by: Jim Qu <Jim.Qu@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++
drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 40 +++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 0bf2f63..fe23de8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -419,6 +419,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 408af41..458e99a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
@@ -161,3 +161,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;
+}
+
--
2.7.4
|