aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64')
-rw-r--r--arch/sparc64/kernel/iommu.c7
-rw-r--r--arch/sparc64/kernel/iommu_common.h14
-rw-r--r--arch/sparc64/kernel/pci_sun4v.c7
3 files changed, 10 insertions, 18 deletions
diff --git a/arch/sparc64/kernel/iommu.c b/arch/sparc64/kernel/iommu.c
index f73b238cd2d4..1cc1995531e2 100644
--- a/arch/sparc64/kernel/iommu.c
+++ b/arch/sparc64/kernel/iommu.c
@@ -575,7 +575,7 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist,
575 } 575 }
576 /* Allocate iommu entries for that segment */ 576 /* Allocate iommu entries for that segment */
577 paddr = (unsigned long) SG_ENT_PHYS_ADDRESS(s); 577 paddr = (unsigned long) SG_ENT_PHYS_ADDRESS(s);
578 npages = iommu_nr_pages(paddr, slen); 578 npages = iommu_num_pages(paddr, slen, IO_PAGE_SIZE);
579 entry = iommu_range_alloc(dev, iommu, npages, &handle); 579 entry = iommu_range_alloc(dev, iommu, npages, &handle);
580 580
581 /* Handle failure */ 581 /* Handle failure */
@@ -647,7 +647,8 @@ iommu_map_failed:
647 iopte_t *base; 647 iopte_t *base;
648 648
649 vaddr = s->dma_address & IO_PAGE_MASK; 649 vaddr = s->dma_address & IO_PAGE_MASK;
650 npages = iommu_nr_pages(s->dma_address, s->dma_length); 650 npages = iommu_num_pages(s->dma_address, s->dma_length,
651 IO_PAGE_SIZE);
651 iommu_range_free(iommu, vaddr, npages); 652 iommu_range_free(iommu, vaddr, npages);
652 653
653 entry = (vaddr - iommu->page_table_map_base) 654 entry = (vaddr - iommu->page_table_map_base)
@@ -715,7 +716,7 @@ static void dma_4u_unmap_sg(struct device *dev, struct scatterlist *sglist,
715 716
716 if (!len) 717 if (!len)
717 break; 718 break;
718 npages = iommu_nr_pages(dma_handle, len); 719 npages = iommu_num_pages(dma_handle, len, IO_PAGE_SIZE);
719 iommu_range_free(iommu, dma_handle, npages); 720 iommu_range_free(iommu, dma_handle, npages);
720 721
721 entry = ((dma_handle - iommu->page_table_map_base) 722 entry = ((dma_handle - iommu->page_table_map_base)
diff --git a/arch/sparc64/kernel/iommu_common.h b/arch/sparc64/kernel/iommu_common.h
index 202d8ae2a67e..591f5879039c 100644
--- a/arch/sparc64/kernel/iommu_common.h
+++ b/arch/sparc64/kernel/iommu_common.h
@@ -35,17 +35,6 @@
35 35
36#define SG_ENT_PHYS_ADDRESS(SG) (__pa(sg_virt((SG)))) 36#define SG_ENT_PHYS_ADDRESS(SG) (__pa(sg_virt((SG))))
37 37
38static inline unsigned long iommu_nr_pages(unsigned long vaddr,
39 unsigned long slen)
40{
41 unsigned long npages;
42
43 npages = IO_PAGE_ALIGN(vaddr + slen) - (vaddr & IO_PAGE_MASK);
44 npages >>= IO_PAGE_SHIFT;
45
46 return npages;
47}
48
49static inline int is_span_boundary(unsigned long entry, 38static inline int is_span_boundary(unsigned long entry,
50 unsigned long shift, 39 unsigned long shift,
51 unsigned long boundary_size, 40 unsigned long boundary_size,
@@ -53,7 +42,8 @@ static inline int is_span_boundary(unsigned long entry,
53 struct scatterlist *sg) 42 struct scatterlist *sg)
54{ 43{
55 unsigned long paddr = SG_ENT_PHYS_ADDRESS(outs); 44 unsigned long paddr = SG_ENT_PHYS_ADDRESS(outs);
56 int nr = iommu_nr_pages(paddr, outs->dma_length + sg->length); 45 int nr = iommu_num_pages(paddr, outs->dma_length + sg->length,
46 IO_PAGE_SIZE);
57 47
58 return iommu_is_span_boundary(entry, nr, shift, boundary_size); 48 return iommu_is_span_boundary(entry, nr, shift, boundary_size);
59} 49}
diff --git a/arch/sparc64/kernel/pci_sun4v.c b/arch/sparc64/kernel/pci_sun4v.c
index e24495407e89..34a1fded3941 100644
--- a/arch/sparc64/kernel/pci_sun4v.c
+++ b/arch/sparc64/kernel/pci_sun4v.c
@@ -384,7 +384,7 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
384 } 384 }
385 /* Allocate iommu entries for that segment */ 385 /* Allocate iommu entries for that segment */
386 paddr = (unsigned long) SG_ENT_PHYS_ADDRESS(s); 386 paddr = (unsigned long) SG_ENT_PHYS_ADDRESS(s);
387 npages = iommu_nr_pages(paddr, slen); 387 npages = iommu_num_pages(paddr, slen, IO_PAGE_SIZE);
388 entry = iommu_range_alloc(dev, iommu, npages, &handle); 388 entry = iommu_range_alloc(dev, iommu, npages, &handle);
389 389
390 /* Handle failure */ 390 /* Handle failure */
@@ -461,7 +461,8 @@ iommu_map_failed:
461 unsigned long vaddr, npages; 461 unsigned long vaddr, npages;
462 462
463 vaddr = s->dma_address & IO_PAGE_MASK; 463 vaddr = s->dma_address & IO_PAGE_MASK;
464 npages = iommu_nr_pages(s->dma_address, s->dma_length); 464 npages = iommu_num_pages(s->dma_address, s->dma_length,
465 IO_PAGE_SIZE);
465 iommu_range_free(iommu, vaddr, npages); 466 iommu_range_free(iommu, vaddr, npages);
466 /* XXX demap? XXX */ 467 /* XXX demap? XXX */
467 s->dma_address = DMA_ERROR_CODE; 468 s->dma_address = DMA_ERROR_CODE;
@@ -500,7 +501,7 @@ static void dma_4v_unmap_sg(struct device *dev, struct scatterlist *sglist,
500 501
501 if (!len) 502 if (!len)
502 break; 503 break;
503 npages = iommu_nr_pages(dma_handle, len); 504 npages = iommu_num_pages(dma_handle, len, IO_PAGE_SIZE);
504 iommu_range_free(iommu, dma_handle, npages); 505 iommu_range_free(iommu, dma_handle, npages);
505 506
506 entry = ((dma_handle - iommu->page_table_map_base) >> IO_PAGE_SHIFT); 507 entry = ((dma_handle - iommu->page_table_map_base) >> IO_PAGE_SHIFT);