@@ -1282,6 +1282,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
1282
1282
if (INTEL_INFO (dev_priv )-> num_pipes )
1283
1283
drm_kms_helper_poll_init (dev );
1284
1284
1285
+ intel_power_domains_enable (dev_priv );
1285
1286
intel_runtime_pm_enable (dev_priv );
1286
1287
}
1287
1288
@@ -1292,6 +1293,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
1292
1293
static void i915_driver_unregister (struct drm_i915_private * dev_priv )
1293
1294
{
1294
1295
intel_runtime_pm_disable (dev_priv );
1296
+ intel_power_domains_disable (dev_priv );
1295
1297
1296
1298
intel_fbdev_unregister (dev_priv );
1297
1299
intel_audio_deinit (dev_priv );
@@ -1374,7 +1376,7 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
1374
1376
if (ret < 0 )
1375
1377
goto out_pci_disable ;
1376
1378
1377
- intel_runtime_pm_get (dev_priv );
1379
+ disable_rpm_wakeref_asserts (dev_priv );
1378
1380
1379
1381
ret = i915_driver_init_mmio (dev_priv );
1380
1382
if (ret < 0 )
@@ -1404,7 +1406,7 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
1404
1406
1405
1407
intel_init_ipc (dev_priv );
1406
1408
1407
- intel_runtime_pm_put (dev_priv );
1409
+ enable_rpm_wakeref_asserts (dev_priv );
1408
1410
1409
1411
i915_welcome_messages (dev_priv );
1410
1412
@@ -1415,7 +1417,7 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
1415
1417
out_cleanup_mmio :
1416
1418
i915_driver_cleanup_mmio (dev_priv );
1417
1419
out_runtime_pm_put :
1418
- intel_runtime_pm_put (dev_priv );
1420
+ enable_rpm_wakeref_asserts (dev_priv );
1419
1421
i915_driver_cleanup_early (dev_priv );
1420
1422
out_pci_disable :
1421
1423
pci_disable_device (pdev );
@@ -1433,7 +1435,7 @@ void i915_driver_unload(struct drm_device *dev)
1433
1435
struct drm_i915_private * dev_priv = to_i915 (dev );
1434
1436
struct pci_dev * pdev = dev_priv -> drm .pdev ;
1435
1437
1436
- intel_display_power_get (dev_priv , POWER_DOMAIN_INIT );
1438
+ disable_rpm_wakeref_asserts (dev_priv );
1437
1439
1438
1440
i915_driver_unregister (dev_priv );
1439
1441
@@ -1465,7 +1467,8 @@ void i915_driver_unload(struct drm_device *dev)
1465
1467
i915_driver_cleanup_hw (dev_priv );
1466
1468
i915_driver_cleanup_mmio (dev_priv );
1467
1469
1468
- intel_display_power_put (dev_priv , POWER_DOMAIN_INIT );
1470
+ enable_rpm_wakeref_asserts (dev_priv );
1471
+
1469
1472
WARN_ON (atomic_read (& dev_priv -> runtime_pm .wakeref_count ));
1470
1473
}
1471
1474
@@ -1575,7 +1578,7 @@ static int i915_drm_suspend(struct drm_device *dev)
1575
1578
1576
1579
/* We do a lot of poking in a lot of registers, make sure they work
1577
1580
* properly. */
1578
- intel_display_set_init_power (dev_priv , true );
1581
+ intel_power_domains_disable (dev_priv );
1579
1582
1580
1583
drm_kms_helper_poll_disable (dev );
1581
1584
@@ -1612,6 +1615,18 @@ static int i915_drm_suspend(struct drm_device *dev)
1612
1615
return 0 ;
1613
1616
}
1614
1617
1618
+ static enum i915_drm_suspend_mode
1619
+ get_suspend_mode (struct drm_i915_private * dev_priv , bool hibernate )
1620
+ {
1621
+ if (hibernate )
1622
+ return I915_DRM_SUSPEND_HIBERNATE ;
1623
+
1624
+ if (suspend_to_idle (dev_priv ))
1625
+ return I915_DRM_SUSPEND_IDLE ;
1626
+
1627
+ return I915_DRM_SUSPEND_MEM ;
1628
+ }
1629
+
1615
1630
static int i915_drm_suspend_late (struct drm_device * dev , bool hibernation )
1616
1631
{
1617
1632
struct drm_i915_private * dev_priv = to_i915 (dev );
@@ -1622,21 +1637,10 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
1622
1637
1623
1638
i915_gem_suspend_late (dev_priv );
1624
1639
1625
- intel_display_set_init_power (dev_priv , false);
1626
1640
intel_uncore_suspend (dev_priv );
1627
1641
1628
- /*
1629
- * In case of firmware assisted context save/restore don't manually
1630
- * deinit the power domains. This also means the CSR/DMC firmware will
1631
- * stay active, it will power down any HW resources as required and
1632
- * also enable deeper system power states that would be blocked if the
1633
- * firmware was inactive.
1634
- */
1635
- if (IS_GEN9_LP (dev_priv ) || hibernation || !suspend_to_idle (dev_priv ) ||
1636
- dev_priv -> csr .dmc_payload == NULL ) {
1637
- intel_power_domains_suspend (dev_priv );
1638
- dev_priv -> power_domains_suspended = true;
1639
- }
1642
+ intel_power_domains_suspend (dev_priv ,
1643
+ get_suspend_mode (dev_priv , hibernation ));
1640
1644
1641
1645
ret = 0 ;
1642
1646
if (IS_GEN9_LP (dev_priv ))
@@ -1648,10 +1652,7 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
1648
1652
1649
1653
if (ret ) {
1650
1654
DRM_ERROR ("Suspend complete failed: %d\n" , ret );
1651
- if (dev_priv -> power_domains_suspended ) {
1652
- intel_power_domains_init_hw (dev_priv , true);
1653
- dev_priv -> power_domains_suspended = false;
1654
- }
1655
+ intel_power_domains_resume (dev_priv );
1655
1656
1656
1657
goto out ;
1657
1658
}
@@ -1768,6 +1769,8 @@ static int i915_drm_resume(struct drm_device *dev)
1768
1769
1769
1770
intel_opregion_notify_adapter (dev_priv , PCI_D0 );
1770
1771
1772
+ intel_power_domains_enable (dev_priv );
1773
+
1771
1774
enable_rpm_wakeref_asserts (dev_priv );
1772
1775
1773
1776
return 0 ;
@@ -1802,7 +1805,7 @@ static int i915_drm_resume_early(struct drm_device *dev)
1802
1805
ret = pci_set_power_state (pdev , PCI_D0 );
1803
1806
if (ret ) {
1804
1807
DRM_ERROR ("failed to set PCI D0 power state (%d)\n" , ret );
1805
- goto out ;
1808
+ return ret ;
1806
1809
}
1807
1810
1808
1811
/*
@@ -1818,10 +1821,8 @@ static int i915_drm_resume_early(struct drm_device *dev)
1818
1821
* depend on the device enable refcount we can't anyway depend on them
1819
1822
* disabling/enabling the device.
1820
1823
*/
1821
- if (pci_enable_device (pdev )) {
1822
- ret = - EIO ;
1823
- goto out ;
1824
- }
1824
+ if (pci_enable_device (pdev ))
1825
+ return - EIO ;
1825
1826
1826
1827
pci_set_master (pdev );
1827
1828
@@ -1844,18 +1845,12 @@ static int i915_drm_resume_early(struct drm_device *dev)
1844
1845
1845
1846
intel_uncore_sanitize (dev_priv );
1846
1847
1847
- if (dev_priv -> power_domains_suspended )
1848
- intel_power_domains_init_hw (dev_priv , true);
1849
- else
1850
- intel_display_set_init_power (dev_priv , true);
1848
+ intel_power_domains_resume (dev_priv );
1851
1849
1852
1850
intel_engines_sanitize (dev_priv );
1853
1851
1854
1852
enable_rpm_wakeref_asserts (dev_priv );
1855
1853
1856
- out :
1857
- dev_priv -> power_domains_suspended = false;
1858
-
1859
1854
return ret ;
1860
1855
}
1861
1856
0 commit comments