aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/mm
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-12-03 08:04:32 -0500
committerChristoph Hellwig <hch@lst.de>2018-12-11 08:45:29 -0500
commitce65d36f3ea79368170ca58f2efd28cdba3d70e9 (patch)
treee9f8449b46f86abc62de7896c25565ae10b3d609 /arch/sparc/mm
parent53b7670e5735ba1c662230377d764799aaf57300 (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.c65
-rw-r--r--arch/sparc/mm/iommu.c137
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
143static __u32 iounit_get_scsi_one(struct device *dev, char *vaddr, unsigned long len) 143static 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
154static void iounit_get_scsi_sgl(struct device *dev, struct scatterlist *sg, int sz) 161static 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
170static void iounit_release_scsi_one(struct device *dev, __u32 vaddr, unsigned long len) 179static 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
184static void iounit_release_scsi_sgl(struct device *dev, struct scatterlist *sg, int sz) 194static 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
204static int iounit_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned long va, unsigned long addr, int len) 215static 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
266out_free_pages:
267 free_pages(va, get_order(len));
268 return NULL;
241} 269}
242 270
243static void iounit_unmap_dma_area(struct device *dev, unsigned long addr, int len) 271static 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
249static const struct sparc32_dma_ops iounit_dma_ops = { 278static 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
260void __init ld_mmu_iounit(void) 289void __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
208static u32 iommu_get_scsi_one(struct device *dev, char *vaddr, unsigned int len) 208static 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
222static __u32 iommu_get_scsi_one_gflush(struct device *dev, char *vaddr, unsigned long len) 221static 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
228static __u32 iommu_get_scsi_one_pflush(struct device *dev, char *vaddr, unsigned long len) 229static 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
239static void iommu_get_scsi_sgl_gflush(struct device *dev, struct scatterlist *sg, int sz) 244static 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
253static void iommu_get_scsi_sgl_pflush(struct device *dev, struct scatterlist *sg, int sz) 261static 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
284static void iommu_release_one(struct device *dev, u32 busa, int npages) 295static 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
300static void iommu_release_scsi_one(struct device *dev, __u32 vaddr, unsigned long len) 311static 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
310static void iommu_release_scsi_sgl(struct device *dev, struct scatterlist *sg, int sz) 321static 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
325static int iommu_map_dma_area(struct device *dev, dma_addr_t *pba, unsigned long va, 336static 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
415out_free_pages:
416 free_pages(va, get_order(len));
417 return NULL;
390} 418}
391 419
392static void iommu_unmap_dma_area(struct device *dev, unsigned long busa, int len) 420static 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
414static const struct sparc32_dma_ops iommu_dma_gflush_ops = { 449static 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
425static const struct sparc32_dma_ops iommu_dma_pflush_ops = { 460static 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
436void __init ld_mmu_iommu(void) 471void __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) {