Laptop Dell XPS 15

From YobiWiki
Jump to navigation Jump to search

Notes about installing a Debian Stretch on a Dell XPS 15

Hardware

Dell XPS 15 model 9550 (variant with touchscreen & PCIe m.2 ssd)

From the configuration list:

  • 6th Generation Intel(R) Core (TM) i7-6700HQ Quad Core (6M Cache, up to 3.5 GHz)
  • 16Go (2x8Go) DDR4 2133MHz
  • 15.6" 4K Ultra HD (3840 x 2160) InfinityEdge touch, Sliver
  • 1To PCIe Solid State
  • DW1830 3x3 802.11ac 2.4/5GHz + Bluetooth 4.1
  • Dell 84 WHr 6-Cell Lithium-Ion Battery
  • Internal US/International Qwerty Backlit Keyboard

From the drivers list:

  • Realtek High Definition Audio ALC3266
  • Realtek RTS5242 PCIe Gen2 CardReader
  • Realtek USB GBE Ethernet Controller
  • ST Microlectronics LNG3DMTR Motion Sensor
  • Intel HD Graphics 530/P530
  • nVIDIA Geforce GTX 960M Graphics

From dmesg (incomplete):

  • BCM20703A1 Bluetooth 4.1 (firmware brcm/BCM-0a5c-6410.hcd)

From lspci -nn:

00:00.0 Host bridge [0600]: Intel Corporation Sky Lake Host Bridge/DRAM Registers [8086:1910] (rev 07)
00:01.0 PCI bridge [0604]: Intel Corporation Sky Lake PCIe Controller (x16) [8086:1901] (rev 07)
00:02.0 VGA compatible controller [0300]: Intel Corporation Device [8086:191b] (rev 06)
00:04.0 Signal processing controller [1180]: Intel Corporation Device [8086:1903] (rev 07)
00:14.0 USB controller [0c03]: Intel Corporation Sunrise Point-H USB 3.0 xHCI Controller [8086:a12f] (rev 31)
00:14.2 Signal processing controller [1180]: Intel Corporation Sunrise Point-H Thermal subsystem [8086:a131] (rev 31)
00:15.0 Signal processing controller [1180]: Intel Corporation Sunrise Point-H LPSS I2C Controller #0 [8086:a160] (rev 31)
00:15.1 Signal processing controller [1180]: Intel Corporation Sunrise Point-H LPSS I2C Controller #1 [8086:a161] (rev 31)
00:16.0 Communication controller [0780]: Intel Corporation Sunrise Point-H CSME HECI #1 [8086:a13a] (rev 31)
00:17.0 SATA controller [0106]: Intel Corporation Sunrise Point-H SATA Controller [AHCI mode] [8086:a103] (rev 31)
00:1c.0 PCI bridge [0604]: Intel Corporation Sunrise Point-H PCI Express Root Port #1 [8086:a110] (rev f1)
00:1c.1 PCI bridge [0604]: Intel Corporation Sunrise Point-H PCI Express Root Port #2 [8086:a111] (rev f1)
00:1d.0 PCI bridge [0604]: Intel Corporation Sunrise Point-H PCI Express Root Port #9 [8086:a118] (rev f1)
00:1d.4 PCI bridge [0604]: Intel Corporation Sunrise Point-H PCI Express Root Port #13 [8086:a11c] (rev f1)
00:1d.6 PCI bridge [0604]: Intel Corporation Sunrise Point-H PCI Express Root Port #15 [8086:a11e] (rev f1)
00:1f.0 ISA bridge [0601]: Intel Corporation Sunrise Point-H LPC Controller [8086:a14e] (rev 31)
00:1f.2 Memory controller [0580]: Intel Corporation Sunrise Point-H PMC [8086:a121] (rev 31)
00:1f.3 Audio device [0403]: Intel Corporation Sunrise Point-H HD Audio [8086:a170] (rev 31)
00:1f.4 SMBus [0c05]: Intel Corporation Sunrise Point-H SMBus [8086:a123] (rev 31)
01:00.0 3D controller [0302]: NVIDIA Corporation GM107M [GeForce GTX 960M] [10de:139b] (rev ff)
02:00.0 Network controller [0280]: Broadcom Corporation BCM43602 802.11ac Wireless LAN SoC [14e4:43ba] (rev 01)
03:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. Device [10ec:525a] (rev 01)
04:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd Device [144d:a802] (rev 01)

From lsusb:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 04f3:21d5 Elan Microelectronics Corp.            <= touchscreen
Bus 001 Device 002: ID 0a5c:6410 Broadcom Corp.                         <= bluetooth
Bus 001 Device 004: ID 0c45:6713 Microdia                               <= webcam
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

From lscpu:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 94
Model name:            Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
Stepping:              3
CPU MHz:               2847.812
CPU max MHz:           3500.0000
CPU min MHz:           800.0000
BogoMIPS:              5183.88
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
NUMA node0 CPU(s):     0-7
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush 
dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts 
rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 
ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx 
f16c rdrand lahf_lm abm 3dnowprefetch ida arat epb pln pts dtherm hwp hwp_notify hwp_act_window hwp_epp 
intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid 
rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1

Dell Wireless 1830 = BCM43602 + BCM20703A1 (DW1830 Bluetooth 4.1 LE)

BCM43602 PCI ID: 14e4:43ba

# smartctl -d scsi -i /dev/nvme0n1
smartctl 6.4 2015-06-04 r4109 [x86_64-linux-4.3.0-1-amd64] (local build)
Copyright (C) 2002-15, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Vendor:               NVMe
Product:              PM951 NVMe SAMSU
Revision:             7D0Q
Compliance:           SPC-4
User Capacity:        1,024,209,543,168 bytes [1.02 TB]
Logical block size:   512 bytes
Rotation Rate:        Solid State Device
Logical Unit id:      0x0025384cf1b0fd29
Serial number:        S2FZNXAGC03824
Device type:          disk
Local Time is:        Sun Feb 14 22:02:03 2016 CET
SMART support is:     Unavailable - device lacks SMART capability.

Resources

General

I first tried to keep a dual-boot just in case, but once we disable Raid and put SATA in AHCI mode, Windows can't boot anymore. (later I read it could be possible to fix it by rebooting several times Windows till safe mode is kicked in, but it was too late for me.)

Just in case again, one can boot Windows and create a USB recovery.

Bios

  • Secure Boot: disable
  • SATA: switch from Raid to AHCI
  • Boot: not sure it's needed but I disabled Windows boot manager entry and kept the hdd UEFI entry: UEFI: PM951 NVMe SAMSUNG 1024GB, Partition 1
  • POST/Fastboot/Thorough
  • auto os recovery threshold off

To update the BIOS:

  • put it on a USB stick
  • reboot
  • select BIOS flash update on the boot screen (F12).

No need to put it on a bootable DOS, just give the exe to the BIOS update built-in util.
You can even drop the update on /boot/efi as it's also a FAT partition, no need for a USB memory stick.

Versions:

Attention: with versions 1.2.10 through 1.2.16 and older Linux kernels, there is a serious bug that let the screen black after suspend/wake up. The workaround is to set the lightness to the maximum but it breaks further lightness tuning.

Linux kernels 4.8 and below tend to work best with A6 BIOS (1.2.0), although there is a workaround that allows it to work with later versions. This workaround uses the intel_reg utility to reset the "pwm_granuality" setting of the onboard graphics. Solution discussed here: [1]. This issue is reportedly fixed in Linux 4.9, and also in recent Ubuntu 16.10 kernel updates. See the patch here [2].

Even with the intel_reg workaround above, the screen brightness cannot be set to the lowest level without turning the screen off. This is fixed in 1.2.18.

Debian

I kept UEFI so we need a Debian netinstall because liveCD doesn't have UEFI support yet.
But Wi-Fi requires a proprietary firmware:

https://github.com/OpenELEC/wlan-firmware/blob/master/firmware/brcm/brcmfmac43602-pcie.bin

so the easiest is to take a Debian netinstall with proprietary firmwares included.
At time of writing Stretch is testing and last release is alpha5:

http://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/stretch_di_alpha5/amd64/iso-cd/

dd the image on a USB stick and boot it.
It will also complain for a missing brcmfmac43602-pcie.txt but we can safely ignore it. (well I think so, but Wi-Fi has troubles now and then under heavy load, see below)

I chose a guided partitionning of the entire disk, with encrypted LVM containing /, /home and swap. But proposed / was a bit too small IMHO (10G) so I deleted and recreated / (50G) and /home.
Initially I tried to add the "discard" option for the partitions which should help on SSD but the kernel reported that "discard" wasn't supported by the disk.

If you want to backup partition table and partitions before destroying everything, it's the right time!

parted /dev/nvme0n1
print
sgdisk --backup=/some/safe/location/nvme0n1.gpt /dev/nvme0n1

I installed Cinnamon. I don't know for the others but Cinnamon has a nice auto setting to double features on HiDPI screens.

First boot

Once installed, the Debian didn't boot up.
I tried many things but at the end the only thing that worked was to copy Debian EFI to the default one:

Starting the netinstall again, in rescue mode, get a chroot shell, then

mount /dev/nvme0n1p1 /boot/efi
cd /boot/efi/EFI
mkdir boot
cp debian/grubx64.efi boot/bootx64.efi

I also deleted the Windows files in EFI.

Resource:

FTR things that failed included:

  • Refind couldn't boot at all. Strange as the netinstall could boot...
  • tweaks with efibootmgr, update-grub etc

UPDATE: It might be possible to fix the issue from the BIOS itself, see http://www.dell.com/support/article/us/en/04/SLN297060/en

Status

Working

  • Screen
  • Touchscreen
  • Touchpad
  • Keyboard backlight and media buttons (volume, luminosity, backlight)
  • Wi-Fi (with the proprietary driver, cf installation above)
  • HDMI
  • SD-Card reader
  • Speakers, mic
  • Webcam

Working after manual steps

i915

Screen was working but dmesg was complaining:

i915 0000:00:02.0: firmware: failed to load i915/skl_dmc_ver1.bin

So I installed that firmware, not sure what it's changed

sudo apt-get install firmware-misc-nonfree

Optimus

Resources:

apt-get install bumblebee-nvidia nvidia-libopencl1 nvidia-opencl-icd nvidia-opencl-icd:i386 libcuda1-i386 nvidia-smi clinfo
reboot

Example:

apt-get install nvidia-settings
optirun -b none nvidia-settings -c :8

This also works for CUDA/OpenCL:

optirun -b none ./hashcat64.bin -m 500 example500.hash example.dict

Testing:

optirun -vv glxgears
optirun -vv clinfo
optirun -b none ./hashcat64.bin -I
optirun --no-xorg ./hashcat64.bin -I

As bridge, primus or virtualgl can be used. Primus is available in the Debian repos while VirtualGL is here. Using primus currently.

CUDA toolkit:

apt-get install nvidia-cuda-toolkit

It removed nvidia-libopencl1 but hashcat is still running fine...

GPU load:

optirun --no-xorg nvidia-smi

Touchpad

Nothing wrong with the touchpad but its default config is a bit painful especially because it's large and my right palm touches it often, even with the option to diable it when typing and because it's "soft" buttons.
I disabled the button area to limit somehow the problem but still you've to get used to first touch and hold before pressing a button to do a drag and drop and not the opposite.

synclient AreaBottomEdge=4026

To add a middle button:

synclient RightButtonAreaLeft=3914
synclient RightButtonAreaRight=0
synclient RightButtonAreaTop=4026
synclient RightButtonAreaBottom=0
synclient MiddleButtonAreaLeft=3100
synclient MiddleButtonAreaRight=3873
synclient MiddleButtonAreaTop=4026
synclient MiddleButtonAreaBottom=0

And because I love it:

synclient CircularScrolling=1

Some doc here and the official one here

If with some kernels you get troubles using Synaptics options, check dmesg, maybe Touchpad is detected by another driver too:

DLL06E4:01 06CB:7A13 Touchpad as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-7/i2c-DLL06E4:01/0018:06CB:7A13.0003/input/input14
hid-multitouch 0018:06CB:7A13.0003: input,hidraw2: I2C HID v1.00 Mouse [DLL06E4:01 06CB:7A13] on i2c-DLL06E4:01

If this is so, add /etc/modprobe.d/synaptics.conf with this line, cf Kernel section below:

blacklist i2c-designware-platform

On recent kernels, i2c-designware-platform is directly in the kernel, not as module anymore. To manage to blacklist it, see https://unix.stackexchange.com/questions/423797/how-do-i-disable-i2c-designware-support-when-its-not-built-as-a-module#446913 Edit /etc/default/grub and append the following blacklist invocation to the command line, then update-grub.

GRUB_CMDLINE_LINUX_DEFAULT="… initcall_blacklist=dw_i2c_init_driver"

Touchscreen

Touchscreen works well but when an external screen is connected, it spans over both screens so e.g. touching the middle of the laptop screen moves the mouse to some middle point of the virtual screen combining both screens.
To fix it, see https://wiki.archlinux.org/index.php/Calibrating_Touchscreen
This example is for an external screen mapped to the right of the laptop screen:

# c0 = width of laptop screen / total width
c0=$(bc -l <<< "scale=2; $(xrandr|grep -A1 eDP1|sed '1d;s/x.*//')/$(xrandr|grep '^Screen 0'|sed 's/.*current //;s/ x.*//')")
xinput set-prop "ELAN Touchscreen" --type=float "Coordinate Transformation Matrix" \
   c0 0  0 \
   0  1  0 \
   0  0  1

Bluetooth

Kernel complains about a missing file.
Apparently we can get it from Windows drivers but I don't know where to find them, so I took this one and copied it into /lib/firmware/brcm

Then Bluetooth was recognized but I couldn't pair my WM615 mouse.
After restarting the Bt adaptor, I could finally pair:

bluetoothctl
 power off
 power on

References:

There is also a possibility to pair directly from bluetoothctl, see https://wiki.archlinux.org/index.php/bluetooth#Bluetoothctl

I finally changed the Wi-Fi+BT card for an Intel one, see #Hardware_changes

HiDPI

Cinnamon handles it nicely but some applications don't such as Gimp and you end up with a microscopic tools ribbon.
See https://wiki.archlinux.org/index.php/HiDPI for some useful tips

Cinnamon / System Settings / Desktop Scaling has the same effect as `gsettings set org.cinnamon.desktop.interface scaling-factor 2`

xdpyinfo | grep -B2 resolution
screen #0:
  dimensions:    3840x2160 pixels (1016x572 millimeters)
  resolution:    96x96 dots per inch

I've no ruler at hand but if it's 15.6 in diagonal and pixels are square, this gives 293.4 dpi for screen dimensions of 332x187mm.
So closest hit with common DPI is 96*3=288dpi

xrandr --dpi 288
xdpyinfo | grep -B2 resolution
screen #0:
  dimensions:    3840x2160 pixels (338x190 millimeters)
  resolution:    289x289 dots per inch

Let's document those fictive dimensions for next boots by creating /etc/X11/xorg.conf.d/90-monitor.conf with

Section "Monitor"
    Identifier             "<default monitor>"
    DisplaySize            338 190    # In millimeters
EndSection

QT5 and GTK+ 3
To enable better scaling of QT5 and GTK+ 3, add to .bashrc (not to .xsessionrc otherwise Cinnamon taskbar is messed up!):

QT_DEVICE_PIXEL_RATIO=3
GDK_SCALE=3
GDK_DPI_SCALE=0.4

QT4
E.g. Skype

sudo apt-get install qt4-qtconfig
qtconfig-qt4

=> one can change font size

Gimp 2.8
E.g. copy /usr/share/gimp/2.0/themes/Default as ~/.gimp-2.8/themes/HiDPI and change a few options:

--- gtkrc
+++ gtkrc
-  GimpToolPalette::tool-icon-size   = button
+  GimpToolPalette::tool-icon-size   = dialog
-  GimpEditor::button-icon-size      = menu
+  GimpEditor::button-icon-size      = button

Wine

winecfg

Change "dpi" in "Graphics" tab Virtualbox:
View/Scale Factor is helpful...

Chromium
Chrome works fine but Chromium broke at some point, so I've to launch it with:

GDK_SCALE=2 exec chromium

Small console font:
I don't care but if that's an issue for you, from here:

sudo dpkg-reconfigure console-setup
  • Choose UTF-8
  • Choose the default Combined - Latin, ... option ("Latin" includes the English alphabet)
  • Select the terminus font
  • Select 16x32
  • OK

To apply immediately, open a TTY and run setupcon, else just reboot

Multiple displays
Combining HiDPI screen with external non-HiDPI? See https://wiki.archlinux.org/index.php/HiDPI#Multiple_displays

Sensors

apt-get install lm-sensors
sensors-detect

Sensors-detect found coretemp which is now loaded via /etc/modules:

coretemp


External microphone

The sole jack is a TRRS, combining output and mic.
Soundcard is a Realtek ALC3266

 grep -r Realtek /proc/asound/card*
 /proc/asound/card0/codec#0:Codec: Realtek ALC3266


With Debian+Cinnamon, the system detects the mic, we can see it in the sound properties and select it, but still the internal mic is used.
When using pavucontrol, selecting the "headset microphone" works fine (it still needs some level boosting).

DA200

DA200 used to be recognized only if it was plugged at boot.
With kernel 4.6 the device is properly detected dynamically.
The adapter is actually using DisplayPort.
VGA output works.

HDMI output is limited to some modes (max 1920x1080, cf Dell support) and by default xrandr will try an unsupported mode.
Even "xrandr --output DP-1 --mode 1920x1080" fails by default.

Some supported modes: 800x600, 1024x768, 1280x720, 1920x1080i
1920x1080i is interlaced and awful to look at.
Reducing the rate allows a non-interlaced 1920x1080 mode, you can test it with:

xrandr --output DP-1 --mode 1920x1080 -r 30

If this works for you, you can create a new mode, using cvt to find the proper parameters:

cvt 1920 1080 30
# 1920x1080 29.95 Hz (CVT) hsync: 33.01 kHz; pclk: 79.75 MHz
Modeline "1920x1080_30.00"   79.75  1920 1976 2168 2416  1080 1083 1088 1102 -hsync +vsync

Creating and adding the new mode:

xrandr --newmode "1920x1080_30.00" 79.75  1920 1976 2168 2416  1080 1083 1088 1102 -hsync +vsync
xrandr --addmode DP-1  "1920x1080_30.00"

Now you can choose this new mode:

 xrandr --output DP-1 --mode "1920x1080_30.00"

When plugged the following hardware gets detected:

lsusb:

Bus 004 Device 003: ID 0bda:8153 Realtek Semiconductor Corp..     <= Ethernet
Bus 004 Device 002: ID 05e3:0617 Genesys Logic, Inc..
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 0835:2a01 Action Star Enterprise Co., Ltd. <= Billboard
Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

The USB Billboard Device Class definition describes the methods used to communicate the Alternate Modes supported by a device container to a host system. More details on Billboard Devices are available in the USB Billboard Device Class specification at the following link: http://www.usb.org/developers/docs/devclass_docs/.

lspci:

06:00.0 PCI bridge: Intel Corporation Device 1576 (prog-if 00 [Normal decode])
07:00.0 PCI bridge: Intel Corporation Device 1576 (prog-if 00 [Normal decode])
07:01.0 PCI bridge: Intel Corporation Device 1576 (prog-if 00 [Normal decode])
07:02.0 PCI bridge: Intel Corporation Device 1576 (prog-if 00 [Normal decode])
0a:00.0 USB controller: Intel Corporation Device 15b5 (prog-if 30 [XHCI])

lsmod:

r8152                  49152  0
cdc_ether              16384  0
usbnet                 40960  1 cdc_ether
mii                    16384  2 r8152,usbnet

Solved issues

i915 and blank screen

There were numerous issues with the video card. Now with latest kernels (>=4.8) most issues are gone, still some occasional blank screen or freeze when plugging an external HDMI.

Bluetooth

WM615 mouse used to act erratically, the cursor stopping now and then. Now with latest kernels and an Intel Wi-Fi+BT card it's fine.

Wi-Fi

Wi-Fi tends to disassociate under heavy load, switching to other SSIDs or frequencies (5Ghz<>2.4GHz) and coming back seems to help.

I finally changed the Wi-Fi+BT card for an Intel one, see #Hardware_changes

Issues

rfkill button

Rfkill button of the keyboard (Fn+PrtScr) doesn't seem to work, no big deal.

Kernels

initramfs complains about lvmetad and I'm not sure it's that useful on SSD, so just disabling it:
Edit /etc/lvm/lvm.conf

use_lvmetad=0

Then stop it

systemctl stop lvm2-lvmetad

Debian

Debian kernel 4.8 works quite well

Compilation notes

Warning, to compile >=4.4, one needs at least initramfs-tools v0.122 to get the nvme.ko properly loaded and therefore the SSD properly seen.

To compile a vanilla kernel, cf http://www.cyberciti.biz/faq/debian-ubuntu-building-installing-a-custom-linux-kernel/

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc
sudo apt-get install kernel-package
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.tar.xz
tar xf linux-4.4.tar.xz
cd linux-4.4
cp /boot/config-$(uname -r) .config
make menuconfig
make-kpkg clean
make-kpkg --rootcmd fakeroot --initrd --append_to_version=9-doegox kernel_image kernel_headers -j 7

Hardware changes

Replacing Broadcom Wi-Fi+BT by an Intel one:

iwlwifi 0000:02:00.0: firmware: direct-loading firmware iwlwifi-7265-17.ucode
iwlwifi 0000:02:00.0: Detected Intel(R) Dual Band Wireless AC 7265, REV=0x184

Alternatives to DA200:

Misc hardware

Smartcard reader