diff options
-rw-r--r-- | arch/powerpc/include/asm/dma-mapping.h | 21 | ||||
-rw-r--r-- | arch/powerpc/kernel/dma.c | 15 |
2 files changed, 22 insertions, 14 deletions
diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h index cb2ca41dd526..34b919fe8cda 100644 --- a/arch/powerpc/include/asm/dma-mapping.h +++ b/arch/powerpc/include/asm/dma-mapping.h | |||
@@ -26,7 +26,6 @@ extern void *dma_direct_alloc_coherent(struct device *dev, size_t size, | |||
26 | extern void dma_direct_free_coherent(struct device *dev, size_t size, | 26 | extern void dma_direct_free_coherent(struct device *dev, size_t size, |
27 | void *vaddr, dma_addr_t dma_handle); | 27 | void *vaddr, dma_addr_t dma_handle); |
28 | 28 | ||
29 | extern unsigned long get_dma_direct_offset(struct device *dev); | ||
30 | 29 | ||
31 | #ifdef CONFIG_NOT_COHERENT_CACHE | 30 | #ifdef CONFIG_NOT_COHERENT_CACHE |
32 | /* | 31 | /* |
@@ -90,6 +89,22 @@ static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops) | |||
90 | dev->archdata.dma_ops = ops; | 89 | dev->archdata.dma_ops = ops; |
91 | } | 90 | } |
92 | 91 | ||
92 | /* | ||
93 | * get_dma_offset() | ||
94 | * | ||
95 | * Get the dma offset on configurations where the dma address can be determined | ||
96 | * from the physical address by looking at a simple offset. Direct dma and | ||
97 | * swiotlb use this function, but it is typically not used by implementations | ||
98 | * with an iommu. | ||
99 | */ | ||
100 | static inline unsigned long get_dma_offset(struct device *dev) | ||
101 | { | ||
102 | if (dev) | ||
103 | return (unsigned long)dev->archdata.dma_data; | ||
104 | |||
105 | return PCI_DRAM_OFFSET; | ||
106 | } | ||
107 | |||
93 | /* this will be removed soon */ | 108 | /* this will be removed soon */ |
94 | #define flush_write_buffers() | 109 | #define flush_write_buffers() |
95 | 110 | ||
@@ -181,12 +196,12 @@ static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size) | |||
181 | 196 | ||
182 | static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr) | 197 | static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr) |
183 | { | 198 | { |
184 | return paddr + get_dma_direct_offset(dev); | 199 | return paddr + get_dma_offset(dev); |
185 | } | 200 | } |
186 | 201 | ||
187 | static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr) | 202 | static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr) |
188 | { | 203 | { |
189 | return daddr - get_dma_direct_offset(dev); | 204 | return daddr - get_dma_offset(dev); |
190 | } | 205 | } |
191 | 206 | ||
192 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | 207 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) |
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index 21b784d7e7d0..6215062caf8c 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c | |||
@@ -21,13 +21,6 @@ | |||
21 | * default the offset is PCI_DRAM_OFFSET. | 21 | * default the offset is PCI_DRAM_OFFSET. |
22 | */ | 22 | */ |
23 | 23 | ||
24 | unsigned long get_dma_direct_offset(struct device *dev) | ||
25 | { | ||
26 | if (dev) | ||
27 | return (unsigned long)dev->archdata.dma_data; | ||
28 | |||
29 | return PCI_DRAM_OFFSET; | ||
30 | } | ||
31 | 24 | ||
32 | void *dma_direct_alloc_coherent(struct device *dev, size_t size, | 25 | void *dma_direct_alloc_coherent(struct device *dev, size_t size, |
33 | dma_addr_t *dma_handle, gfp_t flag) | 26 | dma_addr_t *dma_handle, gfp_t flag) |
@@ -37,7 +30,7 @@ void *dma_direct_alloc_coherent(struct device *dev, size_t size, | |||
37 | ret = __dma_alloc_coherent(dev, size, dma_handle, flag); | 30 | ret = __dma_alloc_coherent(dev, size, dma_handle, flag); |
38 | if (ret == NULL) | 31 | if (ret == NULL) |
39 | return NULL; | 32 | return NULL; |
40 | *dma_handle += get_dma_direct_offset(dev); | 33 | *dma_handle += get_dma_offset(dev); |
41 | return ret; | 34 | return ret; |
42 | #else | 35 | #else |
43 | struct page *page; | 36 | struct page *page; |
@@ -51,7 +44,7 @@ void *dma_direct_alloc_coherent(struct device *dev, size_t size, | |||
51 | return NULL; | 44 | return NULL; |
52 | ret = page_address(page); | 45 | ret = page_address(page); |
53 | memset(ret, 0, size); | 46 | memset(ret, 0, size); |
54 | *dma_handle = virt_to_abs(ret) + get_dma_direct_offset(dev); | 47 | *dma_handle = virt_to_abs(ret) + get_dma_offset(dev); |
55 | 48 | ||
56 | return ret; | 49 | return ret; |
57 | #endif | 50 | #endif |
@@ -75,7 +68,7 @@ static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, | |||
75 | int i; | 68 | int i; |
76 | 69 | ||
77 | for_each_sg(sgl, sg, nents, i) { | 70 | for_each_sg(sgl, sg, nents, i) { |
78 | sg->dma_address = sg_phys(sg) + get_dma_direct_offset(dev); | 71 | sg->dma_address = sg_phys(sg) + get_dma_offset(dev); |
79 | sg->dma_length = sg->length; | 72 | sg->dma_length = sg->length; |
80 | __dma_sync_page(sg_page(sg), sg->offset, sg->length, direction); | 73 | __dma_sync_page(sg_page(sg), sg->offset, sg->length, direction); |
81 | } | 74 | } |
@@ -110,7 +103,7 @@ static inline dma_addr_t dma_direct_map_page(struct device *dev, | |||
110 | { | 103 | { |
111 | BUG_ON(dir == DMA_NONE); | 104 | BUG_ON(dir == DMA_NONE); |
112 | __dma_sync_page(page, offset, size, dir); | 105 | __dma_sync_page(page, offset, size, dir); |
113 | return page_to_phys(page) + offset + get_dma_direct_offset(dev); | 106 | return page_to_phys(page) + offset + get_dma_offset(dev); |
114 | } | 107 | } |
115 | 108 | ||
116 | static inline void dma_direct_unmap_page(struct device *dev, | 109 | static inline void dma_direct_unmap_page(struct device *dev, |