@@ -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");
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@dell.com> --- drivers/pci/dmar.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-)