Manjaro Gnome on a Dell XPS 15 7590

I’ve got this laptop a few weeks ago, and in these weeks I’ve experimented a lot to make everything work. Most works out of the box, but some things require some tweaking, especially the management of the double GPU (the integrated Intel one and the Nvidia one) and the excessive power usage.

I’ll leave a few tips here in case they can be useful to someone.

To begin with, this is my output for the command inxi -Fazy:

System:
  Kernel: 5.10.18-1-MANJARO x86_64 bits: 64 compiler: gcc v: 10.2.1 
  parameters: BOOT_IMAGE=/boot/vmlinuz-5.10-x86_64 
  root=UUID=e6c4e28c-1714-4aa0-8378-71e34489645d ro quiet 
  cryptdevice=UUID=558055a3-e71d-4692-926f-516ae14a27c3:luks-558055a3-e71d-4692-926f-516ae14a27c3 
  root=/dev/mapper/luks-558055a3-e71d-4692-926f-516ae14a27c3 splash apparmor=1 
  security=apparmor udev.log_priority=3 nvidia-drm.modeset=1 
  acpi_rev_override=5 pcie_port_pm=off libahci.ignore_sss=1 pcie_aspm=force 
  nmi_watchdog=0 
  Desktop: GNOME 3.38.3 tk: GTK 3.24.26 wm: gnome-shell dm: GDM 3.38.2 
  Distro: Manjaro Linux 
Machine:
  Type: Laptop System: Dell product: XPS 15 7590 v: N/A serial: <filter> 
  Chassis: type: 10 serial: <filter> 
  Mobo: Dell model: 018W12 v: A06 serial: <filter> UEFI: Dell v: 1.9.1 
  date: 12/14/2020 
Battery:
  ID-1: BAT0 charge: 41.9 Wh condition: 95.9/97.0 Wh (99%) volts: 11.4/11.4 
  model: LGC-LGC8.33 DELL 5XJ280A type: Li-ion serial: <filter> 
  status: Discharging 
CPU:
  Info: 6-Core model: Intel Core i7-9750H bits: 64 type: MT MCP 
  arch: Kaby Lake note: check family: 6 model-id: 9E (158) stepping: A (10) 
  microcode: DE L2 cache: 12 MiB 
  flags: avx avx2 lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx 
  bogomips: 62431 
  Speed: 800 MHz min/max: 800/2600 MHz Core speeds (MHz): 1: 800 2: 800 3: 800 
  4: 800 5: 800 6: 800 7: 800 8: 800 9: 800 10: 800 11: 800 12: 800 
  Vulnerabilities: Type: itlb_multihit status: KVM: VMX disabled 
  Type: l1tf 
  mitigation: PTE Inversion; VMX: conditional cache flushes, SMT vulnerable 
  Type: mds mitigation: Clear CPU buffers; SMT vulnerable 
  Type: meltdown mitigation: PTI 
  Type: spec_store_bypass 
  mitigation: Speculative Store Bypass disabled via prctl and seccomp 
  Type: spectre_v1 
  mitigation: usercopy/swapgs barriers and __user pointer sanitization 
  Type: spectre_v2 mitigation: Full generic retpoline, IBPB: conditional, 
  IBRS_FW, STIBP: conditional, RSB filling 
  Type: srbds mitigation: Microcode 
  Type: tsx_async_abort status: Not affected 
Graphics:
  Device-1: Intel UHD Graphics 630 vendor: Dell driver: i915 v: kernel 
  bus ID: 00:02.0 chip ID: 8086:3e9b class ID: 0300 
  Device-2: Microdia Integrated_Webcam_HD type: USB driver: uvcvideo 
  bus ID: 1-12:4 chip ID: 0c45:6723 class ID: 0e02 
  Display: x11 server: X.org 1.20.10 compositor: gnome-shell driver: 
  loaded: modesetting resolution: <missing: xdpyinfo> 
  OpenGL: renderer: Mesa Intel UHD Graphics 630 (CFL GT2) v: 4.6 Mesa 20.3.4 
  direct render: Yes 
Audio:
  Device-1: Intel Cannon Lake PCH cAVS vendor: Dell driver: snd_hda_intel 
  v: kernel alternate: snd_soc_skl,snd_sof_pci bus ID: 00:1f.3 
  chip ID: 8086:a348 class ID: 0403 
  Sound Server: ALSA v: k5.10.18-1-MANJARO 
Network:
  Device-1: Intel Wi-Fi 6 AX200 vendor: Rivet Networks driver: iwlwifi 
  v: kernel port: efa0 bus ID: 3b:00.0 chip ID: 8086:2723 class ID: 0280 
  IF: wlp59s0 state: up mac: <filter> 
  IF-ID-1: virbr0 state: down mac: <filter> 
Bluetooth:
  Device-1: Intel AX200 Bluetooth type: USB driver: btusb v: 0.8 bus ID: 1-4:2 
  chip ID: 8087:0029 class ID: e001 
  Message: Required tool hciconfig not installed. Check --recommends 
Drives:
  Local Storage: total: 476.94 GiB used: 156.5 GiB (32.8%) 
  SMART Message: Unable to run smartctl. Root privileges required. 
  ID-1: /dev/nvme0n1 maj-min: 259:0 vendor: Western Digital 
  model: PC SN730 NVMe WDC 512GB size: 476.94 GiB block size: physical: 512 B 
  logical: 512 B speed: 31.6 Gb/s lanes: 4 rotation: SSD serial: <filter> 
  rev: 11121012 temp: 33.9 C scheme: GPT 
Partition:
  ID-1: / raw size: 355.94 GiB size: 349.36 GiB (98.15%) 
  used: 156.5 GiB (44.8%) fs: ext4 dev: /dev/dm-0 maj-min: 254:0 
  mapped: luks-558055a3-e71d-4692-926f-516ae14a27c3 
  ID-2: /boot/efi raw size: 512 MiB size: 511 MiB (99.80%) 
  used: 500 KiB (0.1%) fs: vfat dev: /dev/nvme0n1p7 maj-min: 259:7 
Swap:
  Kernel: swappiness: 60 (default) cache pressure: 100 (default) 
  ID-1: swap-1 type: file size: 10 GiB used: 0 KiB (0.0%) priority: -2 
  file: /swapfile 
Sensors:
  System Temperatures: cpu: 45.0 C mobo: N/A 
  Fan Speeds (RPM): cpu: 0 fan-2: 0 
Info:
  Processes: 423 Uptime: 1h 29m wakeups: 3602 Memory: 15.28 GiB 
  used: 5.27 GiB (34.5%) Init: systemd v: 247 Compilers: gcc: 10.2.0 
  Packages: 1608 pacman: 1593 lib: 425 flatpak: 11 snap: 4 Shell: Zsh v: 5.8 
  running in: gnome-terminal inxi: 3.3.01 

Adjusting screen brightness

Like with many others laptops with OLED screens, adjusting screen brightness does not work out of the box. I needed to install ICC Brightness to make it work.

Power management

If the two GPUs are used, the laptop is very resource-hungry. I use the usual TLP with some tweaks that I collected here and there on the internet. This is my etc/tlp.conf, in case anyone is interested:

# ------------------------------------------------------------------------------
# /etc/tlp.conf - TLP user configuration
# See full explanation: https://linrunner.de/en/tlp/docs/tlp-configuration.html
#
# New configuration scheme (TLP 1.3). Settings are read in the following order:

# 1. Intrinsic defaults
# 2. /etc/tlp.d/*.conf - Drop-in customization snippets
# 3. /etc/tlp.conf     - User configuration (this file)
#
# Notes:
# - In case of identical parameters, the last occurence has precedence
# - This also means, parameters enabled here will override anything else
# - IMPORTANT: all parameters here are disabled, remove the leading '#'
#   to enable them; shown values may be suggestions rather than defaults
# - Default *: intrinsic default that is effective when the parameter is missing
#     or disabled by a leading '#'; use PARAM="" to disable an intrinsic default
# - Default <none>: do nothing or use kernel/hardware defaults

# ------------------------------------------------------------------------------
# tlp - Parameters for power saving

# Set to 0 to disable, 1 to enable TLP.
# Default: 1

TLP_ENABLE=1

# Operation mode when no power supply can be detected: AC, BAT.
# Concerns some desktop and embedded hardware only.
# Default: <none>

#TLP_DEFAULT_MODE=AC

# Operation mode select: 0=depend on power source, 1=always use TLP_DEFAULT_MODE
# Note: use in conjunction with TLP_DEFAULT_MODE=BAT for BAT settings on AC.
# Default: 0

#TLP_PERSISTENT_DEFAULT=0

# Power supply class to ignore when determining operation mode: AC, BAT.
# Note: try on laptops where operation mode AC/BAT is incorrectly detected.
# Default: <none>

#TLP_PS_IGNORE=BAT

# Seconds laptop mode has to wait after the disk goes idle before doing a sync.
# Non-zero value enables, zero disables laptop mode.
# Default: 0 (AC), 2 (BAT)

#DISK_IDLE_SECS_ON_AC=0
#DISK_IDLE_SECS_ON_BAT=2

# Dirty page values (timeouts in secs).
# Default: 15 (AC), 60 (BAT)

#MAX_LOST_WORK_SECS_ON_AC=15
#MAX_LOST_WORK_SECS_ON_BAT=60

# Note: CPU parameters below are disabled by default, remove the leading #
# to enable them, otherwise kernel defaults will be used.
#
# Select a CPU frequency scaling governor.
# Intel Core i processor with intel_pstate driver:
#   powersave(*), performance.
# Other hardware with acpi-cpufreq driver:
#   ondemand(*), powersave, performance, conservative, schedutil.
# (*) is recommended.
# Use tlp-stat -p to show the active driver and available governors.
# Important:
#   powersave for intel_pstate and ondemand for acpi-cpufreq are power
#   efficient for *almost all* workloads and therefore kernel and most
#   distributions have chosen them as defaults. If you still want to change,
#   you should know what you're doing!
# Default: <none>

#CPU_SCALING_GOVERNOR_ON_AC=powersave
CPU_SCALING_GOVERNOR_ON_BAT=powersave

# Set the min/max frequency available for the scaling governor.
# Possible values depend on your CPU. For available frequencies see
# the output of tlp-stat -p.
# Default: <none>

#CPU_SCALING_MIN_FREQ_ON_AC=0
#CPU_SCALING_MAX_FREQ_ON_AC=0
#CPU_SCALING_MIN_FREQ_ON_BAT=0
#CPU_SCALING_MAX_FREQ_ON_BAT=0

CPU_SCALING_MAX_FREQ_ON_AC=3300000
CPU_SCALING_MAX_FREQ_ON_BAT=2600000

# Set Intel CPU energy/performance policies HWP.EPP and EPB:
#   performance, balance_performance, default, balance_power, power
# Values are given in order of increasing power saving.
# Notes:
# - Requires an Intel Core i processor
# - HWP.EPP requires kernel 4.10 and intel_pstate driver
# - EPB requires kernel 5.2 or module msr and x86_energy_perf_policy
#   from linux-tools
# - When HWP.EPP is available, EPB is not set
# Default: balance_performance (AC), balance_power (BAT)

#CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
#CPU_ENERGY_PERF_POLICY_ON_BAT=balance_power

CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
CPU_ENERGY_PERF_POLICY_ON_BAT=balance_power


# Set Intel CPU P-state performance: 0..100 (%).
# Limit the max/min P-state to control the power dissipation of the CPU.
# Values are stated as a percentage of the available performance.
# Requires an Intel Core i processor with intel_pstate driver.
# Default: <none>

#CPU_MIN_PERF_ON_AC=0
#CPU_MAX_PERF_ON_AC=100
#CPU_MIN_PERF_ON_BAT=0
#CPU_MAX_PERF_ON_BAT=30

# Set the CPU "turbo boost" feature: 0=disable, 1=allow
# Requires an Intel Core i processor.
# Important:
# - This may conflict with your distribution's governor settings
# - A value of 1 does *not* activate boosting, it just allows it
# Default: <none>

#CPU_BOOST_ON_AC=1
#CPU_BOOST_ON_BAT=0

CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0

# Minimize number of used CPU cores/hyper-threads under light load conditions:
#   0=disable, 1=enable.
# Default: 0 (AC), 1 (BAT)

#SCHED_POWERSAVE_ON_AC=0
#SCHED_POWERSAVE_ON_BAT=1

SCHED_POWERSAVE_ON_BAT=1

# Kernel NMI Watchdog:
#   0=disable (default, saves power), 1=enable (for kernel debugging only).
# Default: 0

#NMI_WATCHDOG=0

# Change CPU voltages aka "undervolting" - Kernel with PHC patch required.
# Frequency voltage pairs are written to:
#   /sys/devices/system/cpu/cpu0/cpufreq/phc_controls
# CAUTION: only use this, if you thoroughly understand what you are doing!
# Default: <none>.

#PHC_CONTROLS="F:V F:V F:V F:V"

# Disk devices; separate multiple devices with spaces.
# Devices can be specified by disk ID also (lookup with: tlp diskid).
# Note: DISK parameters below are effective only when this option is configured.
# Default: "nvme0n1 sda"

#DISK_DEVICES="nvme0n1 sda"

# Disk advanced power management level: 1..254, 255 (max saving, min, off).
# Levels 1..127 may spin down the disk; 255 allowable on most drives.
# Separate values for multiple disks with spaces. Use the special value 'keep'
# to keep the hardware default for the particular disk.
# Default: 254 (AC), 128 (BAT)

#DISK_APM_LEVEL_ON_AC="254 254"
#DISK_APM_LEVEL_ON_BAT="128 128"

# Hard disk spin down timeout:
#   0:        spin down disabled
#   1..240:   timeouts from 5s to 20min (in units of 5s)
#   241..251: timeouts from 30min to 5.5 hours (in units of 30min)
# See 'man hdparm' for details.
# Separate values for multiple disks with spaces. Use the special value 'keep'
# to keep the hardware default for the particular disk.
# Default: <none>

#DISK_SPINDOWN_TIMEOUT_ON_AC="0 0"
#DISK_SPINDOWN_TIMEOUT_ON_BAT="0 0"

# Select I/O scheduler for the disk devices.
# Multi queue (blk-mq) schedulers:
#   mq-deadline(*), none, kyber, bfq
# Single queue schedulers:
#   deadline(*), cfq, bfq, noop
# (*) recommended.
# Separate values for multiple disks with spaces. Use the special value 'keep'
# to keep the kernel default scheduler for the particular disk.
# Notes:
# - Multi queue (blk-mq) may need kernel boot option 'scsi_mod.use_blk_mq=1'
#   and 'modprobe mq-deadline-iosched|kyber|bfq' on kernels < 5.0
# - Single queue schedulers are legacy now and were removed together with
#   the old block layer in kernel 5.0
# Default: keep

#DISK_IOSCHED="mq-deadline mq-deadline"

# AHCI link power management (ALPM) for disk devices:
#   min_power, med_power_with_dipm(*), medium_power, max_performance.
# (*) Kernel >= 4.15 required, then recommended.
# Multiple values separated with spaces are tried sequentially until success.
# Default:
#  - "med_power_with_dipm max_performance" (AC)
#  - "med_power_with_dipm min_power" (BAT)

#SATA_LINKPWR_ON_AC="med_power_with_dipm max_performance"
#SATA_LINKPWR_ON_BAT="med_power_with_dipm min_power"

# Exclude host devices from AHCI link power management.
# Separate multiple hosts with spaces.
# Default: <none>

#SATA_LINKPWR_BLACKLIST="host1"

# Runtime Power Management for AHCI host and disks devices:
#   on=disable, auto=enable.
# EXPERIMENTAL ** WARNING: auto may cause system lockups/data loss.
# Default: <none>

#AHCI_RUNTIME_PM_ON_AC=on
#AHCI_RUNTIME_PM_ON_BAT=on

# Seconds of inactivity before disk is suspended.
# Note: effective only when AHCI_RUNTIME_PM_ON_AC/BAT is activated.
# Default: 15

#AHCI_RUNTIME_PM_TIMEOUT=15

# PCI Express Active State Power Management (PCIe ASPM):
#   default(*), performance, powersave, powersupersave.
# (*) keeps BIOS ASPM defaults (recommended)
# Default: <none>

#PCIE_ASPM_ON_AC=default
#PCIE_ASPM_ON_BAT=default

# Set the min/max/turbo frequency for the Intel GPU.
# Possible values depend on your hardware. For available frequencies see
# the output of tlp-stat -g.
# Default: <none>

#INTEL_GPU_MIN_FREQ_ON_AC=0
#INTEL_GPU_MIN_FREQ_ON_BAT=0
#INTEL_GPU_MAX_FREQ_ON_AC=0
INTEL_GPU_MAX_FREQ_ON_BAT=750
#INTEL_GPU_BOOST_FREQ_ON_AC=0
INTEL_GPU_BOOST_FREQ_ON_BAT=750

# Radeon graphics clock speed (profile method): low, mid, high, auto, default;
# auto = mid on BAT, high on AC.
# Default: default

#RADEON_POWER_PROFILE_ON_AC=default
#RADEON_POWER_PROFILE_ON_BAT=default

# Radeon dynamic power management method (DPM): battery, performance.
# Default: <none>

#RADEON_DPM_STATE_ON_AC=performance
#RADEON_DPM_STATE_ON_BAT=battery

# Radeon DPM performance level: auto, low, high; auto is recommended.
# Note: effective only when RADEON_DPM_STATE_ON_AC/BAT is activated.
# Default: auto

#RADEON_DPM_PERF_LEVEL_ON_AC=auto
#RADEON_DPM_PERF_LEVEL_ON_BAT=auto

# WiFi power saving mode: on=enable, off=disable; not supported by all adapters.
# Default: off (AC), on (BAT)

#WIFI_PWR_ON_AC=off
WIFI_PWR_ON_BAT=on

# Disable wake on LAN: Y/N.
# Default: Y

#WOL_DISABLE=Y

# Enable audio power saving for Intel HDA, AC97 devices (timeout in secs).
# A value of 0 disables, >=1 enables power saving (recommended: 1).
# Default: 0 (AC), 1 (BAT)

SOUND_POWER_SAVE_ON_AC=0
SOUND_POWER_SAVE_ON_BAT=1

# Disable controller too (HDA only): Y/N.
# Note: effective only when SOUND_POWER_SAVE_ON_AC/BAT is activated.
# Default: Y

SOUND_POWER_SAVE_CONTROLLER=Y

# Power off optical drive in UltraBay/MediaBay: 0=disable, 1=enable.
# Drive can be powered on again by releasing (and reinserting) the eject lever
# or by pressing the disc eject button on newer models.
# Note: an UltraBay/MediaBay hard disk is never powered off.
# Default: 0

#BAY_POWEROFF_ON_AC=0
#BAY_POWEROFF_ON_BAT=0

# Optical drive device to power off
# Default: sr0

#BAY_DEVICE="sr0"

# Runtime Power Management for PCI(e) bus devices: on=disable, auto=enable.
# Default: on (AC), auto (BAT)

RUNTIME_PM_ON_AC=on
RUNTIME_PM_ON_BAT=auto

# Exclude PCI(e) device adresses the following list from Runtime PM
# (separate with spaces). Use lspci to get the adresses (1st column).
# Default: <none>

#RUNTIME_PM_BLACKLIST="bb:dd.f 11:22.3 44:55.6"
#RUNTIME_PM_BLACKLIST="01:00.0" # lspci | grep -i nvidia

# Exclude PCI(e) devices assigned to the listed drivers from Runtime PM.
# Default when unconfigured is "amdgpu nouveau nvidia radeon" which
# prevents accidential power-on of dGPU in hybrid graphics setups.
# Separate multiple drivers with spaces.
# Default: "amdgpu mei_me nouveau nvidia pcieport radeon", use "" to disable
# completely.

#RUNTIME_PM_DRIVER_BLACKLIST="amdgpu mei_me nouveau nvidia pcieport radeon"

# Set to 0 to disable, 1 to enable USB autosuspend feature.
# Default: 1

USB_AUTOSUSPEND=1

# Exclude listed devices from USB autosuspend (separate with spaces).
# Use lsusb to get the ids.
# Note: input devices (usbhid) are excluded automatically
# Default: <none>

#USB_BLACKLIST="1111:2222 3333:4444"

# Bluetooth devices are excluded from USB autosuspend:
#   0=do not exclude, 1=exclude.
# Default: 0

#USB_BLACKLIST_BTUSB=0

# Phone devices are excluded from USB autosuspend:
#   0=do not exclude, 1=exclude (enable charging).
# Default: 0

#USB_BLACKLIST_PHONE=0

# Printers are excluded from USB autosuspend:
#   0=do not exclude, 1=exclude.
# Default: 1

#USB_BLACKLIST_PRINTER=1

# WWAN devices are excluded from USB autosuspend:
#   0=do not exclude, 1=exclude.
# Default: 0

#USB_BLACKLIST_WWAN=0

# Include listed devices into USB autosuspend even if already excluded
# by the blacklists above (separate with spaces). Use lsusb to get the ids.
# Default: <none>

#USB_WHITELIST="1111:2222 3333:4444"

# Set to 1 to disable autosuspend before shutdown, 0 to do nothing
# Note: use as a workaround for USB devices that cause shutdown problems.
# Default: 0

#USB_AUTOSUSPEND_DISABLE_ON_SHUTDOWN=0

# Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown
# on system startup: 0=disable, 1=enable.
# Note: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below
#   are ignored when this is enabled.
# Default: 0

#RESTORE_DEVICE_STATE_ON_STARTUP=0

# Radio devices to disable on startup: bluetooth, wifi, wwan.
# Separate multiple devices with spaces.
# Default: <none>

#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"

# Radio devices to enable on startup: bluetooth, wifi, wwan.
# Separate multiple devices with spaces.
# Default: <none>

#DEVICES_TO_ENABLE_ON_STARTUP="wifi"

# Radio devices to disable on shutdown: bluetooth, wifi, wwan.
# Note: use as a workaround for devices that are blocking shutdown.
# Default: <none>

#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"

# Radio devices to enable on shutdown: bluetooth, wifi, wwan.
# (to prevent other operating systems from missing radios).
# Default: <none>

#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"

# Radio devices to enable on AC: bluetooth, wifi, wwan.
# Default: <none>

#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"

# Radio devices to disable on battery: bluetooth, wifi, wwan.
# Default: <none>

#DEVICES_TO_DISABLE_ON_BAT="bluetooth wifi wwan"

# Radio devices to disable on battery when not in use (not connected):
#   bluetooth, wifi, wwan.
# Default: <none>

#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"

# Battery charge thresholds (ThinkPad only).
# May require external kernel module(s), refer to the output of tlp-stat -b.
# Charging starts when the remaining capacity falls below the
# START_CHARGE_THRESH value and stops when exceeding the STOP_CHARGE_THRESH
# value.

# Main / Internal battery (values in %)
# Default: <none>

#START_CHARGE_THRESH_BAT0=75
#STOP_CHARGE_THRESH_BAT0=80

# Ultrabay / Slice / Replaceable battery (values in %)
# Default: <none>

#START_CHARGE_THRESH_BAT1=75
#STOP_CHARGE_THRESH_BAT1=80

# Restore charge thresholds when AC is unplugged: 0=disable, 1=enable.
# Default: 0

#RESTORE_THRESHOLDS_ON_BAT=1

# Battery feature drivers: 0=disable, 1=enable
# Default: 1 (all)

#NATACPI_ENABLE=1
#TPACPI_ENABLE=1
#TPSMAPI_ENABLE=1

# ------------------------------------------------------------------------------
# tlp-rdw - Parameters for the radio device wizard

# Possible devices: bluetooth, wifi, wwan.
# Separate multiple radio devices with spaces.
# Default: <none> (for all parameters below)

# Radio devices to disable on connect.

#DEVICES_TO_DISABLE_ON_LAN_CONNECT="wifi wwan"
DEVICES_TO_DISABLE_ON_WIFI_CONNECT="wwan"
#DEVICES_TO_DISABLE_ON_WWAN_CONNECT="wifi"

# Radio devices to enable on disconnect.

#DEVICES_TO_ENABLE_ON_LAN_DISCONNECT="wifi wwan"
#DEVICES_TO_ENABLE_ON_WIFI_DISCONNECT=""
#DEVICES_TO_ENABLE_ON_WWAN_DISCONNECT=""

# Radio devices to enable/disable when docked.

#DEVICES_TO_ENABLE_ON_DOCK=""
#DEVICES_TO_DISABLE_ON_DOCK=""

# Radio devices to enable/disable when undocked.

#DEVICES_TO_ENABLE_ON_UNDOCK="wifi"
#DEVICES_TO_DISABLE_ON_UNDOCK=""

However, TLP alone does not reduce power usage significantly when running on battery. Powertop measured an average discharge rate of ~20 W, which is a lot, and meant a battery life of ~3 hours when fully charged. Luckily, by solving the issue below, I improved power management too.

Management of the two GPUs

This has been the most demanding part of the configuration. To be sure, the laptop works with the configuration set up by the Manjaro installer, and installing nvidia prime I could use the Intel card as primary GPU and run prime-run nameoftheprogramme when needed (which, in my case, was basically never, as I don’t do gaming on this laptop).

However, I was mad at the amount of power my laptop used, and after searching on the internet I became convinced that it could be due to the fact that the Nvidia card was not powered off and kept draining my battery even though I never used it.

I gave a try at Optimus-manager ([Optimus-manager] Can't switch to nvidia card) but power usage did not improve and, above all, I was unable to switch to the Nvidia card.

So I tried optimus-switch (or, better said, optimus-switch-gdm). I followed the instructions and installation went fine. However, there were two problems (I’m saying this in case @dglt is interested):

  1. when running using the Nvidia card screen brightness was broken again (I didn’t investigate the issue as I wanted to use the Intel card)
  2. the system was unable to load the graphic session when setting the Intel driver with sudo set-intel.sh, throwing a mysterious [FAILED] failed to start run root script error.

I had almost given up when I tried a last attempt: using the modesetting driver instead of the Intel one (which is what @dglt recommends – actually, I had uninstalled the previously installed modesetting driver prior to installing optimus-switch exactly following the guide here).

To do this, I re-installed the modesetting driver from Manjaro Settings Manager, and then I modified the file /etc/switch/intel/intel-xorg.conf (which is called when running sudo set-intel.sh) as follows.

# xorg configuration for use with intel driver.
# xf86-video-intel package required
#
# This driver now uses DRI3 as the default Direct Rendering
# Infrastructure. You can try falling back to DRI2 if you run
# into trouble. To do so, save a file with the following
# content as /etc/X11/xorg.conf.d/20-intel.conf :

    Section "Device"
        Identifier  "Intel Graphics"
        Driver      "modesetting"
#        Option      "DRI" "3"             # DRI2 and DRI1 are alternatives if DRI3 performs performs poorly
#        Option      "TearFree" "True"
        #Option      "AccelMethod"  "sna" # default
        #Option      "AccelMethod"  "uxa" # fallback
     EndSection

The system finally booted with the modesetting driver, and I was then able to uncomment the two lines at the bottom of /etc/switch/intel/no-optimus.sh to shut down permanently the Nvidia card when using the Intel GPU.

Result? My average discharge rate when not stressing the CPU as measured by powertop has gone from ~20W to ~10W.

See also: Dell XPS 15 7590 - ArchWiki

1 Like

Although, I have to say, the recommendation in the Arch Wiki of setting “deep” as default suspend mode causes huge battery drain after resuming, at least in my case: Discharge rate much higher after deep suspend (not after s2idle suspend)