Pierre Moreau
2015-May-28 08:52 UTC
[Nouveau] [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
Hi Dave, ----- Mail original -----> Changes since v1:[...]> diff --git a/drm/nouveau/nouveau_vga.c b/drm/nouveau/nouveau_vga.c > index 9a6328f..7b13804 100644 > --- a/drm/nouveau/nouveau_vga.c > +++ b/drm/nouveau/nouveau_vga.c > @@ -36,7 +36,7 @@ nouveau_switcheroo_set_state(struct pci_dev *pdev, > { > struct drm_device *dev = pci_get_drvdata(pdev); > > - if ((nouveau_is_optimus() || nouveau_has_mux()) && state => VGA_SWITCHEROO_OFF)If I understand it correctly, if the laptop is an Optimus one or has a mux, we are not "allowed" to opt-out of DynPwr/DynOff by powering down the card? In the same commit adding this conditional (5addcf0a5f0fadceba6bd562d0616a1c5d4c1a4d), you added the possibility to enable/disable dynpm. How is it supposed to work, by simply echo'ing ON or OFF to vga_switcheroo/switch? Then I probably forgot some stuff as it doesn't want to work on my laptop. Pierre> + if (nouveau_has_dsm() && state == VGA_SWITCHEROO_OFF) > return; > > if (state == VGA_SWITCHEROO_ON) { > @@ -96,11 +96,11 @@ nouveau_vga_init(struct nouveau_drm *drm) > > if (nouveau_runtime_pm == 1) > runtime = true; > - if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || > nouveau_has_mux())) > + if ((nouveau_runtime_pm == -1) && nouveau_has_dsm()) > runtime = true; > vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops, > runtime); > > - if (runtime && nouveau_has_mux() && !nouveau_is_optimus()) > + if (runtime && (nouveau_has_mux() || nouveau_has_gmux()) && > !nouveau_is_optimus()) > vga_switcheroo_init_domain_pm_ops(drm->dev->dev, > &drm->vga_pm_domain); > } > > @@ -112,11 +112,11 @@ nouveau_vga_fini(struct nouveau_drm *drm) > > if (nouveau_runtime_pm == 1) > runtime = true; > - if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || > nouveau_has_mux())) > + if ((nouveau_runtime_pm == -1) && nouveau_has_dsm()) > runtime = true; > > vga_switcheroo_unregister_client(dev->pdev); > - if (runtime && nouveau_has_mux() && !nouveau_is_optimus()) > + if (runtime && (nouveau_has_mux() || nouveau_has_gmux()) && > !nouveau_is_optimus()) > vga_switcheroo_fini_domain_pm_ops(drm->dev->dev); > vga_client_register(dev->pdev, NULL, NULL, NULL); > } > -- > 2.4.2 > > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/nouveau >
Dave Airlie
2015-May-29 01:20 UTC
[Nouveau] [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
On 28 May 2015 at 18:52, Pierre Moreau <pierre.morrow at free.fr> wrote:> Hi Dave, > > > ----- Mail original ----- >> Changes since v1: > [...] >> diff --git a/drm/nouveau/nouveau_vga.c b/drm/nouveau/nouveau_vga.c >> index 9a6328f..7b13804 100644 >> --- a/drm/nouveau/nouveau_vga.c >> +++ b/drm/nouveau/nouveau_vga.c >> @@ -36,7 +36,7 @@ nouveau_switcheroo_set_state(struct pci_dev *pdev, >> { >> struct drm_device *dev = pci_get_drvdata(pdev); >> >> - if ((nouveau_is_optimus() || nouveau_has_mux()) && state =>> VGA_SWITCHEROO_OFF) > > If I understand it correctly, if the laptop is an Optimus one or has a mux, we are not "allowed" to opt-out of DynPwr/DynOff by powering down the card? > In the same commit adding this conditional (5addcf0a5f0fadceba6bd562d0616a1c5d4c1a4d), you added the possibility to enable/disable dynpm. How is it supposed to work, by simply echo'ing ON or OFF to vga_switcheroo/switch? Then I probably forgot some stuff as it doesn't want to work on my laptop. >I can't remember to be honest I think I wanted to stop the user from changing the state if it was dynamic, now if you turn off dynpm then you should probably enable that. Dave.
Lukas Wunner
2015-May-30 18:23 UTC
[Nouveau] [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
Hi Pierre, On Thu, May 28, 2015 at 10:52:56AM +0200, Pierre Moreau wrote:> How is it supposed to work, by simply echo'ing ON or OFF to > vga_switcheroo/switch? Then I probably forgot some stuff as > it doesn't want to work on my laptop.What exactly doesn't work and which version of the MacBook Pro did you try this on? The expected behaviour when switching GPUs on the MBP is that the GPU that was inactive on bootup will only show a black screen because it was unable to read the EDID (and DPCD on retina MBPs) on bootup. In other words, it's broken. There have been attempts to solve this by multiple folks, the last one was submitted to dri-devel in April by yours truly: http://lists.freedesktop.org/archives/dri-devel/2015-April/081515.html That initial version of my patch set turned out to only work on pre-retina MBPs, and only if the active GPU on bootup is the discrete one. I'm currently working on a v2 to solve all that. We need to get switching working before we can enable runtime PM on MBPs, otherwise the user will be greeted by a black screen when the Nvidia GPU goes to sleep and hands over to the integrated GPU. So your patch is a bit premature I'm afraid. :-( As to the patch itself, you're checking for existence of the gmux but we can't make use of it unless its driver is loaded. Hence it may be easier to simply query for the existence of the driver, using something along the lines of find_module("apple-gmux"). I imagine this is much less code than checking for the DMI IDs. Also, Dave Airlie and Matthew Garrett already wrote a patch set to enable runtime PM for nouveau on MBPs which is more generic: It works with any vga_switcheroo handler, not just gmux: http://lists.freedesktop.org/archives/dri-devel/2014-June/060927.html http://lists.freedesktop.org/archives/dri-devel/2014-June/060928.html http://lists.freedesktop.org/archives/dri-devel/2014-June/060942.html http://www.codon.org.uk/~mjg59/tmp/retina_patches/0027-nouveau-enable-runtime-pm-on-apple-gmux-machines.patch http://www.codon.org.uk/~mjg59/tmp/retina_patches/0028-nouveau-Enable-switcheroo-dynamic-PM-at-switcheroo-e.patch The fourth one in that list is by Dave Airlie and all the others are by Matthew Garrett. But, as I said, we can't apply these either until switching works. I'm working on it. ;-) As to your questions:> How is it supposed to work, by simply echo'ing ON or OFF to > vga_switcheroo/switch?Echoing ON/OFF to the "switch" file will power the inactive device up or down. If the currently active gpu is the discrete one (which is the default when booting a MacBook Pro), this will power up/down the integrated gpu. You can use the tool "gpu-switch" to force the MBP to the integrated GPU on next bootup, then you can echo ON/OFF to change the power state of the Nvidia GPU: https://github.com/0xbb/gpu-switch> If I understand it correctly, if the laptop is an Optimus one or > has a mux, we are not "allowed" to opt-out of DynPwr/DynOff by > powering down the card?If we power the GPU down manually by echoing OFF to the "switch" file, the runtime PM code would probably get confused, I imagine that's the reason why ON/OFF is ignored if client->driver_power_control is set to true. Speaking of which, the external ports of the MBP are soldered to the discrete GPU and can't be switched. Only the panel can be switched. So if there are DP or HDMI connectors with status connected, we can't suspend. That's one of the MBP's numerous peculiarities that I haven't verified yet they're handled properly by the code. Best regards, Lukas
Pierre Moreau
2015-May-30 21:21 UTC
[Nouveau] [PATCH v2 8/9] acpi: Add support for Apple Gmux _DMS
Hi Lukas ----- Mail original -----> Hi Pierre, > > On Thu, May 28, 2015 at 10:52:56AM +0200, Pierre Moreau wrote: > > How is it supposed to work, by simply echo'ing ON or OFF to > > vga_switcheroo/switch? Then I probably forgot some stuff as > > it doesn't want to work on my laptop. > > What exactly doesn't work and which version of the MacBook Pro did > you try this on? The expected behaviour when switching GPUs on the > MBP is that the GPU that was inactive on bootup will only show a > black screen because it was unable to read the EDID (and DPCD on > retina MBPs) on bootup. In other words, it's broken.I'm trying on a mid-2009 MBP, which has a double NVidia setup with a 9400M as IGD and 9600M GT as DIS. Switching between both works (as long as do a PCI-reset of the G96, but that's another story and I should have a patch soon, hopefully). It was also tested by another user on a retina MBP and we ran into the black screen issue. I pointed him to your patches, but I don't know yet if it helped or not.> > There have been attempts to solve this by multiple folks, the last > one was submitted to dri-devel in April by yours truly: > http://lists.freedesktop.org/archives/dri-devel/2015-April/081515.html > > That initial version of my patch set turned out to only work on > pre-retina MBPs, and only if the active GPU on bootup is the > discrete one. I'm currently working on a v2 to solve all that.Cool! Looking forward to it!> > We need to get switching working before we can enable runtime PM on > MBPs, otherwise the user will be greeted by a black screen when the > Nvidia GPU goes to sleep and hands over to the integrated GPU. > So your patch is a bit premature I'm afraid. :-(It's power management++: we even save energy on the screen by "powering it off" for better battery life! ;)> > > As to the patch itself, you're checking for existence of the gmux > but we can't make use of it unless its driver is loaded. Hence it > may be easier to simply query for the existence of the driver, > using something along the lines of find_module("apple-gmux"). > I imagine this is much less code than checking for the DMI IDs.I didn't know there was such a function! Seems nice!> > Also, Dave Airlie and Matthew Garrett already wrote a patch set to > enable runtime PM for nouveau on MBPs which is more generic: It works > with any vga_switcheroo handler, not just gmux: > > http://lists.freedesktop.org/archives/dri-devel/2014-June/060927.html > http://lists.freedesktop.org/archives/dri-devel/2014-June/060928.html > http://lists.freedesktop.org/archives/dri-devel/2014-June/060942.html > http://www.codon.org.uk/~mjg59/tmp/retina_patches/0027-nouveau-enable-runtime-pm-on-apple-gmux-machines.patch > http://www.codon.org.uk/~mjg59/tmp/retina_patches/0028-nouveau-Enable-switcheroo-dynamic-PM-at-switcheroo-e.patch > > The fourth one in that list is by Dave Airlie and all the others are > by Matthew Garrett. But, as I said, we can't apply these either until > switching works. I'm working on it. ;-)I had no idea these patches existed: I should have looked around before. I'll drop the patches, apart probably from the *cleaning* ones, but I'll wait for the previously mentioned ones to first land.> > > As to your questions: > > > How is it supposed to work, by simply echo'ing ON or OFF to > > vga_switcheroo/switch? > > Echoing ON/OFF to the "switch" file will power the inactive device > up or down. If the currently active gpu is the discrete one (which > is the default when booting a MacBook Pro)Not on the mid-2009 MBP! ;) Which is great!> , this will power up/down > the integrated gpu. You can use the tool "gpu-switch" to force the > MBP to the integrated GPU on next bootup, then you can echo ON/OFFI'ddd > to change the power state of the Nvidia GPU: > https://github.com/0xbb/gpu-switch > > > If I understand it correctly, if the laptop is an Optimus one or > > has a mux, we are not "allowed" to opt-out of DynPwr/DynOff by > > powering down the card? > > If we power the GPU down manually by echoing OFF to the "switch" > file, the runtime PM code would probably get confused, I imagine > that's the reason why ON/OFF is ignored if > client->driver_power_control > is set to true.I would have guessed that runtime pm would then get disabled.> > Speaking of which, the external ports of the MBP are soldered to > the discrete GPU and can't be switched. Only the panel can be > switched. So if there are DP or HDMI connectors with status > connected, we can't suspend. That's one of the MBP's numerous > peculiarities that I haven't verified yet they're handled properly > by the code.I could check that on my MBP if you want. Best regards, Pierre> > Best regards, > > Lukas >