← Back to team overview

hybrid-graphics-linux team mailing list archive

Re: Macbook Pro graphics switching

 

Hi all,

Any new developments on this front? I am thinking about putting
together all the current info and post it in our blog...

On Tue, Mar 20, 2012 at 3:16 PM, Andreas Heider <andreas@xxxxxxxx> wrote:
> Hi everyone,
>
> I fixed a lot of stuff and now have a first working version.
> It's not yet perfect and I expect the internals to change quite a bit, but
> it already works pretty well for me.
>
> Since everybody loves videos I made two:
> A full demo showing everything (switching between the GPUs, bumblebee with
> both the nvidia and nouveau): http://www.youtube.com/watch?v=0FYP3nMyxcQ
> And a screen recording showing bumblebee in
> action: http://www.youtube.com/watch?v=qdY_qZWNM6E
>
> If you own a Macbook Pro 6,2 or 6,1 and are adventurous enough to try it you
> can find the source here:
> https://github.com/ah-/gmux-scripts
> https://github.com/ah-/ubuntu-kernel-mbp
> https://github.com/ah-/gmux
>
> There's also some documentation
> at https://github.com/ah-/gmux-scripts/blob/master/README
>
> The gmux switching driver itself should also work on other models, but the
> scripts and some of the kernel patches won't, because the newer models use
> AMD graphics instead of NVIDIA. I only have access to my Macbook Pro 6,2,
> but if you're interested in getting graphics switching to work on other
> models I'd be happy to help.
>
> Over the next time I plan to clean things up and hopefully get some of this
> merged. If someone who knows the linux graphics stack well reads this, I'd
> be happy to get in touch with you to get some help about how to solve the
> whole reprobe/lock_ddc problem properly. There are also an issue with the
> intel card not properly resuming after a suspend.
>
> Cheers,
> Andreas
>
>
> Am 10.03.2012 um 13:12 schrieb Albert Vilella:
>
> Really good stuff!! Keep up the good work!
>
> BTW, what version of the Macbook Pro is that you are testing here? Is
> it "MacBookPro7,1"? Should "MacBookPro6,1" also work?
>
> sudo dmidecode -s system-product-name
>
> I am guessing the models in Apple's website that have hybrid graphics
> now are the ones called "MacBookPro8,2" and "MacBookPro8,3" in these
> ubuntu and wikipedia pages, but these are with Intel/AMD combo -- it
> seems the 13'' model is Intel-only MacBookPro8,1 (13"):
> https://help.ubuntu.com/community/MacBookPro
> http://en.wikipedia.org/wiki/MacBook_Pro
>
> A.
>
> On Sat, Mar 10, 2012 at 12:01 PM, Andreas Heider <andreas@xxxxxxxx> wrote:
>
>
> Hi,
>
>
> Am 09.03.2012 um 10:10 schrieb Albert Vilella:
>
> Do you folks think this is ready for a blog post?
>
>
> There's still a bunch of stuff missing. At the moment switching works, but
> only if you know exactly what you're doing. The next step is to make it work
> without requiring too much manual intervention, so it's possible to simply
> boot the system and switch between nouveau/i915 (and potentially turn the
> dedicated card on/off).
>
>
> This is not only related to the gmux driver itself but also to nouveau/i915
> and how they handle not having a monitor attached at boot. I don't think it
> will be too long until this works but I'd prefer to wait a bit until it
> does, since the many of the readers of the hybrid-graphics-linux blog are
> normal users.
>
>
> In other news, I found a first solution to the vbios problem. There is a
> register on the card (0x619f04, if i'm not mistaken PDISPLAY.VGA.ROM_WINDOW)
> which points to where the vbios should be. Initially this register is set to
> 0x000ffe09 on my card but after a powercycle it's set to 0x1.
>
>
> If I manually restore it to 0xffe09 using nvapoke and copy the vbios back
> with nvafakebios (otherwise it points to a location with just 0xff) both
> nouveau and the nvidia-blob load successfully!
>
>
> For more information see the excellent documentation
> at https://github.com/pathscale/envytools/blob/master/hwdocs ;(especially
> nvbars.txt) and the source of the envytools.
>
>
> This is really amazing, because that means that the standard bumblebee
> switching will work without major modifications, especially with the nvidia
> blob.
>
>
> Cheers,
>
> Andreas
>
>
>
> Now that Linus has Linux running on a Macbook Air, it may be good to
>
> show Macbook Pros with hybrid graphics have half-decent Linux support
>
> as well... :-p
>
>
> On Thu, Mar 8, 2012 at 9:34 PM, Andreas Heider <andreas@xxxxxxxx> wrote:
>
> Hi Peter,
>
>
> I blacklisted both nvidia and nouveau during boot and did exactly these
>
> eight steps. I used dd to save the config space, if that is of any
>
> importance (e.g. "dd if=/sys/bus/pci/devices/0000:01:00.0/config
>
> of=7-restored").
>
>
> Because I'm not sure wether the pci_save/restore_state functions work I did
>
> the test twice. You can find the results for the run with
>
> pci_save/restore_state at http://andreas.meetr.de/nouveau/pcs/ and the one
>
> without at http://andreas.meetr.de/nouveau/pcs-2.
>
>
> Both lead to the same result, the vbios is not
>
> accessible. http://andreas.meetr.de/nouveau/nouveau.dmesg shows how a normal
>
> boot with nouveau looks like.
>
>
> Cheers,
>
> Andreas
>
>
> Am 08.03.2012 um 21:31 schrieb Lekensteyn:
>
>
> Hi Andreas,
>
>
> What about nouveau? The blob sometimes do not get completely unloaded
>
> (/dev/nvidia* devices then still
>
> exist).
>
>
> What if the following steps are followed:
>
>
> 1. ensure that the blob has not been loaded (reboot if necessary)
>
> 2. unload nouveau if necessary
>
> 3. save pci configuration space
>
> 4. disable card
>
> 5. save pci configuration space, it should be all 1's (ff in xxd)
>
> 6. enable card
>
> 7. save pci configuration space, it should be similar to (3)
>
> 8. load the nouveau driver, does it work?
>
>
> Regards,
>
> Peter
>
>
> On Thu, Mar 8, 2012 at 7:17 PM, Andreas Heider <andreas@xxxxxxxx> wrote:
>
>
> Hi Peter,
>
>
> I'm already saving the pci configuration space with pci_save/restore_state
>
> and I've also tried manually changing it through /sys/bus/pci/..., but I
>
> still have the problem that the blob can't load the vbios.
>
>
> I've uploaded dumps of it, maybe you can spot something thats obviously
>
> wrong with it:
>
> 1. After boot: http://andreas.meetr.de/gmux/nv.config
>
> 2. After one powercycle: http://andreas.meetr.de/gmux/nv.bad.config
>
> 3. After one powercycle and copying the first config space
>
> back: http://andreas.meetr.de/gmux/nv.bad.config_restored
>
>
> Unfortunately this still gives me the NVRM: RmInitAdapter failed!
>
> (0x30:0xffffffff:858) error.
>
>
> Thanks,
>
> Andreas
>
>
>
> Am 08.03.2012 um 12:38 schrieb Lekensteyn:
>
>
> Hi Andreas,
>
>
> I've documented about the PCI configuration space issue on
>
> http://wiki.bumblebee-project.org/ACPI-for-Developers. Bumblebee also
>
> saves
>
> and restores the PCI configuration space before enabling/after disabling.
>
>
> Regards,
>
> Peter
>
>
> On Thu, Mar 8, 2012 at 2:47 AM, Andreas Heider <andreas@xxxxxxxx> wrote:
>
>
> Hi everyone,
>
>
> I'll just continue using this mailing list as a blog. After a lot of
>
> wild guesses in all directions I now have a setup that could be a base
>
> for useful graphics switching on Macbook Pros. It's not completely
>
> reliable yet but hopefully that will improve in the future.
>
>
> Switching between two running GPUs works pretty well and just needs a
>
> bit more work. But that shouldn't be a big issue.
>
>
> The main problem I fought with is that after powering down the external
>
> GPU the vbios vanishes and it's impossible to load the proprietary
>
> nvidia driver:
>
>
> [  214.505208] NVRM: failed to copy vbios to system memory.
>
> [  214.507347] NVRM: RmInitAdapter failed! (0x30:0xffffffff:858)
>
> [  214.507357] NVRM: rm_init_adapter(0) failed
>
>
> The same problem exists with nouveau, after the first power cycle
>
> nouveau doesn't load again if I unload it. I guess this is actually a
>
> BIOS/EFI/firmware bug, since Apple's switching driver just keeps the
>
> driver loaded.
>
>
> So it's necessary to load the driver once and keep it loaded. This works
>
> well with nouveau+vga_switcheroo but is a bit problematic with the
>
> blob.
>
>
> At the moment I have the blob running with the patch from my first mail
>
> and noticed that it survives a powercycle if X _is_ loaded while the GPU
>
> is powered down. If I shutdown X I get this error when I try to start it
>
> again afterwards:
>
>
> [  144.390920] NVRM: RmInitAdapter failed! (0x26:0xffffffff:1170)
>
> [  144.390930] NVRM: rm_init_adapter(0) failed
>
>
> I'm not 100% certain that this really works but at the moment it's the
>
> only possibility for getting full switching support with the blob.
>
>
> Speaking of nvidia bugs, I also had problems with the blob not reliably
>
> loading when I boot with EFI.
>
> Luckily it's possible to also enable the integrated card in BIOS
>
> emulation mode. After staring a lot at the output of lspci -xxx from
>
> both EFI and BIOS boot I noticed that this just requires flipping one
>
> bit in the pci configuration space. This can be done by adding "setpci
>
> -d 8086:0044 54.b=0b" in grub. This value will most likely only work for
>
> this exact model, a MBP 6,2. For more information see
>
> http://download.intel.com/design/processor/datashts/322813.pdf page 62.
>
>
> If anyone has some hints how to better deal with the blob that would be
>
> greatly appreciated.
>
>
> On Wed, 2012-02-29 at 10:33 +0100, Lekensteyn wrote:
>
> Hi Andreas,
>
>
> I'm using nouveau + bbswitch (switcheroo also works, but not after
>
> resume), not on
>
> a mac, but a Clevo B7130 (branded as "BTO P-BOOK 17CL34").
>
>
> The restoration of the PCI configuration space is a hack to allow the
>
> driver to load
>
> in case it was accidentally loaded while the card was off. This is
>
> especially necessary
>
> for the nvidia blob driver which loads itself if you try to
>
> access /dev/nvidia* devices.
>
>
> In the case of switcheroo, no driver is attempted to be unloaded (see
>
> the second field
>
> of the switching_method struct and line 30 of src/switch/switching.c.
>
>
> Sorry, that was my fault. I changed that for testing purposes and then
>
> forgot about it.
>
>
>
> gmux can be integrated into BB. Writing a new switcher module
>
> (src/switch/gmux.c)
>
> which also takes care of loading the switcheroo module (only if that
>
> is a safe operation!)
>
> should do the trick. Just be careful not to conflict with switcheroo.
>
> The other way is leave
>
> BB as it and require users to load gmux before BB.
>
>
> Because of vbios situation and nouveau already working pretty well with
>
> switcheroo I'd prefer to keep using that.
>
>
> Regards,
>
> Peter
>
>
> Cheers,
>
> Andreas
>
>
>
> On Wed, Feb 29, 2012 at 12:25 AM, Andreas Heider <andreas@xxxxxxxx>
>
> wrote:
>
>         Hi Peter,
>
>
>         I took another look at bumblebee today and got it running with
>
>         nouveau!
>
>         Bumblebee automatically powers the nvidia card down when it's
>
>         not in
>
>         use and starting programs with optirun works well.
>
>
>         This required a dirty hack to bumblebee which you can find
>
>         here:
>
>
> https://github.com/ah-/Bumblebee/commit/c5ab6f0e7f841045cee6905bb367c79091b0eb6b
>
>
>         The problem is that bumblebee wants to save/restore the pci
>
>         configuration
>
>         space, which is already done by nouveau. (See
>
>         https://gist.github.com/1935992)
>
>
>         It also shouldn't try to unload the driver.
>
>
>         Do you think this could somehow be integrated into bumblebee?
>
>
>         Cheers,
>
>         Andreas
>
>
>         On Tue, 2012-02-28 at 16:14 +0100, Lekensteyn wrote:
>
>         > Hi Andreas,
>
>         >
>
>         > vga_switcheroo is a supported method since Bumblebee 3.0,
>
>         but I
>
>         > assumed that
>
>         > it would not be used for the nvidia driver. If you wish to
>
>         use the
>
>         > nvidia blob with
>
>         > switcheroo, you have to recompile Bumblebee and apply commit
>
>         > 85636d1f21b0644e7dd47e3931479860c55b7a05 (or use the develop
>
>         branch).
>
>         > The
>
>         > next version will have this change too.
>
>         >
>
>         > One shortcoming of vga_switcheroo now is that the state is
>
>         messed up
>
>         > after
>
>         > suspend: switcheroo remembered that the card was off, but in
>
>         reality
>
>         > the card
>
>         > is on. The module bbswitch worked around this by enabling
>
>         the card
>
>         > before
>
>         > suspend and disabling the card on resume.
>
>         >
>
>         > In some cases, while the card was turned off with switcheroo
>
>         caused
>
>         > the machine
>
>         > to lock when the card is tried to be accessed. If switcheroo
>
>         is not an
>
>         > option for
>
>         > Bumblebee, you can write your own switching code. See the
>
>         src/switch/
>
>         > directory
>
>         > for examples.
>
>         >
>
>         > Regards,
>
>         > Peter
>
>         > (Bumblebee and bbswitch developer)
>
>         >
>
>         > On Tue, Feb 28, 2012 at 3:16 PM, Andreas Heider
>
>         <andreas@xxxxxxxx>
>
>         > wrote:
>
>         >         Hello everybody,
>
>         >
>
>         >         I'm developing a vga_switcheroo driver for the Apple
>
>         Macbook
>
>         >         Pro models
>
>         >         with switchable graphics and have a few questions
>
>         about how to
>
>         >         integrate
>
>         >         it with the current linux hybrid graphics
>
>         infrastructure.
>
>         >
>
>         >
>
>         >         Apple implemented the switching using a "chip"
>
>         dubbed the
>
>         >         "gmux" (probably short for graphics multiplexer or
>
>         something
>
>         >         similar).
>
>         >         The gmux can power down the external graphics card,
>
>         switch the
>
>         >         DDC,
>
>         >         internal and external display connections
>
>         (individually)
>
>         >         between both
>
>         >         cards and set the backlight brightness. Unlike most
>
>         newer
>
>         >         laptops with
>
>         >         hybrid graphics, Apple's Macbook Pros use a physical
>
>         mux.
>
>         >
>
>         >         Luckily the gmux has remained mostly the same
>
>         between all
>
>         >         models with
>
>         >         switchable graphics, so it should be possible to
>
>         develop one
>
>         >         driver that
>
>         >         supports all of them.
>
>         >
>
>         >
>
>         >         This driver has actually been lying around in
>
>         unfinished state
>
>         >         for some
>
>         >         time now, until Seth Forshee from Canonical recently
>
>         rewrote
>
>         >         it into a
>
>         >         clean, backlight-only driver that will hopefully
>
>         find it's way
>
>         >         into
>
>         >         mainline soon.
>
>         >
>
>         >         My goal is to use Seth's work as a base and add the
>
>         other
>
>         >         features back
>
>         >         again and make it work well. A first version is
>
>         already
>
>         >         working and up
>
>         >         at https://github.com/ah-/gmux
>
>         >
>
>         >         This driver supports all vga_switcheroo operations
>
>         (discrete
>
>         >         power
>
>         >         on/off, display switching) and they all work on my
>
>         MBP 6,2
>
>         >         using the
>
>         >         intel and nouveau drivers.
>
>         >
>
>         >         But unfortunately, it doesn't work with bumbleebee
>
>         and/or the
>
>         >         proprietary
>
>         >         nvidia driver yet.
>
>         >
>
>         >
>
>         >         Because I'm using CUDA in other projects, getting
>
>         the
>
>         >         proprietary NVIDIA
>
>         >         driver running well is very interesting to me. The
>
>         setup
>
>         >         bumblebee plus
>
>         >         intel + nvidia_current without power management
>
>         works well on
>
>         >         my laptop
>
>         >         if I switch to the intel card in grub. (It's just
>
>         three
>
>         >         outbs). But that
>
>         >         breaks suspend and uses 10W more power than
>
>         necessary.
>
>         >
>
>         >         Does/should bumblebee work with a vga_switcheroo
>
>         driver just
>
>         >         for ON/OFF?
>
>         >
>
>         >         One thing I stumbled upon is a patch for the
>
>         proprietary
>
>         >         NVIDIA
>
>         >         driver originally written by "Kayo
>
>         <kayo@xxxxxxxxxxxx>" which
>
>         >         adds
>
>         >         some kind of vga_switcheroo support to it. I
>
>         modified it to
>
>         >         just register
>
>         >         with switcheroo (patch is attached), and that part
>
>         works well.
>
>         >         Turning
>
>         >         off the card works, but turning it on afterwards
>
>         doesn't. Any
>
>         >         Ideas?
>
>         >
>
>         >
>
>         >         Ultimately I'd like to get two scenarios/workflows
>
>         to work
>
>         >         well:
>
>         >
>
>         >         1. Real switching, by disabling one card completely
>
>         and only
>
>         >         using
>
>         >         the other one, requiring a logout/login.
>
>         >         Preferably using the NVIDIA driver.
>
>         >
>
>         >         2. Bumblebee switching with working power management
>
>         when the
>
>         >         NVIDIA
>
>         >         GPU is not in usw.
>
>         >
>
>         >
>
>         >         I'd appreciate any comments and thoughts on how to
>
>         implement
>
>         >         this and
>
>         >         how to integrate it with the current hybrid graphics
>
>         >         environment.
>
>         >
>
>         >         Cheers,
>
>         >         Andreas
>
>         >
>
>         >         _______________________________________________
>
>         >         Mailing list:
>
>         https://launchpad.net/~hybrid-graphics-linux
>
>         >         Post to     :
>
>         hybrid-graphics-linux@xxxxxxxxxxxxxxxxxxx
>
>         >         Unsubscribe :
>
>         https://launchpad.net/~hybrid-graphics-linux
>
>         >         More help   : https://help.launchpad.net/ListHelp
>
>         >
>
>         >
>
>
>
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
>
> Mailing list: https://launchpad.net/~hybrid-graphics-linux
>
> Post to     : hybrid-graphics-linux@xxxxxxxxxxxxxxxxxxx
>
> Unsubscribe : https://launchpad.net/~hybrid-graphics-linux
>
> More help   : https://help.launchpad.net/ListHelp
>
>
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~hybrid-graphics-linux
> Post to     : hybrid-graphics-linux@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~hybrid-graphics-linux
> More help   : https://help.launchpad.net/ListHelp
>
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~hybrid-graphics-linux
> Post to     : hybrid-graphics-linux@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~hybrid-graphics-linux
> More help   : https://help.launchpad.net/ListHelp
>


Follow ups

References