Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1612019 > unrolled thread

[PATCH] iommu/vt-d: Make sure IOMMUs are off when intel_iommu=off

Started byJoerg Roedel <joro@8bytes.org>
First post2017-03-29 17:10 +0200
Last post2017-03-29 23:10 +0200
Articles 3 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] iommu/vt-d: Make sure IOMMUs are off when intel_iommu=off Joerg Roedel <joro@8bytes.org> - 2017-03-29 17:10 +0200
    Re: [PATCH] iommu/vt-d: Make sure IOMMUs are off when  intel_iommu=off Jacob Pan <jacob.jun.pan@linux.intel.com> - 2017-03-29 18:00 +0200
      Re: [PATCH] iommu/vt-d: Make sure IOMMUs are off when intel_iommu=off Joerg Roedel <jroedel@suse.de> - 2017-03-29 23:10 +0200

#1612019 — [PATCH] iommu/vt-d: Make sure IOMMUs are off when intel_iommu=off

FromJoerg Roedel <joro@8bytes.org>
Date2017-03-29 17:10 +0200
Subject[PATCH] iommu/vt-d: Make sure IOMMUs are off when intel_iommu=off
Message-ID<tqnot-9P-7@gated-at.bofh.it>
From: Joerg Roedel <jroedel@suse.de>

When booting into a kexec kernel with intel_iommu=off, and
the previous kernel had intel_iommu=on, the IOMMU hardware
is still enabled and gets not disabled by the new kernel.

This causes the boot to fail because DMA is blocked by the
hardware. Disable the IOMMUs when we find it enabled in the
kexec kernel and boot with intel_iommu=off.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
 drivers/iommu/intel-iommu.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index d412a31..1662288 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -4730,6 +4730,15 @@ static int intel_iommu_cpu_dead(unsigned int cpu)
 	return 0;
 }
 
+static void intel_disable_iommus(void)
+{
+	struct intel_iommu *iommu = NULL;
+	struct dmar_drhd_unit *drhd;
+
+	for_each_iommu(iommu, drhd)
+		iommu_disable_translation(iommu);
+}
+
 static inline struct intel_iommu *dev_to_intel_iommu(struct device *dev)
 {
 	return container_of(dev, struct intel_iommu, iommu.dev);
@@ -4840,8 +4849,15 @@ int __init intel_iommu_init(void)
 		goto out_free_dmar;
 	}
 
-	if (no_iommu || dmar_disabled)
+	if (no_iommu || dmar_disabled) {
+		/*
+		 * Make sure the IOMMUs are switched off, even when we
+		 * boot into a kexec kernel and the previous kernel left
+		 * them enabled
+		 */
+		intel_disable_iommus();
 		goto out_free_dmar;
+	}
 
 	if (list_empty(&dmar_rmrr_units))
 		pr_info("No RMRR found\n");
-- 
1.9.1

[toc] | [next] | [standalone]


#1612088 — Re: [PATCH] iommu/vt-d: Make sure IOMMUs are off when intel_iommu=off

FromJacob Pan <jacob.jun.pan@linux.intel.com>
Date2017-03-29 18:00 +0200
SubjectRe: [PATCH] iommu/vt-d: Make sure IOMMUs are off when intel_iommu=off
Message-ID<tqoaR-AU-15@gated-at.bofh.it>
In reply to#1612019
On Wed, 29 Mar 2017 17:00:39 +0200
Joerg Roedel <joro@8bytes.org> wrote:

> From: Joerg Roedel <jroedel@suse.de>
> 
> When booting into a kexec kernel with intel_iommu=off, and
> the previous kernel had intel_iommu=on, the IOMMU hardware
> is still enabled and gets not disabled by the new kernel.
> 
> This causes the boot to fail because DMA is blocked by the
> hardware. Disable the IOMMUs when we find it enabled in the
> kexec kernel and boot with intel_iommu=off.
> 
> Signed-off-by: Joerg Roedel <jroedel@suse.de>
> ---
>  drivers/iommu/intel-iommu.c | 18 +++++++++++++++++-
>  1 file changed, 17 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> index d412a31..1662288 100644
> --- a/drivers/iommu/intel-iommu.c
> +++ b/drivers/iommu/intel-iommu.c
> @@ -4730,6 +4730,15 @@ static int intel_iommu_cpu_dead(unsigned int
> cpu) return 0;
>  }
>  
> +static void intel_disable_iommus(void)
> +{
> +	struct intel_iommu *iommu = NULL;
> +	struct dmar_drhd_unit *drhd;
> +
> +	for_each_iommu(iommu, drhd)
> +		iommu_disable_translation(iommu);
should we also disable IR here? i.e.
iommu_disable_irq_remapping(iommu);

> +}
> +
>  static inline struct intel_iommu *dev_to_intel_iommu(struct device
> *dev) {
>  	return container_of(dev, struct intel_iommu, iommu.dev);
> @@ -4840,8 +4849,15 @@ int __init intel_iommu_init(void)
>  		goto out_free_dmar;
>  	}
>  
> -	if (no_iommu || dmar_disabled)
> +	if (no_iommu || dmar_disabled) {
> +		/*
> +		 * Make sure the IOMMUs are switched off, even when
> we
> +		 * boot into a kexec kernel and the previous kernel
> left
> +		 * them enabled
> +		 */
> +		intel_disable_iommus();
>  		goto out_free_dmar;
> +	}
>  
>  	if (list_empty(&dmar_rmrr_units))
>  		pr_info("No RMRR found\n");

[Jacob Pan]

[toc] | [prev] | [next] | [standalone]


#1612347

FromJoerg Roedel <jroedel@suse.de>
Date2017-03-29 23:10 +0200
Message-ID<tqt0T-4cP-45@gated-at.bofh.it>
In reply to#1612088
On Wed, Mar 29, 2017 at 08:51:53AM -0700, Jacob Pan wrote:
> On Wed, 29 Mar 2017 17:00:39 +0200
> Joerg Roedel <joro@8bytes.org> wrote:

> > +static void intel_disable_iommus(void)
> > +{
> > +	struct intel_iommu *iommu = NULL;
> > +	struct dmar_drhd_unit *drhd;
> > +
> > +	for_each_iommu(iommu, drhd)
> > +		iommu_disable_translation(iommu);
> should we also disable IR here? i.e.
> iommu_disable_irq_remapping(iommu);

No, irq remapping depends on another parameter (intremap=off) and needs
to be handled seperatly. I already looked at it and this needs to be
part of a larger effort as it required changes in code-paths that are
shared between Intel and AMD IOMMU drivers.


	Joerg

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web