Skip to contentSkip to conversation

ACPI: DMI init_set_sci_en_on_resume for multiple Lenovo ThinkPads

PATCH In review Alex Chiang 2 participants 3 messages Apr 23, 2010 ACPI

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 ACPI: DMI init_set_sci_en_on_resume for multiple Lenovo ThinkPads

Multiple Lenovo ThinkPad models with Intel Core i5/i7 CPUs can successfully suspend/resume once, and then hang on the second s/r cycle.

We got confirmation that this was due to a BIOS defect. The BIOS did not properly set SCI_EN coming out of S3. The BIOS guys hinted that The Other Leading OS ignores the fact that hardware owns the bit and sets it manually.

In any case, an existing DMI table exists for machines where this defect is a known problem. Lenovo promise to fix their BIOS, but for folks who either won't or can't upgrade their BIOS, allow Linux to workaround the issue.

Confirmed by numerous testers in the launchpad bug that using acpi_sleep=sci_force_enable fixes the issue. We add the machines to acpisleep_dmi_table[] to automatically enable this workaround.

https://bugzilla.kernel.org/show_bug.cgi?id=15407

---
We want to get this patch upstream so that we can get it into -stable. Matthew Garrett's patch titled "Fall back to manually changing SCI_EN" is the plan for dealing with future platforms that will likely have this same BIOS bug.

v1 -> v2:
- remove separate X201s entry, as the X201 entry will match it too

---
 sleep.c |   32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

---

drivers/acpi/sleep.c +32 -0
index f74834a..317794f 100644
@@ -450,6 +450,38 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
 		},
 	},
 	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad T410",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad T510",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad W510",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad X201[s]",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
+		},
+	},
+	{
 	.callback = init_old_suspend_ordering,
 	.ident = "Panasonic CF51-2L",
 	.matches = {
#1 lore raw

You made a small mistake..point out below.

**mumble** .. still not a fan of quirk tables when a bios coming out to resolve this issue is coming out..one out for T410 came out yesterday.

Quoted 62 lines · Alex Chiang

Multiple Lenovo ThinkPad models with Intel Core i5/i7 CPUs can successfully suspend/resume once, and then hang on the second s/r cycle.

We got confirmation that this was due to a BIOS defect. The BIOS did not properly set SCI_EN coming out of S3. The BIOS guys hinted that The Other Leading OS ignores the fact that hardware owns the bit and sets it manually.

In any case, an existing DMI table exists for machines where this defect is a known problem. Lenovo promise to fix their BIOS, but for folks who either won't or can't upgrade their BIOS, allow Linux to workaround the issue.

Confirmed by numerous testers in the launchpad bug that using acpi_sleep=sci_force_enable fixes the issue. We add the machines to acpisleep_dmi_table[] to automatically enable this workaround.

https://bugzilla.kernel.org/show_bug.cgi?id=15407

---
We want to get this patch upstream so that we can get it into -stable. Matthew Garrett's patch titled "Fall back to manually changing SCI_EN" is the plan for dealing with future platforms that will likely have this same BIOS bug.

v1 -> v2:
- remove separate X201s entry, as the X201 entry will match it too

---
 sleep.c |   32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

---

drivers/acpi/sleep.c +19 -0
index f74834a..317794f 100644
@@ -450,6 +450,38 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
 		},
 	},
 	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad T410",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad T510",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad W510",
+	.matches = {

drivers/acpi/sleep.c static struct dmi_system_id __initdata acpisleep_dmi_table[] = { · line 481

Quoted 10 lines
drivers/acpi/sleep.c +10 -0
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad X201[s]",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),

The X201s identifies it's self as an X201s .. So you would need two separate entries.

Here is dmidecode data from a X201s:
http://launchpadlibrarian.net/45050202/dmidecode

Quoted 10 lines
drivers/acpi/sleep.c +3 -1
+		},
+	},
+	{
 	.callback = init_old_suspend_ordering,
 	.ident = "Panasonic CF51-2L",
 	.matches = {
--

To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#2 lore raw

Apparently I made a mistake. Not realizing that DMI_MATCH does not do an exact match.

Patch looks good.

Quoted 97 lines · Jerone Young

You made a small mistake..point out below.

**mumble** .. still not a fan of quirk tables when a bios coming out to resolve this issue is coming out..one out for T410 came out yesterday.

Quoted 62 lines · Alex Chiang

Multiple Lenovo ThinkPad models with Intel Core i5/i7 CPUs can successfully suspend/resume once, and then hang on the second s/r cycle.

We got confirmation that this was due to a BIOS defect. The BIOS did not properly set SCI_EN coming out of S3. The BIOS guys hinted that The Other Leading OS ignores the fact that hardware owns the bit and sets it manually.

In any case, an existing DMI table exists for machines where this defect is a known problem. Lenovo promise to fix their BIOS, but for folks who either won't or can't upgrade their BIOS, allow Linux to workaround the issue.

Confirmed by numerous testers in the launchpad bug that using acpi_sleep=sci_force_enable fixes the issue. We add the machines to acpisleep_dmi_table[] to automatically enable this workaround.

https://bugzilla.kernel.org/show_bug.cgi?id=15407

---
We want to get this patch upstream so that we can get it into -stable. Matthew Garrett's patch titled "Fall back to manually changing SCI_EN" is the plan for dealing with future platforms that will likely have this same BIOS bug.

v1 -> v2:
- remove separate X201s entry, as the X201 entry will match it too

---
 sleep.c |   32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

---

drivers/acpi/sleep.c +19 -0
index f74834a..317794f 100644
@@ -450,6 +450,38 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
 		},
 	},
 	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad T410",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad T510",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad W510",
+	.matches = {

drivers/acpi/sleep.c static struct dmi_system_id __initdata acpisleep_dmi_table[] = { · line 481

Quoted 10 lines
drivers/acpi/sleep.c +10 -0
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
+		},
+	},
+	{
+	.callback = init_set_sci_en_on_resume,
+	.ident = "Lenovo ThinkPad X201[s]",
+	.matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+		DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),

The X201s identifies it's self as an X201s .. So you would need two separate entries.

Here is dmidecode data from a X201s:
http://launchpadlibrarian.net/45050202/dmidecode

Quoted 10 lines
drivers/acpi/sleep.c +3 -1
+		},
+	},
+	{
 	.callback = init_old_suspend_ordering,
 	.ident = "Panasonic CF51-2L",
 	.matches = {
--

To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html