diff options
Diffstat (limited to 'arch/ia64/sn/pci/pci_dma.c')
-rw-r--r-- | arch/ia64/sn/pci/pci_dma.c | 99 |
1 files changed, 55 insertions, 44 deletions
diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index 863f5017baae..8c130e8f00e1 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c | |||
@@ -10,7 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/dma-attrs.h> | 13 | #include <linux/dma-mapping.h> |
14 | #include <asm/dma.h> | 14 | #include <asm/dma.h> |
15 | #include <asm/sn/intr.h> | 15 | #include <asm/sn/intr.h> |
16 | #include <asm/sn/pcibus_provider_defs.h> | 16 | #include <asm/sn/pcibus_provider_defs.h> |
@@ -31,7 +31,7 @@ | |||
31 | * this function. Of course, SN only supports devices that have 32 or more | 31 | * this function. Of course, SN only supports devices that have 32 or more |
32 | * address bits when using the PMU. | 32 | * address bits when using the PMU. |
33 | */ | 33 | */ |
34 | int sn_dma_supported(struct device *dev, u64 mask) | 34 | static int sn_dma_supported(struct device *dev, u64 mask) |
35 | { | 35 | { |
36 | BUG_ON(dev->bus != &pci_bus_type); | 36 | BUG_ON(dev->bus != &pci_bus_type); |
37 | 37 | ||
@@ -39,7 +39,6 @@ int sn_dma_supported(struct device *dev, u64 mask) | |||
39 | return 0; | 39 | return 0; |
40 | return 1; | 40 | return 1; |
41 | } | 41 | } |
42 | EXPORT_SYMBOL(sn_dma_supported); | ||
43 | 42 | ||
44 | /** | 43 | /** |
45 | * sn_dma_set_mask - set the DMA mask | 44 | * sn_dma_set_mask - set the DMA mask |
@@ -75,8 +74,8 @@ EXPORT_SYMBOL(sn_dma_set_mask); | |||
75 | * queue for a SCSI controller). See Documentation/DMA-API.txt for | 74 | * queue for a SCSI controller). See Documentation/DMA-API.txt for |
76 | * more information. | 75 | * more information. |
77 | */ | 76 | */ |
78 | void *sn_dma_alloc_coherent(struct device *dev, size_t size, | 77 | static void *sn_dma_alloc_coherent(struct device *dev, size_t size, |
79 | dma_addr_t * dma_handle, gfp_t flags) | 78 | dma_addr_t * dma_handle, gfp_t flags) |
80 | { | 79 | { |
81 | void *cpuaddr; | 80 | void *cpuaddr; |
82 | unsigned long phys_addr; | 81 | unsigned long phys_addr; |
@@ -124,7 +123,6 @@ void *sn_dma_alloc_coherent(struct device *dev, size_t size, | |||
124 | 123 | ||
125 | return cpuaddr; | 124 | return cpuaddr; |
126 | } | 125 | } |
127 | EXPORT_SYMBOL(sn_dma_alloc_coherent); | ||
128 | 126 | ||
129 | /** | 127 | /** |
130 | * sn_pci_free_coherent - free memory associated with coherent DMAable region | 128 | * sn_pci_free_coherent - free memory associated with coherent DMAable region |
@@ -136,8 +134,8 @@ EXPORT_SYMBOL(sn_dma_alloc_coherent); | |||
136 | * Frees the memory allocated by dma_alloc_coherent(), potentially unmapping | 134 | * Frees the memory allocated by dma_alloc_coherent(), potentially unmapping |
137 | * any associated IOMMU mappings. | 135 | * any associated IOMMU mappings. |
138 | */ | 136 | */ |
139 | void sn_dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, | 137 | static void sn_dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, |
140 | dma_addr_t dma_handle) | 138 | dma_addr_t dma_handle) |
141 | { | 139 | { |
142 | struct pci_dev *pdev = to_pci_dev(dev); | 140 | struct pci_dev *pdev = to_pci_dev(dev); |
143 | struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev); | 141 | struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev); |
@@ -147,7 +145,6 @@ void sn_dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, | |||
147 | provider->dma_unmap(pdev, dma_handle, 0); | 145 | provider->dma_unmap(pdev, dma_handle, 0); |
148 | free_pages((unsigned long)cpu_addr, get_order(size)); | 146 | free_pages((unsigned long)cpu_addr, get_order(size)); |
149 | } | 147 | } |
150 | EXPORT_SYMBOL(sn_dma_free_coherent); | ||
151 | 148 | ||
152 | /** | 149 | /** |
153 | * sn_dma_map_single_attrs - map a single page for DMA | 150 | * sn_dma_map_single_attrs - map a single page for DMA |
@@ -173,10 +170,12 @@ EXPORT_SYMBOL(sn_dma_free_coherent); | |||
173 | * TODO: simplify our interface; | 170 | * TODO: simplify our interface; |
174 | * figure out how to save dmamap handle so can use two step. | 171 | * figure out how to save dmamap handle so can use two step. |
175 | */ | 172 | */ |
176 | dma_addr_t sn_dma_map_single_attrs(struct device *dev, void *cpu_addr, | 173 | static dma_addr_t sn_dma_map_page(struct device *dev, struct page *page, |
177 | size_t size, int direction, | 174 | unsigned long offset, size_t size, |
178 | struct dma_attrs *attrs) | 175 | enum dma_data_direction dir, |
176 | struct dma_attrs *attrs) | ||
179 | { | 177 | { |
178 | void *cpu_addr = page_address(page) + offset; | ||
180 | dma_addr_t dma_addr; | 179 | dma_addr_t dma_addr; |
181 | unsigned long phys_addr; | 180 | unsigned long phys_addr; |
182 | struct pci_dev *pdev = to_pci_dev(dev); | 181 | struct pci_dev *pdev = to_pci_dev(dev); |
@@ -201,7 +200,6 @@ dma_addr_t sn_dma_map_single_attrs(struct device *dev, void *cpu_addr, | |||
201 | } | 200 | } |
202 | return dma_addr; | 201 | return dma_addr; |
203 | } | 202 | } |
204 | EXPORT_SYMBOL(sn_dma_map_single_attrs); | ||
205 | 203 | ||
206 | /** | 204 | /** |
207 | * sn_dma_unmap_single_attrs - unamp a DMA mapped page | 205 | * sn_dma_unmap_single_attrs - unamp a DMA mapped page |
@@ -215,21 +213,20 @@ EXPORT_SYMBOL(sn_dma_map_single_attrs); | |||
215 | * by @dma_handle into the coherence domain. On SN, we're always cache | 213 | * by @dma_handle into the coherence domain. On SN, we're always cache |
216 | * coherent, so we just need to free any ATEs associated with this mapping. | 214 | * coherent, so we just need to free any ATEs associated with this mapping. |
217 | */ | 215 | */ |
218 | void sn_dma_unmap_single_attrs(struct device *dev, dma_addr_t dma_addr, | 216 | static void sn_dma_unmap_page(struct device *dev, dma_addr_t dma_addr, |
219 | size_t size, int direction, | 217 | size_t size, enum dma_data_direction dir, |
220 | struct dma_attrs *attrs) | 218 | struct dma_attrs *attrs) |
221 | { | 219 | { |
222 | struct pci_dev *pdev = to_pci_dev(dev); | 220 | struct pci_dev *pdev = to_pci_dev(dev); |
223 | struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev); | 221 | struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev); |
224 | 222 | ||
225 | BUG_ON(dev->bus != &pci_bus_type); | 223 | BUG_ON(dev->bus != &pci_bus_type); |
226 | 224 | ||
227 | provider->dma_unmap(pdev, dma_addr, direction); | 225 | provider->dma_unmap(pdev, dma_addr, dir); |
228 | } | 226 | } |
229 | EXPORT_SYMBOL(sn_dma_unmap_single_attrs); | ||
230 | 227 | ||
231 | /** | 228 | /** |
232 | * sn_dma_unmap_sg_attrs - unmap a DMA scatterlist | 229 | * sn_dma_unmap_sg - unmap a DMA scatterlist |
233 | * @dev: device to unmap | 230 | * @dev: device to unmap |
234 | * @sg: scatterlist to unmap | 231 | * @sg: scatterlist to unmap |
235 | * @nhwentries: number of scatterlist entries | 232 | * @nhwentries: number of scatterlist entries |
@@ -238,9 +235,9 @@ EXPORT_SYMBOL(sn_dma_unmap_single_attrs); | |||
238 | * | 235 | * |
239 | * Unmap a set of streaming mode DMA translations. | 236 | * Unmap a set of streaming mode DMA translations. |
240 | */ | 237 | */ |
241 | void sn_dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sgl, | 238 | static void sn_dma_unmap_sg(struct device *dev, struct scatterlist *sgl, |
242 | int nhwentries, int direction, | 239 | int nhwentries, enum dma_data_direction dir, |
243 | struct dma_attrs *attrs) | 240 | struct dma_attrs *attrs) |
244 | { | 241 | { |
245 | int i; | 242 | int i; |
246 | struct pci_dev *pdev = to_pci_dev(dev); | 243 | struct pci_dev *pdev = to_pci_dev(dev); |
@@ -250,15 +247,14 @@ void sn_dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sgl, | |||
250 | BUG_ON(dev->bus != &pci_bus_type); | 247 | BUG_ON(dev->bus != &pci_bus_type); |
251 | 248 | ||
252 | for_each_sg(sgl, sg, nhwentries, i) { | 249 | for_each_sg(sgl, sg, nhwentries, i) { |
253 | provider->dma_unmap(pdev, sg->dma_address, direction); | 250 | provider->dma_unmap(pdev, sg->dma_address, dir); |
254 | sg->dma_address = (dma_addr_t) NULL; | 251 | sg->dma_address = (dma_addr_t) NULL; |
255 | sg->dma_length = 0; | 252 | sg->dma_length = 0; |
256 | } | 253 | } |
257 | } | 254 | } |
258 | EXPORT_SYMBOL(sn_dma_unmap_sg_attrs); | ||
259 | 255 | ||
260 | /** | 256 | /** |
261 | * sn_dma_map_sg_attrs - map a scatterlist for DMA | 257 | * sn_dma_map_sg - map a scatterlist for DMA |
262 | * @dev: device to map for | 258 | * @dev: device to map for |
263 | * @sg: scatterlist to map | 259 | * @sg: scatterlist to map |
264 | * @nhwentries: number of entries | 260 | * @nhwentries: number of entries |
@@ -272,8 +268,9 @@ EXPORT_SYMBOL(sn_dma_unmap_sg_attrs); | |||
272 | * | 268 | * |
273 | * Maps each entry of @sg for DMA. | 269 | * Maps each entry of @sg for DMA. |
274 | */ | 270 | */ |
275 | int sn_dma_map_sg_attrs(struct device *dev, struct scatterlist *sgl, | 271 | static int sn_dma_map_sg(struct device *dev, struct scatterlist *sgl, |
276 | int nhwentries, int direction, struct dma_attrs *attrs) | 272 | int nhwentries, enum dma_data_direction dir, |
273 | struct dma_attrs *attrs) | ||
277 | { | 274 | { |
278 | unsigned long phys_addr; | 275 | unsigned long phys_addr; |
279 | struct scatterlist *saved_sg = sgl, *sg; | 276 | struct scatterlist *saved_sg = sgl, *sg; |
@@ -310,8 +307,7 @@ int sn_dma_map_sg_attrs(struct device *dev, struct scatterlist *sgl, | |||
310 | * Free any successfully allocated entries. | 307 | * Free any successfully allocated entries. |
311 | */ | 308 | */ |
312 | if (i > 0) | 309 | if (i > 0) |
313 | sn_dma_unmap_sg_attrs(dev, saved_sg, i, | 310 | sn_dma_unmap_sg(dev, saved_sg, i, dir, attrs); |
314 | direction, attrs); | ||
315 | return 0; | 311 | return 0; |
316 | } | 312 | } |
317 | 313 | ||
@@ -320,41 +316,36 @@ int sn_dma_map_sg_attrs(struct device *dev, struct scatterlist *sgl, | |||
320 | 316 | ||
321 | return nhwentries; | 317 | return nhwentries; |
322 | } | 318 | } |
323 | EXPORT_SYMBOL(sn_dma_map_sg_attrs); | ||
324 | 319 | ||
325 | void sn_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, | 320 | static void sn_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, |
326 | size_t size, int direction) | 321 | size_t size, enum dma_data_direction dir) |
327 | { | 322 | { |
328 | BUG_ON(dev->bus != &pci_bus_type); | 323 | BUG_ON(dev->bus != &pci_bus_type); |
329 | } | 324 | } |
330 | EXPORT_SYMBOL(sn_dma_sync_single_for_cpu); | ||
331 | 325 | ||
332 | void sn_dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, | 326 | static void sn_dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, |
333 | size_t size, int direction) | 327 | size_t size, |
328 | enum dma_data_direction dir) | ||
334 | { | 329 | { |
335 | BUG_ON(dev->bus != &pci_bus_type); | 330 | BUG_ON(dev->bus != &pci_bus_type); |
336 | } | 331 | } |
337 | EXPORT_SYMBOL(sn_dma_sync_single_for_device); | ||
338 | 332 | ||
339 | void sn_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, | 333 | static void sn_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, |
340 | int nelems, int direction) | 334 | int nelems, enum dma_data_direction dir) |
341 | { | 335 | { |
342 | BUG_ON(dev->bus != &pci_bus_type); | 336 | BUG_ON(dev->bus != &pci_bus_type); |
343 | } | 337 | } |
344 | EXPORT_SYMBOL(sn_dma_sync_sg_for_cpu); | ||
345 | 338 | ||
346 | void sn_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, | 339 | static void sn_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, |
347 | int nelems, int direction) | 340 | int nelems, enum dma_data_direction dir) |
348 | { | 341 | { |
349 | BUG_ON(dev->bus != &pci_bus_type); | 342 | BUG_ON(dev->bus != &pci_bus_type); |
350 | } | 343 | } |
351 | EXPORT_SYMBOL(sn_dma_sync_sg_for_device); | ||
352 | 344 | ||
353 | int sn_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 345 | static int sn_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
354 | { | 346 | { |
355 | return 0; | 347 | return 0; |
356 | } | 348 | } |
357 | EXPORT_SYMBOL(sn_dma_mapping_error); | ||
358 | 349 | ||
359 | u64 sn_dma_get_required_mask(struct device *dev) | 350 | u64 sn_dma_get_required_mask(struct device *dev) |
360 | { | 351 | { |
@@ -471,3 +462,23 @@ int sn_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size) | |||
471 | out: | 462 | out: |
472 | return ret; | 463 | return ret; |
473 | } | 464 | } |
465 | |||
466 | static struct dma_map_ops sn_dma_ops = { | ||
467 | .alloc_coherent = sn_dma_alloc_coherent, | ||
468 | .free_coherent = sn_dma_free_coherent, | ||
469 | .map_page = sn_dma_map_page, | ||
470 | .unmap_page = sn_dma_unmap_page, | ||
471 | .map_sg = sn_dma_map_sg, | ||
472 | .unmap_sg = sn_dma_unmap_sg, | ||
473 | .sync_single_for_cpu = sn_dma_sync_single_for_cpu, | ||
474 | .sync_sg_for_cpu = sn_dma_sync_sg_for_cpu, | ||
475 | .sync_single_for_device = sn_dma_sync_single_for_device, | ||
476 | .sync_sg_for_device = sn_dma_sync_sg_for_device, | ||
477 | .mapping_error = sn_dma_mapping_error, | ||
478 | .dma_supported = sn_dma_supported, | ||
479 | }; | ||
480 | |||
481 | void sn_dma_init(void) | ||
482 | { | ||
483 | dma_ops = &sn_dma_ops; | ||
484 | } | ||