summaryrefslogtreecommitdiffstats
path: root/arch/mips/include/asm/mach-powertv/dma-coherence.h
diff options
context:
space:
mode:
authorDavid VomLehn <dvomlehn@cisco.com>2010-05-21 11:25:36 -0700
committerRalf Baechle <ralf@linux-mips.org>2010-08-05 13:25:40 +0100
commitca36c36b7821b573fe06ce6bc34db03b557f3ce4 (patch)
tree28fe24b5080e29ca62ff4d1b4bbf5afc83084792 /arch/mips/include/asm/mach-powertv/dma-coherence.h
parent36f217d9df3e6bf8e6ae7647827b485b79dbaf8e (diff)
downloadop-kernel-dev-ca36c36b7821b573fe06ce6bc34db03b557f3ce4.zip
op-kernel-dev-ca36c36b7821b573fe06ce6bc34db03b557f3ce4.tar.gz
MIPS: PowerTV: Use O(1) algorthm for phys_to_dma/dma_to_phys
Replace phys_to_dma()/dma_to_phys() looping algorithm with an O(1) algorithm The approach taken is inspired by the sparse memory implementation: take a certain number of high-order bits off the address them, use this as an index into a table containing an offset to the desired address and add it to the original value. There is a table for mapping physical addresses to DMA addresses and another one for the reverse mapping. The table sizes depend on how fine-grained the mappings need to be; Coarser granularity less to smaller tables. On a processor with 32-bit physical and DMA addresses, with 4 MIB granularity, memory usage is two 2048-byte arrays. Each 32-byte cache line thus covers 64 MiB of address space. Also, renames phys_to_bus() to phys_to_dma() and bus_to_phys() to dma_to_phys() to align with kernel usage. [Ralf: Fixed silly build breakage due to stackoverflow warning caused by huge array on stack.] Signed-off-by: David VomLehn <dvomlehn@cisco.com> To: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/1257/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/include/asm/mach-powertv/dma-coherence.h')
-rw-r--r--arch/mips/include/asm/mach-powertv/dma-coherence.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/mips/include/asm/mach-powertv/dma-coherence.h b/arch/mips/include/asm/mach-powertv/dma-coherence.h
index 5b8d5eb..f76029c 100644
--- a/arch/mips/include/asm/mach-powertv/dma-coherence.h
+++ b/arch/mips/include/asm/mach-powertv/dma-coherence.h
@@ -65,21 +65,21 @@ static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr,
size_t size)
{
if (is_kseg2(addr))
- return phys_to_bus(virt_to_phys_from_pte(addr));
+ return phys_to_dma(virt_to_phys_from_pte(addr));
else
- return phys_to_bus(virt_to_phys(addr));
+ return phys_to_dma(virt_to_phys(addr));
}
static inline dma_addr_t plat_map_dma_mem_page(struct device *dev,
struct page *page)
{
- return phys_to_bus(page_to_phys(page));
+ return phys_to_dma(page_to_phys(page));
}
static inline unsigned long plat_dma_addr_to_phys(struct device *dev,
dma_addr_t dma_addr)
{
- return bus_to_phys(dma_addr);
+ return dma_to_phys(dma_addr);
}
static inline void plat_unmap_dma_mem(struct device *dev, dma_addr_t dma_addr,
OpenPOWER on IntegriCloud