There was a proliferation of duplicated checks for runpm == -1 &&
optimus. Instead of continuing that tradition, get rid of all of them,
only doing the optimus computation once on load.

This should hopefully fix secondary cards suspending and then being
unable to come back in non-optimus setups.

Signed-off-by: Ilia Mirkin <[email protected]>
Cc: <[email protected]> # 3.12+
---

This is as yet untested, but I wanted to send this out to the list
since I think a few people are still running into these annoying
issues.

I don't have access to an actual optimus configuration, so if someone
could give this a shot on such a setup and confirm that things
autosuspend as expected without any runpm parameters, that'd be great.

 drm/nouveau_drm.c | 18 +++++-------------
 drm/nouveau_vga.c |  4 +---
 2 files changed, 6 insertions(+), 16 deletions(-)

diff --git a/drm/nouveau_drm.c b/drm/nouveau_drm.c
index 8f811a5..a6225ee 100644
--- a/drm/nouveau_drm.c
+++ b/drm/nouveau_drm.c
@@ -352,6 +352,10 @@ nouveau_drm_load(struct drm_device *dev, unsigned long 
flags)
        struct nouveau_drm *drm;
        int ret;
 
+       if (nouveau_runtime_pm == -1)
+               nouveau_runtime_pm =
+                       nouveau_is_optimus() || nouveau_is_v1_dsm();
+
        ret = nouveau_cli_create(nouveau_name(dev), "DRM", sizeof(*drm),
                                 (void **)&drm);
        if (ret)
@@ -443,7 +447,7 @@ nouveau_drm_load(struct drm_device *dev, unsigned long 
flags)
        nouveau_accel_init(drm);
        nouveau_fbcon_init(dev);
 
-       if (nouveau_runtime_pm != 0) {
+       if (nouveau_runtime_pm) {
                pm_runtime_use_autosuspend(dev->dev);
                pm_runtime_set_autosuspend_delay(dev->dev, 5000);
                pm_runtime_set_active(dev->dev);
@@ -894,12 +898,6 @@ static int nouveau_pmops_runtime_suspend(struct device 
*dev)
        if (nouveau_runtime_pm == 0)
                return -EINVAL;
 
-       /* are we optimus enabled? */
-       if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && 
!nouveau_is_v1_dsm()) {
-               DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
-               return -EINVAL;
-       }
-
        nv_debug_level(SILENT);
        drm_kms_helper_poll_disable(drm_dev);
        vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF);
@@ -951,12 +949,6 @@ static int nouveau_pmops_runtime_idle(struct device *dev)
        if (nouveau_runtime_pm == 0)
                return -EBUSY;
 
-       /* are we optimus enabled? */
-       if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && 
!nouveau_is_v1_dsm()) {
-               DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
-               return -EBUSY;
-       }
-
        /* if we have a hdmi audio device - make sure it has a driver loaded */
        if (drm->hdmi_device) {
                if (!drm->hdmi_device->driver) {
diff --git a/drm/nouveau_vga.c b/drm/nouveau_vga.c
index fb84da3..b00b05a 100644
--- a/drm/nouveau_vga.c
+++ b/drm/nouveau_vga.c
@@ -91,9 +91,7 @@ nouveau_vga_init(struct nouveau_drm *drm)
 
        vga_client_register(dev->pdev, dev, NULL, nouveau_vga_set_decode);
 
-       if (nouveau_runtime_pm == 1)
-               runtime = true;
-       if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || 
nouveau_is_v1_dsm()))
+       if (nouveau_runtime_pm)
                runtime = true;
        vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops, 
runtime);
 
-- 
1.8.3.2

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to