The DMAR driver currently doesn't reserve the memory used for the IOMMU registers. On one specific combination of cards on our system, the kernel pci resource allocator was assigning a BAR to the same address as the IOMMU. When the other driver did an ioremap, suddenly the IOMMU registers were no longer valid. Signed-off-by: Jordan Hargrave <Jordan_Hargrave@xxxxxxxx> --- drivers/pci/dmar.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c index 12e02bf..9650b9b 100644 --- a/drivers/pci/dmar.c +++ b/drivers/pci/dmar.c @@ -750,6 +750,10 @@ int alloc_iommu(struct dmar_drhd_unit *drhd) iommu->seq_id = iommu_allocated++; sprintf (iommu->name, "dmar%d", iommu->seq_id); + if (!request_mem_region(drhd->reg_base_addr, VTD_PAGE_SIZE, iommu->name)) { + printk(KERN_ERR "IOMMU: can't reserve memory\n"); + goto error; + } iommu->reg = ioremap(drhd->reg_base_addr, VTD_PAGE_SIZE); if (!iommu->reg) { printk(KERN_ERR "IOMMU: can't map the region\n"); @@ -789,7 +793,12 @@ int alloc_iommu(struct dmar_drhd_unit *drhd) cap_max_fault_reg_offset(iommu->cap)); map_size = VTD_PAGE_ALIGN(map_size); if (map_size > VTD_PAGE_SIZE) { + release_mem_region(drhd->reg_base_addr, VTD_PAGE_SIZE); iounmap(iommu->reg); + if (!request_mem_region(drhd->reg_base_addr, map_size, iommu->name)) { + printk(KERN_ERR "IOMMU: can't reserve memory\n"); + goto error; + } iommu->reg = ioremap(drhd->reg_base_addr, map_size); if (!iommu->reg) { printk(KERN_ERR "IOMMU: can't map the region\n"); -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html