#include <linux/dma-mapping.h>
#include <linux/pci.h>
#include <xen/swiotlb-xen.h>
+#include <xen/pv-iommu-xen.h>
#include <asm/xen/hypervisor.h>
#include <xen/xen.h>
#include <linux/export.h>
int xen_swiotlb __read_mostly;
+int xen_pv_iommu __read_mostly;
+
+int __init pci_xen_pv_iommu_detect(void)
+{
+ xen_pv_iommu = xen_pv_iommu_detect();
+
+ return xen_pv_iommu;
+}
+
+void __init pci_xen_pv_iommu_init(void)
+{
+ if (xen_pv_iommu) {
+ xen_pv_iommu_early_init();
+ dma_ops = &xen_pv_iommu_dma_ops;
+
+#ifdef CONFIG_PCI
+ /* Make sure ACS will be enabled */
+ pci_request_acs();
+#endif
+ }
+}
+
+void __init pci_xen_pv_iommu_late_init(void)
+{
+ if (xen_pv_iommu)
+ xen_pv_iommu_late_init();
+}
+
+IOMMU_INIT_FINISH(pci_xen_pv_iommu_detect,
+ NULL,
+ pci_xen_pv_iommu_init,
+ pci_xen_pv_iommu_late_init);
/*
* pci_xen_swiotlb_detect - set xen_swiotlb to 1 if necessary
EXPORT_SYMBOL_GPL(pci_xen_swiotlb_init_late);
IOMMU_INIT_FINISH(pci_xen_swiotlb_detect,
- NULL,
+ pci_xen_pv_iommu_detect,
pci_xen_swiotlb_init,
NULL);
obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o
obj-$(CONFIG_XEN_PVHVM) += platform-pci.o
obj-$(CONFIG_XEN_TMEM) += tmem.o
-obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o
+obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o pv-iommu-xen.o
obj-$(CONFIG_XEN_MCE_LOG) += mcelog.o
obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/
obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o
--- /dev/null
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/slab.h>
+#include <linux/dma-mapping.h>
+#include <linux/kthread.h>
+
+#include <xen/swiotlb-xen.h>
+#include <xen/pv-iommu-xen.h>
+#include <xen/page.h>
+#include <xen/grant_table.h>
+
+#include <asm/xen/hypervisor.h>
+#include <asm/xen/hypercall.h>
+#include <asm/xen/page.h>
+#include <asm/xen/swiotlb-xen.h>
+#include <xen/xen.h>
+
+#include <trace/events/swiotlb.h>
+
+struct dma_map_ops xen_pv_iommu_dma_ops = {};
+
+int __init xen_pv_iommu_detect(void)
+{
+ xen_swiotlb = 1;
+
+ return xen_swiotlb;
+}
+
+void __init xen_pv_iommu_early_init(void)
+{
+ pr_info("%s: ====>\n", __func__);
+
+ xen_swiotlb_init(1, true);
+ xen_pv_iommu_dma_ops = xen_swiotlb_dma_ops;
+
+ pr_info("%s: <====\n", __func__);
+}
+
+void __init xen_pv_iommu_late_init(void)
+{
+ pr_info("%s: <===>\n", __func__);
+}
+
+
--- /dev/null
+#ifndef __LINUX_PV_IOMMU_XEN_H
+#define __LINUX_PV_IOMMU_XEN_H
+
+#include <linux/swiotlb.h>
+
+int xen_pv_iommu_detect(void);
+void xen_pv_iommu_early_init(void);
+void xen_pv_iommu_late_init(void);
+
+extern struct dma_map_ops xen_pv_iommu_dma_ops;
+
+#endif /* __LINUX_PV_IOMMU_XEN_H */