Auto detect drivers for switchable graphics

From ThinkWiki
Revision as of 05:34, 26 February 2011 by Cyberey66 (Talk | contribs) (Requirements)
Jump to: navigation, search

Auto detection and configuration for switchable graphics

The purpose of this script is to allow a user to select either the integrated or discrete graphics chip in the BIOS and boot into Linux and have it work without any configuration. This scripts allows the user to switch between integrated Intel graphics using the xorg driver and discrete ATI graphics using the fglrx driver. This script was tested on a W500 running Debian Wheezy on Kernel 2.6.32-5 and Fglrx 11.2. At the time of writing this page, this is the quickest way to switch between integrated graphics and discrete graphics while using the binary ATI drivers. Switching under Linux requires a reboot and if one wishes to use binary drivers, switching is generally not possible without first uninstalling the binary drivers and reinstalling the open source drivers and viceversa.

Requirements

The script only works to switch between and ATI video card with fglrx drivers and Intel Integrated graphics with xorg drivers. To select between the drivers, you simply select either 'Discrete' or 'Integrated' in the bios and then boot as normal. The fglrx and xorg drivers use different libraries and this is the reason they are not compatible with each other. The two specific libraries are: libGL.so.1.2 and libglx.so. The script requires copies of the libraries to be stores in /usr/lib/ and /usr/lib/xorg/modules/extensions/ respectively. You must double check that the libraries are stored correctly as named below! I would first

and the original xorg libraries are stored as:

   /usr/lib/libGL.so.1.2.xorg
   /usr/lib/xorg/modules/extensions/libglx.so.xorg

To save these, before installing fglrx and while running the integrated card execute:

   cp /usr/lib/libGL.so.1.2 /usr/lib/libGL.so.1.2.xorg
   cp /usr/lib/xorg/modules/extensions/libglx.so /usr/lib/xorg/modules/extensions/libglx.so.xorg

then the fglrx libraries must be stored as:

   /usr/lib/libGL.so.1.2.fglrx
   /usr/lib/xorg/modules/extensions/libglx.so.fglrx

To save these, after fglrx and while running the discrete card execute:

   cp /usr/lib/libGL.so.1.2 /usr/lib/libGL.so.1.2.fglrx
   cp /usr/lib/xorg/modules/extensions/libglx.so /usr/lib/xorg/modules/extensions/libglx.so.fglrx

In addition, xorg.conf files for each driver, intel and fglrx, must be stored as:

   /etc/X11/xorg.conf.intel for integrated graphics
   /etc/X11/xorg.conf.fglrx for discrete graphics

Initial Setup

The first step is select the integrated graphics chip in the bios and boot into Linux without fglrx installed. One then makes copies of the two libraries mentioned above.

   cp /usr/lib/libGL.so.1.2 /usr/lib/libGL.so.1.2.xorg
   cp /usr/lib/xorg/modules/extensions/libglx.so.xorg

The next step is to create a simple xorg.conf and save it in the same directory as xorg.conf as xorg.conf.intel. Simply is must contain:

   Section "Device"
       Identifier  "Anyname here will work"
       Driver      "intel"
   EndSection

The next step is the same but with the ATI card selected in the BIOS and the fglrx drivers installed.

   cp /usr/lib/libGL.so.1.2 /usr/lib/libGL.so.1.2.fglrx	
   cp /usr/lib/xorg/modules/extensions/libglx.so.fglrx

Next we need a copy of an xorg.conf for fglrx. You can simply generate one and make a copy using:

   aticonfig --initial
   cp /etc/X11/xorg.conf /etc/X11/xorg.conf.fglrx

Now we are ready to setup the script.

Script

The script is below and can be saved as video_switch.

   #!/bin/bash
   #check for intel integrated drivers
   intel=`lspci | grep Integrated\ Graphics`
   ATI=`lspci | grep ATI`
   
   if [ "$intel" ] ; then
       #setup drivers for intel Xorg driver
       cp /etc/X11/xorg.conf.intel /etc/X11/xorg.conf
       
       # switch libraries to fglrx libraries
       # need to switch /usr/lib/libGL.so.1.2 and 
       # /usr/lib/xorg/modules/extensions/libglx.so
       
       # I stored a copy of libGL.so.1.2 to libGL.so.1.2.xorg
       # when xorg drivers were installed
       # switch libraries to Xorg libraries
       cp /usr/lib/libGL.so.1.2.xorg /usr/lib/libGL.so.1.2
           ln -s /usr/lib/libGL.so.1.2 libGL.so.1
           ln -s /usr/lib/libGL.so.1 libGL.so
       
       cp /usr/lib/xorg/modules/extensions/libglx.so.xorg /usr/lib/xorg/modules/extensions/libglx.so
       
       
       echo "Switched to Xorg Intel drivers"
       
   fi
   if [ "$ATI" ] ; then
       #setup drivers for ATI fglrx driver
       
       cp /etc/X11/xorg.conf.fglrx /etc/X11/xorg.conf
       # switch libraries to fglrx libraries
       # need to switch /usr/lib/libGL.so.1.2 and 
       # /usr/lib/xorg/modules/extensions/libglx.so
       
       # I stored a copy of libGL.so.1.2 to libGL.so.1.2.fglrx
       # when fglrx drivers were installed
       cp /usr/lib/libGL.so.1.2.fglrx /usr/lib/libGL.so.1.2
       # link the other two libraries
           ln -s /usr/lib/libGL.so.1.2 libGL.so.1
           ln -s /usr/lib/libGL.so.1 libGL.so
       #same as before, stored a backup when fglrx was installed
       cp /usr/lib/xorg/modules/extensions/libglx.so.fglrx /usr/lib/xorg/modules/extensions/libglx.so
       
       echo "Switched to Discrete fglrx drivers"
       
       echo "Switched to ATI fglrx drivers"
   fi


We now set this as an init script to run during boot:

First copy the script

       sudo cp video_switch /etc/init.d/

Set it as executable:

       sudo chmod +x /etc/init.d/video_switch

And set the script to run during boot

       sudo update-rc.d video_switch defaults

Now you can select your graphics card in your bios and you are all ready to go!

Sorry for the bad formatting, I just wanted to copy this somewhere and share it while it was still fresh in my head. I will come back to clean it up. --Cyberey66 05:52, 23 February 2011 (CET)