So someone thought it would be a good idea to make laptops with two graphics chips in them and switch betweem them to save power.
Now other OSes support this to varying degrees, I think XP + MacOSX require a logout cycle and Vista/Win7 can dynamically switch while running, while Linux basically falls over in a heap.
So I sat down today with a Lenovo W500 which has an Intel GM45 and AMD Radeon 3650 Mobility in it, and I wrote a patch to try and get closer to the XP/MacOSX level.
The result of one days straight hacking is at:
http://people.freedesktop.org/~airlied/vgaswitcheroo/
The patch is totally focused on the Lenovo W500, other switchers will need to add stuff to this codebase.
So what works?
Boot in switchable graphics - which boots with intel and radeon turned on
KMS drivers load for radeon and intel, radeon BIOS stored in start of VRAM (driver hacked to read it)
bind to both drivers + fbs for both.
mount debugfs - cat /sys/kernel/debug/vgaswitcheroo/switch
2
0 :0000:01:00.0
1+:0000:00:02.0
shows the 02.0 (intel) device is in charge of the MUX.
goto runlevel 5, play with X under the Intel driver, goto runlevel 3 kill X
at fbcon echo "0000:01:00.0" > /sys/kernel/debug/vgaswitcheroo/switch
barely glitches console and switches
goto runlevel 5, play with X under the ATI driver, goto runlevel 3 kill X
echo "0000:00:02.0" > /sys/kernel/debug/vgaswitcheroo/switch
goto runlevel 5, play with X under intel again.
wash and repeat.
What does it do?
So far its just switching the MUX using the ACPI method and remapping all the console to the other framebuffer device,
it also reset the bits that denotes which devices is the boot vga device which X uses to pick the primary GPU. This
means X doesn't need an xorg.conf to switch. (I think all those patches are in upstream X server).
What does it not do?
It doesn't powerdown the radeon when its not in use yet. I know the ACPI call to power it off/on, and since I have
the BIOS I should be able to repost it. So I'll try adding the callbacks into the KMS driver to do this soon.
It doesn't poewrdown the intel when its not in use yet. Not sure what I can do here, since there is no ACPI method to turn
it off. I think I can just D3 the GPU, and use the normal s/r paths to bring it back. Again requires more investigation.
The whole what ACPI + methods map to what device, how the mux ids match etc will probably all need to be stored in the DMI table.
Anything not a Lenovo W500 - probably not that hard to add other Intel/AMD variants to this, add DMI and mux switching method.
nouveau isn't hooked up - this could probably be done by some interested party - the driver hooks so far aren't very hard.
No idea about ATI/ATI or NV/NV ones either.
I'm really hoping interested community people can make this actually useful to them on other hw, I won't have permanent access to the W500 to keep this all tested in the future.
Can we do dynamic switch without restarting X?
No. X needs a lot of work, a lot more than the day it took to hack the kernel.
How do we go forward?
We probably need to add gdm support to move this forward. A logout button that is "Switch GPU", that gdm kills the X server,
then hits the switch port and starts a new X server. I'll try and talk to some gdm hackers over the next few days.
I'll try and push this into a git tree against Linus current, and we can add tested patches for other machines as they go in.
Also the DMI section is only imaginary of what I think others might need, we might have to rip it all out. Also I've no idea
if there are ACPI methods to query the switchable modes etc.
|
Page Summary
ext_184748 :: Fab! [+1] :: (no subject) [+1] :: (no subject)
July 2017
|
hybrid graphics on Linux
blog link
This blog has some info on switchable graphics: Re: blog link
its different everwhere apparantly. Re: blog link
For the Intel/ATI systems, it looks like there's always an ATPX method under the discrete GPU. Nvidia handle it through a _DSM method, regardless of whether it's Nvidia/Intel or Nvidia/Nvidia. The main thing is avoiding hardcoded paths, which requires some of the code you've currently got in the vga code to be in the gpu-specific drm instead. Fab!
Hey well done on working on this Re: Fab!
we don't expose connectors to X, the kernel just exposes interfaces to the X driver which exposes things. (Anonymous)
switching without the hastle to the user
While I understand one would have to kill the X server on the one GPU and start an X server on the other when switching, but could one not make that more fluid an experience for the user by using xmove to persist their X windows? Just something I've read about but have no clue how it actually works. |
