This config option (DMAR_FLPY_WA) sets up 1:1 mapping for the
floppy device so that the floppy device which does not use
DMA api's will continue to work.

Signed-off-by: Anil S Keshavamurthy <[EMAIL PROTECTED]>
---
 arch/x86_64/Kconfig       |   10 ++++++++++
 drivers/pci/intel-iommu.c |   23 +++++++++++++++++++++++
 2 files changed, 33 insertions(+)

Index: linux-2.6.22-rc3/arch/x86_64/Kconfig
===================================================================
--- linux-2.6.22-rc3.orig/arch/x86_64/Kconfig   2007-06-05 12:58:08.000000000 
-0700
+++ linux-2.6.22-rc3/arch/x86_64/Kconfig        2007-06-05 12:58:08.000000000 
-0700
@@ -738,6 +738,16 @@
         all the OS visible memory. Hence the driver can continue
         to use physical addresses for DMA.
 
+config DMAR_FLPY_WA
+       bool "Support for Floppy disk workaround"
+       depends on DMAR
+       default y
+       help
+        Floppy disk drivers are know to by pass dma api calls
+        their by failing to work when IOMMU is enabled. This
+        work around will setup a 1 to 1 mappings for the first
+        16M to make floppy(isa device) work.
+
 source "drivers/pci/pcie/Kconfig"
 
 source "drivers/pci/Kconfig"
Index: linux-2.6.22-rc3/drivers/pci/intel-iommu.c
===================================================================
--- linux-2.6.22-rc3.orig/drivers/pci/intel-iommu.c     2007-06-05 
12:58:08.000000000 -0700
+++ linux-2.6.22-rc3/drivers/pci/intel-iommu.c  2007-06-05 12:58:08.000000000 
-0700
@@ -1584,6 +1584,25 @@
 }
 #endif
 
+#ifdef CONFIG_DMAR_FLPY_WA
+static void iommu_prepare_isa(void)
+{
+       struct pci_dev *pdev = NULL;
+       int ret;
+
+       pdev = pci_get_class (PCI_CLASS_BRIDGE_ISA << 8, NULL);
+       if (!pdev)
+               return;
+
+       printk (KERN_INFO "IOMMU: Prepare 0-16M unity mapping for LPC\n");
+       ret = iommu_prepare_identity_map(pdev, 0, 16*1024*1024);
+
+       if (ret)
+               printk ("IOMMU: Failed to create 0-64M identity map, Floppy 
might not work\n");
+
+}
+#endif
+
 int __init init_dmars(void)
 {
        struct dmar_drhd_unit *drhd;
@@ -1643,6 +1662,10 @@
        iommu_prepare_gfx_mapping();
 #endif
 
+#ifdef CONFIG_DMAR_FLPY_WA
+       iommu_prepare_isa();
+#endif
+
        /*
         * for each drhd
         *   enable fault log

-- 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to