aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/mm/io-unit.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/mm/io-unit.c')
-rw-r--r--arch/sparc/mm/io-unit.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c
index eb99862e9654..f311bf219016 100644
--- a/arch/sparc/mm/io-unit.c
+++ b/arch/sparc/mm/io-unit.c
@@ -25,6 +25,8 @@
25#include <asm/dma.h> 25#include <asm/dma.h>
26#include <asm/oplib.h> 26#include <asm/oplib.h>
27 27
28#include "mm_32.h"
29
28/* #define IOUNIT_DEBUG */ 30/* #define IOUNIT_DEBUG */
29#ifdef IOUNIT_DEBUG 31#ifdef IOUNIT_DEBUG
30#define IOD(x) printk(x) 32#define IOD(x) printk(x)
@@ -38,7 +40,8 @@
38static void __init iounit_iommu_init(struct platform_device *op) 40static void __init iounit_iommu_init(struct platform_device *op)
39{ 41{
40 struct iounit_struct *iounit; 42 struct iounit_struct *iounit;
41 iopte_t *xpt, *xptend; 43 iopte_t __iomem *xpt;
44 iopte_t __iomem *xptend;
42 45
43 iounit = kzalloc(sizeof(struct iounit_struct), GFP_ATOMIC); 46 iounit = kzalloc(sizeof(struct iounit_struct), GFP_ATOMIC);
44 if (!iounit) { 47 if (!iounit) {
@@ -62,10 +65,10 @@ static void __init iounit_iommu_init(struct platform_device *op)
62 op->dev.archdata.iommu = iounit; 65 op->dev.archdata.iommu = iounit;
63 iounit->page_table = xpt; 66 iounit->page_table = xpt;
64 spin_lock_init(&iounit->lock); 67 spin_lock_init(&iounit->lock);
65 68
66 for (xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t); 69 xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t);
67 xpt < xptend;) 70 for (; xpt < xptend; xpt++)
68 iopte_val(*xpt++) = 0; 71 sbus_writel(0, xpt);
69} 72}
70 73
71static int __init iounit_init(void) 74static int __init iounit_init(void)
@@ -130,7 +133,7 @@ nexti: scan = find_next_zero_bit(iounit->bmap, limit, scan);
130 vaddr = IOUNIT_DMA_BASE + (scan << PAGE_SHIFT) + (vaddr & ~PAGE_MASK); 133 vaddr = IOUNIT_DMA_BASE + (scan << PAGE_SHIFT) + (vaddr & ~PAGE_MASK);
131 for (k = 0; k < npages; k++, iopte = __iopte(iopte_val(iopte) + 0x100), scan++) { 134 for (k = 0; k < npages; k++, iopte = __iopte(iopte_val(iopte) + 0x100), scan++) {
132 set_bit(scan, iounit->bmap); 135 set_bit(scan, iounit->bmap);
133 iounit->page_table[scan] = iopte; 136 sbus_writel(iopte, &iounit->page_table[scan]);
134 } 137 }
135 IOD(("%08lx\n", vaddr)); 138 IOD(("%08lx\n", vaddr));
136 return vaddr; 139 return vaddr;
@@ -202,7 +205,7 @@ static int iounit_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned lon
202 struct iounit_struct *iounit = dev->archdata.iommu; 205 struct iounit_struct *iounit = dev->archdata.iommu;
203 unsigned long page, end; 206 unsigned long page, end;
204 pgprot_t dvma_prot; 207 pgprot_t dvma_prot;
205 iopte_t *iopte; 208 iopte_t __iomem *iopte;
206 209
207 *pba = addr; 210 *pba = addr;
208 211
@@ -224,8 +227,8 @@ static int iounit_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned lon
224 227
225 i = ((addr - IOUNIT_DMA_BASE) >> PAGE_SHIFT); 228 i = ((addr - IOUNIT_DMA_BASE) >> PAGE_SHIFT);
226 229
227 iopte = (iopte_t *)(iounit->page_table + i); 230 iopte = iounit->page_table + i;
228 *iopte = MKIOPTE(__pa(page)); 231 sbus_writel(MKIOPTE(__pa(page)), iopte);
229 } 232 }
230 addr += PAGE_SIZE; 233 addr += PAGE_SIZE;
231 va += PAGE_SIZE; 234 va += PAGE_SIZE;