Ubuntu – Blank screen after resume – Dell M5510 Ubuntu 16.04

16.04dellsuspend

Unable to Resume from Suspend

Laptop is the Dell M5510 Precision

Suspend/Resume works under Windows 10 and the Ubuntu Live CD/USB image. It even worked the first
couple days installed. Then (without running any updates or rebooting), I did a suspend and the resume
failed. I get a blank screen. It's running: I can ssh in from another system.

I've tried a number of things from around the web, though my first set of notes I lost when I reinstalled. I originally started on Ubuntu Mint, then reinstalled to vanilla Ubuntu. After a fresh install, suspend/resume worked great for 2 days.
On the second day, I had resumed my laptop and started working. During mid-day, I suspended it and it gave the blank screen issue. I hadn't ran any upgrade commands or done any reboots in between, so I don't know what changed there.

00:02.0 VGA compatible controller: Intel Corporation Skylake Integrated Graphics (rev 06)
01:00.0 3D controller: NVIDIA Corporation GM107GLM [Quadro M1000M](rev a2)
Linux 4.4.0-36-generic

Things I've tried:

  • Created a 24GB unecreypted swap
  • Edit /etc/systemd/logind.conf and uncomment HandleLidSwitchDocked=suspend 763085
  • Update kernel to 4.4.8 (also broke networking) 761820
  • Update kernel to 4.6.0 (this didn't help, and also broke docker) launchpad bug
  • Switched from open source driver to Nvidia 361.42
  • I saw some post about disabling discrete graphics in the bios, but could not find that option in my bios.
  • Some answers suggest doing ctrl-alt-f[12] to get text console and than ctrl-alt-f7. When in the blank screen, this does nothing.
  • Tried the Fn+F8 screen toggle (toggles between internal/external display), as well as all the brightness keys. archlinux bug

Run nvidia x server setings and change gpu to Intel instead of nvidia.

Best Answer

The solution was ultimately found posted on Sept 18th on the Dell Community Forums. This is ultimately a bios problem: during suspend, an intel register is reset to all 0's. A kernel patch workaround is already in the works, but may not be included until 4.9. However, the register can be saved to a file during suspend and loaded during resume.

Save the following script as /lib/systemd/system-sleep/fixbacklight (and chmod 755)

#!/bin/sh
# From patchwork.freedesktop.org/.../
# and en.community.dell.com/.../19985320
# Suspend Resume fails to restore PWM_GRANUALITY
# Based on script by Tony.Jewell@Cregganna.Com

INTEL_REG=/usr/bin/intel_reg
ADDR="0x000c2000"
SAVE_FILE=/var/lib/systemd/save_intel_reg_pwm_granuality

[ -x "$INTEL_REG" ] || exit 0

case "$1" in
    pre)
        echo "$0: Saving Intel Register PWM_GRANUALITY"
        "$INTEL_REG" read "$ADDR" \
            | (read addr value && echo "$value") \
            >"$SAVE_FILE"
    sync
    ;;
    post)
        value=`cat "$SAVE_FILE" 2>/dev/null`
        if [ -n "$value" ]
        then
            echo "$0: Restoring Intel Register PWM_GRANUALITY $value"
            "$INTEL_REG" write "$ADDR" "$value"
            rm "$SAVE_FILE"
        fi
    ;;
esac

It was @nloewen that pointed me down the right path.