On Wed, 24 Jun 2009 17:38:41 -0700 Fenghua Yu <fenghua.yu@xxxxxxxxx> wrote: > IA64 Compilation error fix for Intel IOMMU identity mapping > > The Intel IOMMU identity mapping uses e820 to walk the memory map. This causes > compilation error on IA64 when IOMMU is configured: > > drivers/pci/intel-iommu.c:42:22: error: asm/e820.h: No such file or directory > > This patch fixes this compilation error on IA64. It defines architecture > dependent memory map walk functions on x86 and ia64 seperately to set up > identity mapping for all devices. > > Signed-off-by: Fenghua Yu <fenghua.yu@xxxxxxxxx> > Acked-by: Tony Luck <tony.luck@xxxxxxxxx> > > --- > > This patch is against the latest upstream tree. > > arch/ia64/kernel/pci-dma.c | 27 +++++++++++++++++++++++++++ > arch/x86/kernel/pci-dma.c | 22 ++++++++++++++++++++++ > drivers/pci/intel-iommu.c | 38 ++++++++++++++++++++++---------------- > include/linux/intel-iommu.h | 4 ++++ > 4 files changed, 75 insertions(+), 16 deletions(-) > > diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c > index 0569596..9cb3700 100644 > --- a/arch/ia64/kernel/pci-dma.c > +++ b/arch/ia64/kernel/pci-dma.c > @@ -10,7 +10,9 @@ > #include <linux/dmar.h> > #include <asm/iommu.h> > #include <asm/machvec.h> > +#include <linux/efi.h> > #include <linux/dma-mapping.h> > +#include <linux/intel-iommu.h> > > #include <asm/system.h> > > @@ -122,4 +124,29 @@ void __init pci_iommu_alloc(void) > #endif > } > > +static int __initdata identity_mapped = 1; > + > +static int __init __iommu_prepare_identity_map(u64 start, u64 end, void *pdev) > +{ > + int ret; > + > + ret = iommu_prepare_identity_map((struct pci_dev *)pdev, start, end); > + if (ret) { > + printk(KERN_INFO "1:1 mapping to one domain failed.\n"); > + identity_mapped = 0; > + return -EFAULT; > + } > + > + return 0; > +} > + > +int __init iommu_setup_identity_map(struct pci_dev *pdev) > +{ > + efi_memmap_walk(__iommu_prepare_identity_map, pdev); > + if (!identity_mapped) > + return -EFAULT; > + > + return 0; > +} > + > #endif > diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c > index 4763047..775ece5 100644 > --- a/arch/x86/kernel/pci-dma.c > +++ b/arch/x86/kernel/pci-dma.c > @@ -10,6 +10,7 @@ > #include <asm/gart.h> > #include <asm/calgary.h> > #include <asm/amd_iommu.h> > +#include <linux/intel-iommu.h> > > static int forbid_dac __read_mostly; > > @@ -314,3 +315,24 @@ static __devinit void via_no_dac(struct pci_dev *dev) > } > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac); > #endif > + > +int iommu_setup_identity_map(struct pci_dev *pdev) > +{ > + int i; > + int ret; > + > + for (i = 0; i < e820.nr_map; i++) { > + struct e820entry *ei = &e820.map[i]; > + > + if (ei->type == E820_RAM) { > + ret = iommu_prepare_identity_map(pdev, > + ei->addr, ei->addr + ei->size); iommu_prepare_identity_map() is in drivers/pci/intel-iommu.c. So this patch breaks x86_64 build on !CONFIG_DMAR. IA64 works since arch/ia64/kernel/pci-dma.c is only build on CONFIG_DMAR though. -- To unsubscribe from this list: send the line "unsubscribe linux-ia64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |