|
@@ -58,21 +58,37 @@ static inline int dma_set_mask(struct device *dev, u64 mask)
|
|
|
#ifndef __arch_pfn_to_dma
|
|
|
static inline dma_addr_t pfn_to_dma(struct device *dev, unsigned long pfn)
|
|
|
{
|
|
|
+ if (dev)
|
|
|
+ pfn -= dev->dma_pfn_offset;
|
|
|
return (dma_addr_t)__pfn_to_bus(pfn);
|
|
|
}
|
|
|
|
|
|
static inline unsigned long dma_to_pfn(struct device *dev, dma_addr_t addr)
|
|
|
{
|
|
|
- return __bus_to_pfn(addr);
|
|
|
+ unsigned long pfn = __bus_to_pfn(addr);
|
|
|
+
|
|
|
+ if (dev)
|
|
|
+ pfn += dev->dma_pfn_offset;
|
|
|
+
|
|
|
+ return pfn;
|
|
|
}
|
|
|
|
|
|
static inline void *dma_to_virt(struct device *dev, dma_addr_t addr)
|
|
|
{
|
|
|
+ if (dev) {
|
|
|
+ unsigned long pfn = dma_to_pfn(dev, addr);
|
|
|
+
|
|
|
+ return phys_to_virt(__pfn_to_phys(pfn));
|
|
|
+ }
|
|
|
+
|
|
|
return (void *)__bus_to_virt((unsigned long)addr);
|
|
|
}
|
|
|
|
|
|
static inline dma_addr_t virt_to_dma(struct device *dev, void *addr)
|
|
|
{
|
|
|
+ if (dev)
|
|
|
+ return pfn_to_dma(dev, virt_to_pfn(addr));
|
|
|
+
|
|
|
return (dma_addr_t)__virt_to_bus((unsigned long)(addr));
|
|
|
}
|
|
|
|