diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 2 |
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 | |||
| 1667 | out: | 1667 | out: |
| 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 | ||
| 1852 | out: | 1850 | out: |
| 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 | ||
