Dell XPS 15 9570 и Manjaro

Стал обладателем ноутбука Dell XPS 15 9570 и решил поставить рядом с Windows операционную систему Manjaro, которой пользуюсь на всех основных устройствах уже более полугода. В целом система встала сразу, но с рядом проблем так или иначе столкнуться пришлось…
Мануал по Dell XPS 15 7590. Часть информации подчерпнута из него.
Запись в блоге andreas-mausch.de

NVIDIA Optimus

Первая проблема с гибридной видеокартой и драйверами. Есть несколько решений, как заставить обе видеокарты работать и переключаться для понижения энергопотребления. Штатно как раз стоят драйвера с Bumblebee, которые это должны делать. Но фактически в моем случае получалось так, что при включении ноутбука, если NVIDIA отключалась, то больше включить ее не получалось.

Поэтому я пошел другим путем — PRIME с поприетарным драйвером NVIDIA. Тот вариант, когда обе видеокарты включены одновременно, но вся обработка идет на дискретной видеокарте. Чуть большее энергопотребление, но нет проблем с работой. Настраивал по топику на форуме Manjaro:
[HowTo] Set up PRIME with NVIDIA proprietary driver

Зависание при закрытии и открытии крышки

Столкнулся с проблемой, что при открытии крышки и пробуждении ноутбука остается черный экран и никакой реакции. По умолчанию стоял режим энергосбережения s2idle. Проверить текущий и доступные режимы можно командой:

cat /sys/power/mem_sleep
[s2idle] deep

Для постоянного изменения на другой режим, нужно добавить новый параметр ядра в файле конфигурации grub:

GRUB_CMDLINE_LINUX_DEFAULT="mem_sleep_default=deep"

После этого сделать update-grub.

Подсветка

У OLED экрана нет собственной подсветки, поэтому регулировать яркость можно только параметром brightness. Можно связать с аппаратными кнопками ноутбука с помощью скрипта, предварительно установив inotify-tools и bc:

sudo nano /usr/local/bin/xbacklightmon
#!/bin/sh
#use LC_NUMERIC if you are using an European LC, else printf will not work because it expects an comma instead of a decimal point
LC_NUMERIC="en_US.UTF-8"

#Exit with 1 if $DISPLAY env isn't set. Helps when using the start up script below
[ -z "$DISPLAY" ] && exit 1;

# modify this path to the location of your backlight class
path=/sys/class/backlight/intel_backlight

read -r max < "$path"/max_brightness

luminance() {
    read -r level < "$path"/actual_brightness
    factor=$((max))
    new_brightness="$(bc -l <<< "scale = 2; $level / $factor")"
    printf '%f\n' $new_brightness
}

# support both intel and nvidia
DEVICE=eDP-1
if [ ! -z "$(xrandr -q --output $DEVICE 2>&1)" ]; then
  DEVICE=eDP-1-1
fi

xrandr --output $DEVICE --brightness "$(luminance)"

inotifywait -me modify --format '' "$path"/actual_brightness | while read; do
    xrandr --output $DEVICE --brightness "$(luminance)"
done
chown root:root /usr/local/bin/xbacklightmon
chmod 755 /usr/local/bin/xbacklightmon

Затем сделать автозапуск скрипта:

mkdir -p $HOME/.config/systemd/user/
nano $HOME/.config/systemd/user/xbacklightmon.service
[Unit]
Description=Ugly fix to be able to control the brightness of OLED screens via keyboard brightness
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/xbacklightmon
Restart=on-failure
RestartSec=1

[Install]
WantedBy=default.target
systemctl --user enable xbacklightmon.service