diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-10-06 20:13:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-10-06 20:13:54 -0400 |
commit | 553911c67eb701d46e2dcd073f603c6f6546c38b (patch) | |
tree | ad5169ecc77a8e647550e2704b64e9a2a9ab3bce /lib/dma-debug.c | |
parent | 521f3970853a4b2ff7f833763532bdba2ea11257 (diff) | |
parent | c84750906b4818d4929fbf73a4ae6c113b94f52b (diff) |
Merge tag 'dmaengine-4.9-rc1' of git://git.infradead.org/users/vkoul/slave-dma
Pull dmaengine updates from Vinod Koul:
"This is bit large pile of code which bring in some nice additions:
- Error reporting: we have added a new mechanism for users of
dmaenegine to register a callback_result which tells them the
result of the dma transaction. Right now only one user (ntb) is
using it.
- As we discussed on KS mailing list and pointed out NO_IRQ has no
place in kernel, this also remove NO_IRQ from dmaengine subsystem
(both arm and ppc users)
- Support for IOMMU slave transfers and its implementation for arm.
- To get better build coverage, enable COMPILE_TEST for bunch of
driver, and fix the warning and sparse complaints on these.
- Apart from above, usual updates spread across drivers"
* tag 'dmaengine-4.9-rc1' of git://git.infradead.org/users/vkoul/slave-dma: (169 commits)
async_pq_val: fix DMA memory leak
dmaengine: virt-dma: move function declarations
dmaengine: omap-dma: Enable burst and data pack for SG
DT: dmaengine: rcar-dmac: document R8A7743/5 support
dmaengine: fsldma: Unmap region obtained by of_iomap
dmaengine: jz4780: fix resource leaks on error exit return
dma-debug: fix ia64 build, use PHYS_PFN
dmaengine: coh901318: fix integer overflow when shifting more than 32 places
dmaengine: edma: avoid uninitialized variable use
dma-mapping: fix m32r build warning
dma-mapping: fix ia64 build, use PHYS_PFN
dmaengine: ti-dma-crossbar: enable COMPILE_TEST
dmaengine: omap-dma: enable COMPILE_TEST
dmaengine: edma: enable COMPILE_TEST
dmaengine: ti-dma-crossbar: Fix of_device_id data parameter usage
dmaengine: ti-dma-crossbar: Correct type for of_find_property() third parameter
dmaengine/ARM: omap-dma: Fix the DMAengine compile test on non OMAP configs
dmaengine: edma: Rename set_bits and remove unused clear_bits helper
dmaengine: edma: Use correct type for of_find_property() third parameter
dmaengine: edma: Fix of_device_id data parameter usage (legacy vs TPCC)
...
Diffstat (limited to 'lib/dma-debug.c')
-rw-r--r-- | lib/dma-debug.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 06f02f6aecd2..8971370bfb16 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
@@ -44,6 +44,7 @@ enum { | |||
44 | dma_debug_page, | 44 | dma_debug_page, |
45 | dma_debug_sg, | 45 | dma_debug_sg, |
46 | dma_debug_coherent, | 46 | dma_debug_coherent, |
47 | dma_debug_resource, | ||
47 | }; | 48 | }; |
48 | 49 | ||
49 | enum map_err_types { | 50 | enum map_err_types { |
@@ -151,8 +152,9 @@ static const char *const maperr2str[] = { | |||
151 | [MAP_ERR_CHECKED] = "dma map error checked", | 152 | [MAP_ERR_CHECKED] = "dma map error checked", |
152 | }; | 153 | }; |
153 | 154 | ||
154 | static const char *type2name[4] = { "single", "page", | 155 | static const char *type2name[5] = { "single", "page", |
155 | "scather-gather", "coherent" }; | 156 | "scather-gather", "coherent", |
157 | "resource" }; | ||
156 | 158 | ||
157 | static const char *dir2name[4] = { "DMA_BIDIRECTIONAL", "DMA_TO_DEVICE", | 159 | static const char *dir2name[4] = { "DMA_BIDIRECTIONAL", "DMA_TO_DEVICE", |
158 | "DMA_FROM_DEVICE", "DMA_NONE" }; | 160 | "DMA_FROM_DEVICE", "DMA_NONE" }; |
@@ -400,6 +402,9 @@ static void hash_bucket_del(struct dma_debug_entry *entry) | |||
400 | 402 | ||
401 | static unsigned long long phys_addr(struct dma_debug_entry *entry) | 403 | static unsigned long long phys_addr(struct dma_debug_entry *entry) |
402 | { | 404 | { |
405 | if (entry->type == dma_debug_resource) | ||
406 | return __pfn_to_phys(entry->pfn) + entry->offset; | ||
407 | |||
403 | return page_to_phys(pfn_to_page(entry->pfn)) + entry->offset; | 408 | return page_to_phys(pfn_to_page(entry->pfn)) + entry->offset; |
404 | } | 409 | } |
405 | 410 | ||
@@ -1519,6 +1524,49 @@ void debug_dma_free_coherent(struct device *dev, size_t size, | |||
1519 | } | 1524 | } |
1520 | EXPORT_SYMBOL(debug_dma_free_coherent); | 1525 | EXPORT_SYMBOL(debug_dma_free_coherent); |
1521 | 1526 | ||
1527 | void debug_dma_map_resource(struct device *dev, phys_addr_t addr, size_t size, | ||
1528 | int direction, dma_addr_t dma_addr) | ||
1529 | { | ||
1530 | struct dma_debug_entry *entry; | ||
1531 | |||
1532 | if (unlikely(dma_debug_disabled())) | ||
1533 | return; | ||
1534 | |||
1535 | entry = dma_entry_alloc(); | ||
1536 | if (!entry) | ||
1537 | return; | ||
1538 | |||
1539 | entry->type = dma_debug_resource; | ||
1540 | entry->dev = dev; | ||
1541 | entry->pfn = PHYS_PFN(addr); | ||
1542 | entry->offset = offset_in_page(addr); | ||
1543 | entry->size = size; | ||
1544 | entry->dev_addr = dma_addr; | ||
1545 | entry->direction = direction; | ||
1546 | entry->map_err_type = MAP_ERR_NOT_CHECKED; | ||
1547 | |||
1548 | add_dma_entry(entry); | ||
1549 | } | ||
1550 | EXPORT_SYMBOL(debug_dma_map_resource); | ||
1551 | |||
1552 | void debug_dma_unmap_resource(struct device *dev, dma_addr_t dma_addr, | ||
1553 | size_t size, int direction) | ||
1554 | { | ||
1555 | struct dma_debug_entry ref = { | ||
1556 | .type = dma_debug_resource, | ||
1557 | .dev = dev, | ||
1558 | .dev_addr = dma_addr, | ||
1559 | .size = size, | ||
1560 | .direction = direction, | ||
1561 | }; | ||
1562 | |||
1563 | if (unlikely(dma_debug_disabled())) | ||
1564 | return; | ||
1565 | |||
1566 | check_unmap(&ref); | ||
1567 | } | ||
1568 | EXPORT_SYMBOL(debug_dma_unmap_resource); | ||
1569 | |||
1522 | void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, | 1570 | void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, |
1523 | size_t size, int direction) | 1571 | size_t size, int direction) |
1524 | { | 1572 | { |