Commit 1b548f667c1487d92e794a9f7a67788f49b952d8
Committed by
Ingo Molnar
1 parent
b81ea27b23
Exists in
master
and in
4 other branches
swiotlb: factor out copy to/from device
Impact: generalize IO bounce memcpys Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Showing 1 changed file with 13 additions and 4 deletions Side-by-side Diff
lib/swiotlb.c
... | ... | @@ -312,6 +312,15 @@ |
312 | 312 | return addr >= io_tlb_start && addr < io_tlb_end; |
313 | 313 | } |
314 | 314 | |
315 | +static void | |
316 | +__sync_single(char *buffer, char *dma_addr, size_t size, int dir) | |
317 | +{ | |
318 | + if (dir == DMA_TO_DEVICE) | |
319 | + memcpy(dma_addr, buffer, size); | |
320 | + else | |
321 | + memcpy(buffer, dma_addr, size); | |
322 | +} | |
323 | + | |
315 | 324 | /* |
316 | 325 | * Allocates bounce buffer and returns its kernel virtual address. |
317 | 326 | */ |
... | ... | @@ -413,7 +422,7 @@ |
413 | 422 | for (i = 0; i < nslots; i++) |
414 | 423 | io_tlb_orig_addr[index+i] = buffer + (i << IO_TLB_SHIFT); |
415 | 424 | if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL) |
416 | - memcpy(dma_addr, buffer, size); | |
425 | + __sync_single(buffer, dma_addr, size, DMA_TO_DEVICE); | |
417 | 426 | |
418 | 427 | return dma_addr; |
419 | 428 | } |
... | ... | @@ -437,7 +446,7 @@ |
437 | 446 | * bounce... copy the data back into the original buffer * and |
438 | 447 | * delete the bounce buffer. |
439 | 448 | */ |
440 | - memcpy(buffer, dma_addr, size); | |
449 | + __sync_single(buffer, dma_addr, size, DMA_FROM_DEVICE); | |
441 | 450 | |
442 | 451 | /* |
443 | 452 | * Return the buffer to the free list by setting the corresponding |
444 | 453 | |
... | ... | @@ -477,13 +486,13 @@ |
477 | 486 | switch (target) { |
478 | 487 | case SYNC_FOR_CPU: |
479 | 488 | if (likely(dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL)) |
480 | - memcpy(buffer, dma_addr, size); | |
489 | + __sync_single(buffer, dma_addr, size, DMA_FROM_DEVICE); | |
481 | 490 | else |
482 | 491 | BUG_ON(dir != DMA_TO_DEVICE); |
483 | 492 | break; |
484 | 493 | case SYNC_FOR_DEVICE: |
485 | 494 | if (likely(dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL)) |
486 | - memcpy(dma_addr, buffer, size); | |
495 | + __sync_single(buffer, dma_addr, size, DMA_TO_DEVICE); | |
487 | 496 | else |
488 | 497 | BUG_ON(dir != DMA_FROM_DEVICE); |
489 | 498 | break; |