hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/arch/parisc/kernel/pci-dma.c
....@@ -446,11 +446,27 @@
446446 void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
447447 enum dma_data_direction dir)
448448 {
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
+ */
449453 flush_kernel_dcache_range((unsigned long)phys_to_virt(paddr), size);
450454 }
451455
452456 void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
453457 enum dma_data_direction dir)
454458 {
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
+ }
456472 }