2007-06-19 22:21:33

by Keshavamurthy, Anil S

[permalink] [raw]
Subject: [Intel IOMMU 10/10] Iommu floppy workaround

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.

Once the floppy driver starts using DMA api's this config option
can be turn off or this patch can be yanked out of kernel at that
time.


Signed-off-by: Anil S Keshavamurthy <[email protected]>
---
arch/x86_64/Kconfig | 10 ++++++++++
drivers/pci/intel-iommu.c | 22 ++++++++++++++++++++++
drivers/pci/intel-iommu.h | 7 +++++++
3 files changed, 39 insertions(+)

Index: linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig
===================================================================
--- linux-2.6.22-rc4-mm2.orig/arch/x86_64/Kconfig 2007-06-18 15:45:08.000000000 -0700
+++ linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig 2007-06-18 15:45:09.000000000 -0700
@@ -752,6 +752,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-rc4-mm2/drivers/pci/intel-iommu.c
===================================================================
--- linux-2.6.22-rc4-mm2.orig/drivers/pci/intel-iommu.c 2007-06-18 15:45:08.000000000 -0700
+++ linux-2.6.22-rc4-mm2/drivers/pci/intel-iommu.c 2007-06-18 15:45:09.000000000 -0700
@@ -1631,6 +1631,26 @@
}
#endif

+#ifdef CONFIG_DMAR_FLPY_WA
+static inline 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;
@@ -1696,6 +1716,8 @@

iommu_prepare_gfx_mapping();

+ iommu_prepare_isa();
+
/*
* for each drhd
* enable fault log
Index: linux-2.6.22-rc4-mm2/drivers/pci/intel-iommu.h
===================================================================
--- linux-2.6.22-rc4-mm2.orig/drivers/pci/intel-iommu.h 2007-06-18 15:45:08.000000000 -0700
+++ linux-2.6.22-rc4-mm2/drivers/pci/intel-iommu.h 2007-06-18 15:45:09.000000000 -0700
@@ -322,4 +322,11 @@
}
#endif /* !CONFIG_DMAR_GFX_WA */

+#ifndef CONFIG_DMAR_FLPY_WA
+static inline void iommu_prepare_isa(void)
+{
+ return;
+}
+#endif /* !CONFIG_DMAR_FLPY_WA */
+
#endif

--


2007-06-26 06:42:47

by Andrew Morton

[permalink] [raw]
Subject: Re: [Intel IOMMU 10/10] Iommu floppy workaround

On Tue, 19 Jun 2007 14:37:11 -0700 "Keshavamurthy, Anil S" <[email protected]> wrote:

> 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.
>
> Once the floppy driver starts using DMA api's this config option
> can be turn off or this patch can be yanked out of kernel at that
> time.
>
>
> Signed-off-by: Anil S Keshavamurthy <[email protected]>
> ---
> arch/x86_64/Kconfig | 10 ++++++++++
> drivers/pci/intel-iommu.c | 22 ++++++++++++++++++++++
> drivers/pci/intel-iommu.h | 7 +++++++
> 3 files changed, 39 insertions(+)
>
> Index: linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig
> ===================================================================
> --- linux-2.6.22-rc4-mm2.orig/arch/x86_64/Kconfig 2007-06-18 15:45:08.000000000 -0700
> +++ linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig 2007-06-18 15:45:09.000000000 -0700
> @@ -752,6 +752,16 @@
> all the OS visible memory. Hence the driver can continue
> to use physical addresses for DMA.
>
> +config DMAR_FLPY_WA

FLOPPY is spelled "FLOPPY"!

> ===================================================================
> --- linux-2.6.22-rc4-mm2.orig/drivers/pci/intel-iommu.c 2007-06-18 15:45:08.000000000 -0700
> +++ linux-2.6.22-rc4-mm2/drivers/pci/intel-iommu.c 2007-06-18 15:45:09.000000000 -0700
> @@ -1631,6 +1631,26 @@
> }
> #endif
>
> +#ifdef CONFIG_DMAR_FLPY_WA
> +static inline 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;
> @@ -1696,6 +1716,8 @@
>
> iommu_prepare_gfx_mapping();
>
> + iommu_prepare_isa();
> +
> /*
> * for each drhd
> * enable fault log
> Index: linux-2.6.22-rc4-mm2/drivers/pci/intel-iommu.h
> ===================================================================
> --- linux-2.6.22-rc4-mm2.orig/drivers/pci/intel-iommu.h 2007-06-18 15:45:08.000000000 -0700
> +++ linux-2.6.22-rc4-mm2/drivers/pci/intel-iommu.h 2007-06-18 15:45:09.000000000 -0700
> @@ -322,4 +322,11 @@
> }
> #endif /* !CONFIG_DMAR_GFX_WA */
>
> +#ifndef CONFIG_DMAR_FLPY_WA
> +static inline void iommu_prepare_isa(void)
> +{
> + return;
> +}
> +#endif /* !CONFIG_DMAR_FLPY_WA */

Bit weird that this was implemented in the header like that.

How about this? (Also contains rather a lot of obvious style fixes)


arch/x86_64/Kconfig | 2 +-
drivers/pci/intel-iommu.c | 19 ++++++++++++-------
drivers/pci/intel-iommu.h | 7 -------
3 files changed, 13 insertions(+), 15 deletions(-)

diff -puN arch/x86_64/Kconfig~intel-iommu-iommu-floppy-workaround-fix arch/x86_64/Kconfig
--- a/arch/x86_64/Kconfig~intel-iommu-iommu-floppy-workaround-fix
+++ a/arch/x86_64/Kconfig
@@ -770,7 +770,7 @@ config DMAR_GFX_WA
all the OS visible memory. Hence the driver can continue
to use physical addresses for DMA.

-config DMAR_FLPY_WA
+config DMAR_FLOPPY_WA
bool "Support for Floppy disk workaround"
depends on DMAR
default y
diff -puN drivers/pci/intel-iommu.c~intel-iommu-iommu-floppy-workaround-fix drivers/pci/intel-iommu.c
--- a/drivers/pci/intel-iommu.c~intel-iommu-iommu-floppy-workaround-fix
+++ a/drivers/pci/intel-iommu.c
@@ -1631,25 +1631,30 @@ error:
}
#endif

-#ifdef CONFIG_DMAR_FLPY_WA
+#ifdef CONFIG_DMAR_FLOPPY_WA
static inline void iommu_prepare_isa(void)
{
- struct pci_dev *pdev = NULL;
+ struct pci_dev *pdev;
int ret;

- pdev = pci_get_class (PCI_CLASS_BRIDGE_ISA << 8, NULL);
+ 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");
+ 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");
+ printk("IOMMU: Failed to create 0-64M identity map, "
+ "floppy might not work\n");

}
-#endif
+#else
+static inline void iommu_prepare_isa(void)
+{
+ return;
+}
+#endif /* !CONFIG_DMAR_FLPY_WA */

int __init init_dmars(void)
{
diff -puN drivers/pci/intel-iommu.h~intel-iommu-iommu-floppy-workaround-fix drivers/pci/intel-iommu.h
--- a/drivers/pci/intel-iommu.h~intel-iommu-iommu-floppy-workaround-fix
+++ a/drivers/pci/intel-iommu.h
@@ -322,11 +322,4 @@ static inline void iommu_prepare_gfx_map
}
#endif /* !CONFIG_DMAR_GFX_WA */

-#ifndef CONFIG_DMAR_FLPY_WA
-static inline void iommu_prepare_isa(void)
-{
- return;
-}
-#endif /* !CONFIG_DMAR_FLPY_WA */
-
#endif
_

2007-06-26 10:38:16

by Andi Kleen

[permalink] [raw]
Subject: Re: [Intel IOMMU 10/10] Iommu floppy workaround


> > Index: linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig
> > ===================================================================
> > --- linux-2.6.22-rc4-mm2.orig/arch/x86_64/Kconfig 2007-06-18 15:45:08.000000000 -0700
> > +++ linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig 2007-06-18 15:45:09.000000000 -0700
> > @@ -752,6 +752,16 @@
> > all the OS visible memory. Hence the driver can continue
> > to use physical addresses for DMA.
> >
> > +config DMAR_FLPY_WA
>
> FLOPPY is spelled "FLOPPY"!

Also this shouldn't be a user visible config. The floppy driver should just
do this transparently when loaded and undo when unloaded.

Otherwise it would be a CONFIG_MAKE_MY_FLOPPY_WORK which is just not very nice.

-Andi

2007-06-26 16:31:18

by Keshavamurthy, Anil S

[permalink] [raw]
Subject: Re: [Intel IOMMU 10/10] Iommu floppy workaround

On Mon, Jun 25, 2007 at 11:42:22PM -0700, Andrew Morton wrote:
> On Tue, 19 Jun 2007 14:37:11 -0700 "Keshavamurthy, Anil S" <[email protected]> wrote:
>
> Bit weird that this was implemented in the header like that.
Sorry, it is my mistake as I understood thus from your previous
code review comment.
>
> How about this? (Also contains rather a lot of obvious style fixes)
Yup, looks good.

-Anil

2007-06-26 19:30:51

by Keshavamurthy, Anil S

[permalink] [raw]
Subject: Re: [Intel IOMMU 10/10] Iommu floppy workaround

On Tue, Jun 26, 2007 at 12:37:55PM +0200, Andi Kleen wrote:
>
> > > Index: linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig
> > > ===================================================================
> > > --- linux-2.6.22-rc4-mm2.orig/arch/x86_64/Kconfig 2007-06-18 15:45:08.000000000 -0700
> > > +++ linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig 2007-06-18 15:45:09.000000000 -0700
> > > @@ -752,6 +752,16 @@
> > > all the OS visible memory. Hence the driver can continue
> > > to use physical addresses for DMA.
> > >
> > > +config DMAR_FLPY_WA
> >
> > FLOPPY is spelled "FLOPPY"!
>
> Also this shouldn't be a user visible config. The floppy driver should just
> do this transparently when loaded and undo when unloaded.

Yup, I agree.

Here goes the patch to make it user invisible config option.

Signed-off-by: Anil S Keshavamurthy <[email protected]>
---
arch/x86_64/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

Index: linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig
===================================================================
--- linux-2.6.22-rc4-mm2.orig/arch/x86_64/Kconfig 2007-06-26 12:04:42.000000000 -0700
+++ linux-2.6.22-rc4-mm2/arch/x86_64/Kconfig 2007-06-26 12:06:01.000000000 -0700
@@ -753,7 +753,7 @@
to use physical addresses for DMA.

config DMAR_FLOPPY_WA
- bool "Support for Floppy disk workaround"
+ bool
depends on DMAR
default y
help