diff mbox

Reserve memory for IOMMU registers

Message ID 1311887593-3608-1-git-send-email-jharg93@gmail.com (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show

Commit Message

jordan hargrave July 28, 2011, 9:13 p.m. UTC
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(-)
diff mbox

Patch

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");