diff options
author | Christoph Hellwig <hch@lst.de> | 2018-12-03 08:04:32 -0500 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2018-12-11 08:45:29 -0500 |
commit | ce65d36f3ea79368170ca58f2efd28cdba3d70e9 (patch) | |
tree | e9f8449b46f86abc62de7896c25565ae10b3d609 /arch/sparc/mm | |
parent | 53b7670e5735ba1c662230377d764799aaf57300 (diff) |
sparc: remove the sparc32_dma_ops indirection
There is no good reason to have a double indirection for the sparc32
dma ops, so remove the sparc32_dma_ops and define separate dma_map_ops
instance for the different IOMMU types.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/mm')
-rw-r--r-- | arch/sparc/mm/io-unit.c | 65 | ||||
-rw-r--r-- | arch/sparc/mm/iommu.c | 137 |
2 files changed, 133 insertions, 69 deletions
diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c index c8cb27d3ea75..2088d292c6e5 100644 --- a/arch/sparc/mm/io-unit.c +++ b/arch/sparc/mm/io-unit.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
13 | #include <linux/highmem.h> /* pte_offset_map => kmap_atomic */ | 13 | #include <linux/highmem.h> /* pte_offset_map => kmap_atomic */ |
14 | #include <linux/bitops.h> | 14 | #include <linux/bitops.h> |
15 | #include <linux/scatterlist.h> | 15 | #include <linux/dma-mapping.h> |
16 | #include <linux/of.h> | 16 | #include <linux/of.h> |
17 | #include <linux/of_device.h> | 17 | #include <linux/of_device.h> |
18 | 18 | ||
@@ -140,18 +140,26 @@ nexti: scan = find_next_zero_bit(iounit->bmap, limit, scan); | |||
140 | return vaddr; | 140 | return vaddr; |
141 | } | 141 | } |
142 | 142 | ||
143 | static __u32 iounit_get_scsi_one(struct device *dev, char *vaddr, unsigned long len) | 143 | static dma_addr_t iounit_map_page(struct device *dev, struct page *page, |
144 | unsigned long offset, size_t len, enum dma_data_direction dir, | ||
145 | unsigned long attrs) | ||
144 | { | 146 | { |
147 | void *vaddr = page_address(page) + offset; | ||
145 | struct iounit_struct *iounit = dev->archdata.iommu; | 148 | struct iounit_struct *iounit = dev->archdata.iommu; |
146 | unsigned long ret, flags; | 149 | unsigned long ret, flags; |
147 | 150 | ||
151 | /* XXX So what is maxphys for us and how do drivers know it? */ | ||
152 | if (!len || len > 256 * 1024) | ||
153 | return DMA_MAPPING_ERROR; | ||
154 | |||
148 | spin_lock_irqsave(&iounit->lock, flags); | 155 | spin_lock_irqsave(&iounit->lock, flags); |
149 | ret = iounit_get_area(iounit, (unsigned long)vaddr, len); | 156 | ret = iounit_get_area(iounit, (unsigned long)vaddr, len); |
150 | spin_unlock_irqrestore(&iounit->lock, flags); | 157 | spin_unlock_irqrestore(&iounit->lock, flags); |
151 | return ret; | 158 | return ret; |
152 | } | 159 | } |
153 | 160 | ||
154 | static void iounit_get_scsi_sgl(struct device *dev, struct scatterlist *sg, int sz) | 161 | static int iounit_map_sg(struct device *dev, struct scatterlist *sg, int sz, |
162 | enum dma_data_direction dir, unsigned long attrs) | ||
155 | { | 163 | { |
156 | struct iounit_struct *iounit = dev->archdata.iommu; | 164 | struct iounit_struct *iounit = dev->archdata.iommu; |
157 | unsigned long flags; | 165 | unsigned long flags; |
@@ -165,9 +173,11 @@ static void iounit_get_scsi_sgl(struct device *dev, struct scatterlist *sg, int | |||
165 | sg = sg_next(sg); | 173 | sg = sg_next(sg); |
166 | } | 174 | } |
167 | spin_unlock_irqrestore(&iounit->lock, flags); | 175 | spin_unlock_irqrestore(&iounit->lock, flags); |
176 | return sz; | ||
168 | } | 177 | } |
169 | 178 | ||
170 | static void iounit_release_scsi_one(struct device *dev, __u32 vaddr, unsigned long len) | 179 | static void iounit_unmap_page(struct device *dev, dma_addr_t vaddr, size_t len, |
180 | enum dma_data_direction dir, unsigned long attrs) | ||
171 | { | 181 | { |
172 | struct iounit_struct *iounit = dev->archdata.iommu; | 182 | struct iounit_struct *iounit = dev->archdata.iommu; |
173 | unsigned long flags; | 183 | unsigned long flags; |
@@ -181,7 +191,8 @@ static void iounit_release_scsi_one(struct device *dev, __u32 vaddr, unsigned lo | |||
181 | spin_unlock_irqrestore(&iounit->lock, flags); | 191 | spin_unlock_irqrestore(&iounit->lock, flags); |
182 | } | 192 | } |
183 | 193 | ||
184 | static void iounit_release_scsi_sgl(struct device *dev, struct scatterlist *sg, int sz) | 194 | static void iounit_unmap_sg(struct device *dev, struct scatterlist *sg, int sz, |
195 | enum dma_data_direction dir, unsigned long attrs) | ||
185 | { | 196 | { |
186 | struct iounit_struct *iounit = dev->archdata.iommu; | 197 | struct iounit_struct *iounit = dev->archdata.iommu; |
187 | unsigned long flags; | 198 | unsigned long flags; |
@@ -201,14 +212,27 @@ static void iounit_release_scsi_sgl(struct device *dev, struct scatterlist *sg, | |||
201 | } | 212 | } |
202 | 213 | ||
203 | #ifdef CONFIG_SBUS | 214 | #ifdef CONFIG_SBUS |
204 | static int iounit_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned long va, unsigned long addr, int len) | 215 | static void *iounit_alloc(struct device *dev, size_t len, |
216 | dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs) | ||
205 | { | 217 | { |
206 | struct iounit_struct *iounit = dev->archdata.iommu; | 218 | struct iounit_struct *iounit = dev->archdata.iommu; |
207 | unsigned long page, end; | 219 | unsigned long va, addr, page, end, ret; |
208 | pgprot_t dvma_prot; | 220 | pgprot_t dvma_prot; |
209 | iopte_t __iomem *iopte; | 221 | iopte_t __iomem *iopte; |
210 | 222 | ||
211 | *pba = addr; | 223 | /* XXX So what is maxphys for us and how do drivers know it? */ |
224 | if (!len || len > 256 * 1024) | ||
225 | return NULL; | ||
226 | |||
227 | len = PAGE_ALIGN(len); | ||
228 | va = __get_free_pages(gfp, get_order(len)); | ||
229 | if (!va) | ||
230 | return NULL; | ||
231 | |||
232 | addr = ret = sparc_dma_alloc_resource(dev, len); | ||
233 | if (!addr) | ||
234 | goto out_free_pages; | ||
235 | *dma_handle = addr; | ||
212 | 236 | ||
213 | dvma_prot = __pgprot(SRMMU_CACHE | SRMMU_ET_PTE | SRMMU_PRIV); | 237 | dvma_prot = __pgprot(SRMMU_CACHE | SRMMU_ET_PTE | SRMMU_PRIV); |
214 | end = PAGE_ALIGN((addr + len)); | 238 | end = PAGE_ALIGN((addr + len)); |
@@ -237,27 +261,32 @@ static int iounit_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned lon | |||
237 | flush_cache_all(); | 261 | flush_cache_all(); |
238 | flush_tlb_all(); | 262 | flush_tlb_all(); |
239 | 263 | ||
240 | return 0; | 264 | return (void *)ret; |
265 | |||
266 | out_free_pages: | ||
267 | free_pages(va, get_order(len)); | ||
268 | return NULL; | ||
241 | } | 269 | } |
242 | 270 | ||
243 | static void iounit_unmap_dma_area(struct device *dev, unsigned long addr, int len) | 271 | static void iounit_free(struct device *dev, size_t size, void *cpu_addr, |
272 | dma_addr_t dma_addr, unsigned long attrs) | ||
244 | { | 273 | { |
245 | /* XXX Somebody please fill this in */ | 274 | /* XXX Somebody please fill this in */ |
246 | } | 275 | } |
247 | #endif | 276 | #endif |
248 | 277 | ||
249 | static const struct sparc32_dma_ops iounit_dma_ops = { | 278 | static const struct dma_map_ops iounit_dma_ops = { |
250 | .get_scsi_one = iounit_get_scsi_one, | ||
251 | .get_scsi_sgl = iounit_get_scsi_sgl, | ||
252 | .release_scsi_one = iounit_release_scsi_one, | ||
253 | .release_scsi_sgl = iounit_release_scsi_sgl, | ||
254 | #ifdef CONFIG_SBUS | 279 | #ifdef CONFIG_SBUS |
255 | .map_dma_area = iounit_map_dma_area, | 280 | .alloc = iounit_alloc, |
256 | .unmap_dma_area = iounit_unmap_dma_area, | 281 | .free = iounit_free, |
257 | #endif | 282 | #endif |
283 | .map_page = iounit_map_page, | ||
284 | .unmap_page = iounit_unmap_page, | ||
285 | .map_sg = iounit_map_sg, | ||
286 | .unmap_sg = iounit_unmap_sg, | ||
258 | }; | 287 | }; |
259 | 288 | ||
260 | void __init ld_mmu_iounit(void) | 289 | void __init ld_mmu_iounit(void) |
261 | { | 290 | { |
262 | sparc32_dma_ops = &iounit_dma_ops; | 291 | dma_ops = &iounit_dma_ops; |
263 | } | 292 | } |
diff --git a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c index 2c5f8a648f8c..3599485717e7 100644 --- a/arch/sparc/mm/iommu.c +++ b/arch/sparc/mm/iommu.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
15 | #include <linux/highmem.h> /* pte_offset_map => kmap_atomic */ | 15 | #include <linux/highmem.h> /* pte_offset_map => kmap_atomic */ |
16 | #include <linux/scatterlist.h> | 16 | #include <linux/dma-mapping.h> |
17 | #include <linux/of.h> | 17 | #include <linux/of.h> |
18 | #include <linux/of_device.h> | 18 | #include <linux/of_device.h> |
19 | 19 | ||
@@ -205,38 +205,44 @@ static u32 iommu_get_one(struct device *dev, struct page *page, int npages) | |||
205 | return busa0; | 205 | return busa0; |
206 | } | 206 | } |
207 | 207 | ||
208 | static u32 iommu_get_scsi_one(struct device *dev, char *vaddr, unsigned int len) | 208 | static dma_addr_t __sbus_iommu_map_page(struct device *dev, struct page *page, |
209 | unsigned long offset, size_t len) | ||
209 | { | 210 | { |
210 | unsigned long off; | 211 | void *vaddr = page_address(page) + offset; |
211 | int npages; | 212 | unsigned long off = (unsigned long)vaddr & ~PAGE_MASK; |
212 | struct page *page; | 213 | unsigned long npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT; |
213 | u32 busa; | 214 | |
214 | 215 | /* XXX So what is maxphys for us and how do drivers know it? */ | |
215 | off = (unsigned long)vaddr & ~PAGE_MASK; | 216 | if (!len || len > 256 * 1024) |
216 | npages = (off + len + PAGE_SIZE-1) >> PAGE_SHIFT; | 217 | return DMA_MAPPING_ERROR; |
217 | page = virt_to_page((unsigned long)vaddr & PAGE_MASK); | 218 | return iommu_get_one(dev, virt_to_page(vaddr), npages) + off; |
218 | busa = iommu_get_one(dev, page, npages); | ||
219 | return busa + off; | ||
220 | } | 219 | } |
221 | 220 | ||
222 | static __u32 iommu_get_scsi_one_gflush(struct device *dev, char *vaddr, unsigned long len) | 221 | static dma_addr_t sbus_iommu_map_page_gflush(struct device *dev, |
222 | struct page *page, unsigned long offset, size_t len, | ||
223 | enum dma_data_direction dir, unsigned long attrs) | ||
223 | { | 224 | { |
224 | flush_page_for_dma(0); | 225 | flush_page_for_dma(0); |
225 | return iommu_get_scsi_one(dev, vaddr, len); | 226 | return __sbus_iommu_map_page(dev, page, offset, len); |
226 | } | 227 | } |
227 | 228 | ||
228 | static __u32 iommu_get_scsi_one_pflush(struct device *dev, char *vaddr, unsigned long len) | 229 | static dma_addr_t sbus_iommu_map_page_pflush(struct device *dev, |
230 | struct page *page, unsigned long offset, size_t len, | ||
231 | enum dma_data_direction dir, unsigned long attrs) | ||
229 | { | 232 | { |
230 | unsigned long page = ((unsigned long) vaddr) & PAGE_MASK; | 233 | void *vaddr = page_address(page) + offset; |
234 | unsigned long p = ((unsigned long)vaddr) & PAGE_MASK; | ||
231 | 235 | ||
232 | while(page < ((unsigned long)(vaddr + len))) { | 236 | while (p < (unsigned long)vaddr + len) { |
233 | flush_page_for_dma(page); | 237 | flush_page_for_dma(p); |
234 | page += PAGE_SIZE; | 238 | p += PAGE_SIZE; |
235 | } | 239 | } |
236 | return iommu_get_scsi_one(dev, vaddr, len); | 240 | |
241 | return __sbus_iommu_map_page(dev, page, offset, len); | ||
237 | } | 242 | } |
238 | 243 | ||
239 | static void iommu_get_scsi_sgl_gflush(struct device *dev, struct scatterlist *sg, int sz) | 244 | static int sbus_iommu_map_sg_gflush(struct device *dev, struct scatterlist *sg, |
245 | int sz, enum dma_data_direction dir, unsigned long attrs) | ||
240 | { | 246 | { |
241 | int n; | 247 | int n; |
242 | 248 | ||
@@ -248,9 +254,12 @@ static void iommu_get_scsi_sgl_gflush(struct device *dev, struct scatterlist *sg | |||
248 | sg->dma_length = sg->length; | 254 | sg->dma_length = sg->length; |
249 | sg = sg_next(sg); | 255 | sg = sg_next(sg); |
250 | } | 256 | } |
257 | |||
258 | return sz; | ||
251 | } | 259 | } |
252 | 260 | ||
253 | static void iommu_get_scsi_sgl_pflush(struct device *dev, struct scatterlist *sg, int sz) | 261 | static int sbus_iommu_map_sg_pflush(struct device *dev, struct scatterlist *sg, |
262 | int sz, enum dma_data_direction dir, unsigned long attrs) | ||
254 | { | 263 | { |
255 | unsigned long page, oldpage = 0; | 264 | unsigned long page, oldpage = 0; |
256 | int n, i; | 265 | int n, i; |
@@ -279,6 +288,8 @@ static void iommu_get_scsi_sgl_pflush(struct device *dev, struct scatterlist *sg | |||
279 | sg->dma_length = sg->length; | 288 | sg->dma_length = sg->length; |
280 | sg = sg_next(sg); | 289 | sg = sg_next(sg); |
281 | } | 290 | } |
291 | |||
292 | return sz; | ||
282 | } | 293 | } |
283 | 294 | ||
284 | static void iommu_release_one(struct device *dev, u32 busa, int npages) | 295 | static void iommu_release_one(struct device *dev, u32 busa, int npages) |
@@ -297,23 +308,23 @@ static void iommu_release_one(struct device *dev, u32 busa, int npages) | |||
297 | bit_map_clear(&iommu->usemap, ioptex, npages); | 308 | bit_map_clear(&iommu->usemap, ioptex, npages); |
298 | } | 309 | } |
299 | 310 | ||
300 | static void iommu_release_scsi_one(struct device *dev, __u32 vaddr, unsigned long len) | 311 | static void sbus_iommu_unmap_page(struct device *dev, dma_addr_t dma_addr, |
312 | size_t len, enum dma_data_direction dir, unsigned long attrs) | ||
301 | { | 313 | { |
302 | unsigned long off; | 314 | unsigned long off = dma_addr & ~PAGE_MASK; |
303 | int npages; | 315 | int npages; |
304 | 316 | ||
305 | off = vaddr & ~PAGE_MASK; | ||
306 | npages = (off + len + PAGE_SIZE-1) >> PAGE_SHIFT; | 317 | npages = (off + len + PAGE_SIZE-1) >> PAGE_SHIFT; |
307 | iommu_release_one(dev, vaddr & PAGE_MASK, npages); | 318 | iommu_release_one(dev, dma_addr & PAGE_MASK, npages); |
308 | } | 319 | } |
309 | 320 | ||
310 | static void iommu_release_scsi_sgl(struct device *dev, struct scatterlist *sg, int sz) | 321 | static void sbus_iommu_unmap_sg(struct device *dev, struct scatterlist *sg, |
322 | int sz, enum dma_data_direction dir, unsigned long attrs) | ||
311 | { | 323 | { |
312 | int n; | 324 | int n; |
313 | 325 | ||
314 | while(sz != 0) { | 326 | while(sz != 0) { |
315 | --sz; | 327 | --sz; |
316 | |||
317 | n = (sg->length + sg->offset + PAGE_SIZE-1) >> PAGE_SHIFT; | 328 | n = (sg->length + sg->offset + PAGE_SIZE-1) >> PAGE_SHIFT; |
318 | iommu_release_one(dev, sg->dma_address & PAGE_MASK, n); | 329 | iommu_release_one(dev, sg->dma_address & PAGE_MASK, n); |
319 | sg->dma_address = 0x21212121; | 330 | sg->dma_address = 0x21212121; |
@@ -322,15 +333,28 @@ static void iommu_release_scsi_sgl(struct device *dev, struct scatterlist *sg, i | |||
322 | } | 333 | } |
323 | 334 | ||
324 | #ifdef CONFIG_SBUS | 335 | #ifdef CONFIG_SBUS |
325 | static int iommu_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned long va, | 336 | static void *sbus_iommu_alloc(struct device *dev, size_t len, |
326 | unsigned long addr, int len) | 337 | dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs) |
327 | { | 338 | { |
328 | struct iommu_struct *iommu = dev->archdata.iommu; | 339 | struct iommu_struct *iommu = dev->archdata.iommu; |
329 | unsigned long page, end; | 340 | unsigned long va, addr, page, end, ret; |
330 | iopte_t *iopte = iommu->page_table; | 341 | iopte_t *iopte = iommu->page_table; |
331 | iopte_t *first; | 342 | iopte_t *first; |
332 | int ioptex; | 343 | int ioptex; |
333 | 344 | ||
345 | /* XXX So what is maxphys for us and how do drivers know it? */ | ||
346 | if (!len || len > 256 * 1024) | ||
347 | return NULL; | ||
348 | |||
349 | len = PAGE_ALIGN(len); | ||
350 | va = __get_free_pages(gfp, get_order(len)); | ||
351 | if (va == 0) | ||
352 | return NULL; | ||
353 | |||
354 | addr = ret = sparc_dma_alloc_resource(dev, len); | ||
355 | if (!addr) | ||
356 | goto out_free_pages; | ||
357 | |||
334 | BUG_ON((va & ~PAGE_MASK) != 0); | 358 | BUG_ON((va & ~PAGE_MASK) != 0); |
335 | BUG_ON((addr & ~PAGE_MASK) != 0); | 359 | BUG_ON((addr & ~PAGE_MASK) != 0); |
336 | BUG_ON((len & ~PAGE_MASK) != 0); | 360 | BUG_ON((len & ~PAGE_MASK) != 0); |
@@ -385,16 +409,25 @@ static int iommu_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned long | |||
385 | flush_tlb_all(); | 409 | flush_tlb_all(); |
386 | iommu_invalidate(iommu->regs); | 410 | iommu_invalidate(iommu->regs); |
387 | 411 | ||
388 | *pba = iommu->start + (ioptex << PAGE_SHIFT); | 412 | *dma_handle = iommu->start + (ioptex << PAGE_SHIFT); |
389 | return 0; | 413 | return (void *)ret; |
414 | |||
415 | out_free_pages: | ||
416 | free_pages(va, get_order(len)); | ||
417 | return NULL; | ||
390 | } | 418 | } |
391 | 419 | ||
392 | static void iommu_unmap_dma_area(struct device *dev, unsigned long busa, int len) | 420 | static void sbus_iommu_free(struct device *dev, size_t len, void *cpu_addr, |
421 | dma_addr_t busa, unsigned long attrs) | ||
393 | { | 422 | { |
394 | struct iommu_struct *iommu = dev->archdata.iommu; | 423 | struct iommu_struct *iommu = dev->archdata.iommu; |
395 | iopte_t *iopte = iommu->page_table; | 424 | iopte_t *iopte = iommu->page_table; |
396 | unsigned long end; | 425 | struct page *page = virt_to_page(cpu_addr); |
397 | int ioptex = (busa - iommu->start) >> PAGE_SHIFT; | 426 | int ioptex = (busa - iommu->start) >> PAGE_SHIFT; |
427 | unsigned long end; | ||
428 | |||
429 | if (!sparc_dma_free_resource(cpu_addr, len)) | ||
430 | return; | ||
398 | 431 | ||
399 | BUG_ON((busa & ~PAGE_MASK) != 0); | 432 | BUG_ON((busa & ~PAGE_MASK) != 0); |
400 | BUG_ON((len & ~PAGE_MASK) != 0); | 433 | BUG_ON((len & ~PAGE_MASK) != 0); |
@@ -408,38 +441,40 @@ static void iommu_unmap_dma_area(struct device *dev, unsigned long busa, int len | |||
408 | flush_tlb_all(); | 441 | flush_tlb_all(); |
409 | iommu_invalidate(iommu->regs); | 442 | iommu_invalidate(iommu->regs); |
410 | bit_map_clear(&iommu->usemap, ioptex, len >> PAGE_SHIFT); | 443 | bit_map_clear(&iommu->usemap, ioptex, len >> PAGE_SHIFT); |
444 | |||
445 | __free_pages(page, get_order(len)); | ||
411 | } | 446 | } |
412 | #endif | 447 | #endif |
413 | 448 | ||
414 | static const struct sparc32_dma_ops iommu_dma_gflush_ops = { | 449 | static const struct dma_map_ops sbus_iommu_dma_gflush_ops = { |
415 | .get_scsi_one = iommu_get_scsi_one_gflush, | ||
416 | .get_scsi_sgl = iommu_get_scsi_sgl_gflush, | ||
417 | .release_scsi_one = iommu_release_scsi_one, | ||
418 | .release_scsi_sgl = iommu_release_scsi_sgl, | ||
419 | #ifdef CONFIG_SBUS | 450 | #ifdef CONFIG_SBUS |
420 | .map_dma_area = iommu_map_dma_area, | 451 | .alloc = sbus_iommu_alloc, |
421 | .unmap_dma_area = iommu_unmap_dma_area, | 452 | .free = sbus_iommu_free, |
422 | #endif | 453 | #endif |
454 | .map_page = sbus_iommu_map_page_gflush, | ||
455 | .unmap_page = sbus_iommu_unmap_page, | ||
456 | .map_sg = sbus_iommu_map_sg_gflush, | ||
457 | .unmap_sg = sbus_iommu_unmap_sg, | ||
423 | }; | 458 | }; |
424 | 459 | ||
425 | static const struct sparc32_dma_ops iommu_dma_pflush_ops = { | 460 | static const struct dma_map_ops sbus_iommu_dma_pflush_ops = { |
426 | .get_scsi_one = iommu_get_scsi_one_pflush, | ||
427 | .get_scsi_sgl = iommu_get_scsi_sgl_pflush, | ||
428 | .release_scsi_one = iommu_release_scsi_one, | ||
429 | .release_scsi_sgl = iommu_release_scsi_sgl, | ||
430 | #ifdef CONFIG_SBUS | 461 | #ifdef CONFIG_SBUS |
431 | .map_dma_area = iommu_map_dma_area, | 462 | .alloc = sbus_iommu_alloc, |
432 | .unmap_dma_area = iommu_unmap_dma_area, | 463 | .free = sbus_iommu_free, |
433 | #endif | 464 | #endif |
465 | .map_page = sbus_iommu_map_page_pflush, | ||
466 | .unmap_page = sbus_iommu_unmap_page, | ||
467 | .map_sg = sbus_iommu_map_sg_pflush, | ||
468 | .unmap_sg = sbus_iommu_unmap_sg, | ||
434 | }; | 469 | }; |
435 | 470 | ||
436 | void __init ld_mmu_iommu(void) | 471 | void __init ld_mmu_iommu(void) |
437 | { | 472 | { |
438 | if (flush_page_for_dma_global) { | 473 | if (flush_page_for_dma_global) { |
439 | /* flush_page_for_dma flushes everything, no matter of what page is it */ | 474 | /* flush_page_for_dma flushes everything, no matter of what page is it */ |
440 | sparc32_dma_ops = &iommu_dma_gflush_ops; | 475 | dma_ops = &sbus_iommu_dma_gflush_ops; |
441 | } else { | 476 | } else { |
442 | sparc32_dma_ops = &iommu_dma_pflush_ops; | 477 | dma_ops = &sbus_iommu_dma_pflush_ops; |
443 | } | 478 | } |
444 | 479 | ||
445 | if (viking_mxcc_present || srmmu_modtype == HyperSparc) { | 480 | if (viking_mxcc_present || srmmu_modtype == HyperSparc) { |