# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Node ID 6cb524702355fae2d2a324243cf2748e11a34725 # Parent d5f57d15427027e5e824b9a274d1040a58f275f7 introduce page_to_bus() and use it in pci-dma-xen.c and swiotlb.c On xen/ia64 with the P2M/VP model pseudo physical address(gpaddr) is fully virtualized so it defines xen_features(XENFEAT_auto_translated_physmap) = 1. In this case page_to_phys(page) should return pseudo physical address like pfn_to_mfn() and its families. However dma is not virtualized, it can't be used for pci-dma-xen.c, swiotlb.c. PATCHNAME: page_to_bus Signed-off-by: Isaku Yamahata diff -r d5f57d154270 -r 6cb524702355 linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c Mon Apr 10 16:39:53 2006 +0900 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c Mon Apr 10 16:39:55 2006 +0900 @@ -69,7 +69,7 @@ dma_map_sg(struct device *hwdev, struct } else { for (i = 0; i < nents; i++ ) { sg[i].dma_address = - page_to_phys(sg[i].page) + sg[i].offset; + page_to_bus(sg[i].page) + sg[i].offset; sg[i].dma_length = sg[i].length; BUG_ON(!sg[i].page); IOMMU_BUG_ON(address_needs_mapping( @@ -105,7 +105,7 @@ dma_map_page(struct device *dev, struct dma_addr = swiotlb_map_page( dev, page, offset, size, direction); } else { - dma_addr = page_to_phys(page) + offset; + dma_addr = page_to_bus(page) + offset; IOMMU_BUG_ON(address_needs_mapping(dev, dma_addr)); } diff -r d5f57d154270 -r 6cb524702355 linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Mon Apr 10 16:39:53 2006 +0900 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Mon Apr 10 16:39:55 2006 +0900 @@ -32,7 +32,7 @@ EXPORT_SYMBOL(swiotlb); #define OFFSET(val,align) ((unsigned long)((val) & ( (align) - 1))) -#define SG_ENT_PHYS_ADDRESS(sg) (page_to_phys((sg)->page) + (sg)->offset) +#define SG_ENT_PHYS_ADDRESS(sg) (page_to_bus((sg)->page) + (sg)->offset) /* * Maximum allowable number of contiguous slabs to map, @@ -607,7 +607,7 @@ swiotlb_map_page(struct device *hwdev, s dma_addr_t dev_addr; char *map; - dev_addr = page_to_phys(page) + offset; + dev_addr = page_to_bus(page) + offset; if (address_needs_mapping(hwdev, dev_addr)) { buffer.page = page; buffer.offset = offset; diff -r d5f57d154270 -r 6cb524702355 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/io.h --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/io.h Mon Apr 10 16:39:53 2006 +0900 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/io.h Mon Apr 10 16:39:55 2006 +0900 @@ -102,6 +102,7 @@ static inline void * phys_to_virt(unsign */ #define page_to_pseudophys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) #define page_to_phys(page) (phys_to_machine(page_to_pseudophys(page))) +#define page_to_bus(page) (phys_to_machine(page_to_pseudophys(page))) #define bio_to_pseudophys(bio) (page_to_pseudophys(bio_page((bio))) + \ (unsigned long) bio_offset((bio))) diff -r d5f57d154270 -r 6cb524702355 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/io.h --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/io.h Mon Apr 10 16:39:53 2006 +0900 +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/io.h Mon Apr 10 16:39:55 2006 +0900 @@ -130,6 +130,7 @@ static inline void * phys_to_virt(unsign */ #define page_to_pseudophys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) #define page_to_phys(page) (phys_to_machine(page_to_pseudophys(page))) +#define page_to_bus(page) (phys_to_machine(page_to_pseudophys(page))) #define bio_to_pseudophys(bio) (page_to_pseudophys(bio_page((bio))) + \ (unsigned long) bio_offset((bio)))