Intel for X11 (while ignoring Nvidia card)

Having re-installed the Nvidia drivers (this time using Negativo’s repository), suddenly X11 didn’t boot properly. And it’s a real headache fiddling with the setup - the following is what worked for me (and some of the process).

Bottom line: Get the kernel parameters right, and the xorg.conf will take care of itself…

My Deep Learning computer set-up

Two graphics systems installed in computer :

  • On-board intel chipset (FWIW on a Gigabyte B85M-DH-A) with a monitor attached
  • Nvidia Titan-X graphics card with no monitor (intended for GPGPU processing only)

The main stumbling block is that the Nvidia installation (I think) modified the kernel parameters so that the Nvidia driver was happy - but that prevents the intel driver from enabling modesetting, which X11 requires to be enabled for the X-server to boot cleanly.

Checking the system

Check the cards installed :

sudo lspci -k | grep -A3 VGA
#00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
#	Subsystem: Gigabyte Technology Co., Ltd Device d000
#	Kernel driver in use: i915
#	Kernel modules: i915
#01:00.0 VGA compatible controller: NVIDIA Corporation GM200 [GeForce GTX TITAN X] (rev a1)
#	Subsystem: NVIDIA Corporation Device 1132
#	Kernel driver in use: nvidia
#	Kernel modules: nouveau, nvidia_drm, nvidia

The important thing to note is the 00:02.0 as the PCI ‘slot’ for the Intel controller (this number needs to be slightly reformatted for a xorg.conf file).

Ensure the intel driver for the internal on-board video subsystem is installed :

dnf install xorg-x11-drv-intel

Updating the kernel parameters

NB: These can be edited during the boot process as a check/backup while testing things.

The relevant contents of /etc/default/grub were set as follows by the Nvidia installer :

GRUB_CMDLINE_LINUX="nouveau.modeset=0 rd.driver.blacklist=nouveau nomodeset \
  gfxpayload=vga=normal swap rhgb quiet"

But the basic point is that xorg-x11-drv-intel requires the intel driver (which is loaded by the kernel, for me, via i915) to be in modesetting mode.

Therefore, the /etc/default/grub line needs to be updated to :

GRUB_CMDLINE_LINUX="rd.driver.blacklist=nouveau nvidia.modeset=0 nouveau.modeset=0 intel.modeset=1 \
  gfxpayload=vga=normal rhgb quiet"

(notice that all the available graphics modules are .modeset=0 apart from intel.modeset=1, and that nouveau is still disabled).

Once that has been updated, run :

grub2-mkconfig -o /boot/grub2/grub.cfg
# or, if EFI boot is enabled (which it is for me) :
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

As helpfully pointed out by the creator of the Negativo RPMs, it’s probably not essential to explicitly set all the .modeset parameters individually - there’s likely to be a leaner combination that works. However, given how irritating it is having a machine that boots badly, I feel that doing it ‘long-hand’ has its own benefits…


Now after rebooting :

lsmod  | grep drm
#nvidia_drm             49152  0
#nvidia_modeset        790528  1 nvidia_drm
#drm_kms_helper        151552  2 i915,nvidia_drm
#drm                   344064  6 i915,nvidia_drm,drm_kms_helper

dmesg | grep drm
#[    1.310803] [drm] Initialized drm 1.1.0 20060810
#[    1.365926] [drm] Memory usable by graphics device = 2048M
#[    1.365928] fb: switching to inteldrmfb from EFI VGA
#[    1.366003] [drm] Replacing VGA console driver
#[    1.371938] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
#[    1.371939] [drm] Driver supports precise vblank timestamp query.
#[    1.404019] [drm] Initialized i915 1.6.0 20160711 for 0000:00:02.0 on minor 0
#[    1.419206] fbcon: inteldrmfb (fb0) is primary device
#[    1.471432] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
#[    2.750981] [drm] [nvidia-drm] [GPU ID 0x00000100] Loading driver


During experimentation, I was fiddling with an /etc/X11/xorg.conf that ended up like this (working, but rather hacky) :

Section "ServerLayout"
	Identifier     " Configured"
	Screen      0  "Screen0" 0 0
	#Screen      1  "Screen1" RightOf "Screen0"
	InputDevice    "Mouse0" "CorePointer"
	InputDevice    "Keyboard0" "CoreKeyboard"
	#Inactive 	"nouveau"  # Must be a Device Identifier
	#Inactive 	"nvidia"   # Must be a Device Identifier
	Inactive 	"Card0"

Section "Files"
	ModulePath   "/usr/lib64/xorg/modules"
	FontPath     "catalogue:/etc/X11/fontpath.d"
	FontPath     "built-ins"

Section "Module"
	Load  "glx"

Section "Module"
	Load "dri2"
	Load "glamoregl"
	Load "modesetting"

Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "kbd"

Section "InputDevice"
	Identifier  "Mouse0"
	Driver      "mouse"
	Option	    "Protocol" "auto"
	Option	    "Device" "/dev/input/mice"
	Option	    "ZAxisMapping" "4 5 6 7"

Section "Device"
	Identifier  "Card0"
	#Driver      "nouveau"
	Driver      "nvidia"
	BusID       "PCI:1:0:0"

Section "Device"
	Identifier  "Card1"

	# modesetting (doesn't seem to work at all)
	#Driver      "modesetting"
	#Option      "AccelMethod"	"glamore"
	#Option	    "DRI"      		"false"
	# This works at correct resolution, but is very slow
	#Driver      "vesa"

	# This works only at /etc/fb.modes (?) and chooses 1024x768
	#Driver      "fbdev"

	# This now works, but only if 'nomodeset' is removed from kernel
	# options, and intel.modeset=1 is present (and no other .modeset=1)
	Driver      "intel"
	#Option	    "NoAccel" "True"
	#Option	    "DRI"	"false"

	# Needs to be set to match the value given by `lscpi`
	BusID       "PCI:0:2:0"

Section "Screen"
	Identifier "Screen0"
	Device     "Card1"
	Monitor    "Monitor0"

Section "Monitor"
	Identifier   "Monitor0"
	VendorName   "Monitor Vendor"
	ModelName    "Monitor Model"

	# Run "cvt X Y"
	Modeline "1024x768"   63.50  1024 1072 1176 1328  768 771 775 798 -hsync +vsync
	Modeline "1680x1050"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync
	Modeline "1920x1080"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync

	#Option          "PreferredMode" "1680x1050"
	Option          "PreferredMode" "1920x1080"

However, while it’s nice that the above /etc/X11/xorg.conf works, it’s nicer still that if the system starts without an /etc/X11/xorg.conf, it will configure itself automatically.

Fortunately, with the correct kernel parameters (as above), the system auto-configuration works perfectly, and X boots on the on-board graphics chip both with acceleration switched on and in the correct resolution (the window manager Display tool will list of all the available resolutions too).

All done.

Martin Andrews

{Finance, Software, AI} entrepreneur, living in Singapore with my family.

blog comments powered by Disqus