diff options
author | Alex Chiang <achiang@canonical.com> | 2010-04-20 10:03:14 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2010-05-05 14:04:52 -0400 |
commit | 07bedca29b0973f36a6b6db36936deed367164ed (patch) | |
tree | f15195d5e4f55eafe6b956b2f7b28ee9ab4df1da /drivers/acpi | |
parent | 8777c793d6a24c7f3adf52b1b1086e9706de4589 (diff) |
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.
https://bugzilla.kernel.org/show_bug.cgi?id=15407
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/532374
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.
Cc: stable@kernel.org
Cc: Colin King <colin.king@canonical.com>
Signed-off-by: Alex Chiang <achiang@canonical.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/sleep.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index f74834a544fd..0fc91a945ab4 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -450,6 +450,126 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
450 | }, | 450 | }, |
451 | }, | 451 | }, |
452 | { | 452 | { |
453 | .callback = init_set_sci_en_on_resume, | ||
454 | .ident = "Lenovo ThinkPad T410", | ||
455 | .matches = { | ||
456 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
457 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
458 | }, | ||
459 | }, | ||
460 | { | ||
461 | .callback = init_set_sci_en_on_resume, | ||
462 | .ident = "Lenovo ThinkPad T510", | ||
463 | .matches = { | ||
464 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
465 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
466 | }, | ||
467 | }, | ||
468 | { | ||
469 | .callback = init_set_sci_en_on_resume, | ||
470 | .ident = "Lenovo ThinkPad W510", | ||
471 | .matches = { | ||
472 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
473 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
474 | }, | ||
475 | }, | ||
476 | { | ||
477 | .callback = init_set_sci_en_on_resume, | ||
478 | .ident = "Lenovo ThinkPad X201", | ||
479 | .matches = { | ||
480 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
481 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
482 | }, | ||
483 | }, | ||
484 | { | ||
485 | .callback = init_set_sci_en_on_resume, | ||
486 | .ident = "Lenovo ThinkPad X201", | ||
487 | .matches = { | ||
488 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
489 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
490 | }, | ||
491 | }, | ||
492 | { | ||
493 | .callback = init_set_sci_en_on_resume, | ||
494 | .ident = "Lenovo ThinkPad T410", | ||
495 | .matches = { | ||
496 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
497 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
498 | }, | ||
499 | }, | ||
500 | { | ||
501 | .callback = init_set_sci_en_on_resume, | ||
502 | .ident = "Lenovo ThinkPad T510", | ||
503 | .matches = { | ||
504 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
505 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
506 | }, | ||
507 | }, | ||
508 | { | ||
509 | .callback = init_set_sci_en_on_resume, | ||
510 | .ident = "Lenovo ThinkPad W510", | ||
511 | .matches = { | ||
512 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
513 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
514 | }, | ||
515 | }, | ||
516 | { | ||
517 | .callback = init_set_sci_en_on_resume, | ||
518 | .ident = "Lenovo ThinkPad X201", | ||
519 | .matches = { | ||
520 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
521 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
522 | }, | ||
523 | }, | ||
524 | { | ||
525 | .callback = init_set_sci_en_on_resume, | ||
526 | .ident = "Lenovo ThinkPad X201", | ||
527 | .matches = { | ||
528 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
529 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
530 | }, | ||
531 | }, | ||
532 | { | ||
533 | .callback = init_set_sci_en_on_resume, | ||
534 | .ident = "Lenovo ThinkPad T410", | ||
535 | .matches = { | ||
536 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
537 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
538 | }, | ||
539 | }, | ||
540 | { | ||
541 | .callback = init_set_sci_en_on_resume, | ||
542 | .ident = "Lenovo ThinkPad T510", | ||
543 | .matches = { | ||
544 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
545 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
546 | }, | ||
547 | }, | ||
548 | { | ||
549 | .callback = init_set_sci_en_on_resume, | ||
550 | .ident = "Lenovo ThinkPad W510", | ||
551 | .matches = { | ||
552 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
553 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
554 | }, | ||
555 | }, | ||
556 | { | ||
557 | .callback = init_set_sci_en_on_resume, | ||
558 | .ident = "Lenovo ThinkPad X201", | ||
559 | .matches = { | ||
560 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
561 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
562 | }, | ||
563 | }, | ||
564 | { | ||
565 | .callback = init_set_sci_en_on_resume, | ||
566 | .ident = "Lenovo ThinkPad X201", | ||
567 | .matches = { | ||
568 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
569 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
570 | }, | ||
571 | }, | ||
572 | { | ||
453 | .callback = init_old_suspend_ordering, | 573 | .callback = init_old_suspend_ordering, |
454 | .ident = "Panasonic CF51-2L", | 574 | .ident = "Panasonic CF51-2L", |
455 | .matches = { | 575 | .matches = { |