This is required for ensuring that CPU memory is coherent after DMA operations have completed.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk --- drivers/iommu.c | 14 ++++++++++++++ include/drivers/drivers.h | 1 + 2 files changed, 15 insertions(+)
diff --git a/drivers/iommu.c b/drivers/iommu.c index b8ec09e..c414894 100644 --- a/drivers/iommu.c +++ b/drivers/iommu.c @@ -10,6 +10,8 @@ #include "drivers/drivers.h" #include "iommu.h" #include "arch/sparc32/ofmem_sparc32.h" +#include "arch/sparc32/asi.h" +#include "arch/sparc32/pgtsrmmu.h"
#ifdef CONFIG_DEBUG_IOMMU #define DPRINTF(fmt, args...) \ @@ -81,6 +83,18 @@ dvma_alloc(int size) return va; }
+void +dvma_sync(unsigned char *va, int size) +{ + /* Synchronise the VA address region after DMA */ + unsigned long virt = pointer2cell(va); + unsigned long page; + + for (page = (unsigned long)virt; page < virt + size; page += PAGE_SIZE) { + srmmu_flush_tlb_page(page); + } +} + unsigned int dvma_map_in(unsigned char *va) { diff --git a/include/drivers/drivers.h b/include/drivers/drivers.h index 85a8db0..64824e4 100644 --- a/include/drivers/drivers.h +++ b/include/drivers/drivers.h @@ -74,6 +74,7 @@ void ss5_init(uint64_t base); /* drivers/iommu.c */ void ob_init_iommu(uint64_t base); void *dvma_alloc(int size); +void dvma_sync(unsigned char *va, int size); unsigned int dvma_map_in(unsigned char *va);
/* drivers/sbus.c */