.. | .. |
---|
446 | 446 | void arch_sync_dma_for_device(phys_addr_t paddr, size_t size, |
---|
447 | 447 | enum dma_data_direction dir) |
---|
448 | 448 | { |
---|
| 449 | + /* |
---|
| 450 | + * fdc: The data cache line is written back to memory, if and only if |
---|
| 451 | + * it is dirty, and then invalidated from the data cache. |
---|
| 452 | + */ |
---|
449 | 453 | flush_kernel_dcache_range((unsigned long)phys_to_virt(paddr), size); |
---|
450 | 454 | } |
---|
451 | 455 | |
---|
452 | 456 | void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size, |
---|
453 | 457 | enum dma_data_direction dir) |
---|
454 | 458 | { |
---|
455 | | - flush_kernel_dcache_range((unsigned long)phys_to_virt(paddr), size); |
---|
| 459 | + unsigned long addr = (unsigned long) phys_to_virt(paddr); |
---|
| 460 | + |
---|
| 461 | + switch (dir) { |
---|
| 462 | + case DMA_TO_DEVICE: |
---|
| 463 | + case DMA_BIDIRECTIONAL: |
---|
| 464 | + flush_kernel_dcache_range(addr, size); |
---|
| 465 | + return; |
---|
| 466 | + case DMA_FROM_DEVICE: |
---|
| 467 | + purge_kernel_dcache_range_asm(addr, addr + size); |
---|
| 468 | + return; |
---|
| 469 | + default: |
---|
| 470 | + BUG(); |
---|
| 471 | + } |
---|
456 | 472 | } |
---|