NVIDIA Optimus

From ArchWiki
Jump to navigation Jump to search

NVIDIA Optimus is a technology that allows an Intel integrated GPU and discrete NVIDIA GPU to be built into and accessed by a laptop. Getting Optimus graphics to work on Arch Linux requires a few somewhat complicated steps, explained below. There are several methods available:

  • disabling one of the devices in BIOS, which may result in improved battery life if the NVIDIA device is disabled, but may not be available with all BIOSes and does not allow GPU switching
  • using the official Optimus support included with the proprietary NVIDIA driver, which offers the best NVIDIA performance but does not allow GPU switching and can be more buggy than the open-source driver
  • using the PRIME functionality of the open-source nouveau driver, which allows GPU switching and powersaving but offers poor performance compared to the proprietary NVIDIA driver and may cause issues with sleep and hibernate
  • using the third-party Bumblebee program to implement Optimus-like functionality, which offers GPU switching and powersaving but requires extra configuration

These options are explained in detail below.

Disabling switchable graphics

If you only care to use a certain GPU without switching, check the options in your system's BIOS. There should be an option to disable one of the cards. Some laptops only allow disabling of the discrete card, or vice-versa, but it is worth checking if you only plan to use one of the cards.

For another way see Hybrid graphics#Fully Power Down Discrete GPU.

If you want to use both cards, or cannot disable the card you do not want, see the options below.

Using nvidia

The proprietary NVIDIA driver does not support dynamic switching like the nouveau driver (meaning it can only use the NVIDIA device). It also has notable screen-tearing issues that NVIDIA recognizes but has not fixed. However, it does allow use of the discrete GPU and has (as of October 2013) a marked edge in performance over the nouveau driver.

First, install nvidia, nvidia-libgl and xorg-xrandr from the official repositories.

Then, configure xorg.conf. You will need to know the PCI address of the NVIDIA card, which you can find by issuing

$ lspci | grep -E "VGA|3D"

The PCI address is the first 7 characters of the line that mentions NVIDIA. It will look something like 01:00.0. In the xorg.conf, you will need to format it as #:#:#; e.g. 01:00.0 would be formatted as 1:0:0.

Note: Since Xorg-server 1.17-1 FS#43830 related to the modesetting module persists for Optimus configurations. A work-around for some systems is to set the Option "AccelMethod" to "none", as in the configuration below. Other systems require it set to "sna", see #Alternative configuration.
Note: On some setups this setup breaks automatic detection of the values of the display by the nvidia driver through the EDID file. As a work-around see #Resolution, screen scan wrong. EDID errors in Xorg.log.

If X.Org X server version 1.17.2 or higher is installed ([1])

Section "Module"
    Load "modesetting"

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "<BusID for NVIDIA device here>"
    Option "AllowEmptyInitialConfiguration"

For older X servers

Section "ServerLayout"
    Identifier "layout"
    Screen 0 "nvidia"
    Inactive "intel"

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    # Change BusID if necessary. Tips: (lspci | grep 3D) (Change 01:00.0 to 1:0:0)
    BusID "PCI:1:0:0"

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    Option "AllowEmptyInitialConfiguration" "Yes"

Section "Device"
    Identifier "intel"
    Driver "modesetting"
    # Change BusID if necessary. Tips: (lspci | grep VGA) (Change 00:02.0 to 0:2:0)
    BusID "PCI:0:2:0"
    Option "AccelMethod"  "none"

Section "Screen"
    Identifier "intel"
    Device "intel"

Next, add the following two lines to the beginning of your ~/.xinitrc:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Now reboot to load the drivers, and X should start.

If your display dpi is not correct add following line:

xrandr --dpi 96

If you get a black screen when starting X, make sure that there are no ampersands after the two xrandr commands in ~/.xinitrc. If there are ampersands, it seems that the window manager can run before the xrandr commands finish executing, leading to a black screen.

If the black screen persists, see the #Alternative configuration below.

Alternative configuration

If you experience Xorg-server crashes since release 1.17.1 with above configuration, modify the section for the Intel device in /etc/X11/xorg.conf as follows:

# nano /etc/X11/xorg.conf
Section "Device"
    Identifier  "intel"
    Driver      "modesetting"
    BusID       "PCI:0:2:0"
    Option      "AccelMethod"  "sna"
    #Option      "TearFree" "True"
    #Option      "Tiling" "True"
    #Option      "SwapbuffersWait" "True"

As above, the BusID must match for the output of the lspci command. Search for the line with "VGA compatible controller", that contains something Intel. For example:

$ lspci |grep VGA
00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)
Tip: The three last commented out options may (without #) result in positive effects on the tearing, but exchange for some performance cost. Note the TearFree option may be used for "sna" acceleration only, see Intel graphics. You can use either "sna" or "uxa" in "AccelMethod" option. For further experimenting, a working xorg.conf from a Lenovo Ideapad Z50-70 59-432128 is here: [2].

If X starts but nothing appears on the screen, check if /var/log/xorg.conf contains a following line or similar:

[ 16112.937] (EE) Screen 1 deleted because of no matching config section.

If so, the problem may disappear when you change your ServerLayout section of /etc/X11/xorg.conf:

Section "ServerLayout"
    Identifier "layout"
    Screen 1 "nvidia"
    Inactive "intel"

Display Managers

If you are using a display manager then you will need to create or edit a display setup script for your display manager instead of using ~/.xinitrc.


For the LightDM display manager:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Make the script executable:

# chmod +x /etc/lightdm/display_setup.sh

Now configure lightdm to run the script by editing the [Seat:*] section in /etc/lightdm/lightdm.conf:


Now reboot and your display manager should start.


For the SDDM display manager:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto


For the GDM display manager create two new .desktop files:

[Desktop Entry]
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"

Make sure that GDM use X as default backend.


For KDE's KDM, add the xrandr lines into /usr/share/config/kdm/Xsetup.

Checking 3D

You can check if the NVIDIA graphics are being used by installing mesa-demos and running

$ glxinfo | grep NVIDIA

Further Information

For more information, look at NVIDIA's official page on the topic [3].


Tearing/Broken VSync

This requires xorg-server 1.19 or higher, linux kernel 4.5 or higher, and nvidia 370.23 or higher. You can read the official forum thread here.

Add on the grub menu /etc/default/grub the option nvidia-drm.modeset=1:

GRUB_CMDLINE_LINUX_DEFAULT="quiet nvidia-drm.modeset=1"

And then automatically re-generate the grub.cfg file with:

$ grub-mkconfig -o /boot/grub/grub.cfg

VSYNC can now be activated (1)/ disabled (0) with:

$ xrandr --output 'eDP-1-1' --set 'PRIME Synchronization' '1' 
$ xrandr --output 'eDP-1-1' --set 'PRIME Synchronization' '0'

Replace eDP-1-1 with the name of your screen which can be determinant using:

$ xrandr

Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)

Add rcutree.rcu_idle_gp_delay=1 to the kernel parameters. Original topic can be found here.

Resolution, screen scan wrong. EDID errors in Xorg.log

This is due to the NVIDIA driver not detecting the EDID for the display. You need to manually specify the path to an EDID file or provide the same information in a similar way.

To provide the path to the EDID file edit the Device Section for the NVIDIA card in Xorg.conf, adding these lines and changing parts to reflect your own system:

Section "Device"
       	Option		"ConnectedMonitor" "CRT-0"
       	Option		"CustomEDID" "CRT-0:/sys/class/drm/card0-LVDS-1/edid"
	Option		"IgnoreEDID" "false"
	Option		"UseEDID" "true"

If Xorg wont start try swapping out all references of CRT to DFB. card0 is the identifier for the intel card to which the display is connected via LVDS. The edid binary is in this directory. If the hardware arrangement is different, the value for CustomEDID might vary but yet this has to be confirmed. The path will start in any case with /sys/class/drm.

Alternatively you can generate your edid with tools like read-edid and point the driver to this file. Even modelines can be used, but then be sure to change "UseEDID" and "IgnoreEDID".

Lockup issue (lspci hangs)

Symptoms: lspci hangs, system suspend fails, shutdown hangs, optirun hangs.

Applies to: newer laptops with GTX 965M or alike when bbswitch (e.g. via Bumblebee) or nouveau is in use.

When the dGPU power resource is turned on, it may fail to do so and hang in ACPI code (kernel bug 156341).

For known model-specific workarounds, see this issue. In other cases you can try to boot with acpi_osi="!Windows 2015" or acpi_osi=! acpi_osi="Windows 2009" added to your Kernel parameters. (Consider reporting your laptop to that issue.)

Using nouveau

The open-source nouveau driver (xf86-video-nouveau) can dynamically switch with the Intel driver (xf86-video-intel) using a technology called PRIME. For more information, see the wiki article on PRIME.

Using Bumblebee

If you wish to use Bumblebee, which will implement powersaving and some other useful features, see the wiki article on Bumblebee.