[Nouveau] [PATCH] drm: compute runpm on load, don't register autosuspend for non-runpm

Ben Skeggs skeggsb at gmail.com
Wed Mar 19 16:39:28 PDT 2014


On Thu, Mar 20, 2014 at 1:28 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> 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 <imirkin at alum.mit.edu>
> Cc: <stable at vger.kernel.org> # 3.12+
Also untested, but looks like a saner idea to me.  Dave?

> ---
>
> 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
> Nouveau at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau


More information about the Nouveau mailing list