Commit 1b548f667c1487d92e794a9f7a67788f49b952d8

Authored by Jeremy Fitzhardinge
Committed by Ingo Molnar
1 parent b81ea27b23

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

... ... @@ -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;