diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_drm.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_drm.c | 52 |
1 files changed, 14 insertions, 38 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c index 250a5e88c751..3ed32dd90303 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c | |||
@@ -547,9 +547,11 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime) | |||
547 | struct nouveau_cli *cli; | 547 | struct nouveau_cli *cli; |
548 | int ret; | 548 | int ret; |
549 | 549 | ||
550 | if (dev->mode_config.num_crtc && !runtime) { | 550 | if (dev->mode_config.num_crtc) { |
551 | NV_INFO(drm, "suspending console...\n"); | ||
552 | nouveau_fbcon_set_suspend(dev, 1); | ||
551 | NV_INFO(drm, "suspending display...\n"); | 553 | NV_INFO(drm, "suspending display...\n"); |
552 | ret = nouveau_display_suspend(dev); | 554 | ret = nouveau_display_suspend(dev, runtime); |
553 | if (ret) | 555 | if (ret) |
554 | return ret; | 556 | return ret; |
555 | } | 557 | } |
@@ -603,7 +605,7 @@ fail_client: | |||
603 | fail_display: | 605 | fail_display: |
604 | if (dev->mode_config.num_crtc) { | 606 | if (dev->mode_config.num_crtc) { |
605 | NV_INFO(drm, "resuming display...\n"); | 607 | NV_INFO(drm, "resuming display...\n"); |
606 | nouveau_display_resume(dev); | 608 | nouveau_display_resume(dev, runtime); |
607 | } | 609 | } |
608 | return ret; | 610 | return ret; |
609 | } | 611 | } |
@@ -618,21 +620,19 @@ int nouveau_pmops_suspend(struct device *dev) | |||
618 | drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) | 620 | drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) |
619 | return 0; | 621 | return 0; |
620 | 622 | ||
621 | if (drm_dev->mode_config.num_crtc) | ||
622 | nouveau_fbcon_set_suspend(drm_dev, 1); | ||
623 | |||
624 | ret = nouveau_do_suspend(drm_dev, false); | 623 | ret = nouveau_do_suspend(drm_dev, false); |
625 | if (ret) | 624 | if (ret) |
626 | return ret; | 625 | return ret; |
627 | 626 | ||
628 | pci_save_state(pdev); | 627 | pci_save_state(pdev); |
629 | pci_disable_device(pdev); | 628 | pci_disable_device(pdev); |
629 | pci_ignore_hotplug(pdev); | ||
630 | pci_set_power_state(pdev, PCI_D3hot); | 630 | pci_set_power_state(pdev, PCI_D3hot); |
631 | return 0; | 631 | return 0; |
632 | } | 632 | } |
633 | 633 | ||
634 | static int | 634 | static int |
635 | nouveau_do_resume(struct drm_device *dev) | 635 | nouveau_do_resume(struct drm_device *dev, bool runtime) |
636 | { | 636 | { |
637 | struct nouveau_drm *drm = nouveau_drm(dev); | 637 | struct nouveau_drm *drm = nouveau_drm(dev); |
638 | struct nouveau_cli *cli; | 638 | struct nouveau_cli *cli; |
@@ -657,7 +657,9 @@ nouveau_do_resume(struct drm_device *dev) | |||
657 | 657 | ||
658 | if (dev->mode_config.num_crtc) { | 658 | if (dev->mode_config.num_crtc) { |
659 | NV_INFO(drm, "resuming display...\n"); | 659 | NV_INFO(drm, "resuming display...\n"); |
660 | nouveau_display_repin(dev); | 660 | nouveau_display_resume(dev, runtime); |
661 | NV_INFO(drm, "resuming console...\n"); | ||
662 | nouveau_fbcon_set_suspend(dev, 0); | ||
661 | } | 663 | } |
662 | 664 | ||
663 | return 0; | 665 | return 0; |
@@ -680,47 +682,21 @@ int nouveau_pmops_resume(struct device *dev) | |||
680 | return ret; | 682 | return ret; |
681 | pci_set_master(pdev); | 683 | pci_set_master(pdev); |
682 | 684 | ||
683 | ret = nouveau_do_resume(drm_dev); | 685 | return nouveau_do_resume(drm_dev, false); |
684 | if (ret) | ||
685 | return ret; | ||
686 | |||
687 | if (drm_dev->mode_config.num_crtc) { | ||
688 | nouveau_display_resume(drm_dev); | ||
689 | nouveau_fbcon_set_suspend(drm_dev, 0); | ||
690 | } | ||
691 | |||
692 | return 0; | ||
693 | } | 686 | } |
694 | 687 | ||
695 | static int nouveau_pmops_freeze(struct device *dev) | 688 | static int nouveau_pmops_freeze(struct device *dev) |
696 | { | 689 | { |
697 | struct pci_dev *pdev = to_pci_dev(dev); | 690 | struct pci_dev *pdev = to_pci_dev(dev); |
698 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | 691 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
699 | int ret; | 692 | return nouveau_do_suspend(drm_dev, false); |
700 | |||
701 | if (drm_dev->mode_config.num_crtc) | ||
702 | nouveau_fbcon_set_suspend(drm_dev, 1); | ||
703 | |||
704 | ret = nouveau_do_suspend(drm_dev, false); | ||
705 | return ret; | ||
706 | } | 693 | } |
707 | 694 | ||
708 | static int nouveau_pmops_thaw(struct device *dev) | 695 | static int nouveau_pmops_thaw(struct device *dev) |
709 | { | 696 | { |
710 | struct pci_dev *pdev = to_pci_dev(dev); | 697 | struct pci_dev *pdev = to_pci_dev(dev); |
711 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | 698 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
712 | int ret; | 699 | return nouveau_do_resume(drm_dev, false); |
713 | |||
714 | ret = nouveau_do_resume(drm_dev); | ||
715 | if (ret) | ||
716 | return ret; | ||
717 | |||
718 | if (drm_dev->mode_config.num_crtc) { | ||
719 | nouveau_display_resume(drm_dev); | ||
720 | nouveau_fbcon_set_suspend(drm_dev, 0); | ||
721 | } | ||
722 | |||
723 | return 0; | ||
724 | } | 700 | } |
725 | 701 | ||
726 | 702 | ||
@@ -976,7 +952,7 @@ static int nouveau_pmops_runtime_resume(struct device *dev) | |||
976 | return ret; | 952 | return ret; |
977 | pci_set_master(pdev); | 953 | pci_set_master(pdev); |
978 | 954 | ||
979 | ret = nouveau_do_resume(drm_dev); | 955 | ret = nouveau_do_resume(drm_dev, true); |
980 | drm_kms_helper_poll_enable(drm_dev); | 956 | drm_kms_helper_poll_enable(drm_dev); |
981 | /* do magic */ | 957 | /* do magic */ |
982 | nvif_mask(device, 0x88488, (1 << 25), (1 << 25)); | 958 | nvif_mask(device, 0x88488, (1 << 25), (1 << 25)); |