2007-10-26 18:20:22

by mark gross

[permalink] [raw]
Subject: [PATCH] iommu-PMEN_REG boot up support

The following patch clears the portect memory region enable bit at boot
time by default. It also provides a kernel parrameter for disabling
this behavior and leave the PMEN_REG untouched if so wanted.

If the boot loader or platform has protected memory regions enabled at
boot time it could prevent DMA's from happening as drivers are loaded
and used.


Singed-off-by: mark gross <[email protected]>

--mgross


Index: linux-2.6/drivers/pci/intel-iommu.c
===================================================================
--- linux-2.6.orig/drivers/pci/intel-iommu.c 2007-10-24 09:31:32.000000000 -0700
+++ linux-2.6/drivers/pci/intel-iommu.c 2007-10-26 11:18:55.000000000 -0700
@@ -55,6 +55,7 @@
static int dmar_disabled;
static int __initdata dmar_map_gfx = 1;
static int dmar_forcedac;
+static int clear_pmen_epm = 1;

#define DUMMY_DEVICE_DOMAIN_INFO ((struct device_domain_info *)(-1))
static DEFINE_SPINLOCK(device_domain_lock);
@@ -76,8 +77,14 @@
printk (KERN_INFO
"Intel-IOMMU: Forcing DAC for PCI devices\n");
dmar_forcedac = 1;
+ } else if (!strncmp(str, "no_epm_clear", 12)) {
+ printk(KERN_INFO
+ "Intel-IOMMU: subress clearing of Enable "
+ "Protected Memory bit\n");
+ clear_pmen_epm = 0;
}

+
str += strcspn(str, ",");
while (*str == ',')
str++;
@@ -692,6 +699,23 @@
DMA_TLB_PSI_FLUSH, non_present_entry_flush);
}

+static void iommu_disable_protect_mem_regions(struct intel_iommu *iommu)
+{
+ u32 pmen;
+ unsigned long flags;
+
+ spin_lock_irqsave(&iommu->register_lock, flags);
+ pmen = readl(iommu->reg + DMAR_PMEN_REG);
+ pmen &= ~DMA_PMEN_EPM;
+ writel(pmen, iommu->reg + DMAR_PMEN_REG);
+
+ /* wait for the protected region status bit to clear */
+ IOMMU_WAIT_OP(iommu, DMAR_PMEN_REG,
+ readl, (pmen & DMA_PMEN_PRS), pmen);
+
+ spin_unlock_irqrestore(&iommu->register_lock, flags);
+}
+
static int iommu_enable_translation(struct intel_iommu *iommu)
{
u32 sts;
@@ -1731,6 +1755,9 @@
iommu_flush_context_global(iommu, 0);
iommu_flush_iotlb_global(iommu, 0);

+ if (clear_pmen_epm)
+ iommu_disable_protect_mem_regions(iommu);
+
ret = iommu_enable_translation(iommu);
if (ret)
goto error;
Index: linux-2.6/drivers/pci/intel-iommu.h
===================================================================
--- linux-2.6.orig/drivers/pci/intel-iommu.h 2007-10-24 09:31:32.000000000 -0700
+++ linux-2.6/drivers/pci/intel-iommu.h 2007-10-26 11:11:44.000000000 -0700
@@ -126,6 +126,10 @@
#define DMA_TLB_IH_NONLEAF (((u64)1) << 6)
#define DMA_TLB_MAX_SIZE (0x3f)

+/* PMEN_REG */
+#define DMA_PMEN_EPM (((u32)1)<<31)
+#define DMA_PMEN_PRS (((u32)1)<<0)
+
/* GCMD_REG */
#define DMA_GCMD_TE (((u32)1) << 31)
#define DMA_GCMD_SRTP (((u32)1) << 30)
Index: linux-2.6/Documentation/kernel-parameters.txt
===================================================================
--- linux-2.6.orig/Documentation/kernel-parameters.txt 2007-10-24 09:31:30.000000000 -0700
+++ linux-2.6/Documentation/kernel-parameters.txt 2007-10-26 11:11:44.000000000 -0700
@@ -789,6 +789,10 @@
than 32 bit addressing. The default is to look
for translation below 32 bit and if not available
then look in the higher range.
+ no_epm_clear
+ This will override the default of disabling protected
+ memory regions from DMA to leave the PMEM_REG settings
+ as they where set up by the boot loader / platform.

io7= [HW] IO7 for Marvel based alpha systems
See comment before marvel_specify_io7 in


2007-10-27 00:19:50

by Muli Ben-Yehuda

[permalink] [raw]
Subject: Re: [PATCH] iommu-PMEN_REG boot up support

On Fri, Oct 26, 2007 at 11:18:49AM -0700, Mark Gross wrote:

> The following patch clears the portect memory region enable bit at
> boot time by default. It also provides a kernel parrameter for
> disabling this behavior and leave the PMEN_REG untouched if so
> wanted.
>
> If the boot loader or platform has protected memory regions enabled
> at boot time it could prevent DMA's from happening as drivers are
> loaded and used.

What's the value of adding a command line option for this? Under what
circumstances would we want to not clear this bit?

> + } else if (!strncmp(str, "no_epm_clear", 12)) {
> + printk(KERN_INFO
> + "Intel-IOMMU: subress clearing of Enable "
> + "Protected Memory bit\n");
> + clear_pmen_epm = 0;

`suppress', I assume. Rest looks fine, if the configuration option is
really needed.

Cheers,
Muli
--
SYSTOR 2007 --- 1st Annual Haifa Systems and Storage Conference 2007
http://www.haifa.il.ibm.com/Workshops/systor2007/

Virtualization workshop: Oct 29th, 2007 | Storage workshop: Oct 30th, 2007

2007-10-29 20:36:19

by mark gross

[permalink] [raw]
Subject: Re: [PATCH] iommu-PMEN_REG boot up support

On Sat, Oct 27, 2007 at 02:19:38AM +0200, Muli Ben-Yehuda wrote:
> On Fri, Oct 26, 2007 at 11:18:49AM -0700, Mark Gross wrote:
>
> > The following patch clears the portect memory region enable bit at
> > boot time by default. It also provides a kernel parrameter for
> > disabling this behavior and leave the PMEN_REG untouched if so
> > wanted.
> >
> > If the boot loader or platform has protected memory regions enabled
> > at boot time it could prevent DMA's from happening as drivers are
> > loaded and used.
>
> What's the value of adding a command line option for this? Under what
> circumstances would we want to not clear this bit?

umm, /me asks around and finds out that at this time there isn't much
point to having a command line to preserve any protected areas set up at
boot time.

>
> > + } else if (!strncmp(str, "no_epm_clear", 12)) {
> > + printk(KERN_INFO
> > + "Intel-IOMMU: subress clearing of Enable "
> > + "Protected Memory bit\n");
> > + clear_pmen_epm = 0;
>
> `suppress', I assume. Rest looks fine, if the configuration option is
> really needed.
>
> Cheers,
> Muli
> --
> SYSTOR 2007 --- 1st Annual Haifa Systems and Storage Conference 2007
> http://www.haifa.il.ibm.com/Workshops/systor2007/
>
> Virtualization workshop: Oct 29th, 2007 | Storage workshop: Oct 30th, 2007
> -


Signed-off-by: mark gross <[email protected]>

--mgross


Index: linux-2.6/drivers/pci/intel-iommu.c
===================================================================
--- linux-2.6.orig/drivers/pci/intel-iommu.c 2007-10-24 09:31:32.000000000 -0700
+++ linux-2.6/drivers/pci/intel-iommu.c 2007-10-29 13:30:29.000000000 -0700
@@ -692,6 +692,23 @@
DMA_TLB_PSI_FLUSH, non_present_entry_flush);
}

+static void iommu_disable_protect_mem_regions(struct intel_iommu *iommu)
+{
+ u32 pmen;
+ unsigned long flags;
+
+ spin_lock_irqsave(&iommu->register_lock, flags);
+ pmen = readl(iommu->reg + DMAR_PMEN_REG);
+ pmen &= ~DMA_PMEN_EPM;
+ writel(pmen, iommu->reg + DMAR_PMEN_REG);
+
+ /* wait for the protected region status bit to clear */
+ IOMMU_WAIT_OP(iommu, DMAR_PMEN_REG,
+ readl, (pmen & DMA_PMEN_PRS), pmen);
+
+ spin_unlock_irqrestore(&iommu->register_lock, flags);
+}
+
static int iommu_enable_translation(struct intel_iommu *iommu)
{
u32 sts;
@@ -1731,6 +1748,8 @@
iommu_flush_context_global(iommu, 0);
iommu_flush_iotlb_global(iommu, 0);

+ iommu_disable_protect_mem_regions(iommu);
+
ret = iommu_enable_translation(iommu);
if (ret)
goto error;
Index: linux-2.6/drivers/pci/intel-iommu.h
===================================================================
--- linux-2.6.orig/drivers/pci/intel-iommu.h 2007-10-24 09:31:32.000000000 -0700
+++ linux-2.6/drivers/pci/intel-iommu.h 2007-10-29 10:30:24.000000000 -0700
@@ -126,6 +126,10 @@
#define DMA_TLB_IH_NONLEAF (((u64)1) << 6)
#define DMA_TLB_MAX_SIZE (0x3f)

+/* PMEN_REG */
+#define DMA_PMEN_EPM (((u32)1)<<31)
+#define DMA_PMEN_PRS (((u32)1)<<0)
+
/* GCMD_REG */
#define DMA_GCMD_TE (((u32)1) << 31)
#define DMA_GCMD_SRTP (((u32)1) << 30)

2007-10-30 08:33:47

by Muli Ben-Yehuda

[permalink] [raw]
Subject: Re: [PATCH] iommu-PMEN_REG boot up support

On Mon, Oct 29, 2007 at 01:31:30PM -0700, Mark Gross wrote:

> > What's the value of adding a command line option for this? Under
> > what circumstances would we want to not clear this bit?
>
> umm, /me asks around and finds out that at this time there isn't
> much point to having a command line to preserve any protected areas
> set up at boot time.

The society for controlled proliferation of command line options
thanks you.

> Signed-off-by: mark gross <[email protected]>

Acked-by: Muli Ben-Yehuda <[email protected]>

Cheers,
Muli
--
SYSTOR 2007 --- 1st Annual Haifa Systems and Storage Conference 2007
http://www.haifa.il.ibm.com/Workshops/systor2007/

Virtualization workshop: Oct 29th, 2007 | Storage workshop: Oct 30th, 2007