aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c22
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
2 files changed, 11 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index d7c4de45644d..07c07d55398b 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1611,15 +1611,12 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
1611{ 1611{
1612 struct drm_i915_private *dev_priv = to_i915(dev); 1612 struct drm_i915_private *dev_priv = to_i915(dev);
1613 struct pci_dev *pdev = dev_priv->drm.pdev; 1613 struct pci_dev *pdev = dev_priv->drm.pdev;
1614 bool fw_csr;
1615 int ret; 1614 int ret;
1616 1615
1617 disable_rpm_wakeref_asserts(dev_priv); 1616 disable_rpm_wakeref_asserts(dev_priv);
1618 1617
1619 intel_display_set_init_power(dev_priv, false); 1618 intel_display_set_init_power(dev_priv, false);
1620 1619
1621 fw_csr = !IS_GEN9_LP(dev_priv) && !hibernation &&
1622 suspend_to_idle(dev_priv) && dev_priv->csr.dmc_payload;
1623 /* 1620 /*
1624 * In case of firmware assisted context save/restore don't manually 1621 * In case of firmware assisted context save/restore don't manually
1625 * deinit the power domains. This also means the CSR/DMC firmware will 1622 * deinit the power domains. This also means the CSR/DMC firmware will
@@ -1627,8 +1624,11 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
1627 * also enable deeper system power states that would be blocked if the 1624 * also enable deeper system power states that would be blocked if the
1628 * firmware was inactive. 1625 * firmware was inactive.
1629 */ 1626 */
1630 if (!fw_csr) 1627 if (IS_GEN9_LP(dev_priv) || hibernation || !suspend_to_idle(dev_priv) ||
1628 dev_priv->csr.dmc_payload == NULL) {
1631 intel_power_domains_suspend(dev_priv); 1629 intel_power_domains_suspend(dev_priv);
1630 dev_priv->power_domains_suspended = true;
1631 }
1632 1632
1633 ret = 0; 1633 ret = 0;
1634 if (IS_GEN9_LP(dev_priv)) 1634 if (IS_GEN9_LP(dev_priv))
@@ -1640,8 +1640,10 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
1640 1640
1641 if (ret) { 1641 if (ret) {
1642 DRM_ERROR("Suspend complete failed: %d\n", ret); 1642 DRM_ERROR("Suspend complete failed: %d\n", ret);
1643 if (!fw_csr) 1643 if (dev_priv->power_domains_suspended) {
1644 intel_power_domains_init_hw(dev_priv, true); 1644 intel_power_domains_init_hw(dev_priv, true);
1645 dev_priv->power_domains_suspended = false;
1646 }
1645 1647
1646 goto out; 1648 goto out;
1647 } 1649 }
@@ -1662,8 +1664,6 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
1662 if (!(hibernation && INTEL_GEN(dev_priv) < 6)) 1664 if (!(hibernation && INTEL_GEN(dev_priv) < 6))
1663 pci_set_power_state(pdev, PCI_D3hot); 1665 pci_set_power_state(pdev, PCI_D3hot);
1664 1666
1665 dev_priv->suspended_to_idle = suspend_to_idle(dev_priv);
1666
1667out: 1667out:
1668 enable_rpm_wakeref_asserts(dev_priv); 1668 enable_rpm_wakeref_asserts(dev_priv);
1669 1669
@@ -1830,8 +1830,7 @@ static int i915_drm_resume_early(struct drm_device *dev)
1830 intel_uncore_resume_early(dev_priv); 1830 intel_uncore_resume_early(dev_priv);
1831 1831
1832 if (IS_GEN9_LP(dev_priv)) { 1832 if (IS_GEN9_LP(dev_priv)) {
1833 if (!dev_priv->suspended_to_idle) 1833 gen9_sanitize_dc_state(dev_priv);
1834 gen9_sanitize_dc_state(dev_priv);
1835 bxt_disable_dc9(dev_priv); 1834 bxt_disable_dc9(dev_priv);
1836 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 1835 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
1837 hsw_disable_pc8(dev_priv); 1836 hsw_disable_pc8(dev_priv);
@@ -1839,8 +1838,7 @@ static int i915_drm_resume_early(struct drm_device *dev)
1839 1838
1840 intel_uncore_sanitize(dev_priv); 1839 intel_uncore_sanitize(dev_priv);
1841 1840
1842 if (IS_GEN9_LP(dev_priv) || 1841 if (dev_priv->power_domains_suspended)
1843 !(dev_priv->suspended_to_idle && dev_priv->csr.dmc_payload))
1844 intel_power_domains_init_hw(dev_priv, true); 1842 intel_power_domains_init_hw(dev_priv, true);
1845 else 1843 else
1846 intel_display_set_init_power(dev_priv, true); 1844 intel_display_set_init_power(dev_priv, true);
@@ -1850,7 +1848,7 @@ static int i915_drm_resume_early(struct drm_device *dev)
1850 enable_rpm_wakeref_asserts(dev_priv); 1848 enable_rpm_wakeref_asserts(dev_priv);
1851 1849
1852out: 1850out:
1853 dev_priv->suspended_to_idle = false; 1851 dev_priv->power_domains_suspended = false;
1854 1852
1855 return ret; 1853 return ret;
1856} 1854}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 6e740f6fe33f..ce18b6cf6e68 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2119,7 +2119,7 @@ struct drm_i915_private {
2119 u32 bxt_phy_grc; 2119 u32 bxt_phy_grc;
2120 2120
2121 u32 suspend_count; 2121 u32 suspend_count;
2122 bool suspended_to_idle; 2122 bool power_domains_suspended;
2123 struct i915_suspend_saved_registers regfile; 2123 struct i915_suspend_saved_registers regfile;
2124 struct vlv_s0ix_state vlv_s0ix_state; 2124 struct vlv_s0ix_state vlv_s0ix_state;
2125 2125