diff -r 79b71c77907b xen/drivers/passthrough/amd/pci_amd_iommu.c --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Wed Nov 24 10:20:03 2010 +0000 +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Wed Nov 24 17:13:43 2010 +0100 @@ -447,4 +447,6 @@ const struct iommu_ops amd_iommu_ops = { .read_msi_from_ire = amd_iommu_read_msi_from_ire, .suspend = amd_iommu_suspend, .resume = amd_iommu_resume, + .map_pages = amd_iommu_map_pages, + .unmap_pages = amd_iommu_unmap_pages, }; diff -r 79b71c77907b xen/drivers/passthrough/vtd/iommu.c --- a/xen/drivers/passthrough/vtd/iommu.c Wed Nov 24 10:20:03 2010 +0000 +++ b/xen/drivers/passthrough/vtd/iommu.c Wed Nov 24 17:13:43 2010 +0100 @@ -2222,6 +2222,8 @@ const struct iommu_ops intel_iommu_ops = .read_msi_from_ire = msi_msg_read_remap_rte, .suspend = vtd_suspend, .resume = vtd_resume, + .map_pages = NULL, + .unmap_pages = NULL, }; /* diff -r 79b71c77907b xen/include/asm-x86/hvm/svm/amd-iommu-proto.h --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Wed Nov 24 10:20:03 2010 +0000 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Wed Nov 24 17:13:43 2010 +0100 @@ -55,6 +55,11 @@ int amd_iommu_reserve_domain_unity_map(s int amd_iommu_reserve_domain_unity_map(struct domain *domain, unsigned long phys_addr, unsigned long size, int iw, int ir); void invalidate_all_iommu_pages(struct domain *d); + +int amd_iommu_map_pages(struct domain *d, unsigned long gfn, unsigned long mfn, + unsigned int order, unsigned int flags); +int amd_iommu_unmap_pages(struct domain *d, + unsigned long gfn, unsigned int order); /* device table functions */ int get_dma_requestor_id(u16 bdf); diff -r 79b71c77907b xen/include/xen/iommu.h --- a/xen/include/xen/iommu.h Wed Nov 24 10:20:03 2010 +0000 +++ b/xen/include/xen/iommu.h Wed Nov 24 17:13:43 2010 +0100 @@ -86,6 +86,10 @@ int iommu_map_page(struct domain *d, uns unsigned int flags); int iommu_unmap_page(struct domain *d, unsigned long gfn); +int iommu_map_pages(struct domain *d, unsigned long gfn, unsigned long mfn, + unsigned int order, unsigned int flags); +int iommu_unmap_pages(struct domain *d, unsigned long gfn, unsigned int order); + void iommu_domain_teardown(struct domain *d); int hvm_do_IRQ_dpci(struct domain *d, unsigned int irq); int dpci_ioport_intercept(ioreq_t *p); @@ -132,6 +136,9 @@ struct iommu_ops { unsigned int (*read_apic_from_ire)(unsigned int apic, unsigned int reg); void (*suspend)(void); void (*resume)(void); + int (*map_pages)(struct domain *d, unsigned long gfn, unsigned long mfn, + unsigned int order, unsigned int flags); + int (*unmap_pages)(struct domain *d, unsigned long gfn, unsigned int order); }; void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);