aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_drm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_drm.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drm.c52
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:
603fail_display: 605fail_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
634static int 634static int
635nouveau_do_resume(struct drm_device *dev) 635nouveau_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
695static int nouveau_pmops_freeze(struct device *dev) 688static 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
708static int nouveau_pmops_thaw(struct device *dev) 695static 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));