Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56f55f8b authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[ARM] dma: provide a better dma_map_page() implementation



We can translate a struct page directly to a DMA address using
page_to_dma().  No need to use page_address() followed by
virt_to_dma().

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent afd1a321
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -412,6 +412,19 @@ dma_map_single(struct device *dev, void *ptr, size_t size,
	return dma_addr;
}

dma_addr_t dma_map_page(struct device *dev, struct page *page,
			unsigned long offset, size_t size,
			enum dma_data_direction dir)
{
	dev_dbg(dev, "%s(page=%p,off=%#lx,size=%zx,dir=%x)\n",
		__func__, page, offset, size, dir);

	BUG_ON(dir == DMA_NONE);

	return map_single(dev, page_address(page) + offset, size, dir);
}
EXPORT_SYMBOL(dma_map_page);

/*
 * see if a mapped address was really a "safe" buffer and if so, copy
 * the data from the safe buffer back to the unsafe buffer and free up
+10 −1
Original line number Diff line number Diff line
@@ -227,13 +227,22 @@ extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_d
 * can regain ownership by calling dma_unmap_page() or
 * dma_sync_single_for_cpu().
 */
#ifndef CONFIG_DMABOUNCE
static inline dma_addr_t
dma_map_page(struct device *dev, struct page *page,
	     unsigned long offset, size_t size,
	     enum dma_data_direction dir)
{
	return dma_map_single(dev, page_address(page) + offset, size, dir);
	if (!arch_is_coherent())
		dma_cache_maint(page_address(page) + offset, size, dir);

	return page_to_dma(dev, page) + offset;
}
#else
extern dma_addr_t dma_map_page(struct device *dev, struct page *page,
			unsigned long offset, size_t size,
			enum dma_data_direction dir);
#endif

/**
 * dma_unmap_single - unmap a single buffer previously mapped