[PATCH] Reserve memory for IOMMU registers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux