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