Problem with display remaining black after resume

From ThinkWiki
Revision as of 21:02, 12 August 2007 by Akaposi (Talk | contribs)

Jump to: navigation, search

There has been a problem encountered where the display stays black on resuming from suspend.

The symptom might have you think first that your system hang up, but you will realize that your ThinkPad works and you can even reset it via CtrlAltDel.

Affected Models

Affected Operating Systems

  • Linux (it's a kernel issue)
  • FreeBSD (6.x at least)

Solutions

Semi-Solution for ThinkPad X60 with damaged system after s2ram usage

It happend when restarting a s2ram-session.

Symptom: Black screen with blinking "_" sign remaind. (without the ")

System status: HDD idle, fan running, everything else looks to wait for something to happen.

Semi-Solution: Booting with DVD-ROM and going through the installations menu, where you choose "other" and "boot a installed system" (something like that). Gladly it works, and OpenSuSE 10.1 comes up with 50% "failed" messages! I than shutdown properly, rebooted again and had 100% "done" again, with no other things affected.

Further: Repairing with the DVD-ROM crashed massivly(!), so I selected "boot a installed system" as final solution and it worked!

Unknown: Maybe the Solution for ThinkPads with 1400x1050 internal LCD and Intel 915GM will help, because X60s and X60 are very familiar. (Not tested so far.)

(If this Problem is not right here, please edit and move.)

Solution for ThinkPads with 1400x1050 internal LCD and Intel 915GM

see 1400x1050 on Intel 915GM.

Solution for ThinkPads with ATI graphic chips and Intel 915/945GM

Affected models include X60s, R60 and T60.

This soluton also applies to T42 with Intel 855 and ATI 9600 M10.

One solution may be to provide the acpi_sleep=s3_bios kernel parameter in your kernel parameter line.

For grub this would look like this:

title           Linux, kernel 2.6.11-1-686
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.11-1-686 root=/dev/hda1 ro acpi_sleep=s3_bios
initrd          /boot/initrd.img-2.6.11-1-686
savedefault
boot

For lilo it would look like this:

image=/boot/vmlinuz
    append="acpi_sleep=s3_bios"

The actual process of going to sleep is then managed through a sleep script; as a start, see the sleep.sh script in the Extreme Graphics 2 section below, but note the following comments:

In OpenSUSE 10.1 (at least on a T43p), it's necessary to override the default options for s2ram if you're using the newer ATI driver. This can be done putting SUSPEND2RAM_FORCE="yes" and SUSPEND2RAM_ACPI_SLEEP="3" in /etc/powersave/sleep.

In Ubuntu or Kubuntu, it may be necessary to modify /etc/default/acpi-support. In that file, make sure that ACPI_SLEEP is uncommented and set to true. With ATI chips, also make sure that SAVE_VBE_STATE is uncommented and set to true; with Intel chips, on the other hand, ensure that nothing is done with respect to VBE--no reposts, no state saves.

In Fedora, it may be necessary with the Intel chips to edit the resume_video() function in /etc/pm/functions-intel to comment out the VBE post and restore. (As of FC6 these seem to be pre-commented out.) Also, the laptop, after waking up, may go back to sleep immediately or whenever the AC adapter is disconnected. When this happens, it's caused by a bug in the HAL daemon that incorrectly reports certain ACPI events. This is a known problem and a simple workaround is described here.

NOTE!
It is possible this method will not work if the laptop is docked. It is also possible that the cited workaround for the HAL daemon bug will not work on some machines. A kludgier workaround in this event is to kill the HAL daemon on suspend. This necessitates the resuscitation of GPM upon resume.

Another solution is to use vbetool. If you are using Debian with the hibernate package, uncomment "EnableVbetool yes" in /etc/hibernate/hibernate.conf (or /etc/hibernate/ram.conf).



On T60 2007-CTO (Core2Duo 2Ghz, 2GB Ram, ATI X1400) the screen stayed blank after suspend-to-ram until I set vga=0 in lilo.conf.

Working config:

Linux 2.6.21.5
fglrx 8.37.6
debian etch:
 powersaved 0.14.0-5:
  UNLOAD_MODULES_BEFORE_SUSPEND2DISK="usb_storage ohci_hcd uhci_hcd ehci_hcd ipw3945 pcmcia yenta_socket rsrc_nonstatic pcmcia_core"
  UNLOAD_MODULES_BEFORE_SUSPEND2RAM="usb_storage ohci_hcd uhci_hcd ehci_hcd ipw3945 pcmcia yenta_socket rsrc_nonstatic pcmcia_core"   
 hibernate:
  SwitchToTextMode yes
 lilo.conf:
  vga=0

"EnableVbetool yes" and other suggestions didn't work for me.

For suspend-to-disk, don't load fglrx in initrd.


Solution for ThinkPads with Intel Extreme Graphics 2

NOTE!
On X40s/X41s - even with Intel Extreme Graphics - and for R52s with Intel Graphics Media Accelerator 900 the solution for ATI graphics chips above is reported to work. In this case, make sure no changes to VBE are made, especially no state saves and no reposts.

The following solution should work on 865G, 865GV, 855GM, 855GME, 852GME chipsets.

  • First of all, do not use the acpi_sleep=s3_bios kernel parameter.
  • Second, completely remove framebuffer support from your kernel. If it's built as modules, it is important that they do not get loaded at all.
  • Before suspending, change to a console and safe the video state with # cat /proc/bus/pci/00/02.0 > /tmp/video_state.
  • On resume, restore the video state with # cat /tmp/video_state > /proc/bus/pci/00/02.0 and change back to X.
  • For Debian Etch 4.0 on R50e just make following changes to /etc/default/acpi-support:
#SAVE_VBE_STATE=true
#VBESTATE=/var/lib/acpi-support/vbestate
#POST_VIDEO=true
SAVE_VIDEO_PCI_STATE=true
  • For a R50e the only thing needed to make suspend to ram work in Ubuntu 6.06 is adding
Option  "VBERestore" "yes"

to the Device section in your /etc/X11/xorg.conf, and the example script below.

The following example /etc/acpi/actions/sleep.sh script shows how to integrate the according lines.

#!/bin/bash

# change to console 1
FGCONSOLE=`fgconsole`
chvt 6

# safe video state
cat /proc/bus/pci/00/02.0 > /tmp/video_state

# sync filesystem
sync

# sync hardware clock with system time
hwclock --systohc

# go to sleep
echo -n 3 > /proc/acpi/sleep

# waking up
# restore system clock
hwclock --hctosys

# restore video state
cat /tmp/video_state > /proc/bus/pci/00/02.0

# change back to X
chvt $FGCONSOLE

# clean up behind us
rm /tmp/video_state

With Ubuntu 6.10 on a R51 (2887-32G) I just (as none of the other tricks above) had to add fb=false to the kernel line in /etc/grub/menu.lst and edit /etc/defaults/acpi-support this way:

SAVE_VBE_STATE=false
POST_VIDEO=false
SAVE_VIDEO_PCI_STATE=true
USE_DPMS=false
DOUBLE_CONSOLE_SWITCH=false

Solution for ThinkPads with Intel I830 Chipset

The following solution worked for me on an X30 with I830M chipset with kernel >= 2.6.16.

  • this works with vesafb and also with intelfb frambuffer support.

The following example /etc/acpi/actions/sleep.sh script shows how to integrate the according lines.

#!/bin/bash

FGCONSOLE=`fgconsole`
chvt 8
sync
hwclock --systohc

echo -n "mem" > /sys/power/state

hwclock --hctosys
vbetool post

if [ "$FGCONSOLE" -ge "7" ] ; then
  chvt $FGCONSOLE
else
  chvt 7
  chvt $FGCONSOLE
fi

Solution for ThinkPads with ATI graphic (and possibly other) chips and FreeBSD

The FreeBSD acpi(4) manpage mentions a tunable parameter, "hw.acpi.reset_video":

   hw.acpi.reset_video
            Reset the video adapter from real mode during the resume path.
            Some systems need this help, others have display problems if it
            is enabled.  Default is 0 (disabled).

This tunable can be set by adding the following line to your FreeBSD machine's /boot/loader.conf file:

   hw.acpi.reset_video="1"

And rebooting your machine. Hopefully, the next time you resume from a suspend, you'll see your video again. This solution doesn't appear to be specific to ATI hardware in any way, so I presume it would be helpful for video chipsets other than ATI, as well.

If this entry doesn't help you, you might consider searching in the FreeBSD-Mobile email-list archive for more insight.



FOOTNOTES [Δ]
  1. If you have this problem with R50e and the above solution doesn't work, try switching to console first. An example sleep script can be found here.

Solution using s2ram for Intel 915/945GM

Just using the "s2ram -f -p" command from the uswsusp package will work from within X, at least on a Z61e. This solution also works on X60s.