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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
From 2cedb24cf8ae3857d9c64eb54ca3b110bb076fe8 Mon Sep 17 00:00:00 2001
From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Date: Fri, 18 Nov 2016 17:30:00 -0500
Subject: [PATCH 1559/4131] drm/amdgpu: Export dmabuf support for KFD BOs
Change-Id: Id0a30c029f1c9d0eff8fc76df40d391a3cddfdbb
Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 2 ++
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 27 +++++++++++++++++++++++
drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 4 ++++
6 files changed, 37 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 11b759e..ee6069f 100755
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -408,6 +408,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);
struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev,
struct dma_buf *dma_buf);
int amdgpu_gem_prime_pin(struct drm_gem_object *obj);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 9c8c941..362132b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -195,6 +195,8 @@ void amdgpu_amdkfd_gpuvm_unpin_put_sg_table(
int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd,
uint64_t va, void *vm,
struct kgd_mem **mem, uint64_t *size);
+int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm,
+ struct kgd_mem *mem, int *dmabuf_fd);
int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm);
int amdgpu_amdkfd_gpuvm_restore_mem(struct kgd_mem *mem, struct mm_struct *mm);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index 7ab108e..4896541 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -224,6 +224,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
.unpin_put_sg_table_bo = amdgpu_amdkfd_gpuvm_unpin_put_sg_table,
.get_dmabuf_info = amdgpu_amdkfd_get_dmabuf_info,
.import_dmabuf = amdgpu_amdkfd_gpuvm_import_dmabuf,
+ .export_dmabuf = amdgpu_amdkfd_gpuvm_export_dmabuf,
.get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info,
.submit_ib = amdgpu_amdkfd_submit_ib,
.get_tile_config = amdgpu_amdkfd_get_tile_config,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index ba316e8..60dafce 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -203,6 +203,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
.unpin_put_sg_table_bo = amdgpu_amdkfd_gpuvm_unpin_put_sg_table,
.get_dmabuf_info = amdgpu_amdkfd_get_dmabuf_info,
.import_dmabuf = amdgpu_amdkfd_gpuvm_import_dmabuf,
+ .export_dmabuf = amdgpu_amdkfd_gpuvm_export_dmabuf,
.get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info,
.submit_ib = amdgpu_amdkfd_submit_ib,
.get_tile_config = amdgpu_amdkfd_get_tile_config,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 0926000..3a7bfa1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -1845,6 +1845,33 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd,
return r;
}
+int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm,
+ struct kgd_mem *mem, int *dmabuf_fd)
+{
+ struct dma_buf *dmabuf;
+ struct amdgpu_device *adev = NULL;
+ struct amdgpu_bo *bo = NULL;
+ struct drm_gem_object *gobj = NULL;
+
+ if (!dmabuf_fd || !kgd || !vm || !mem)
+ return -EINVAL;
+
+ adev = get_amdgpu_device(kgd);
+ bo = mem->bo;
+
+ gobj = amdgpu_gem_prime_foreign_bo(adev, bo);
+ if (gobj == NULL) {
+ pr_err("Export BO failed. Unable to find/create GEM object\n");
+ return -EINVAL;
+ }
+
+ dmabuf = amdgpu_gem_prime_export(adev->ddev, gobj, 0);
+ *dmabuf_fd = dma_buf_fd(dmabuf, 0);
+
+ pr_debug("Exported: %d\n", *dmabuf_fd);
+ return 0;
+}
+
/* Runs out of process context. mem->lock must be held. */
int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm)
{
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
index 910dca1..68b72cd 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -217,6 +217,8 @@ struct tile_config {
* @import_dmabuf: Imports a DMA buffer, creating a new kgd_mem object
* Supports only DMA buffers created by GPU driver on the same GPU
*
+ * @export_dmabuf: Emports a KFD BO for sharing with other process
+ *
* @submit_ib: Submits an IB to the engine specified by inserting the IB to
* the corresonded ring (ring type).
*
@@ -355,6 +357,8 @@ struct kfd2kgd_calls {
uint32_t *metadata_size, uint32_t *flags);
int (*import_dmabuf)(struct kgd_dev *kgd, int dma_buf_fd, uint64_t va,
void *vm, struct kgd_mem **mem, uint64_t *size);
+ int (*export_dmabuf)(struct kgd_dev *kgd, void *vm, struct kgd_mem *mem,
+ int *dma_buf_fd);
int (*get_vm_fault_info)(struct kgd_dev *kgd,
struct kfd_vm_fault_info *info);
--
2.7.4
|