diff options
-rw-r--r-- | arch/parisc/include/asm/Kbuild | 1 | ||||
-rw-r--r-- | arch/parisc/include/asm/scatterlist.h | 10 | ||||
-rw-r--r-- | arch/parisc/kernel/pci-dma.c | 8 | ||||
-rw-r--r-- | drivers/parisc/ccio-dma.c | 6 | ||||
-rw-r--r-- | drivers/parisc/iommu-helpers.h | 26 | ||||
-rw-r--r-- | drivers/parisc/sba_iommu.c | 7 |
6 files changed, 25 insertions, 33 deletions
diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild index 12b341d04f88..7a4bcc36303d 100644 --- a/arch/parisc/include/asm/Kbuild +++ b/arch/parisc/include/asm/Kbuild | |||
@@ -20,6 +20,7 @@ generic-y += param.h | |||
20 | generic-y += percpu.h | 20 | generic-y += percpu.h |
21 | generic-y += poll.h | 21 | generic-y += poll.h |
22 | generic-y += preempt.h | 22 | generic-y += preempt.h |
23 | generic-y += scatterlist.h | ||
23 | generic-y += seccomp.h | 24 | generic-y += seccomp.h |
24 | generic-y += segment.h | 25 | generic-y += segment.h |
25 | generic-y += topology.h | 26 | generic-y += topology.h |
diff --git a/arch/parisc/include/asm/scatterlist.h b/arch/parisc/include/asm/scatterlist.h deleted file mode 100644 index 8bf1f0dd1f15..000000000000 --- a/arch/parisc/include/asm/scatterlist.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | #ifndef _ASM_PARISC_SCATTERLIST_H | ||
2 | #define _ASM_PARISC_SCATTERLIST_H | ||
3 | |||
4 | #include <asm/page.h> | ||
5 | #include <asm/types.h> | ||
6 | #include <asm-generic/scatterlist.h> | ||
7 | |||
8 | #define sg_virt_addr(sg) ((unsigned long)sg_virt(sg)) | ||
9 | |||
10 | #endif /* _ASM_PARISC_SCATTERLIST_H */ | ||
diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index d87d1c476d85..ff834fd67478 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c | |||
@@ -482,7 +482,7 @@ static int pa11_dma_map_sg(struct device *dev, struct scatterlist *sglist, int n | |||
482 | BUG_ON(direction == DMA_NONE); | 482 | BUG_ON(direction == DMA_NONE); |
483 | 483 | ||
484 | for (i = 0; i < nents; i++, sglist++ ) { | 484 | for (i = 0; i < nents; i++, sglist++ ) { |
485 | unsigned long vaddr = sg_virt_addr(sglist); | 485 | unsigned long vaddr = (unsigned long)sg_virt(sglist); |
486 | sg_dma_address(sglist) = (dma_addr_t) virt_to_phys(vaddr); | 486 | sg_dma_address(sglist) = (dma_addr_t) virt_to_phys(vaddr); |
487 | sg_dma_len(sglist) = sglist->length; | 487 | sg_dma_len(sglist) = sglist->length; |
488 | flush_kernel_dcache_range(vaddr, sglist->length); | 488 | flush_kernel_dcache_range(vaddr, sglist->length); |
@@ -502,7 +502,7 @@ static void pa11_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, in | |||
502 | /* once we do combining we'll need to use phys_to_virt(sg_dma_address(sglist)) */ | 502 | /* once we do combining we'll need to use phys_to_virt(sg_dma_address(sglist)) */ |
503 | 503 | ||
504 | for (i = 0; i < nents; i++, sglist++ ) | 504 | for (i = 0; i < nents; i++, sglist++ ) |
505 | flush_kernel_dcache_range(sg_virt_addr(sglist), sglist->length); | 505 | flush_kernel_vmap_range(sg_virt(sglist), sglist->length); |
506 | return; | 506 | return; |
507 | } | 507 | } |
508 | 508 | ||
@@ -527,7 +527,7 @@ static void pa11_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sgl | |||
527 | /* once we do combining we'll need to use phys_to_virt(sg_dma_address(sglist)) */ | 527 | /* once we do combining we'll need to use phys_to_virt(sg_dma_address(sglist)) */ |
528 | 528 | ||
529 | for (i = 0; i < nents; i++, sglist++ ) | 529 | for (i = 0; i < nents; i++, sglist++ ) |
530 | flush_kernel_dcache_range(sg_virt_addr(sglist), sglist->length); | 530 | flush_kernel_vmap_range(sg_virt(sglist), sglist->length); |
531 | } | 531 | } |
532 | 532 | ||
533 | static void pa11_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sglist, int nents, enum dma_data_direction direction) | 533 | static void pa11_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sglist, int nents, enum dma_data_direction direction) |
@@ -537,7 +537,7 @@ static void pa11_dma_sync_sg_for_device(struct device *dev, struct scatterlist * | |||
537 | /* once we do combining we'll need to use phys_to_virt(sg_dma_address(sglist)) */ | 537 | /* once we do combining we'll need to use phys_to_virt(sg_dma_address(sglist)) */ |
538 | 538 | ||
539 | for (i = 0; i < nents; i++, sglist++ ) | 539 | for (i = 0; i < nents; i++, sglist++ ) |
540 | flush_kernel_dcache_range(sg_virt_addr(sglist), sglist->length); | 540 | flush_kernel_vmap_range(sg_virt(sglist), sglist->length); |
541 | } | 541 | } |
542 | 542 | ||
543 | struct hppa_dma_ops pcxl_dma_ops = { | 543 | struct hppa_dma_ops pcxl_dma_ops = { |
diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c index 6bc16809c504..02ff84fcfa61 100644 --- a/drivers/parisc/ccio-dma.c +++ b/drivers/parisc/ccio-dma.c | |||
@@ -916,7 +916,7 @@ ccio_map_sg(struct device *dev, struct scatterlist *sglist, int nents, | |||
916 | /* Fast path single entry scatterlists. */ | 916 | /* Fast path single entry scatterlists. */ |
917 | if (nents == 1) { | 917 | if (nents == 1) { |
918 | sg_dma_address(sglist) = ccio_map_single(dev, | 918 | sg_dma_address(sglist) = ccio_map_single(dev, |
919 | (void *)sg_virt_addr(sglist), sglist->length, | 919 | sg_virt(sglist), sglist->length, |
920 | direction); | 920 | direction); |
921 | sg_dma_len(sglist) = sglist->length; | 921 | sg_dma_len(sglist) = sglist->length; |
922 | return 1; | 922 | return 1; |
@@ -983,8 +983,8 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, | |||
983 | BUG_ON(!dev); | 983 | BUG_ON(!dev); |
984 | ioc = GET_IOC(dev); | 984 | ioc = GET_IOC(dev); |
985 | 985 | ||
986 | DBG_RUN_SG("%s() START %d entries, %08lx,%x\n", | 986 | DBG_RUN_SG("%s() START %d entries, %p,%x\n", |
987 | __func__, nents, sg_virt_addr(sglist), sglist->length); | 987 | __func__, nents, sg_virt(sglist), sglist->length); |
988 | 988 | ||
989 | #ifdef CCIO_COLLECT_STATS | 989 | #ifdef CCIO_COLLECT_STATS |
990 | ioc->usg_calls++; | 990 | ioc->usg_calls++; |
diff --git a/drivers/parisc/iommu-helpers.h b/drivers/parisc/iommu-helpers.h index 8c33491b21fe..761e77bfce5d 100644 --- a/drivers/parisc/iommu-helpers.h +++ b/drivers/parisc/iommu-helpers.h | |||
@@ -30,9 +30,9 @@ iommu_fill_pdir(struct ioc *ioc, struct scatterlist *startsg, int nents, | |||
30 | unsigned long vaddr; | 30 | unsigned long vaddr; |
31 | long size; | 31 | long size; |
32 | 32 | ||
33 | DBG_RUN_SG(" %d : %08lx/%05x %08lx/%05x\n", nents, | 33 | DBG_RUN_SG(" %d : %08lx/%05x %p/%05x\n", nents, |
34 | (unsigned long)sg_dma_address(startsg), cnt, | 34 | (unsigned long)sg_dma_address(startsg), cnt, |
35 | sg_virt_addr(startsg), startsg->length | 35 | sg_virt(startsg), startsg->length |
36 | ); | 36 | ); |
37 | 37 | ||
38 | 38 | ||
@@ -66,7 +66,7 @@ iommu_fill_pdir(struct ioc *ioc, struct scatterlist *startsg, int nents, | |||
66 | 66 | ||
67 | BUG_ON(pdirp == NULL); | 67 | BUG_ON(pdirp == NULL); |
68 | 68 | ||
69 | vaddr = sg_virt_addr(startsg); | 69 | vaddr = (unsigned long)sg_virt(startsg); |
70 | sg_dma_len(dma_sg) += startsg->length; | 70 | sg_dma_len(dma_sg) += startsg->length; |
71 | size = startsg->length + dma_offset; | 71 | size = startsg->length + dma_offset; |
72 | dma_offset = 0; | 72 | dma_offset = 0; |
@@ -113,7 +113,7 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev, | |||
113 | */ | 113 | */ |
114 | contig_sg = startsg; | 114 | contig_sg = startsg; |
115 | dma_len = startsg->length; | 115 | dma_len = startsg->length; |
116 | dma_offset = sg_virt_addr(startsg) & ~IOVP_MASK; | 116 | dma_offset = startsg->offset; |
117 | 117 | ||
118 | /* PARANOID: clear entries */ | 118 | /* PARANOID: clear entries */ |
119 | sg_dma_address(startsg) = 0; | 119 | sg_dma_address(startsg) = 0; |
@@ -124,14 +124,13 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev, | |||
124 | ** it's always looking one "ahead". | 124 | ** it's always looking one "ahead". |
125 | */ | 125 | */ |
126 | while(--nents > 0) { | 126 | while(--nents > 0) { |
127 | unsigned long prevstartsg_end, startsg_end; | 127 | unsigned long prev_end, sg_start; |
128 | 128 | ||
129 | prevstartsg_end = sg_virt_addr(startsg) + | 129 | prev_end = (unsigned long)sg_virt(startsg) + |
130 | startsg->length; | 130 | startsg->length; |
131 | 131 | ||
132 | startsg++; | 132 | startsg++; |
133 | startsg_end = sg_virt_addr(startsg) + | 133 | sg_start = (unsigned long)sg_virt(startsg); |
134 | startsg->length; | ||
135 | 134 | ||
136 | /* PARANOID: clear entries */ | 135 | /* PARANOID: clear entries */ |
137 | sg_dma_address(startsg) = 0; | 136 | sg_dma_address(startsg) = 0; |
@@ -150,10 +149,13 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev, | |||
150 | break; | 149 | break; |
151 | 150 | ||
152 | /* | 151 | /* |
153 | ** Next see if we can append the next chunk (i.e. | 152 | * Next see if we can append the next chunk (i.e. |
154 | ** it must end on one page and begin on another | 153 | * it must end on one page and begin on another, or |
154 | * it must start on the same address as the previous | ||
155 | * entry ended. | ||
155 | */ | 156 | */ |
156 | if (unlikely(((prevstartsg_end | sg_virt_addr(startsg)) & ~PAGE_MASK) != 0)) | 157 | if (unlikely((prev_end != sg_start) || |
158 | ((prev_end | sg_start) & ~PAGE_MASK))) | ||
157 | break; | 159 | break; |
158 | 160 | ||
159 | dma_len += startsg->length; | 161 | dma_len += startsg->length; |
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index f07471264689..f1441e466c06 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c | |||
@@ -278,7 +278,7 @@ sba_dump_sg( struct ioc *ioc, struct scatterlist *startsg, int nents) | |||
278 | nents, | 278 | nents, |
279 | (unsigned long) sg_dma_address(startsg), | 279 | (unsigned long) sg_dma_address(startsg), |
280 | sg_dma_len(startsg), | 280 | sg_dma_len(startsg), |
281 | sg_virt_addr(startsg), startsg->length); | 281 | sg_virt(startsg), startsg->length); |
282 | startsg++; | 282 | startsg++; |
283 | } | 283 | } |
284 | } | 284 | } |
@@ -945,8 +945,7 @@ sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, | |||
945 | 945 | ||
946 | /* Fast path single entry scatterlists. */ | 946 | /* Fast path single entry scatterlists. */ |
947 | if (nents == 1) { | 947 | if (nents == 1) { |
948 | sg_dma_address(sglist) = sba_map_single(dev, | 948 | sg_dma_address(sglist) = sba_map_single(dev, sg_virt(sglist), |
949 | (void *)sg_virt_addr(sglist), | ||
950 | sglist->length, direction); | 949 | sglist->length, direction); |
951 | sg_dma_len(sglist) = sglist->length; | 950 | sg_dma_len(sglist) = sglist->length; |
952 | return 1; | 951 | return 1; |
@@ -1025,7 +1024,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, | |||
1025 | #endif | 1024 | #endif |
1026 | 1025 | ||
1027 | DBG_RUN_SG("%s() START %d entries, %p,%x\n", | 1026 | DBG_RUN_SG("%s() START %d entries, %p,%x\n", |
1028 | __func__, nents, sg_virt_addr(sglist), sglist->length); | 1027 | __func__, nents, sg_virt(sglist), sglist->length); |
1029 | 1028 | ||
1030 | ioc = GET_IOC(dev); | 1029 | ioc = GET_IOC(dev); |
1031 | 1030 | ||