29
29
#include "amdgpu_object.h"
30
30
#include "amdgpu_vm.h"
31
31
#include "amdgpu_mn.h"
32
+ #include "amdgpu_res_cursor.h"
32
33
#include "kfd_priv.h"
33
34
#include "kfd_svm.h"
34
35
#include "kfd_migrate.h"
@@ -205,34 +206,6 @@ svm_migrate_copy_done(struct amdgpu_device *adev, struct dma_fence *mfence)
205
206
return r ;
206
207
}
207
208
208
- static uint64_t
209
- svm_migrate_node_physical_addr (struct amdgpu_device * adev ,
210
- struct drm_mm_node * * mm_node , uint64_t * offset )
211
- {
212
- struct drm_mm_node * node = * mm_node ;
213
- uint64_t pos = * offset ;
214
-
215
- if (node -> start == AMDGPU_BO_INVALID_OFFSET ) {
216
- pr_debug ("drm node is not validated\n" );
217
- return 0 ;
218
- }
219
-
220
- pr_debug ("vram node start 0x%llx npages 0x%llx\n" , node -> start ,
221
- node -> size );
222
-
223
- if (pos >= node -> size ) {
224
- do {
225
- pos -= node -> size ;
226
- node ++ ;
227
- } while (pos >= node -> size );
228
-
229
- * mm_node = node ;
230
- * offset = pos ;
231
- }
232
-
233
- return (node -> start + pos ) << PAGE_SHIFT ;
234
- }
235
-
236
209
unsigned long
237
210
svm_migrate_addr_to_pfn (struct amdgpu_device * adev , unsigned long addr )
238
211
{
@@ -297,11 +270,9 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
297
270
{
298
271
uint64_t npages = migrate -> cpages ;
299
272
struct device * dev = adev -> dev ;
300
- struct drm_mm_node * node ;
273
+ struct amdgpu_res_cursor cursor ;
301
274
dma_addr_t * src ;
302
275
uint64_t * dst ;
303
- uint64_t vram_addr ;
304
- uint64_t offset ;
305
276
uint64_t i , j ;
306
277
int r ;
307
278
@@ -317,19 +288,12 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
317
288
goto out ;
318
289
}
319
290
320
- node = prange -> ttm_res -> mm_node ;
321
- offset = prange -> offset ;
322
- vram_addr = svm_migrate_node_physical_addr (adev , & node , & offset );
323
- if (!vram_addr ) {
324
- WARN_ONCE (1 , "vram node address is 0\n" );
325
- r = - ENOMEM ;
326
- goto out ;
327
- }
328
-
291
+ amdgpu_res_first (prange -> ttm_res , prange -> offset << PAGE_SHIFT ,
292
+ npages << PAGE_SHIFT , & cursor );
329
293
for (i = j = 0 ; i < npages ; i ++ ) {
330
294
struct page * spage ;
331
295
332
- dst [i ] = vram_addr + (j << PAGE_SHIFT );
296
+ dst [i ] = cursor . start + (j << PAGE_SHIFT );
333
297
migrate -> dst [i ] = svm_migrate_addr_to_pfn (adev , dst [i ]);
334
298
svm_migrate_get_vram_page (prange , migrate -> dst [i ]);
335
299
@@ -354,38 +318,26 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
354
318
mfence );
355
319
if (r )
356
320
goto out_free_vram_pages ;
357
- offset += j ;
358
- vram_addr = (node -> start + offset ) << PAGE_SHIFT ;
321
+ amdgpu_res_next (& cursor , j << PAGE_SHIFT );
359
322
j = 0 ;
360
323
} else {
361
- offset ++ ;
362
- vram_addr += PAGE_SIZE ;
363
- }
364
- if (offset >= node -> size ) {
365
- node ++ ;
366
- pr_debug ("next node size 0x%llx\n" , node -> size );
367
- vram_addr = node -> start << PAGE_SHIFT ;
368
- offset = 0 ;
324
+ amdgpu_res_next (& cursor , PAGE_SIZE );
369
325
}
370
326
continue ;
371
327
}
372
328
373
329
pr_debug ("dma mapping src to 0x%llx, page_to_pfn 0x%lx\n" ,
374
330
src [i ] >> PAGE_SHIFT , page_to_pfn (spage ));
375
331
376
- if (j + offset >= node -> size - 1 && i < npages - 1 ) {
332
+ if (j >= ( cursor . size >> PAGE_SHIFT ) - 1 && i < npages - 1 ) {
377
333
r = svm_migrate_copy_memory_gart (adev , src + i - j ,
378
334
dst + i - j , j + 1 ,
379
335
FROM_RAM_TO_VRAM ,
380
336
mfence );
381
337
if (r )
382
338
goto out_free_vram_pages ;
383
-
384
- node ++ ;
385
- pr_debug ("next node size 0x%llx\n" , node -> size );
386
- vram_addr = node -> start << PAGE_SHIFT ;
387
- offset = 0 ;
388
- j = 0 ;
339
+ amdgpu_res_next (& cursor , (j + 1 ) * PAGE_SIZE );
340
+ j = 0 ;
389
341
} else {
390
342
j ++ ;
391
343
}
0 commit comments