Bug 4455
Summary: | S3 resume: console lockup - ThinkPad R51 2883ELU | ||
---|---|---|---|
Product: | ACPI | Reporter: | Andrew Barr (barr.156) |
Component: | Power-Sleep-Wake | Assignee: | Venkatesh Pallipadi (venki) |
Status: | REJECTED UNREPRODUCIBLE | ||
Severity: | high | CC: | acpi-bugzilla |
Priority: | P2 | ||
Hardware: | i386 | ||
OS: | Linux | ||
Kernel Version: | 2.6.9-2.6.11.6,also 2.6.12-rc1-mm3 | Subsystem: | |
Regression: | --- | Bisected commit-id: | |
Attachments: |
kernel configuration for 2.6.11.6
dmidecode output disassembled DSDT 'lspci -vvv' before s3 'lspci -vvv' after s3 dmesg after s3 sleep.conf file for swsusp2 hibernate script biosdecode output |
Description
Andrew Barr
2005-04-07 07:38:48 UTC
Created attachment 4872 [details]
kernel configuration for 2.6.11.6
Created attachment 4873 [details]
dmidecode output
Created attachment 4874 [details]
disassembled DSDT
compiles back w/o errors.
Created attachment 4875 [details]
'lspci -vvv' before s3
Created attachment 4876 [details]
'lspci -vvv' after s3
Created attachment 4877 [details]
dmesg after s3
Created attachment 4878 [details]
sleep.conf file for swsusp2 hibernate script
Created attachment 4879 [details]
biosdecode output
Under 2.6.12-rc2-mm3, the computer reboots after resume from S3 either with no acpi_sleep parameter or acpi_sleep=s3_mode. 2.6.12-rc2-mm3 has a bug for gdt load, which cause any system reboots at resume. I have reported this to Len. Revert below patch will help you. diff -Nru a/arch/i386/kernel/acpi/sleep.c b/arch/i386/kernel/acpi/sleep.c --- a/arch/i386/kernel/acpi/sleep.c 2004-10-15 11:29:15.000000000 +0900 +++ b/arch/i386/kernel/acpi/sleep.c 2004-10-19 00:59:32.000000000 +0900 @@ -17,7 +17,7 @@ extern void zap_low_mappings(void); -extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long)); +extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long,unsigned long)); static void init_low_mapping(pgd_t *pgd, int pgd_limit) { @@ -41,7 +41,8 @@ return 1; init_low_mapping(swapper_pg_dir, USER_PTRS_PER_PGD); memcpy((void *) acpi_wakeup_address, &wakeup_start, &wakeup_end - &wakeup_start); - acpi_copy_wakeup_routine(acpi_wakeup_address); + acpi_copy_wakeup_routine(acpi_wakeup_address, + virt_to_phys((void *)acpi_wakeup_address)); return 0; } diff -Nru a/arch/i386/kernel/acpi/wakeup.S b/arch/i386/kernel/acpi/wakeup.S --- a/arch/i386/kernel/acpi/wakeup.S 2004-08-14 14:36:31.000000000 +0900 +++ b/arch/i386/kernel/acpi/wakeup.S 2004-10-19 05:24:42.000000000 +0900 @@ -89,6 +89,7 @@ real_magic: .long 0 video_mode: .long 0 video_flags: .long 0 +real_gdt_table: .fill GDT_ENTRIES, 8, 0 bogus_real_magic: movw $0x0e00 + 'B', %fs:(0x12) @@ -213,6 +214,7 @@ # # Parameters: # %eax: place to copy wakeup routine to +# %edx: the second argument (physical address) # # Returned address is location of code in low memory (past data and stack) # @@ -223,6 +225,9 @@ sldt saved_ldt str saved_tss + # save wakeup_start physical address in ecx + movl %edx, %ecx + movl %cr3, %edx movl %edx, real_save_cr3 - wakeup_start (%eax) movl %cr4, %edx @@ -231,6 +236,16 @@ movl %edx, real_save_cr0 - wakeup_start (%eax) sgdt real_save_gdt - wakeup_start (%eax) + # gdt body must be addressable from real mode by + # copying it to the lower mem + lea real_gdt_table - wakeup_start (%ecx), %ecx + movl %ecx, real_save_gdt + 2 - wakeup_start (%eax) + xor %ecx, %ecx + movw saved_gdt, %cx + movl saved_gdt + 2, %esi + lea real_gdt_table - wakeup_start (%eax), %edi + rep movsb + movl saved_videomode, %edx movl %edx, video_mode - wakeup_start (%eax) movl acpi_video_flags, %edx It seems that the problem of a frozen console is related to the graphics device being put into D3 (perhaps by the BIOS), but not being put back into D0 for lack of a kernel driver. Saving the config space to disk and restoring it after suspend returns me to the bash prompt. See my recent posting to this acpi-devel thread for a description of the commands I used: "i855-based ThinkPad STR: Graphics device stays in D3 after resume" (hasn't been archived by Sourceforge or Gmane yet). I have not tested this within X yet. still an issue with 2.6.13? It is still necessary to run the following command before suspend, where the video hardware sits at PCI 00:02.0 : cat /proc/bus/pci/00/02.0 > /var/cache/vidpci.config and then this command after the computer wakes up: cat /var/cache/vidpci.config > /proc/bus/pci/00/02.0 Tested 2.6.13-rc6-git9. Andrew, is this still failing with a recent kernel and a recent distribution (ie. version of X)? BTW. Some have asserted that acpi_sleep=s3_bios is always a good idea on Intel integrated video hardware, but your observations seem to show that it may actually make things worse on this system -- at least with the version of the kernel tested. please re-open if this is still a problem in linux-2.6.22.stable or later |