hybrid-graphics-linux team mailing list archive
-
hybrid-graphics-linux team
-
Mailing list archive
-
Message #02166
Re: Macbook Pro graphics switching
Do you folks think this is ready for a blog post?
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
>
References