Linux IOMMU Development
 help / color / mirror / Atom feed
* [PATCH] iommu/vt-d: Disable IOMMU on Lenovo ThinkPad P50s
@ 2026-06-20 19:22 Oliver Lin
  2026-06-21  1:29 ` Baolu Lu
  0 siblings, 1 reply; 8+ messages in thread
From: Oliver Lin @ 2026-06-20 19:22 UTC (permalink / raw)
  To: baolu.lu, dwmw2; +Cc: joro, will, robin.murphy, iommu, linux-kernel, Oliver Lin

On Lenovo ThinkPad P50s, enabling Intel IOMMU causes TPM
initialization failures, suspend/resume issues, and prevents the
system from powering off completely.

The system works correctly with intel_iommu=off. A locally tested
kernel with this DMI quirk also works correctly without requiring the
kernel parameter.

Add a DMI quirk to disable Intel IOMMU on this platform.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=221674
Signed-off-by: Oliver Lin <oliver@liuxiaozhen.dev>
---
 drivers/iommu/intel/iommu.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 849d06dfe1ae..a072e9ef63ef 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -278,6 +278,19 @@ static int __init intel_iommu_setup(char *str)
 
 	return 1;
 }
+
+static const struct dmi_system_id intel_iommu_broken_dmar_table[] __initconst = {
+	{
+		.ident = "Lenovo ThinkPad P50s",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "20FLCTO1WW"),
+			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad P50s"),
+		},
+	},
+	{}
+};
+
 __setup("intel_iommu=", intel_iommu_setup);
 
 /*
@@ -2565,6 +2578,12 @@ int __init intel_iommu_init(void)
 	force_on = (!intel_iommu_tboot_noforce && tboot_force_iommu()) ||
 		    platform_optin_force_iommu();
 
+	if (!force_on && dmi_check_system(intel_iommu_broken_dmar_table)) {
+		dmar_disabled = 1;
+		no_platform_optin = 1;
+		pr_info("DMAR: IOMMU disabled on Lenovo ThinkPad P50s due to firmware issue\n");
+	}
+
 	down_write(&dmar_global_lock);
 	if (dmar_table_init()) {
 		if (force_on)
-- 
2.53.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: Disable IOMMU on Lenovo ThinkPad P50s
  2026-06-20 19:22 [PATCH] iommu/vt-d: Disable IOMMU on Lenovo ThinkPad P50s Oliver Lin
@ 2026-06-21  1:29 ` Baolu Lu
       [not found]   ` <e4deced7-aabf-44d2-859c-d0b0add48d76@liuxiaozhen.dev>
  0 siblings, 1 reply; 8+ messages in thread
From: Baolu Lu @ 2026-06-21  1:29 UTC (permalink / raw)
  To: Oliver Lin, dwmw2; +Cc: baolu.lu, joro, will, robin.murphy, iommu, linux-kernel

On 6/21/2026 3:22 AM, Oliver Lin wrote:
> On Lenovo ThinkPad P50s, enabling Intel IOMMU causes TPM
> initialization failures, suspend/resume issues, and prevents the
> system from powering off completely.
> 
> The system works correctly with intel_iommu=off. A locally tested
> kernel with this DMI quirk also works correctly without requiring the
> kernel parameter.
> 
> Add a DMI quirk to disable Intel IOMMU on this platform.
> 
> Link:https://bugzilla.kernel.org/show_bug.cgi?id=221674
> Signed-off-by: Oliver Lin<oliver@liuxiaozhen.dev>
> ---
>   drivers/iommu/intel/iommu.c | 19 +++++++++++++++++++
>   1 file changed, 19 insertions(+)
> 
> diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
> index 849d06dfe1ae..a072e9ef63ef 100644
> --- a/drivers/iommu/intel/iommu.c
> +++ b/drivers/iommu/intel/iommu.c
> @@ -278,6 +278,19 @@ static int __init intel_iommu_setup(char *str)
>   
>   	return 1;
>   }
> +
> +static const struct dmi_system_id intel_iommu_broken_dmar_table[] __initconst = {
> +	{
> +		.ident = "Lenovo ThinkPad P50s",
> +		.matches = {
> +			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
> +			DMI_MATCH(DMI_PRODUCT_NAME, "20FLCTO1WW"),
> +			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad P50s"),
> +		},
> +	},
> +	{}
> +};

Is this a broken ACPI DMAR table? If so, please try updating to the
latest firmware. Otherwise, report the issue to the laptop vendor and
ask them to resolve it, especially if they claim their product supports
Linux.

Thanks,
baolu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: Disable IOMMU on Lenovo ThinkPad P50s
       [not found]   ` <e4deced7-aabf-44d2-859c-d0b0add48d76@liuxiaozhen.dev>
@ 2026-07-01 17:03     ` Oliver Lin
  2026-07-02 10:31       ` [PATCH] iommu/vt-d: respect user override for intel_iommu=on " Oliver Lin
  0 siblings, 1 reply; 8+ messages in thread
From: Oliver Lin @ 2026-07-01 17:03 UTC (permalink / raw)
  To: Baolu Lu; +Cc: iommu, linux-kernel, dwmw2

Hi Baolu,

Thanks for the feedback.

I will investigate the DMAR table further and provide acpidump + dmesg 
comparison in the next revision.

Best regards,
Oliver

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH] iommu/vt-d: respect user override for intel_iommu=on on Lenovo ThinkPad P50s
  2026-07-01 17:03     ` Oliver Lin
@ 2026-07-02 10:31       ` Oliver Lin
  2026-07-03  1:26         ` Baolu Lu
  0 siblings, 1 reply; 8+ messages in thread
From: Oliver Lin @ 2026-07-02 10:31 UTC (permalink / raw)
  To: baolu.lu; +Cc: iommu, linux-kernel, joro, robin.murphy, will, oliver

From: oliver <oliver@liuxiaozhen.dev>

The current DMI quirk disables VT-d on ThinkPad P50s unconditionally,
even when intel_iommu=on is explicitly requested via kernel command line.

This breaks kernel parameter precedence and user intent.

Make the quirk conditional so that it does not override explicit user
enabling of Intel IOMMU.

Signed-off-by: Oliver <oliver@liuxiaozhen.dev>
---
 drivers/iommu/intel/iommu.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index a072e9ef63ef..b34b5a60f349 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -201,6 +201,7 @@ static void intel_iommu_domain_free(struct iommu_domain *domain);
 
 int dmar_disabled = !IS_ENABLED(CONFIG_INTEL_IOMMU_DEFAULT_ON);
 int intel_iommu_sm = IS_ENABLED(CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON);
+static int intel_iommu_cmdline_on;
 
 int intel_iommu_enabled = 0;
 EXPORT_SYMBOL_GPL(intel_iommu_enabled);
@@ -241,10 +242,12 @@ static int __init intel_iommu_setup(char *str)
 	while (*str) {
 		if (!strncmp(str, "on", 2)) {
 			dmar_disabled = 0;
+			intel_iommu_cmdline_on = 1;
 			pr_info("IOMMU enabled\n");
 		} else if (!strncmp(str, "off", 3)) {
 			dmar_disabled = 1;
 			no_platform_optin = 1;
+			intel_iommu_cmdline_on = 0;
 			pr_info("IOMMU disabled\n");
 		} else if (!strncmp(str, "igfx_off", 8)) {
 			disable_igfx_iommu = 1;
@@ -2578,7 +2581,8 @@ int __init intel_iommu_init(void)
 	force_on = (!intel_iommu_tboot_noforce && tboot_force_iommu()) ||
 		    platform_optin_force_iommu();
 
-	if (!force_on && dmi_check_system(intel_iommu_broken_dmar_table)) {
+	if (!force_on && !intel_iommu_cmdline_on &&
+    dmi_check_system(intel_iommu_broken_dmar_table)) {
 		dmar_disabled = 1;
 		no_platform_optin = 1;
 		pr_info("DMAR: IOMMU disabled on Lenovo ThinkPad P50s due to firmware issue\n");
-- 
2.53.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: respect user override for intel_iommu=on on Lenovo ThinkPad P50s
  2026-07-02 10:31       ` [PATCH] iommu/vt-d: respect user override for intel_iommu=on " Oliver Lin
@ 2026-07-03  1:26         ` Baolu Lu
  2026-07-03  9:23           ` [PATCH v3] iommu/vt-d: Disable IOMMU by default " Oliver Lin
  0 siblings, 1 reply; 8+ messages in thread
From: Baolu Lu @ 2026-07-03  1:26 UTC (permalink / raw)
  To: Oliver Lin; +Cc: iommu, linux-kernel, joro, robin.murphy, will

On 7/2/26 18:31, Oliver Lin wrote:
> From: oliver<oliver@liuxiaozhen.dev>
> 
> The current DMI quirk disables VT-d on ThinkPad P50s unconditionally,
> even when intel_iommu=on is explicitly requested via kernel command line.

The current driver doesn't have the DMI quirk, so this patch cannot be
applied to the tree as-is.

> This breaks kernel parameter precedence and user intent.
> 
> Make the quirk conditional so that it does not override explicit user
> enabling of Intel IOMMU.
> 
> Signed-off-by: Oliver<oliver@liuxiaozhen.dev>
> ---
>   drivers/iommu/intel/iommu.c | 6 +++++-
>   1 file changed, 5 insertions(+), 1 deletion(-)

Thanks,
baolu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v3] iommu/vt-d: Disable IOMMU by default on Lenovo ThinkPad P50s
  2026-07-03  1:26         ` Baolu Lu
@ 2026-07-03  9:23           ` Oliver Lin
  2026-07-13  1:55             ` Baolu Lu
  0 siblings, 1 reply; 8+ messages in thread
From: Oliver Lin @ 2026-07-03  9:23 UTC (permalink / raw)
  To: baolu.lu; +Cc: iommu, linux-kernel, joro, robin.murphy, will, Oliver Lin

Lenovo ThinkPad P50s exhibits firmware issues when Intel VT-d is enabled.

With IOMMU enabled, the system reports DMAR DMA faults during boot,
TPM 2.0 (tpm_crb) fails to initialize with timeout errors, and the
machine cannot shut down or resume reliably. Booting with
intel_iommu=off avoids these issues.

Add a DMI quirk to disable Intel IOMMU by default on this platform.
If the user explicitly specifies intel_iommu=on on the kernel command
line, do not apply the quirk so that VT-d can still be enabled for
testing and debugging.

Signed-off-by: Oliver Lin <oliver@liuxiaozhen.dev>
---
 drivers/iommu/intel/iommu.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 849d06dfe1ae..b34b5a60f349 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -201,6 +201,7 @@ static void intel_iommu_domain_free(struct iommu_domain *domain);
 
 int dmar_disabled = !IS_ENABLED(CONFIG_INTEL_IOMMU_DEFAULT_ON);
 int intel_iommu_sm = IS_ENABLED(CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON);
+static int intel_iommu_cmdline_on;
 
 int intel_iommu_enabled = 0;
 EXPORT_SYMBOL_GPL(intel_iommu_enabled);
@@ -241,10 +242,12 @@ static int __init intel_iommu_setup(char *str)
 	while (*str) {
 		if (!strncmp(str, "on", 2)) {
 			dmar_disabled = 0;
+			intel_iommu_cmdline_on = 1;
 			pr_info("IOMMU enabled\n");
 		} else if (!strncmp(str, "off", 3)) {
 			dmar_disabled = 1;
 			no_platform_optin = 1;
+			intel_iommu_cmdline_on = 0;
 			pr_info("IOMMU disabled\n");
 		} else if (!strncmp(str, "igfx_off", 8)) {
 			disable_igfx_iommu = 1;
@@ -278,6 +281,19 @@ static int __init intel_iommu_setup(char *str)
 
 	return 1;
 }
+
+static const struct dmi_system_id intel_iommu_broken_dmar_table[] __initconst = {
+	{
+		.ident = "Lenovo ThinkPad P50s",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "20FLCTO1WW"),
+			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad P50s"),
+		},
+	},
+	{}
+};
+
 __setup("intel_iommu=", intel_iommu_setup);
 
 /*
@@ -2565,6 +2581,13 @@ int __init intel_iommu_init(void)
 	force_on = (!intel_iommu_tboot_noforce && tboot_force_iommu()) ||
 		    platform_optin_force_iommu();
 
+	if (!force_on && !intel_iommu_cmdline_on &&
+    dmi_check_system(intel_iommu_broken_dmar_table)) {
+		dmar_disabled = 1;
+		no_platform_optin = 1;
+		pr_info("DMAR: IOMMU disabled on Lenovo ThinkPad P50s due to firmware issue\n");
+	}
+
 	down_write(&dmar_global_lock);
 	if (dmar_table_init()) {
 		if (force_on)
-- 
2.53.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v3] iommu/vt-d: Disable IOMMU by default on Lenovo ThinkPad P50s
  2026-07-03  9:23           ` [PATCH v3] iommu/vt-d: Disable IOMMU by default " Oliver Lin
@ 2026-07-13  1:55             ` Baolu Lu
  2026-07-13  2:27               ` Oliver Lin
  0 siblings, 1 reply; 8+ messages in thread
From: Baolu Lu @ 2026-07-13  1:55 UTC (permalink / raw)
  To: Oliver Lin; +Cc: iommu, linux-kernel, joro, robin.murphy, will

On 7/3/26 17:23, Oliver Lin wrote:
> Lenovo ThinkPad P50s exhibits firmware issues when Intel VT-d is enabled.

Why not fix the firmware issue instead?

> With IOMMU enabled, the system reports DMAR DMA faults during boot,
> TPM 2.0 (tpm_crb) fails to initialize with timeout errors, and the
> machine cannot shut down or resume reliably. Booting with
> intel_iommu=off avoids these issues.

So the driver already provides a command-line workaround for this
firmware issue, right? Why is a hardcoded kernel quirk necessary here?

> 
> Add a DMI quirk to disable Intel IOMMU by default on this platform.
> If the user explicitly specifies intel_iommu=on on the kernel command
> line, do not apply the quirk so that VT-d can still be enabled for
> testing and debugging.
> 
> Signed-off-by: Oliver Lin <oliver@liuxiaozhen.dev>
> ---
>   drivers/iommu/intel/iommu.c | 23 +++++++++++++++++++++++
>   1 file changed, 23 insertions(+)

[..snip...]

Thanks,
baolu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3] iommu/vt-d: Disable IOMMU by default on Lenovo ThinkPad P50s
  2026-07-13  1:55             ` Baolu Lu
@ 2026-07-13  2:27               ` Oliver Lin
  0 siblings, 0 replies; 8+ messages in thread
From: Oliver Lin @ 2026-07-13  2:27 UTC (permalink / raw)
  To: Baolu Lu; +Cc: iommu, linux-kernel, joro, robin.murphy, will

On 13/7/2026 09:55, Baolu Lu wrote:
 >Why not fix the firmware issue instead?

 >So the driver already provides a command-line workaround for this

 > firmware issue, right? Why is a hardcoded kernel quirk necessary here?


Thanks for the review.

The machine is already running the latest available Lenovo BIOS, version 
1.45. I am not aware of any newer firmware update that fixes the issue, 
and the ThinkPad P50s is no longer receiving firmware updates from Lenovo.

Yes, intel_iommu=off provides a working command-line workaround. With 
VT-d enabled, however, the issue occurs during a normal default boot and 
causes several unrelated failures: DMAR faults are reported, tpm_crb 
times out during initialization, and shutdown and suspend/resume are 
unreliable. Adding intel_iommu=off consistently avoids all of these 
failures.

My reason for proposing a DMI quirk was that users installing a current 
kernel on this platform would otherwise encounter a partially unusable 
system without knowing that the failures are caused by VT-d or that 
intel_iommu=off is required.

That said, I understand the concern about disabling IOMMU functionality 
based on a single platform report. At the moment, my testing is limited 
to one ThinkPad P50s. I can provide the full DMAR, TPM, shutdown, and 
resume logs for both configurations, and I can also look for reports or 
testing from additional P50s systems before pursuing the quirk further.

Would additional reproductions from other P50s machines be required 
before a DMI quirk could be considered, or would you prefer that this 
remain a documented command-line workaround?

Thanks,
Oliver

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-07-13  2:27 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-20 19:22 [PATCH] iommu/vt-d: Disable IOMMU on Lenovo ThinkPad P50s Oliver Lin
2026-06-21  1:29 ` Baolu Lu
     [not found]   ` <e4deced7-aabf-44d2-859c-d0b0add48d76@liuxiaozhen.dev>
2026-07-01 17:03     ` Oliver Lin
2026-07-02 10:31       ` [PATCH] iommu/vt-d: respect user override for intel_iommu=on " Oliver Lin
2026-07-03  1:26         ` Baolu Lu
2026-07-03  9:23           ` [PATCH v3] iommu/vt-d: Disable IOMMU by default " Oliver Lin
2026-07-13  1:55             ` Baolu Lu
2026-07-13  2:27               ` Oliver Lin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox