diff options
author | Christian König <christian.koenig@amd.com> | 2016-09-09 10:32:33 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-09-28 16:16:19 -0400 |
commit | bb990bb09235a3cc38fd4600d48c7bfb7a0a167c (patch) | |
tree | 4e493c06cf367598a3572c33fcdb829689263850 | |
parent | 2744b647f49e24d636c8b293325aed674363f0d2 (diff) |
drm/amdgpu: add a custom GTT memory manager v2
Only allocate address space when we really need it.
v2: fix a typo, add correct function description,
stop leaking the node in the error case.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/Makefile | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 238 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 9 |
6 files changed, 265 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile index d15e9b080ce1..9ec262d4b8a2 100644 --- a/drivers/gpu/drm/amd/amdgpu/Makefile +++ b/drivers/gpu/drm/amd/amdgpu/Makefile | |||
@@ -23,7 +23,8 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \ | |||
23 | amdgpu_pm.o atombios_dp.o amdgpu_afmt.o amdgpu_trace_points.o \ | 23 | amdgpu_pm.o atombios_dp.o amdgpu_afmt.o amdgpu_trace_points.o \ |
24 | atombios_encoders.o amdgpu_sa.o atombios_i2c.o \ | 24 | atombios_encoders.o amdgpu_sa.o atombios_i2c.o \ |
25 | amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \ | 25 | amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \ |
26 | amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o | 26 | amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \ |
27 | amdgpu_gtt_mgr.o | ||
27 | 28 | ||
28 | # add asic specific block | 29 | # add asic specific block |
29 | amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \ | 30 | amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \ |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index b8412bcbad2a..b0f6e6957536 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -648,7 +648,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, | |||
648 | if (!r && p->uf_entry.robj) { | 648 | if (!r && p->uf_entry.robj) { |
649 | struct amdgpu_bo *uf = p->uf_entry.robj; | 649 | struct amdgpu_bo *uf = p->uf_entry.robj; |
650 | 650 | ||
651 | r = amdgpu_ttm_bind(uf->tbo.ttm, &uf->tbo.mem); | 651 | r = amdgpu_ttm_bind(&uf->tbo, &uf->tbo.mem); |
652 | p->job->uf_addr += amdgpu_bo_gpu_offset(uf); | 652 | p->job->uf_addr += amdgpu_bo_gpu_offset(uf); |
653 | } | 653 | } |
654 | 654 | ||
@@ -1192,7 +1192,7 @@ int amdgpu_cs_sysvm_access_required(struct amdgpu_cs_parser *parser) | |||
1192 | for (i = 0; i < parser->bo_list->num_entries; i++) { | 1192 | for (i = 0; i < parser->bo_list->num_entries; i++) { |
1193 | struct amdgpu_bo *bo = parser->bo_list->array[i].robj; | 1193 | struct amdgpu_bo *bo = parser->bo_list->array[i].robj; |
1194 | 1194 | ||
1195 | r = amdgpu_ttm_bind(bo->tbo.ttm, &bo->tbo.mem); | 1195 | r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem); |
1196 | if (unlikely(r)) | 1196 | if (unlikely(r)) |
1197 | return r; | 1197 | return r; |
1198 | } | 1198 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c new file mode 100644 index 000000000000..262e872bea0e --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | |||
@@ -0,0 +1,238 @@ | |||
1 | /* | ||
2 | * Copyright 2016 Advanced Micro Devices, Inc. | ||
3 | * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
5 | * copy of this software and associated documentation files (the "Software"), | ||
6 | * to deal in the Software without restriction, including without limitation | ||
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
8 | * and/or sell copies of the Software, and to permit persons to whom the | ||
9 | * Software is furnished to do so, subject to the following conditions: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be included in | ||
12 | * all copies or substantial portions of the Software. | ||
13 | * | ||
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
20 | * OTHER DEALINGS IN THE SOFTWARE. | ||
21 | * | ||
22 | * Authors: Christian König | ||
23 | */ | ||
24 | |||
25 | #include <drm/drmP.h> | ||
26 | #include "amdgpu.h" | ||
27 | |||
28 | struct amdgpu_gtt_mgr { | ||
29 | struct drm_mm mm; | ||
30 | spinlock_t lock; | ||
31 | uint64_t available; | ||
32 | }; | ||
33 | |||
34 | /** | ||
35 | * amdgpu_gtt_mgr_init - init GTT manager and DRM MM | ||
36 | * | ||
37 | * @man: TTM memory type manager | ||
38 | * @p_size: maximum size of GTT | ||
39 | * | ||
40 | * Allocate and initialize the GTT manager. | ||
41 | */ | ||
42 | static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man, | ||
43 | unsigned long p_size) | ||
44 | { | ||
45 | struct amdgpu_gtt_mgr *mgr; | ||
46 | |||
47 | mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); | ||
48 | if (!mgr) | ||
49 | return -ENOMEM; | ||
50 | |||
51 | drm_mm_init(&mgr->mm, 0, p_size); | ||
52 | spin_lock_init(&mgr->lock); | ||
53 | mgr->available = p_size; | ||
54 | man->priv = mgr; | ||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | /** | ||
59 | * amdgpu_gtt_mgr_fini - free and destroy GTT manager | ||
60 | * | ||
61 | * @man: TTM memory type manager | ||
62 | * | ||
63 | * Destroy and free the GTT manager, returns -EBUSY if ranges are still | ||
64 | * allocated inside it. | ||
65 | */ | ||
66 | static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man) | ||
67 | { | ||
68 | struct amdgpu_gtt_mgr *mgr = man->priv; | ||
69 | |||
70 | spin_lock(&mgr->lock); | ||
71 | if (!drm_mm_clean(&mgr->mm)) { | ||
72 | spin_unlock(&mgr->lock); | ||
73 | return -EBUSY; | ||
74 | } | ||
75 | |||
76 | drm_mm_takedown(&mgr->mm); | ||
77 | spin_unlock(&mgr->lock); | ||
78 | kfree(mgr); | ||
79 | man->priv = NULL; | ||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | /** | ||
84 | * amdgpu_gtt_mgr_alloc - allocate new ranges | ||
85 | * | ||
86 | * @man: TTM memory type manager | ||
87 | * @tbo: TTM BO we need this range for | ||
88 | * @place: placement flags and restrictions | ||
89 | * @mem: the resulting mem object | ||
90 | * | ||
91 | * Allocate the address space for a node. | ||
92 | */ | ||
93 | int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man, | ||
94 | struct ttm_buffer_object *tbo, | ||
95 | const struct ttm_place *place, | ||
96 | struct ttm_mem_reg *mem) | ||
97 | { | ||
98 | struct amdgpu_gtt_mgr *mgr = man->priv; | ||
99 | struct drm_mm_node *node = mem->mm_node; | ||
100 | enum drm_mm_search_flags sflags = DRM_MM_SEARCH_BEST; | ||
101 | enum drm_mm_allocator_flags aflags = DRM_MM_CREATE_DEFAULT; | ||
102 | unsigned long fpfn, lpfn; | ||
103 | int r; | ||
104 | |||
105 | if (node->start != AMDGPU_BO_INVALID_OFFSET) | ||
106 | return 0; | ||
107 | |||
108 | if (place) | ||
109 | fpfn = place->fpfn; | ||
110 | else | ||
111 | fpfn = 0; | ||
112 | |||
113 | if (place && place->lpfn) | ||
114 | lpfn = place->lpfn; | ||
115 | else | ||
116 | lpfn = man->size; | ||
117 | |||
118 | if (place && place->flags & TTM_PL_FLAG_TOPDOWN) { | ||
119 | sflags = DRM_MM_SEARCH_BELOW; | ||
120 | aflags = DRM_MM_CREATE_TOP; | ||
121 | } | ||
122 | |||
123 | spin_lock(&mgr->lock); | ||
124 | r = drm_mm_insert_node_in_range_generic(&mgr->mm, node, mem->num_pages, | ||
125 | mem->page_alignment, 0, | ||
126 | fpfn, lpfn, sflags, aflags); | ||
127 | spin_unlock(&mgr->lock); | ||
128 | |||
129 | if (!r) { | ||
130 | mem->start = node->start; | ||
131 | tbo->offset = (tbo->mem.start << PAGE_SHIFT) + | ||
132 | tbo->bdev->man[tbo->mem.mem_type].gpu_offset; | ||
133 | } | ||
134 | |||
135 | return r; | ||
136 | } | ||
137 | |||
138 | /** | ||
139 | * amdgpu_gtt_mgr_new - allocate a new node | ||
140 | * | ||
141 | * @man: TTM memory type manager | ||
142 | * @tbo: TTM BO we need this range for | ||
143 | * @place: placement flags and restrictions | ||
144 | * @mem: the resulting mem object | ||
145 | * | ||
146 | * Dummy, allocate the node but no space for it yet. | ||
147 | */ | ||
148 | static int amdgpu_gtt_mgr_new(struct ttm_mem_type_manager *man, | ||
149 | struct ttm_buffer_object *tbo, | ||
150 | const struct ttm_place *place, | ||
151 | struct ttm_mem_reg *mem) | ||
152 | { | ||
153 | struct amdgpu_gtt_mgr *mgr = man->priv; | ||
154 | struct drm_mm_node *node; | ||
155 | int r; | ||
156 | |||
157 | spin_lock(&mgr->lock); | ||
158 | if (mgr->available < mem->num_pages) { | ||
159 | spin_unlock(&mgr->lock); | ||
160 | return 0; | ||
161 | } | ||
162 | mgr->available -= mem->num_pages; | ||
163 | spin_unlock(&mgr->lock); | ||
164 | |||
165 | node = kzalloc(sizeof(*node), GFP_KERNEL); | ||
166 | if (!node) | ||
167 | return -ENOMEM; | ||
168 | |||
169 | node->start = AMDGPU_BO_INVALID_OFFSET; | ||
170 | mem->mm_node = node; | ||
171 | |||
172 | if (place->fpfn || place->lpfn || place->flags & TTM_PL_FLAG_TOPDOWN) { | ||
173 | r = amdgpu_gtt_mgr_alloc(man, tbo, place, mem); | ||
174 | if (unlikely(r)) { | ||
175 | kfree(node); | ||
176 | mem->mm_node = NULL; | ||
177 | } | ||
178 | } else { | ||
179 | mem->start = node->start; | ||
180 | } | ||
181 | |||
182 | return 0; | ||
183 | } | ||
184 | |||
185 | /** | ||
186 | * amdgpu_gtt_mgr_del - free ranges | ||
187 | * | ||
188 | * @man: TTM memory type manager | ||
189 | * @tbo: TTM BO we need this range for | ||
190 | * @place: placement flags and restrictions | ||
191 | * @mem: TTM memory object | ||
192 | * | ||
193 | * Free the allocated GTT again. | ||
194 | */ | ||
195 | static void amdgpu_gtt_mgr_del(struct ttm_mem_type_manager *man, | ||
196 | struct ttm_mem_reg *mem) | ||
197 | { | ||
198 | struct amdgpu_gtt_mgr *mgr = man->priv; | ||
199 | struct drm_mm_node *node = mem->mm_node; | ||
200 | |||
201 | if (!node) | ||
202 | return; | ||
203 | |||
204 | spin_lock(&mgr->lock); | ||
205 | if (node->start != AMDGPU_BO_INVALID_OFFSET) | ||
206 | drm_mm_remove_node(node); | ||
207 | mgr->available += mem->num_pages; | ||
208 | spin_unlock(&mgr->lock); | ||
209 | |||
210 | kfree(node); | ||
211 | mem->mm_node = NULL; | ||
212 | } | ||
213 | |||
214 | /** | ||
215 | * amdgpu_gtt_mgr_debug - dump VRAM table | ||
216 | * | ||
217 | * @man: TTM memory type manager | ||
218 | * @prefix: text prefix | ||
219 | * | ||
220 | * Dump the table content using printk. | ||
221 | */ | ||
222 | static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, | ||
223 | const char *prefix) | ||
224 | { | ||
225 | struct amdgpu_gtt_mgr *mgr = man->priv; | ||
226 | |||
227 | spin_lock(&mgr->lock); | ||
228 | drm_mm_debug_table(&mgr->mm, prefix); | ||
229 | spin_unlock(&mgr->lock); | ||
230 | } | ||
231 | |||
232 | const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func = { | ||
233 | amdgpu_gtt_mgr_init, | ||
234 | amdgpu_gtt_mgr_fini, | ||
235 | amdgpu_gtt_mgr_new, | ||
236 | amdgpu_gtt_mgr_del, | ||
237 | amdgpu_gtt_mgr_debug | ||
238 | }; | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 428aa00025e4..9b80dfedcb4a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |||
@@ -673,7 +673,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain, | |||
673 | dev_err(bo->adev->dev, "%p pin failed\n", bo); | 673 | dev_err(bo->adev->dev, "%p pin failed\n", bo); |
674 | goto error; | 674 | goto error; |
675 | } | 675 | } |
676 | r = amdgpu_ttm_bind(bo->tbo.ttm, &bo->tbo.mem); | 676 | r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem); |
677 | if (unlikely(r)) { | 677 | if (unlikely(r)) { |
678 | dev_err(bo->adev->dev, "%p bind failed\n", bo); | 678 | dev_err(bo->adev->dev, "%p bind failed\n", bo); |
679 | goto error; | 679 | goto error; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index dfb12237a6b0..e21e823f67a5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -160,7 +160,7 @@ static int amdgpu_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, | |||
160 | man->default_caching = TTM_PL_FLAG_CACHED; | 160 | man->default_caching = TTM_PL_FLAG_CACHED; |
161 | break; | 161 | break; |
162 | case TTM_PL_TT: | 162 | case TTM_PL_TT: |
163 | man->func = &ttm_bo_manager_func; | 163 | man->func = &amdgpu_gtt_mgr_func; |
164 | man->gpu_offset = adev->mc.gtt_start; | 164 | man->gpu_offset = adev->mc.gtt_start; |
165 | man->available_caching = TTM_PL_MASK_CACHING; | 165 | man->available_caching = TTM_PL_MASK_CACHING; |
166 | man->default_caching = TTM_PL_FLAG_CACHED; | 166 | man->default_caching = TTM_PL_FLAG_CACHED; |
@@ -277,7 +277,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo, | |||
277 | 277 | ||
278 | switch (old_mem->mem_type) { | 278 | switch (old_mem->mem_type) { |
279 | case TTM_PL_TT: | 279 | case TTM_PL_TT: |
280 | r = amdgpu_ttm_bind(bo->ttm, old_mem); | 280 | r = amdgpu_ttm_bind(bo, old_mem); |
281 | if (r) | 281 | if (r) |
282 | return r; | 282 | return r; |
283 | 283 | ||
@@ -290,7 +290,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo, | |||
290 | } | 290 | } |
291 | switch (new_mem->mem_type) { | 291 | switch (new_mem->mem_type) { |
292 | case TTM_PL_TT: | 292 | case TTM_PL_TT: |
293 | r = amdgpu_ttm_bind(bo->ttm, new_mem); | 293 | r = amdgpu_ttm_bind(bo, new_mem); |
294 | if (r) | 294 | if (r) |
295 | return r; | 295 | return r; |
296 | 296 | ||
@@ -675,7 +675,6 @@ static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm, | |||
675 | return r; | 675 | return r; |
676 | } | 676 | } |
677 | } | 677 | } |
678 | gtt->offset = (u64)bo_mem->start << PAGE_SHIFT; | ||
679 | if (!ttm->num_pages) { | 678 | if (!ttm->num_pages) { |
680 | WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n", | 679 | WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n", |
681 | ttm->num_pages, bo_mem, ttm); | 680 | ttm->num_pages, bo_mem, ttm); |
@@ -696,16 +695,25 @@ bool amdgpu_ttm_is_bound(struct ttm_tt *ttm) | |||
696 | return gtt && !list_empty(>t->list); | 695 | return gtt && !list_empty(>t->list); |
697 | } | 696 | } |
698 | 697 | ||
699 | int amdgpu_ttm_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem) | 698 | int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem) |
700 | { | 699 | { |
701 | struct amdgpu_ttm_tt *gtt = (void *)ttm; | 700 | struct ttm_tt *ttm = bo->ttm; |
701 | struct amdgpu_ttm_tt *gtt = (void *)bo->ttm; | ||
702 | uint32_t flags; | 702 | uint32_t flags; |
703 | int r; | 703 | int r; |
704 | 704 | ||
705 | if (!ttm || amdgpu_ttm_is_bound(ttm)) | 705 | if (!ttm || amdgpu_ttm_is_bound(ttm)) |
706 | return 0; | 706 | return 0; |
707 | 707 | ||
708 | r = amdgpu_gtt_mgr_alloc(&bo->bdev->man[TTM_PL_TT], bo, | ||
709 | NULL, bo_mem); | ||
710 | if (r) { | ||
711 | DRM_ERROR("Failed to allocate GTT address space (%d)\n", r); | ||
712 | return r; | ||
713 | } | ||
714 | |||
708 | flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem); | 715 | flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem); |
716 | gtt->offset = (u64)bo_mem->start << PAGE_SHIFT; | ||
709 | r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages, | 717 | r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages, |
710 | ttm->pages, gtt->ttm.dma_address, flags); | 718 | ttm->pages, gtt->ttm.dma_address, flags); |
711 | 719 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 3ee825f4de28..9812c805326c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | |||
@@ -65,6 +65,13 @@ struct amdgpu_mman { | |||
65 | struct amdgpu_mman_lru guard; | 65 | struct amdgpu_mman_lru guard; |
66 | }; | 66 | }; |
67 | 67 | ||
68 | extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func; | ||
69 | |||
70 | int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man, | ||
71 | struct ttm_buffer_object *tbo, | ||
72 | const struct ttm_place *place, | ||
73 | struct ttm_mem_reg *mem); | ||
74 | |||
68 | int amdgpu_copy_buffer(struct amdgpu_ring *ring, | 75 | int amdgpu_copy_buffer(struct amdgpu_ring *ring, |
69 | uint64_t src_offset, | 76 | uint64_t src_offset, |
70 | uint64_t dst_offset, | 77 | uint64_t dst_offset, |
@@ -78,6 +85,6 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo, | |||
78 | 85 | ||
79 | int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma); | 86 | int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma); |
80 | bool amdgpu_ttm_is_bound(struct ttm_tt *ttm); | 87 | bool amdgpu_ttm_is_bound(struct ttm_tt *ttm); |
81 | int amdgpu_ttm_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem); | 88 | int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem); |
82 | 89 | ||
83 | #endif | 90 | #endif |