[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1238539935-4295-4-git-send-email-jeremy@goop.org>
Date: Tue, 31 Mar 2009 15:52:09 -0700
From: Jeremy Fitzhardinge <jeremy@...p.org>
To: FUJITA Tomonori <fujita.tomonori@....ntt.co.jp>
Cc: the arch/x86 maintainers <x86@...nel.org>,
Ingo Molnar <mingo@...e.hu>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Ian Campbell <ian.campbell@...rix.com>,
Jeremy Fitzhardinge <jeremy.fitzhardinge@...rix.com>
Subject: [PATCH 3/9] xen: add hooks for mapping phys<->bus addresses in swiotlb
From: Ian Campbell <ian.campbell@...rix.com>
Impact: Xen support for DMA
Add hooks to allow Xen to do translation between pfn and mfns for the swiotlb
layer, so that dma actually ends up going to the proper machine pages.
Signed-off-by: Ian Campbell <ian.campbell@...rix.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@...rix.com>
Reviewed-by: "H. Peter Anvin" <hpa@...or.com>
---
arch/x86/kernel/pci-swiotlb_64.c | 6 ++++++
drivers/pci/xen-iommu.c | 10 ++++++++++
include/xen/swiotlb.h | 12 ++++++++++++
3 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/arch/x86/kernel/pci-swiotlb_64.c b/arch/x86/kernel/pci-swiotlb_64.c
index be379af..7f87ce2 100644
--- a/arch/x86/kernel/pci-swiotlb_64.c
+++ b/arch/x86/kernel/pci-swiotlb_64.c
@@ -38,11 +38,17 @@ void *swiotlb_alloc(unsigned order, unsigned long nslabs)
dma_addr_t swiotlb_phys_to_bus(struct device *hwdev, phys_addr_t paddr)
{
+ if (xen_pv_domain())
+ return xen_phys_to_bus(paddr);
+
return paddr;
}
phys_addr_t swiotlb_bus_to_phys(dma_addr_t baddr)
{
+ if (xen_pv_domain())
+ return xen_bus_to_phys(baddr);
+
return baddr;
}
diff --git a/drivers/pci/xen-iommu.c b/drivers/pci/xen-iommu.c
index b9b4620..47d87a7 100644
--- a/drivers/pci/xen-iommu.c
+++ b/drivers/pci/xen-iommu.c
@@ -59,6 +59,16 @@ void xen_swiotlb_fixup(void *buf, size_t size, unsigned long nslabs)
panic(KERN_ERR "xen_create_contiguous_region failed\n");
}
}
+dma_addr_t xen_phys_to_bus(phys_addr_t paddr)
+{
+ return phys_to_machine(XPADDR(paddr)).maddr;
+}
+
+phys_addr_t xen_bus_to_phys(dma_addr_t daddr)
+{
+ return machine_to_phys(XMADDR(daddr)).paddr;
+}
+
static inline int address_needs_mapping(struct device *hwdev,
dma_addr_t addr)
{
diff --git a/include/xen/swiotlb.h b/include/xen/swiotlb.h
index 8d59439..3d96b07 100644
--- a/include/xen/swiotlb.h
+++ b/include/xen/swiotlb.h
@@ -3,10 +3,22 @@
#ifdef CONFIG_PCI_XEN
extern void xen_swiotlb_fixup(void *buf, size_t size, unsigned long nslabs);
+extern phys_addr_t xen_bus_to_phys(dma_addr_t daddr);
+extern dma_addr_t xen_phys_to_bus(phys_addr_t paddr);
#else
static inline void xen_swiotlb_fixup(void *buf, size_t size, unsigned long nslabs)
{
}
+
+static inline phys_addr_t xen_bus_to_phys(dma_addr_t daddr)
+{
+ return daddr;
+}
+
+static inline dma_addr_t xen_phys_to_bus(phys_addr_t paddr)
+{
+ return paddr;
+}
#endif
#endif /* _XEN_SWIOTLB_H */
--
1.6.0.6
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists