diff options
-rw-r--r-- | include/linux/dma-debug.h | 11 | ||||
-rw-r--r-- | include/linux/dma-mapping.h | 66 | ||||
-rw-r--r-- | kernel/dma/debug.c | 17 |
3 files changed, 32 insertions, 62 deletions
diff --git a/include/linux/dma-debug.h b/include/linux/dma-debug.h index 2ad5c363d7d5..cb422cbe587d 100644 --- a/include/linux/dma-debug.h +++ b/include/linux/dma-debug.h | |||
@@ -35,13 +35,12 @@ extern void debug_dma_map_single(struct device *dev, const void *addr, | |||
35 | 35 | ||
36 | extern void debug_dma_map_page(struct device *dev, struct page *page, | 36 | extern void debug_dma_map_page(struct device *dev, struct page *page, |
37 | size_t offset, size_t size, | 37 | size_t offset, size_t size, |
38 | int direction, dma_addr_t dma_addr, | 38 | int direction, dma_addr_t dma_addr); |
39 | bool map_single); | ||
40 | 39 | ||
41 | extern void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr); | 40 | extern void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr); |
42 | 41 | ||
43 | extern void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, | 42 | extern void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, |
44 | size_t size, int direction, bool map_single); | 43 | size_t size, int direction); |
45 | 44 | ||
46 | extern void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, | 45 | extern void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, |
47 | int nents, int mapped_ents, int direction); | 46 | int nents, int mapped_ents, int direction); |
@@ -95,8 +94,7 @@ static inline void debug_dma_map_single(struct device *dev, const void *addr, | |||
95 | 94 | ||
96 | static inline void debug_dma_map_page(struct device *dev, struct page *page, | 95 | static inline void debug_dma_map_page(struct device *dev, struct page *page, |
97 | size_t offset, size_t size, | 96 | size_t offset, size_t size, |
98 | int direction, dma_addr_t dma_addr, | 97 | int direction, dma_addr_t dma_addr) |
99 | bool map_single) | ||
100 | { | 98 | { |
101 | } | 99 | } |
102 | 100 | ||
@@ -106,8 +104,7 @@ static inline void debug_dma_mapping_error(struct device *dev, | |||
106 | } | 104 | } |
107 | 105 | ||
108 | static inline void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, | 106 | static inline void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, |
109 | size_t size, int direction, | 107 | size_t size, int direction) |
110 | bool map_single) | ||
111 | { | 108 | { |
112 | } | 109 | } |
113 | 110 | ||
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index ba521d5506c9..0452a8be2789 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
@@ -284,32 +284,25 @@ static inline void dma_direct_sync_sg_for_cpu(struct device *dev, | |||
284 | } | 284 | } |
285 | #endif | 285 | #endif |
286 | 286 | ||
287 | static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr, | 287 | static inline dma_addr_t dma_map_page_attrs(struct device *dev, |
288 | size_t size, | 288 | struct page *page, size_t offset, size_t size, |
289 | enum dma_data_direction dir, | 289 | enum dma_data_direction dir, unsigned long attrs) |
290 | unsigned long attrs) | ||
291 | { | 290 | { |
292 | const struct dma_map_ops *ops = get_dma_ops(dev); | 291 | const struct dma_map_ops *ops = get_dma_ops(dev); |
293 | dma_addr_t addr; | 292 | dma_addr_t addr; |
294 | 293 | ||
295 | BUG_ON(!valid_dma_direction(dir)); | 294 | BUG_ON(!valid_dma_direction(dir)); |
296 | debug_dma_map_single(dev, ptr, size); | ||
297 | if (dma_is_direct(ops)) | 295 | if (dma_is_direct(ops)) |
298 | addr = dma_direct_map_page(dev, virt_to_page(ptr), | 296 | addr = dma_direct_map_page(dev, page, offset, size, dir, attrs); |
299 | offset_in_page(ptr), size, dir, attrs); | ||
300 | else | 297 | else |
301 | addr = ops->map_page(dev, virt_to_page(ptr), | 298 | addr = ops->map_page(dev, page, offset, size, dir, attrs); |
302 | offset_in_page(ptr), size, dir, attrs); | 299 | debug_dma_map_page(dev, page, offset, size, dir, addr); |
303 | debug_dma_map_page(dev, virt_to_page(ptr), | 300 | |
304 | offset_in_page(ptr), size, | ||
305 | dir, addr, true); | ||
306 | return addr; | 301 | return addr; |
307 | } | 302 | } |
308 | 303 | ||
309 | static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr, | 304 | static inline void dma_unmap_page_attrs(struct device *dev, dma_addr_t addr, |
310 | size_t size, | 305 | size_t size, enum dma_data_direction dir, unsigned long attrs) |
311 | enum dma_data_direction dir, | ||
312 | unsigned long attrs) | ||
313 | { | 306 | { |
314 | const struct dma_map_ops *ops = get_dma_ops(dev); | 307 | const struct dma_map_ops *ops = get_dma_ops(dev); |
315 | 308 | ||
@@ -318,13 +311,7 @@ static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr, | |||
318 | dma_direct_unmap_page(dev, addr, size, dir, attrs); | 311 | dma_direct_unmap_page(dev, addr, size, dir, attrs); |
319 | else if (ops->unmap_page) | 312 | else if (ops->unmap_page) |
320 | ops->unmap_page(dev, addr, size, dir, attrs); | 313 | ops->unmap_page(dev, addr, size, dir, attrs); |
321 | debug_dma_unmap_page(dev, addr, size, dir, true); | 314 | debug_dma_unmap_page(dev, addr, size, dir); |
322 | } | ||
323 | |||
324 | static inline void dma_unmap_page_attrs(struct device *dev, dma_addr_t addr, | ||
325 | size_t size, enum dma_data_direction dir, unsigned long attrs) | ||
326 | { | ||
327 | return dma_unmap_single_attrs(dev, addr, size, dir, attrs); | ||
328 | } | 315 | } |
329 | 316 | ||
330 | /* | 317 | /* |
@@ -363,25 +350,6 @@ static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg | |||
363 | ops->unmap_sg(dev, sg, nents, dir, attrs); | 350 | ops->unmap_sg(dev, sg, nents, dir, attrs); |
364 | } | 351 | } |
365 | 352 | ||
366 | static inline dma_addr_t dma_map_page_attrs(struct device *dev, | ||
367 | struct page *page, | ||
368 | size_t offset, size_t size, | ||
369 | enum dma_data_direction dir, | ||
370 | unsigned long attrs) | ||
371 | { | ||
372 | const struct dma_map_ops *ops = get_dma_ops(dev); | ||
373 | dma_addr_t addr; | ||
374 | |||
375 | BUG_ON(!valid_dma_direction(dir)); | ||
376 | if (dma_is_direct(ops)) | ||
377 | addr = dma_direct_map_page(dev, page, offset, size, dir, attrs); | ||
378 | else | ||
379 | addr = ops->map_page(dev, page, offset, size, dir, attrs); | ||
380 | debug_dma_map_page(dev, page, offset, size, dir, addr, false); | ||
381 | |||
382 | return addr; | ||
383 | } | ||
384 | |||
385 | static inline dma_addr_t dma_map_resource(struct device *dev, | 353 | static inline dma_addr_t dma_map_resource(struct device *dev, |
386 | phys_addr_t phys_addr, | 354 | phys_addr_t phys_addr, |
387 | size_t size, | 355 | size_t size, |
@@ -488,6 +456,20 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, | |||
488 | 456 | ||
489 | } | 457 | } |
490 | 458 | ||
459 | static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr, | ||
460 | size_t size, enum dma_data_direction dir, unsigned long attrs) | ||
461 | { | ||
462 | debug_dma_map_single(dev, ptr, size); | ||
463 | return dma_map_page_attrs(dev, virt_to_page(ptr), offset_in_page(ptr), | ||
464 | size, dir, attrs); | ||
465 | } | ||
466 | |||
467 | static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr, | ||
468 | size_t size, enum dma_data_direction dir, unsigned long attrs) | ||
469 | { | ||
470 | return dma_unmap_page_attrs(dev, addr, size, dir, attrs); | ||
471 | } | ||
472 | |||
491 | #define dma_map_single(d, a, s, r) dma_map_single_attrs(d, a, s, r, 0) | 473 | #define dma_map_single(d, a, s, r) dma_map_single_attrs(d, a, s, r, 0) |
492 | #define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, 0) | 474 | #define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, 0) |
493 | #define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, 0) | 475 | #define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, 0) |
diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c index 164706da2a73..1e0157113d15 100644 --- a/kernel/dma/debug.c +++ b/kernel/dma/debug.c | |||
@@ -49,7 +49,6 @@ | |||
49 | 49 | ||
50 | enum { | 50 | enum { |
51 | dma_debug_single, | 51 | dma_debug_single, |
52 | dma_debug_page, | ||
53 | dma_debug_sg, | 52 | dma_debug_sg, |
54 | dma_debug_coherent, | 53 | dma_debug_coherent, |
55 | dma_debug_resource, | 54 | dma_debug_resource, |
@@ -1300,8 +1299,7 @@ void debug_dma_map_single(struct device *dev, const void *addr, | |||
1300 | EXPORT_SYMBOL(debug_dma_map_single); | 1299 | EXPORT_SYMBOL(debug_dma_map_single); |
1301 | 1300 | ||
1302 | void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, | 1301 | void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, |
1303 | size_t size, int direction, dma_addr_t dma_addr, | 1302 | size_t size, int direction, dma_addr_t dma_addr) |
1304 | bool map_single) | ||
1305 | { | 1303 | { |
1306 | struct dma_debug_entry *entry; | 1304 | struct dma_debug_entry *entry; |
1307 | 1305 | ||
@@ -1316,7 +1314,7 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, | |||
1316 | return; | 1314 | return; |
1317 | 1315 | ||
1318 | entry->dev = dev; | 1316 | entry->dev = dev; |
1319 | entry->type = dma_debug_page; | 1317 | entry->type = dma_debug_single; |
1320 | entry->pfn = page_to_pfn(page); | 1318 | entry->pfn = page_to_pfn(page); |
1321 | entry->offset = offset, | 1319 | entry->offset = offset, |
1322 | entry->dev_addr = dma_addr; | 1320 | entry->dev_addr = dma_addr; |
@@ -1324,9 +1322,6 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, | |||
1324 | entry->direction = direction; | 1322 | entry->direction = direction; |
1325 | entry->map_err_type = MAP_ERR_NOT_CHECKED; | 1323 | entry->map_err_type = MAP_ERR_NOT_CHECKED; |
1326 | 1324 | ||
1327 | if (map_single) | ||
1328 | entry->type = dma_debug_single; | ||
1329 | |||
1330 | check_for_stack(dev, page, offset); | 1325 | check_for_stack(dev, page, offset); |
1331 | 1326 | ||
1332 | if (!PageHighMem(page)) { | 1327 | if (!PageHighMem(page)) { |
@@ -1378,10 +1373,10 @@ void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | |||
1378 | EXPORT_SYMBOL(debug_dma_mapping_error); | 1373 | EXPORT_SYMBOL(debug_dma_mapping_error); |
1379 | 1374 | ||
1380 | void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, | 1375 | void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, |
1381 | size_t size, int direction, bool map_single) | 1376 | size_t size, int direction) |
1382 | { | 1377 | { |
1383 | struct dma_debug_entry ref = { | 1378 | struct dma_debug_entry ref = { |
1384 | .type = dma_debug_page, | 1379 | .type = dma_debug_single, |
1385 | .dev = dev, | 1380 | .dev = dev, |
1386 | .dev_addr = addr, | 1381 | .dev_addr = addr, |
1387 | .size = size, | 1382 | .size = size, |
@@ -1390,10 +1385,6 @@ void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, | |||
1390 | 1385 | ||
1391 | if (unlikely(dma_debug_disabled())) | 1386 | if (unlikely(dma_debug_disabled())) |
1392 | return; | 1387 | return; |
1393 | |||
1394 | if (map_single) | ||
1395 | ref.type = dma_debug_single; | ||
1396 | |||
1397 | check_unmap(&ref); | 1388 | check_unmap(&ref); |
1398 | } | 1389 | } |
1399 | EXPORT_SYMBOL(debug_dma_unmap_page); | 1390 | EXPORT_SYMBOL(debug_dma_unmap_page); |