nvidia optimus tricks

Adrian Sevcenco Adrian.Sevcenco at cern.ch
Tue Jul 24 07:50:33 UTC 2012


On 07/24/12 10:40, Roberto Ragusa wrote:
> Maybe I should write a detailed HOWTO, but I will try to describe it
> here.
Thanks a lot for your info!! I will start playing with it :)

Adrian

> My investigation says that not all laptops have the same arrangement
> (some do not have multiplexers and cannot switch mode), this is what
> is working for me on a W520 (hopefully on your T420 too).
>
> - BIOS: configure "Nvidia Optimus" mode: this means both the cards are
> activated; the Intel one is routed to the internal panel, the Nvidia one
> is routed to VGA and other external outputs. (other options are intel only
> and nvidia only, they make hardware invisible).
>
> - BIOS: turn off "detect Nvidia Optimus operating system": I don't know
> what kind of magic it is trying to do, but it is always better to not
> trust the BIOS.
>
> - the kernel will init both cards (as I see in dmesg); for some reason
> the Intel board appears to have a higher priority, it happens that what
> you are seeing on the screen comes from Intel.
>
> - run X in autodetection mode (no conf), it will fire up on the
> Intel one (LCD)
>
> - run everything you want on the Intel screen (including 3D)
>
> - run another X process, I do it this way:
>      xinit -display :1 -- -novtswitch -sharevts -config xorg.conf_nvidiaW520 vt1 :1
>
>    explanations needed:
>
>    - xinit launches an X server and a client (xterm), it could be easier to
>      separate che X server (which is the hard part) and then mess with the
>      clients (you just have to use DISPLAY=:1)
>      The X server would have to be started with
>        X -novtswitch -config xorg.conf_nvidiaW520 vt1 :1
>
>    - we assume the existing X server (intel) is running on vt1
>
>    - we run the second one (nvidia) on vt 1 too (!), so -sharevts
>
>    - this is why we have to use -novtswitch; we want to avoid that enabling
>      the Nvidia turns off the Intel and vice versa; in that case I've seen that
>      the screen remains visible, but the software does not refresh the
>      windows anymore, until you "switch" vt again with Ctrl-Alf-F{1,2,...}
>
>    - having two X running on vt1 means they are really active at the same time;
>      one funny effect of this is that key presses and mouse movements would go to
>      both the screens (amazing to see that!!)
>
>    - the specific xorg.conf I use basically does a few things (I'm pasting it below):
>
>      - it forces nouveau (as autodetection prefers the intel)
>
>      - it tries to disconnect any kind of mouse and keyboard from the secondary
>        server, which, yes, remains without any input devices
>
>      - it includes the vnc module and sets the necessary options to
>        make it usable through a password protected connection; you have to run
>        "vncpasswd /etc/X11/vncpasswd" once, to set your password
>
>      - it sets a default size for the screen (1024x768); keep in mind that
>        the nvidia hardware could have no monitor attached, so autodetection of
>        resolution will not make a lot of sense
>
>    - you can now set your DISPLAY to :1 and run things (xterm, fluxbox, ...); they
>      are still invisible
>
>    - you can connect via vnc to localhost:1 (port 5901); you get access to the
>      display and send key presses and mouse inputs via vnc
>
>    - if you have an external VGA monitor attached the nvidia will output on
>      that when X starts (that is my use-case: external projector)
>
>    - you can use xrandr (with DISPLAY=:1) and do everything you want (but I have seen
>      that changing resolution on the fly confuses the vnc module and crashes X)
>
> If that is not enough, I have more: you can switch the nvidia hardware on/off
> to save battery.
> You need the bbswitch kernel module (very easy to compile from source, project
> Bumblebee). The switch is controlled though a /proc/acpi/bbswitch file. You can cat
> and echo it. You have to avoid turning off the hardware when nouveau is loaded
> or loading nouveau when the hardware is switched off.
> I have two scripts for that (VGAon, VGAoff), another script launches X
> (it is called X2).
> So what I do is:
>
> VGAon --- this switches the hw on and loads nouveau
> X2 --- (without &, so this terminal is now busy, I move to another one)
> vncviewer :1 --- here is my desktop, with just an xterm, I now run fluxbox or ooimpress, ...
>
> stopping is done with:
>
> Ctrl-C in the X2 terminal (everything on that screen dies)
> VGAoff --- this removes nouveau and switches the hw off
>
> Suggestions and improvements are kindly accepted. :-)
>
> Finally, here are my files:
>
> ------------------------------------------------------------------------
>
> # cat /etc/X11/xorg.conf_nvidiaW520
> Section "ServerLayout"
>          Identifier     "X.org Configured"
>          Screen      0  "Screen0" 0 0
>          InputDevice    "Mouse0" "CorePointer"
>          InputDevice    "Keyboard0" "CoreKeyboard"
>          Option "AutoAddDevices" "off"
>          Option "AllowEmptyInput" "on"
> EndSection
>
> Section "Files"
>          ModulePath   "/usr/lib64/xorg/modules"
>          FontPath     "catalogue:/etc/X11/fontpath.d"
>          FontPath     "built-ins"
> EndSection
>
> Section "Module"
>          Load  "vnc"
>          Load  "dri2"
>          Load  "glx"
>          Load  "extmod"
>          Load  "dri"
>          Load  "dbe"
>          Load  "record"
> EndSection
>
> Section "InputDevice"
>          Identifier  "Keyboard0"
>          Driver      "void"
> EndSection
>
> Section "InputDevice"
>          Identifier  "Mouse0"
>          Driver      "void"
>          Option      "Protocol" "auto"
> #       Option      "Device" "/dev/input/mice"
>          Option      "Device" "/dev/null"
>          Option      "ZAxisMapping" "4 5 6 7"
> EndSection
>
> Section "Monitor"
>          Identifier   "Monitor0"
>          VendorName   "Monitor Vendor"
>          ModelName    "Monitor Model"
> EndSection
>
> Section "Device"
>          ### Available Driver options are:-
>          ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
>          ### <string>: "String", <freq>: "<f> Hz/kHz/MHz",
>          ### <percent>: "<f>%"
>          ### [arg]: arg optional
>          #Option     "SWcursor"                  # [<bool>]
>          #Option     "HWcursor"                  # [<bool>]
>          #Option     "NoAccel"                   # [<bool>]
>          #Option     "ShadowFB"                  # [<bool>]
>          #Option     "VideoKey"                  # <i>
>          #Option     "WrappedFB"                 # [<bool>]
>          #Option     "GLXVBlank"                 # [<bool>]
>          #Option     "ZaphodHeads"               # <str>
>          #Option     "PageFlip"                  # [<bool>]
>          Identifier  "Card0"
>          Driver      "nouveau"
>          BusID       "PCI:1:0:0"
> EndSection
>
> Section "Screen"
>          Identifier "Screen0"
>          Device     "Card0"
>          Monitor    "Monitor0"
>          SubSection "Display"
>                  Viewport   0 0
>                  Depth     1
>          EndSubSection
>          SubSection "Display"
>                  Viewport   0 0
>                  Depth     4
>          EndSubSection
>          SubSection "Display"
>                  Viewport   0 0
>                  Depth     8
>          EndSubSection
>          SubSection "Display"
>                  Viewport   0 0
>                  Depth     15
>          EndSubSection
>          SubSection "Display"
>                  Viewport   0 0
>                  Depth     16
>          EndSubSection
>          SubSection "Display"
>                  Viewport   0 0
>                  Depth     24
>                  Modes     "1024x768"
>          EndSubSection
>          Option "SecurityTypes" "VncAuth"
>          Option "PasswordFile" "/etc/X11/vncpassword"
> EndSection
>
> ------------------------------------------------------------------------
>
> # cat `which VGAon`
> #!/bin/bash
>
> grep -q ON /proc/acpi/bbswitch && echo "Nvidia is on" ||
> (
>      echo "Nvidia is off, turning on..."
>      echo ON >/proc/acpi/bbswitch
>      grep -q ON /proc/acpi/bbswitch && echo "Nvidia is on" ||
>      (
>        echo "Nvidia activation FAILED."
>        exit 1
>      )
> )
>
> lsmod|grep -q nouveau$ && echo "nouveau is loaded" ||
> (
>      echo "nouveau is not loaded, loading..."
>      modprobe nouveau
>      lsmod|grep -q nouveau$ && echo "nouveau is loaded" ||
>      (
>        echo "nouveau loading FAILED."
>        exit 2
>      )
> )
>
> ------------------------------------------------------------------------
>
> #cat `which VGAoff`
> #!/bin/bash
>
> ! lsmod|grep -q nouveau$ && echo "nouveau is not loaded" ||
> (
>      echo "nouveau is loaded, unloading..."
>      modprobe -r nouveau
>      ! lsmod| grep -q nouveau$ && echo "nouveau is not loaded" ||
>      (
>        echo "nouveau unloading FAILED."
>        exit 2
>      )
> )
>
> grep -q OFF /proc/acpi/bbswitch && echo "Nvidia is off" ||
> (
>      echo "Nvidia is on, turning off..."
>      echo OFF >/proc/acpi/bbswitch
>      grep -q OFF /proc/acpi/bbswitch && echo "Nvidia is off" ||
>      (
>        echo "Nvidia deactivation FAILED."
>        exit 1
>      )
> )
>
> ------------------------------------------------------------------------
>



-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 1997 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.fedoraproject.org/pipermail/users/attachments/20120724/8c09367c/attachment.p7s>


More information about the users mailing list