|
@@ -547,9 +547,11 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime)
|
|
struct nouveau_cli *cli;
|
|
struct nouveau_cli *cli;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- if (dev->mode_config.num_crtc && !runtime) {
|
|
|
|
|
|
+ if (dev->mode_config.num_crtc) {
|
|
|
|
+ NV_INFO(drm, "suspending console...\n");
|
|
|
|
+ nouveau_fbcon_set_suspend(dev, 1);
|
|
NV_INFO(drm, "suspending display...\n");
|
|
NV_INFO(drm, "suspending display...\n");
|
|
- ret = nouveau_display_suspend(dev);
|
|
|
|
|
|
+ ret = nouveau_display_suspend(dev, runtime);
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -603,7 +605,7 @@ fail_client:
|
|
fail_display:
|
|
fail_display:
|
|
if (dev->mode_config.num_crtc) {
|
|
if (dev->mode_config.num_crtc) {
|
|
NV_INFO(drm, "resuming display...\n");
|
|
NV_INFO(drm, "resuming display...\n");
|
|
- nouveau_display_resume(dev);
|
|
|
|
|
|
+ nouveau_display_resume(dev, runtime);
|
|
}
|
|
}
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -618,9 +620,6 @@ int nouveau_pmops_suspend(struct device *dev)
|
|
drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
|
|
drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- if (drm_dev->mode_config.num_crtc)
|
|
|
|
- nouveau_fbcon_set_suspend(drm_dev, 1);
|
|
|
|
-
|
|
|
|
ret = nouveau_do_suspend(drm_dev, false);
|
|
ret = nouveau_do_suspend(drm_dev, false);
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
@@ -633,7 +632,7 @@ int nouveau_pmops_suspend(struct device *dev)
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|
|
-nouveau_do_resume(struct drm_device *dev)
|
|
|
|
|
|
+nouveau_do_resume(struct drm_device *dev, bool runtime)
|
|
{
|
|
{
|
|
struct nouveau_drm *drm = nouveau_drm(dev);
|
|
struct nouveau_drm *drm = nouveau_drm(dev);
|
|
struct nouveau_cli *cli;
|
|
struct nouveau_cli *cli;
|
|
@@ -658,7 +657,9 @@ nouveau_do_resume(struct drm_device *dev)
|
|
|
|
|
|
if (dev->mode_config.num_crtc) {
|
|
if (dev->mode_config.num_crtc) {
|
|
NV_INFO(drm, "resuming display...\n");
|
|
NV_INFO(drm, "resuming display...\n");
|
|
- nouveau_display_repin(dev);
|
|
|
|
|
|
+ nouveau_display_resume(dev, runtime);
|
|
|
|
+ NV_INFO(drm, "resuming console...\n");
|
|
|
|
+ nouveau_fbcon_set_suspend(dev, 0);
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -681,47 +682,21 @@ int nouveau_pmops_resume(struct device *dev)
|
|
return ret;
|
|
return ret;
|
|
pci_set_master(pdev);
|
|
pci_set_master(pdev);
|
|
|
|
|
|
- ret = nouveau_do_resume(drm_dev);
|
|
|
|
- if (ret)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
- if (drm_dev->mode_config.num_crtc) {
|
|
|
|
- nouveau_display_resume(drm_dev);
|
|
|
|
- nouveau_fbcon_set_suspend(drm_dev, 0);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return nouveau_do_resume(drm_dev, false);
|
|
}
|
|
}
|
|
|
|
|
|
static int nouveau_pmops_freeze(struct device *dev)
|
|
static int nouveau_pmops_freeze(struct device *dev)
|
|
{
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
|
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
|
- int ret;
|
|
|
|
-
|
|
|
|
- if (drm_dev->mode_config.num_crtc)
|
|
|
|
- nouveau_fbcon_set_suspend(drm_dev, 1);
|
|
|
|
-
|
|
|
|
- ret = nouveau_do_suspend(drm_dev, false);
|
|
|
|
- return ret;
|
|
|
|
|
|
+ return nouveau_do_suspend(drm_dev, false);
|
|
}
|
|
}
|
|
|
|
|
|
static int nouveau_pmops_thaw(struct device *dev)
|
|
static int nouveau_pmops_thaw(struct device *dev)
|
|
{
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
|
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
|
- int ret;
|
|
|
|
-
|
|
|
|
- ret = nouveau_do_resume(drm_dev);
|
|
|
|
- if (ret)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
- if (drm_dev->mode_config.num_crtc) {
|
|
|
|
- nouveau_display_resume(drm_dev);
|
|
|
|
- nouveau_fbcon_set_suspend(drm_dev, 0);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return nouveau_do_resume(drm_dev, false);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -977,7 +952,7 @@ static int nouveau_pmops_runtime_resume(struct device *dev)
|
|
return ret;
|
|
return ret;
|
|
pci_set_master(pdev);
|
|
pci_set_master(pdev);
|
|
|
|
|
|
- ret = nouveau_do_resume(drm_dev);
|
|
|
|
|
|
+ ret = nouveau_do_resume(drm_dev, true);
|
|
drm_kms_helper_poll_enable(drm_dev);
|
|
drm_kms_helper_poll_enable(drm_dev);
|
|
/* do magic */
|
|
/* do magic */
|
|
nvif_mask(device, 0x88488, (1 << 25), (1 << 25));
|
|
nvif_mask(device, 0x88488, (1 << 25), (1 << 25));
|