dev_addr is the machine address of the page.
The new parameter can be used by the ARM and ARM64 implementations of
xen_dma_map_page to find out if the page is a local page (pfn == mfn) or
a foreign page (pfn != mfn).
dev_addr could be retrieved again from the physical address, using
pfn_to_mfn, but it requires accessing an rbtree. Since we already have
the dev_addr in our hands at the call site there is no need to get the
mfn twice.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
 }
 
 static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
-            unsigned long offset, size_t size, enum dma_data_direction dir,
-            struct dma_attrs *attrs)
+            dma_addr_t dev_addr, unsigned long offset, size_t size,
+            enum dma_data_direction dir, struct dma_attrs *attrs)
 {
        __generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs);
 }
 
 }
 
 static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
-            unsigned long offset, size_t size, enum dma_data_direction dir,
-            struct dma_attrs *attrs)
+            dma_addr_t dev_addr, unsigned long offset, size_t size,
+            enum dma_data_direction dir, struct dma_attrs *attrs)
 {
 }
 
 
 }
 
 static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
-            unsigned long offset, size_t size, enum dma_data_direction dir,
-            struct dma_attrs *attrs) { }
+            dma_addr_t dev_addr, unsigned long offset, size_t size,
+            enum dma_data_direction dir, struct dma_attrs *attrs) { }
 
 static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
                size_t size, enum dma_data_direction dir,
 
                /* we are not interested in the dma_addr returned by
                 * xen_dma_map_page, only in the potential cache flushes executed
                 * by the function. */
-               xen_dma_map_page(dev, page, offset, size, dir, attrs);
+               xen_dma_map_page(dev, page, dev_addr, offset, size, dir, attrs);
                return dev_addr;
        }
 
                return DMA_ERROR_CODE;
 
        xen_dma_map_page(dev, pfn_to_page(map >> PAGE_SHIFT),
-                                       map & ~PAGE_MASK, size, dir, attrs);
+                                       dev_addr, map & ~PAGE_MASK, size, dir, attrs);
        dev_addr = xen_phys_to_bus(map);
 
        /*
                                return 0;
                        }
                        xen_dma_map_page(hwdev, pfn_to_page(map >> PAGE_SHIFT),
+                                               dev_addr,
                                                map & ~PAGE_MASK,
                                                sg->length,
                                                dir,
                         * xen_dma_map_page, only in the potential cache flushes executed
                         * by the function. */
                        xen_dma_map_page(hwdev, pfn_to_page(paddr >> PAGE_SHIFT),
+                                               dev_addr,
                                                paddr & ~PAGE_MASK,
                                                sg->length,
                                                dir,