|
@@ -10,6 +10,7 @@
|
|
|
|
|
|
#include <asm-generic/dma-coherent.h>
|
|
|
#include <asm/memory.h>
|
|
|
+#include <asm/cacheflush.h>
|
|
|
|
|
|
#define DMA_ERROR_CODE (~0)
|
|
|
extern struct dma_map_ops arm_dma_ops;
|
|
@@ -86,6 +87,42 @@ static inline dma_addr_t virt_to_dma(struct device *dev, void *addr)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
|
|
|
+{
|
|
|
+ unsigned int offset = paddr & ~PAGE_MASK;
|
|
|
+ return pfn_to_dma(dev, __phys_to_pfn(paddr)) + offset;
|
|
|
+}
|
|
|
+
|
|
|
+static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t dev_addr)
|
|
|
+{
|
|
|
+ unsigned int offset = dev_addr & ~PAGE_MASK;
|
|
|
+ return __pfn_to_phys(dma_to_pfn(dev, dev_addr)) + offset;
|
|
|
+}
|
|
|
+
|
|
|
+static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size)
|
|
|
+{
|
|
|
+ u64 limit, mask;
|
|
|
+
|
|
|
+ if (dev->dma_mask)
|
|
|
+ mask = *dev->dma_mask;
|
|
|
+ else
|
|
|
+ mask = dev->coherent_dma_mask;
|
|
|
+
|
|
|
+ if (mask == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ limit = (mask + 1) & ~mask;
|
|
|
+ if (limit && size > limit)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if ((addr | (addr + size - 1)) & ~mask)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void dma_mark_clean(void *addr, size_t size) { }
|
|
|
+
|
|
|
/*
|
|
|
* DMA errors are defined by all-bits-set in the DMA address.
|
|
|
*/
|