From: Bob Breuer I found a solution for the HyperSPARC DMA problems in 2.6. This allows my SS20 with HyperSPARCs to boot to single user. It's not efficient, but I hope it points out whats needed for a proper fix. Seems that the iotlb entries need to flushed to ram or uncached since the iommu changes between 2.5.60 and 2.5.70. The second part seems to be needed to allow consistent sbus dma mappings to be cached on HyperSPARC. I have also tested this change on 2.4.27 with no noticeable difference. Acked-by: William Irwin Signed-off-by: Andrew Morton --- 25-akpm/arch/sparc/mm/iommu.c | 1 + 25-akpm/arch/sparc/mm/srmmu.c | 1 + 2 files changed, 2 insertions(+) diff -puN arch/sparc/mm/iommu.c~sparc32-fix-for-hypersparc-dma-errors arch/sparc/mm/iommu.c --- 25/arch/sparc/mm/iommu.c~sparc32-fix-for-hypersparc-dma-errors 2004-11-09 22:06:04.432029912 -0800 +++ 25-akpm/arch/sparc/mm/iommu.c 2004-11-09 22:06:04.437029152 -0800 @@ -173,6 +173,7 @@ static u32 iommu_get_one(struct page *pa } iommu_viking_flush_iotlb(iopte0, npages); + flush_cache_all(); // hack to fix dma errors with hypersparc return busa0; } diff -puN arch/sparc/mm/srmmu.c~sparc32-fix-for-hypersparc-dma-errors arch/sparc/mm/srmmu.c --- 25/arch/sparc/mm/srmmu.c~sparc32-fix-for-hypersparc-dma-errors 2004-11-09 22:06:04.434029608 -0800 +++ 25-akpm/arch/sparc/mm/srmmu.c 2004-11-09 22:06:04.439028848 -0800 @@ -1464,6 +1464,7 @@ static void __init poke_hypersparc(void) static void __init init_hypersparc(void) { srmmu_name = "ROSS HyperSparc"; + srmmu_modtype = HyperSparc; init_vac_layout(); _