diff options
Diffstat (limited to 'include/linux/dma-mapping.h')
-rw-r--r-- | include/linux/dma-mapping.h | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index c24721a33b4c..0977317c6835 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
@@ -134,7 +134,8 @@ struct dma_map_ops { | |||
134 | int is_phys; | 134 | int is_phys; |
135 | }; | 135 | }; |
136 | 136 | ||
137 | extern struct dma_map_ops dma_noop_ops; | 137 | extern const struct dma_map_ops dma_noop_ops; |
138 | extern const struct dma_map_ops dma_virt_ops; | ||
138 | 139 | ||
139 | #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) | 140 | #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) |
140 | 141 | ||
@@ -171,14 +172,26 @@ int dma_mmap_from_coherent(struct device *dev, struct vm_area_struct *vma, | |||
171 | 172 | ||
172 | #ifdef CONFIG_HAS_DMA | 173 | #ifdef CONFIG_HAS_DMA |
173 | #include <asm/dma-mapping.h> | 174 | #include <asm/dma-mapping.h> |
175 | static inline const struct dma_map_ops *get_dma_ops(struct device *dev) | ||
176 | { | ||
177 | if (dev && dev->dma_ops) | ||
178 | return dev->dma_ops; | ||
179 | return get_arch_dma_ops(dev ? dev->bus : NULL); | ||
180 | } | ||
181 | |||
182 | static inline void set_dma_ops(struct device *dev, | ||
183 | const struct dma_map_ops *dma_ops) | ||
184 | { | ||
185 | dev->dma_ops = dma_ops; | ||
186 | } | ||
174 | #else | 187 | #else |
175 | /* | 188 | /* |
176 | * Define the dma api to allow compilation but not linking of | 189 | * Define the dma api to allow compilation but not linking of |
177 | * dma dependent code. Code that depends on the dma-mapping | 190 | * dma dependent code. Code that depends on the dma-mapping |
178 | * API needs to set 'depends on HAS_DMA' in its Kconfig | 191 | * API needs to set 'depends on HAS_DMA' in its Kconfig |
179 | */ | 192 | */ |
180 | extern struct dma_map_ops bad_dma_ops; | 193 | extern const struct dma_map_ops bad_dma_ops; |
181 | static inline struct dma_map_ops *get_dma_ops(struct device *dev) | 194 | static inline const struct dma_map_ops *get_dma_ops(struct device *dev) |
182 | { | 195 | { |
183 | return &bad_dma_ops; | 196 | return &bad_dma_ops; |
184 | } | 197 | } |
@@ -189,7 +202,7 @@ static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr, | |||
189 | enum dma_data_direction dir, | 202 | enum dma_data_direction dir, |
190 | unsigned long attrs) | 203 | unsigned long attrs) |
191 | { | 204 | { |
192 | struct dma_map_ops *ops = get_dma_ops(dev); | 205 | const struct dma_map_ops *ops = get_dma_ops(dev); |
193 | dma_addr_t addr; | 206 | dma_addr_t addr; |
194 | 207 | ||
195 | kmemcheck_mark_initialized(ptr, size); | 208 | kmemcheck_mark_initialized(ptr, size); |
@@ -208,7 +221,7 @@ static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr, | |||
208 | enum dma_data_direction dir, | 221 | enum dma_data_direction dir, |
209 | unsigned long attrs) | 222 | unsigned long attrs) |
210 | { | 223 | { |
211 | struct dma_map_ops *ops = get_dma_ops(dev); | 224 | const struct dma_map_ops *ops = get_dma_ops(dev); |
212 | 225 | ||
213 | BUG_ON(!valid_dma_direction(dir)); | 226 | BUG_ON(!valid_dma_direction(dir)); |
214 | if (ops->unmap_page) | 227 | if (ops->unmap_page) |
@@ -224,7 +237,7 @@ static inline int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, | |||
224 | int nents, enum dma_data_direction dir, | 237 | int nents, enum dma_data_direction dir, |
225 | unsigned long attrs) | 238 | unsigned long attrs) |
226 | { | 239 | { |
227 | struct dma_map_ops *ops = get_dma_ops(dev); | 240 | const struct dma_map_ops *ops = get_dma_ops(dev); |
228 | int i, ents; | 241 | int i, ents; |
229 | struct scatterlist *s; | 242 | struct scatterlist *s; |
230 | 243 | ||
@@ -242,7 +255,7 @@ static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg | |||
242 | int nents, enum dma_data_direction dir, | 255 | int nents, enum dma_data_direction dir, |
243 | unsigned long attrs) | 256 | unsigned long attrs) |
244 | { | 257 | { |
245 | struct dma_map_ops *ops = get_dma_ops(dev); | 258 | const struct dma_map_ops *ops = get_dma_ops(dev); |
246 | 259 | ||
247 | BUG_ON(!valid_dma_direction(dir)); | 260 | BUG_ON(!valid_dma_direction(dir)); |
248 | debug_dma_unmap_sg(dev, sg, nents, dir); | 261 | debug_dma_unmap_sg(dev, sg, nents, dir); |
@@ -256,7 +269,7 @@ static inline dma_addr_t dma_map_page_attrs(struct device *dev, | |||
256 | enum dma_data_direction dir, | 269 | enum dma_data_direction dir, |
257 | unsigned long attrs) | 270 | unsigned long attrs) |
258 | { | 271 | { |
259 | struct dma_map_ops *ops = get_dma_ops(dev); | 272 | const struct dma_map_ops *ops = get_dma_ops(dev); |
260 | dma_addr_t addr; | 273 | dma_addr_t addr; |
261 | 274 | ||
262 | kmemcheck_mark_initialized(page_address(page) + offset, size); | 275 | kmemcheck_mark_initialized(page_address(page) + offset, size); |
@@ -272,7 +285,7 @@ static inline void dma_unmap_page_attrs(struct device *dev, | |||
272 | enum dma_data_direction dir, | 285 | enum dma_data_direction dir, |
273 | unsigned long attrs) | 286 | unsigned long attrs) |
274 | { | 287 | { |
275 | struct dma_map_ops *ops = get_dma_ops(dev); | 288 | const struct dma_map_ops *ops = get_dma_ops(dev); |
276 | 289 | ||
277 | BUG_ON(!valid_dma_direction(dir)); | 290 | BUG_ON(!valid_dma_direction(dir)); |
278 | if (ops->unmap_page) | 291 | if (ops->unmap_page) |
@@ -286,7 +299,7 @@ static inline dma_addr_t dma_map_resource(struct device *dev, | |||
286 | enum dma_data_direction dir, | 299 | enum dma_data_direction dir, |
287 | unsigned long attrs) | 300 | unsigned long attrs) |
288 | { | 301 | { |
289 | struct dma_map_ops *ops = get_dma_ops(dev); | 302 | const struct dma_map_ops *ops = get_dma_ops(dev); |
290 | dma_addr_t addr; | 303 | dma_addr_t addr; |
291 | 304 | ||
292 | BUG_ON(!valid_dma_direction(dir)); | 305 | BUG_ON(!valid_dma_direction(dir)); |
@@ -307,7 +320,7 @@ static inline void dma_unmap_resource(struct device *dev, dma_addr_t addr, | |||
307 | size_t size, enum dma_data_direction dir, | 320 | size_t size, enum dma_data_direction dir, |
308 | unsigned long attrs) | 321 | unsigned long attrs) |
309 | { | 322 | { |
310 | struct dma_map_ops *ops = get_dma_ops(dev); | 323 | const struct dma_map_ops *ops = get_dma_ops(dev); |
311 | 324 | ||
312 | BUG_ON(!valid_dma_direction(dir)); | 325 | BUG_ON(!valid_dma_direction(dir)); |
313 | if (ops->unmap_resource) | 326 | if (ops->unmap_resource) |
@@ -319,7 +332,7 @@ static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, | |||
319 | size_t size, | 332 | size_t size, |
320 | enum dma_data_direction dir) | 333 | enum dma_data_direction dir) |
321 | { | 334 | { |
322 | struct dma_map_ops *ops = get_dma_ops(dev); | 335 | const struct dma_map_ops *ops = get_dma_ops(dev); |
323 | 336 | ||
324 | BUG_ON(!valid_dma_direction(dir)); | 337 | BUG_ON(!valid_dma_direction(dir)); |
325 | if (ops->sync_single_for_cpu) | 338 | if (ops->sync_single_for_cpu) |
@@ -331,7 +344,7 @@ static inline void dma_sync_single_for_device(struct device *dev, | |||
331 | dma_addr_t addr, size_t size, | 344 | dma_addr_t addr, size_t size, |
332 | enum dma_data_direction dir) | 345 | enum dma_data_direction dir) |
333 | { | 346 | { |
334 | struct dma_map_ops *ops = get_dma_ops(dev); | 347 | const struct dma_map_ops *ops = get_dma_ops(dev); |
335 | 348 | ||
336 | BUG_ON(!valid_dma_direction(dir)); | 349 | BUG_ON(!valid_dma_direction(dir)); |
337 | if (ops->sync_single_for_device) | 350 | if (ops->sync_single_for_device) |
@@ -371,7 +384,7 @@ static inline void | |||
371 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, | 384 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, |
372 | int nelems, enum dma_data_direction dir) | 385 | int nelems, enum dma_data_direction dir) |
373 | { | 386 | { |
374 | struct dma_map_ops *ops = get_dma_ops(dev); | 387 | const struct dma_map_ops *ops = get_dma_ops(dev); |
375 | 388 | ||
376 | BUG_ON(!valid_dma_direction(dir)); | 389 | BUG_ON(!valid_dma_direction(dir)); |
377 | if (ops->sync_sg_for_cpu) | 390 | if (ops->sync_sg_for_cpu) |
@@ -383,7 +396,7 @@ static inline void | |||
383 | dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, | 396 | dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, |
384 | int nelems, enum dma_data_direction dir) | 397 | int nelems, enum dma_data_direction dir) |
385 | { | 398 | { |
386 | struct dma_map_ops *ops = get_dma_ops(dev); | 399 | const struct dma_map_ops *ops = get_dma_ops(dev); |
387 | 400 | ||
388 | BUG_ON(!valid_dma_direction(dir)); | 401 | BUG_ON(!valid_dma_direction(dir)); |
389 | if (ops->sync_sg_for_device) | 402 | if (ops->sync_sg_for_device) |
@@ -428,7 +441,7 @@ static inline int | |||
428 | dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, | 441 | dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, |
429 | dma_addr_t dma_addr, size_t size, unsigned long attrs) | 442 | dma_addr_t dma_addr, size_t size, unsigned long attrs) |
430 | { | 443 | { |
431 | struct dma_map_ops *ops = get_dma_ops(dev); | 444 | const struct dma_map_ops *ops = get_dma_ops(dev); |
432 | BUG_ON(!ops); | 445 | BUG_ON(!ops); |
433 | if (ops->mmap) | 446 | if (ops->mmap) |
434 | return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); | 447 | return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); |
@@ -446,7 +459,7 @@ dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr, | |||
446 | dma_addr_t dma_addr, size_t size, | 459 | dma_addr_t dma_addr, size_t size, |
447 | unsigned long attrs) | 460 | unsigned long attrs) |
448 | { | 461 | { |
449 | struct dma_map_ops *ops = get_dma_ops(dev); | 462 | const struct dma_map_ops *ops = get_dma_ops(dev); |
450 | BUG_ON(!ops); | 463 | BUG_ON(!ops); |
451 | if (ops->get_sgtable) | 464 | if (ops->get_sgtable) |
452 | return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, | 465 | return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, |
@@ -464,7 +477,7 @@ static inline void *dma_alloc_attrs(struct device *dev, size_t size, | |||
464 | dma_addr_t *dma_handle, gfp_t flag, | 477 | dma_addr_t *dma_handle, gfp_t flag, |
465 | unsigned long attrs) | 478 | unsigned long attrs) |
466 | { | 479 | { |
467 | struct dma_map_ops *ops = get_dma_ops(dev); | 480 | const struct dma_map_ops *ops = get_dma_ops(dev); |
468 | void *cpu_addr; | 481 | void *cpu_addr; |
469 | 482 | ||
470 | BUG_ON(!ops); | 483 | BUG_ON(!ops); |
@@ -486,7 +499,7 @@ static inline void dma_free_attrs(struct device *dev, size_t size, | |||
486 | void *cpu_addr, dma_addr_t dma_handle, | 499 | void *cpu_addr, dma_addr_t dma_handle, |
487 | unsigned long attrs) | 500 | unsigned long attrs) |
488 | { | 501 | { |
489 | struct dma_map_ops *ops = get_dma_ops(dev); | 502 | const struct dma_map_ops *ops = get_dma_ops(dev); |
490 | 503 | ||
491 | BUG_ON(!ops); | 504 | BUG_ON(!ops); |
492 | WARN_ON(irqs_disabled()); | 505 | WARN_ON(irqs_disabled()); |
@@ -544,7 +557,7 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | |||
544 | #ifndef HAVE_ARCH_DMA_SUPPORTED | 557 | #ifndef HAVE_ARCH_DMA_SUPPORTED |
545 | static inline int dma_supported(struct device *dev, u64 mask) | 558 | static inline int dma_supported(struct device *dev, u64 mask) |
546 | { | 559 | { |
547 | struct dma_map_ops *ops = get_dma_ops(dev); | 560 | const struct dma_map_ops *ops = get_dma_ops(dev); |
548 | 561 | ||
549 | if (!ops) | 562 | if (!ops) |
550 | return 0; | 563 | return 0; |
@@ -557,7 +570,7 @@ static inline int dma_supported(struct device *dev, u64 mask) | |||
557 | #ifndef HAVE_ARCH_DMA_SET_MASK | 570 | #ifndef HAVE_ARCH_DMA_SET_MASK |
558 | static inline int dma_set_mask(struct device *dev, u64 mask) | 571 | static inline int dma_set_mask(struct device *dev, u64 mask) |
559 | { | 572 | { |
560 | struct dma_map_ops *ops = get_dma_ops(dev); | 573 | const struct dma_map_ops *ops = get_dma_ops(dev); |
561 | 574 | ||
562 | if (ops->set_dma_mask) | 575 | if (ops->set_dma_mask) |
563 | return ops->set_dma_mask(dev, mask); | 576 | return ops->set_dma_mask(dev, mask); |