* [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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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
0 siblings, 0 replies; 6+ 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] 6+ messages in thread
end of thread, other threads:[~2026-07-03 9:25 UTC | newest]
Thread overview: 6+ 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
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.