aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-12-18 14:07:14 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-12-24 17:57:06 -0500
commit6c7bccea390853bdec5b76fe31fc50f3b36f75d5 (patch)
tree2b6002db2816965b8d2850728b81ff0099b036a9 /drivers
parente14cd2bbcb98541e199b7223f38d61527dfe45c9 (diff)
drm/radeon/pm: move pm handling into the asic specific code
We need more control over the ordering of dpm init with respect to the rest of the asic. Specifically, the SMC has to be initialized before the rlc and cg/pg. The pm code currently initializes late in the driver, but we need it to happen much earlier so move pm handling into the asic specific callbacks. This makes dpm more reliable and makes clockgating work properly on CIK parts and should help on SI parts as well. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/btc_dpm.c5
-rw-r--r--drivers/gpu/drm/radeon/ci_dpm.c6
-rw-r--r--drivers/gpu/drm/radeon/cik.c11
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c9
-rw-r--r--drivers/gpu/drm/radeon/ni.c9
-rw-r--r--drivers/gpu/drm/radeon/ni_dpm.c6
-rw-r--r--drivers/gpu/drm/radeon/r100.c7
-rw-r--r--drivers/gpu/drm/radeon/r300.c7
-rw-r--r--drivers/gpu/drm/radeon/r420.c7
-rw-r--r--drivers/gpu/drm/radeon/r520.c5
-rw-r--r--drivers/gpu/drm/radeon/r600.c7
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c14
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c17
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c11
-rw-r--r--drivers/gpu/drm/radeon/rs400.c7
-rw-r--r--drivers/gpu/drm/radeon/rs600.c7
-rw-r--r--drivers/gpu/drm/radeon/rs690.c7
-rw-r--r--drivers/gpu/drm/radeon/rv515.c7
-rw-r--r--drivers/gpu/drm/radeon/rv770.c7
-rw-r--r--drivers/gpu/drm/radeon/si.c19
-rw-r--r--drivers/gpu/drm/radeon/si_dpm.c7
21 files changed, 158 insertions, 24 deletions
diff --git a/drivers/gpu/drm/radeon/btc_dpm.c b/drivers/gpu/drm/radeon/btc_dpm.c
index 2eb985a0242c..0fbd36f3d4e9 100644
--- a/drivers/gpu/drm/radeon/btc_dpm.c
+++ b/drivers/gpu/drm/radeon/btc_dpm.c
@@ -49,6 +49,7 @@ struct rv7xx_ps *rv770_get_ps(struct radeon_ps *rps);
49struct rv7xx_power_info *rv770_get_pi(struct radeon_device *rdev); 49struct rv7xx_power_info *rv770_get_pi(struct radeon_device *rdev);
50struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev); 50struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
51 51
52extern int ni_mc_load_microcode(struct radeon_device *rdev);
52 53
53//********* BARTS **************// 54//********* BARTS **************//
54static const u32 barts_cgcg_cgls_default[] = 55static const u32 barts_cgcg_cgls_default[] =
@@ -2561,7 +2562,11 @@ void btc_dpm_disable(struct radeon_device *rdev)
2561void btc_dpm_setup_asic(struct radeon_device *rdev) 2562void btc_dpm_setup_asic(struct radeon_device *rdev)
2562{ 2563{
2563 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 2564 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2565 int r;
2564 2566
2567 r = ni_mc_load_microcode(rdev);
2568 if (r)
2569 DRM_ERROR("Failed to load MC firmware!\n");
2565 rv770_get_memory_type(rdev); 2570 rv770_get_memory_type(rdev);
2566 rv740_read_clock_registers(rdev); 2571 rv740_read_clock_registers(rdev);
2567 btc_read_arb_registers(rdev); 2572 btc_read_arb_registers(rdev);
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c
index 6eab12d1641b..a3c4711d8222 100644
--- a/drivers/gpu/drm/radeon/ci_dpm.c
+++ b/drivers/gpu/drm/radeon/ci_dpm.c
@@ -171,6 +171,7 @@ extern void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev,
171 struct atom_voltage_table *voltage_table); 171 struct atom_voltage_table *voltage_table);
172extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev); 172extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev);
173extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev); 173extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev);
174extern int ci_mc_load_microcode(struct radeon_device *rdev);
174 175
175static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev, 176static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev,
176 struct atom_voltage_table_entry *voltage_table, 177 struct atom_voltage_table_entry *voltage_table,
@@ -4547,6 +4548,11 @@ void ci_dpm_post_set_power_state(struct radeon_device *rdev)
4547 4548
4548void ci_dpm_setup_asic(struct radeon_device *rdev) 4549void ci_dpm_setup_asic(struct radeon_device *rdev)
4549{ 4550{
4551 int r;
4552
4553 r = ci_mc_load_microcode(rdev);
4554 if (r)
4555 DRM_ERROR("Failed to load MC firmware!\n");
4550 ci_read_clock_registers(rdev); 4556 ci_read_clock_registers(rdev);
4551 ci_get_memory_type(rdev); 4557 ci_get_memory_type(rdev);
4552 ci_enable_acpi_power_management(rdev); 4558 ci_enable_acpi_power_management(rdev);
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 4ddc3e5c2d97..25a6ef6c7e4c 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -1697,7 +1697,7 @@ static void cik_srbm_select(struct radeon_device *rdev,
1697 * Load the GDDR MC ucode into the hw (CIK). 1697 * Load the GDDR MC ucode into the hw (CIK).
1698 * Returns 0 on success, error on failure. 1698 * Returns 0 on success, error on failure.
1699 */ 1699 */
1700static int ci_mc_load_microcode(struct radeon_device *rdev) 1700int ci_mc_load_microcode(struct radeon_device *rdev)
1701{ 1701{
1702 const __be32 *fw_data; 1702 const __be32 *fw_data;
1703 u32 running, blackout = 0; 1703 u32 running, blackout = 0;
@@ -7501,7 +7501,7 @@ static int cik_startup(struct radeon_device *rdev)
7501 7501
7502 cik_mc_program(rdev); 7502 cik_mc_program(rdev);
7503 7503
7504 if (!(rdev->flags & RADEON_IS_IGP)) { 7504 if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
7505 r = ci_mc_load_microcode(rdev); 7505 r = ci_mc_load_microcode(rdev);
7506 if (r) { 7506 if (r) {
7507 DRM_ERROR("Failed to load MC firmware!\n"); 7507 DRM_ERROR("Failed to load MC firmware!\n");
@@ -7710,6 +7710,8 @@ int cik_resume(struct radeon_device *rdev)
7710 /* init golden registers */ 7710 /* init golden registers */
7711 cik_init_golden_registers(rdev); 7711 cik_init_golden_registers(rdev);
7712 7712
7713 radeon_pm_resume(rdev);
7714
7713 rdev->accel_working = true; 7715 rdev->accel_working = true;
7714 r = cik_startup(rdev); 7716 r = cik_startup(rdev);
7715 if (r) { 7717 if (r) {
@@ -7733,6 +7735,7 @@ int cik_resume(struct radeon_device *rdev)
7733 */ 7735 */
7734int cik_suspend(struct radeon_device *rdev) 7736int cik_suspend(struct radeon_device *rdev)
7735{ 7737{
7738 radeon_pm_suspend(rdev);
7736 dce6_audio_fini(rdev); 7739 dce6_audio_fini(rdev);
7737 radeon_vm_manager_fini(rdev); 7740 radeon_vm_manager_fini(rdev);
7738 cik_cp_enable(rdev, false); 7741 cik_cp_enable(rdev, false);
@@ -7835,6 +7838,9 @@ int cik_init(struct radeon_device *rdev)
7835 } 7838 }
7836 } 7839 }
7837 7840
7841 /* Initialize power management */
7842 radeon_pm_init(rdev);
7843
7838 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 7844 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
7839 ring->ring_obj = NULL; 7845 ring->ring_obj = NULL;
7840 r600_ring_init(rdev, ring, 1024 * 1024); 7846 r600_ring_init(rdev, ring, 1024 * 1024);
@@ -7915,6 +7921,7 @@ int cik_init(struct radeon_device *rdev)
7915 */ 7921 */
7916void cik_fini(struct radeon_device *rdev) 7922void cik_fini(struct radeon_device *rdev)
7917{ 7923{
7924 radeon_pm_fini(rdev);
7918 cik_cp_fini(rdev); 7925 cik_cp_fini(rdev);
7919 cik_sdma_fini(rdev); 7926 cik_sdma_fini(rdev);
7920 cik_fini_pg(rdev); 7927 cik_fini_pg(rdev);
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 4abf8b651b49..594a3d7abcf8 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -5109,7 +5109,7 @@ static int evergreen_startup(struct radeon_device *rdev)
5109 5109
5110 evergreen_mc_program(rdev); 5110 evergreen_mc_program(rdev);
5111 5111
5112 if (ASIC_IS_DCE5(rdev)) { 5112 if (ASIC_IS_DCE5(rdev) && !rdev->pm.dpm_enabled) {
5113 r = ni_mc_load_microcode(rdev); 5113 r = ni_mc_load_microcode(rdev);
5114 if (r) { 5114 if (r) {
5115 DRM_ERROR("Failed to load MC firmware!\n"); 5115 DRM_ERROR("Failed to load MC firmware!\n");
@@ -5252,6 +5252,8 @@ int evergreen_resume(struct radeon_device *rdev)
5252 /* init golden registers */ 5252 /* init golden registers */
5253 evergreen_init_golden_registers(rdev); 5253 evergreen_init_golden_registers(rdev);
5254 5254
5255 radeon_pm_resume(rdev);
5256
5255 rdev->accel_working = true; 5257 rdev->accel_working = true;
5256 r = evergreen_startup(rdev); 5258 r = evergreen_startup(rdev);
5257 if (r) { 5259 if (r) {
@@ -5266,6 +5268,7 @@ int evergreen_resume(struct radeon_device *rdev)
5266 5268
5267int evergreen_suspend(struct radeon_device *rdev) 5269int evergreen_suspend(struct radeon_device *rdev)
5268{ 5270{
5271 radeon_pm_suspend(rdev);
5269 r600_audio_fini(rdev); 5272 r600_audio_fini(rdev);
5270 uvd_v1_0_fini(rdev); 5273 uvd_v1_0_fini(rdev);
5271 radeon_uvd_suspend(rdev); 5274 radeon_uvd_suspend(rdev);
@@ -5360,6 +5363,9 @@ int evergreen_init(struct radeon_device *rdev)
5360 } 5363 }
5361 } 5364 }
5362 5365
5366 /* Initialize power management */
5367 radeon_pm_init(rdev);
5368
5363 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; 5369 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
5364 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); 5370 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
5365 5371
@@ -5412,6 +5418,7 @@ int evergreen_init(struct radeon_device *rdev)
5412 5418
5413void evergreen_fini(struct radeon_device *rdev) 5419void evergreen_fini(struct radeon_device *rdev)
5414{ 5420{
5421 radeon_pm_fini(rdev);
5415 r600_audio_fini(rdev); 5422 r600_audio_fini(rdev);
5416 r700_cp_fini(rdev); 5423 r700_cp_fini(rdev);
5417 r600_dma_fini(rdev); 5424 r600_dma_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 757141a75c64..494ba006e8b1 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1866,7 +1866,7 @@ static int cayman_startup(struct radeon_device *rdev)
1866 1866
1867 evergreen_mc_program(rdev); 1867 evergreen_mc_program(rdev);
1868 1868
1869 if (!(rdev->flags & RADEON_IS_IGP)) { 1869 if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
1870 r = ni_mc_load_microcode(rdev); 1870 r = ni_mc_load_microcode(rdev);
1871 if (r) { 1871 if (r) {
1872 DRM_ERROR("Failed to load MC firmware!\n"); 1872 DRM_ERROR("Failed to load MC firmware!\n");
@@ -2035,6 +2035,8 @@ int cayman_resume(struct radeon_device *rdev)
2035 /* init golden registers */ 2035 /* init golden registers */
2036 ni_init_golden_registers(rdev); 2036 ni_init_golden_registers(rdev);
2037 2037
2038 radeon_pm_resume(rdev);
2039
2038 rdev->accel_working = true; 2040 rdev->accel_working = true;
2039 r = cayman_startup(rdev); 2041 r = cayman_startup(rdev);
2040 if (r) { 2042 if (r) {
@@ -2047,6 +2049,7 @@ int cayman_resume(struct radeon_device *rdev)
2047 2049
2048int cayman_suspend(struct radeon_device *rdev) 2050int cayman_suspend(struct radeon_device *rdev)
2049{ 2051{
2052 radeon_pm_suspend(rdev);
2050 if (ASIC_IS_DCE6(rdev)) 2053 if (ASIC_IS_DCE6(rdev))
2051 dce6_audio_fini(rdev); 2054 dce6_audio_fini(rdev);
2052 else 2055 else
@@ -2135,6 +2138,9 @@ int cayman_init(struct radeon_device *rdev)
2135 } 2138 }
2136 } 2139 }
2137 2140
2141 /* Initialize power management */
2142 radeon_pm_init(rdev);
2143
2138 ring->ring_obj = NULL; 2144 ring->ring_obj = NULL;
2139 r600_ring_init(rdev, ring, 1024 * 1024); 2145 r600_ring_init(rdev, ring, 1024 * 1024);
2140 2146
@@ -2194,6 +2200,7 @@ int cayman_init(struct radeon_device *rdev)
2194 2200
2195void cayman_fini(struct radeon_device *rdev) 2201void cayman_fini(struct radeon_device *rdev)
2196{ 2202{
2203 radeon_pm_fini(rdev);
2197 cayman_cp_fini(rdev); 2204 cayman_cp_fini(rdev);
2198 cayman_dma_fini(rdev); 2205 cayman_dma_fini(rdev);
2199 r600_irq_fini(rdev); 2206 r600_irq_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c
index cb92287ca985..c351226ecb31 100644
--- a/drivers/gpu/drm/radeon/ni_dpm.c
+++ b/drivers/gpu/drm/radeon/ni_dpm.c
@@ -720,6 +720,8 @@ static const u32 cayman_sysls_enable[] =
720struct rv7xx_power_info *rv770_get_pi(struct radeon_device *rdev); 720struct rv7xx_power_info *rv770_get_pi(struct radeon_device *rdev);
721struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev); 721struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
722 722
723extern int ni_mc_load_microcode(struct radeon_device *rdev);
724
723struct ni_power_info *ni_get_pi(struct radeon_device *rdev) 725struct ni_power_info *ni_get_pi(struct radeon_device *rdev)
724{ 726{
725 struct ni_power_info *pi = rdev->pm.dpm.priv; 727 struct ni_power_info *pi = rdev->pm.dpm.priv;
@@ -3565,7 +3567,11 @@ void ni_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev,
3565void ni_dpm_setup_asic(struct radeon_device *rdev) 3567void ni_dpm_setup_asic(struct radeon_device *rdev)
3566{ 3568{
3567 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 3569 struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
3570 int r;
3568 3571
3572 r = ni_mc_load_microcode(rdev);
3573 if (r)
3574 DRM_ERROR("Failed to load MC firmware!\n");
3569 ni_read_clock_registers(rdev); 3575 ni_read_clock_registers(rdev);
3570 btc_read_arb_registers(rdev); 3576 btc_read_arb_registers(rdev);
3571 rv770_get_memory_type(rdev); 3577 rv770_get_memory_type(rdev);
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 10abc4d5a6cc..526d2aa7d70f 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -3913,6 +3913,8 @@ int r100_resume(struct radeon_device *rdev)
3913 /* Initialize surface registers */ 3913 /* Initialize surface registers */
3914 radeon_surface_init(rdev); 3914 radeon_surface_init(rdev);
3915 3915
3916 radeon_pm_resume(rdev);
3917
3916 rdev->accel_working = true; 3918 rdev->accel_working = true;
3917 r = r100_startup(rdev); 3919 r = r100_startup(rdev);
3918 if (r) { 3920 if (r) {
@@ -3923,6 +3925,7 @@ int r100_resume(struct radeon_device *rdev)
3923 3925
3924int r100_suspend(struct radeon_device *rdev) 3926int r100_suspend(struct radeon_device *rdev)
3925{ 3927{
3928 radeon_pm_suspend(rdev);
3926 r100_cp_disable(rdev); 3929 r100_cp_disable(rdev);
3927 radeon_wb_disable(rdev); 3930 radeon_wb_disable(rdev);
3928 r100_irq_disable(rdev); 3931 r100_irq_disable(rdev);
@@ -3933,6 +3936,7 @@ int r100_suspend(struct radeon_device *rdev)
3933 3936
3934void r100_fini(struct radeon_device *rdev) 3937void r100_fini(struct radeon_device *rdev)
3935{ 3938{
3939 radeon_pm_fini(rdev);
3936 r100_cp_fini(rdev); 3940 r100_cp_fini(rdev);
3937 radeon_wb_fini(rdev); 3941 radeon_wb_fini(rdev);
3938 radeon_ib_pool_fini(rdev); 3942 radeon_ib_pool_fini(rdev);
@@ -4039,6 +4043,9 @@ int r100_init(struct radeon_device *rdev)
4039 } 4043 }
4040 r100_set_safe_registers(rdev); 4044 r100_set_safe_registers(rdev);
4041 4045
4046 /* Initialize power management */
4047 radeon_pm_init(rdev);
4048
4042 rdev->accel_working = true; 4049 rdev->accel_working = true;
4043 r = r100_startup(rdev); 4050 r = r100_startup(rdev);
4044 if (r) { 4051 if (r) {
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index d8dd269b9159..7c63ef840e86 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -1430,6 +1430,8 @@ int r300_resume(struct radeon_device *rdev)
1430 /* Initialize surface registers */ 1430 /* Initialize surface registers */
1431 radeon_surface_init(rdev); 1431 radeon_surface_init(rdev);
1432 1432
1433 radeon_pm_resume(rdev);
1434
1433 rdev->accel_working = true; 1435 rdev->accel_working = true;
1434 r = r300_startup(rdev); 1436 r = r300_startup(rdev);
1435 if (r) { 1437 if (r) {
@@ -1440,6 +1442,7 @@ int r300_resume(struct radeon_device *rdev)
1440 1442
1441int r300_suspend(struct radeon_device *rdev) 1443int r300_suspend(struct radeon_device *rdev)
1442{ 1444{
1445 radeon_pm_suspend(rdev);
1443 r100_cp_disable(rdev); 1446 r100_cp_disable(rdev);
1444 radeon_wb_disable(rdev); 1447 radeon_wb_disable(rdev);
1445 r100_irq_disable(rdev); 1448 r100_irq_disable(rdev);
@@ -1452,6 +1455,7 @@ int r300_suspend(struct radeon_device *rdev)
1452 1455
1453void r300_fini(struct radeon_device *rdev) 1456void r300_fini(struct radeon_device *rdev)
1454{ 1457{
1458 radeon_pm_fini(rdev);
1455 r100_cp_fini(rdev); 1459 r100_cp_fini(rdev);
1456 radeon_wb_fini(rdev); 1460 radeon_wb_fini(rdev);
1457 radeon_ib_pool_fini(rdev); 1461 radeon_ib_pool_fini(rdev);
@@ -1538,6 +1542,9 @@ int r300_init(struct radeon_device *rdev)
1538 } 1542 }
1539 r300_set_reg_safe(rdev); 1543 r300_set_reg_safe(rdev);
1540 1544
1545 /* Initialize power management */
1546 radeon_pm_init(rdev);
1547
1541 rdev->accel_working = true; 1548 rdev->accel_working = true;
1542 r = r300_startup(rdev); 1549 r = r300_startup(rdev);
1543 if (r) { 1550 if (r) {
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 6edf2b3a52b4..3768aab2710b 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -325,6 +325,8 @@ int r420_resume(struct radeon_device *rdev)
325 /* Initialize surface registers */ 325 /* Initialize surface registers */
326 radeon_surface_init(rdev); 326 radeon_surface_init(rdev);
327 327
328 radeon_pm_resume(rdev);
329
328 rdev->accel_working = true; 330 rdev->accel_working = true;
329 r = r420_startup(rdev); 331 r = r420_startup(rdev);
330 if (r) { 332 if (r) {
@@ -335,6 +337,7 @@ int r420_resume(struct radeon_device *rdev)
335 337
336int r420_suspend(struct radeon_device *rdev) 338int r420_suspend(struct radeon_device *rdev)
337{ 339{
340 radeon_pm_suspend(rdev);
338 r420_cp_errata_fini(rdev); 341 r420_cp_errata_fini(rdev);
339 r100_cp_disable(rdev); 342 r100_cp_disable(rdev);
340 radeon_wb_disable(rdev); 343 radeon_wb_disable(rdev);
@@ -348,6 +351,7 @@ int r420_suspend(struct radeon_device *rdev)
348 351
349void r420_fini(struct radeon_device *rdev) 352void r420_fini(struct radeon_device *rdev)
350{ 353{
354 radeon_pm_fini(rdev);
351 r100_cp_fini(rdev); 355 r100_cp_fini(rdev);
352 radeon_wb_fini(rdev); 356 radeon_wb_fini(rdev);
353 radeon_ib_pool_fini(rdev); 357 radeon_ib_pool_fini(rdev);
@@ -444,6 +448,9 @@ int r420_init(struct radeon_device *rdev)
444 } 448 }
445 r420_set_reg_safe(rdev); 449 r420_set_reg_safe(rdev);
446 450
451 /* Initialize power management */
452 radeon_pm_init(rdev);
453
447 rdev->accel_working = true; 454 rdev->accel_working = true;
448 r = r420_startup(rdev); 455 r = r420_startup(rdev);
449 if (r) { 456 if (r) {
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c
index e1aece73b370..e209eb75024f 100644
--- a/drivers/gpu/drm/radeon/r520.c
+++ b/drivers/gpu/drm/radeon/r520.c
@@ -240,6 +240,8 @@ int r520_resume(struct radeon_device *rdev)
240 /* Initialize surface registers */ 240 /* Initialize surface registers */
241 radeon_surface_init(rdev); 241 radeon_surface_init(rdev);
242 242
243 radeon_pm_resume(rdev);
244
243 rdev->accel_working = true; 245 rdev->accel_working = true;
244 r = r520_startup(rdev); 246 r = r520_startup(rdev);
245 if (r) { 247 if (r) {
@@ -312,6 +314,9 @@ int r520_init(struct radeon_device *rdev)
312 return r; 314 return r;
313 rv515_set_safe_registers(rdev); 315 rv515_set_safe_registers(rdev);
314 316
317 /* Initialize power management */
318 radeon_pm_init(rdev);
319
315 rdev->accel_working = true; 320 rdev->accel_working = true;
316 r = r520_startup(rdev); 321 r = r520_startup(rdev);
317 if (r) { 322 if (r) {
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 09e83f264958..d05611aba134 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2881,6 +2881,8 @@ int r600_resume(struct radeon_device *rdev)
2881 /* post card */ 2881 /* post card */
2882 atom_asic_init(rdev->mode_info.atom_context); 2882 atom_asic_init(rdev->mode_info.atom_context);
2883 2883
2884 radeon_pm_resume(rdev);
2885
2884 rdev->accel_working = true; 2886 rdev->accel_working = true;
2885 r = r600_startup(rdev); 2887 r = r600_startup(rdev);
2886 if (r) { 2888 if (r) {
@@ -2894,6 +2896,7 @@ int r600_resume(struct radeon_device *rdev)
2894 2896
2895int r600_suspend(struct radeon_device *rdev) 2897int r600_suspend(struct radeon_device *rdev)
2896{ 2898{
2899 radeon_pm_suspend(rdev);
2897 r600_audio_fini(rdev); 2900 r600_audio_fini(rdev);
2898 r600_cp_stop(rdev); 2901 r600_cp_stop(rdev);
2899 r600_dma_stop(rdev); 2902 r600_dma_stop(rdev);
@@ -2970,6 +2973,9 @@ int r600_init(struct radeon_device *rdev)
2970 } 2973 }
2971 } 2974 }
2972 2975
2976 /* Initialize power management */
2977 radeon_pm_init(rdev);
2978
2973 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; 2979 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
2974 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); 2980 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
2975 2981
@@ -3002,6 +3008,7 @@ int r600_init(struct radeon_device *rdev)
3002 3008
3003void r600_fini(struct radeon_device *rdev) 3009void r600_fini(struct radeon_device *rdev)
3004{ 3010{
3011 radeon_pm_fini(rdev);
3005 r600_audio_fini(rdev); 3012 r600_audio_fini(rdev);
3006 r600_cp_fini(rdev); 3013 r600_cp_fini(rdev);
3007 r600_dma_fini(rdev); 3014 r600_dma_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 39b033b441d2..5f0ff43e5bb9 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1330,6 +1330,7 @@ int radeon_device_init(struct radeon_device *rdev,
1330 if (r) 1330 if (r)
1331 return r; 1331 return r;
1332 } 1332 }
1333
1333 if ((radeon_testing & 1)) { 1334 if ((radeon_testing & 1)) {
1334 if (rdev->accel_working) 1335 if (rdev->accel_working)
1335 radeon_test_moves(rdev); 1336 radeon_test_moves(rdev);
@@ -1455,7 +1456,6 @@ int radeon_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
1455 1456
1456 radeon_save_bios_scratch_regs(rdev); 1457 radeon_save_bios_scratch_regs(rdev);
1457 1458
1458 radeon_pm_suspend(rdev);
1459 radeon_suspend(rdev); 1459 radeon_suspend(rdev);
1460 radeon_hpd_fini(rdev); 1460 radeon_hpd_fini(rdev);
1461 /* evict remaining vram memory */ 1461 /* evict remaining vram memory */
@@ -1516,14 +1516,22 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
1516 if (r) 1516 if (r)
1517 DRM_ERROR("ib ring test failed (%d).\n", r); 1517 DRM_ERROR("ib ring test failed (%d).\n", r);
1518 1518
1519 radeon_pm_resume(rdev); 1519 if (rdev->pm.dpm_enabled) {
1520 /* do dpm late init */
1521 r = radeon_pm_late_init(rdev);
1522 if (r) {
1523 rdev->pm.dpm_enabled = false;
1524 DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n");
1525 }
1526 }
1527
1520 radeon_restore_bios_scratch_regs(rdev); 1528 radeon_restore_bios_scratch_regs(rdev);
1521 1529
1522 if (fbcon) { 1530 if (fbcon) {
1523 radeon_fbdev_set_suspend(rdev, 0); 1531 radeon_fbdev_set_suspend(rdev, 0);
1524 console_unlock(); 1532 console_unlock();
1525 } 1533 }
1526 1534
1527 /* init dig PHYs, disp eng pll */ 1535 /* init dig PHYs, disp eng pll */
1528 if (rdev->is_atom_bios) { 1536 if (rdev->is_atom_bios) {
1529 radeon_atom_encoder_init(rdev); 1537 radeon_atom_encoder_init(rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 7b253815a323..7ea647b84733 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -1464,12 +1464,22 @@ int radeon_modeset_init(struct radeon_device *rdev)
1464 /* setup afmt */ 1464 /* setup afmt */
1465 radeon_afmt_init(rdev); 1465 radeon_afmt_init(rdev);
1466 1466
1467 /* Initialize power management */
1468 radeon_pm_init(rdev);
1469
1470 radeon_fbdev_init(rdev); 1467 radeon_fbdev_init(rdev);
1471 drm_kms_helper_poll_init(rdev->ddev); 1468 drm_kms_helper_poll_init(rdev->ddev);
1472 1469
1470 if (rdev->pm.dpm_enabled) {
1471 /* do dpm late init */
1472 ret = radeon_pm_late_init(rdev);
1473 if (ret) {
1474 rdev->pm.dpm_enabled = false;
1475 DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n");
1476 }
1477 /* set the dpm state for PX since there won't be
1478 * a modeset to call this.
1479 */
1480 radeon_pm_compute_clocks(rdev);
1481 }
1482
1473 return 0; 1483 return 0;
1474} 1484}
1475 1485
@@ -1477,7 +1487,6 @@ void radeon_modeset_fini(struct radeon_device *rdev)
1477{ 1487{
1478 radeon_fbdev_fini(rdev); 1488 radeon_fbdev_fini(rdev);
1479 kfree(rdev->mode_info.bios_hardcoded_edid); 1489 kfree(rdev->mode_info.bios_hardcoded_edid);
1480 radeon_pm_fini(rdev);
1481 1490
1482 if (rdev->mode_info.mode_config_initialized) { 1491 if (rdev->mode_info.mode_config_initialized) {
1483 radeon_afmt_fini(rdev); 1492 radeon_afmt_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index 7fc76d165e89..933ada0147b5 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -1034,10 +1034,6 @@ static void radeon_pm_resume_dpm(struct radeon_device *rdev)
1034 mutex_unlock(&rdev->pm.mutex); 1034 mutex_unlock(&rdev->pm.mutex);
1035 if (ret) 1035 if (ret)
1036 goto dpm_resume_fail; 1036 goto dpm_resume_fail;
1037 ret = radeon_pm_late_init(rdev);
1038 if (ret)
1039 goto dpm_resume_fail;
1040
1041 rdev->pm.dpm_enabled = true; 1037 rdev->pm.dpm_enabled = true;
1042 radeon_pm_compute_clocks(rdev); 1038 radeon_pm_compute_clocks(rdev);
1043 return; 1039 return;
@@ -1178,11 +1174,7 @@ static int radeon_pm_init_dpm(struct radeon_device *rdev)
1178 mutex_unlock(&rdev->pm.mutex); 1174 mutex_unlock(&rdev->pm.mutex);
1179 if (ret) 1175 if (ret)
1180 goto dpm_failed; 1176 goto dpm_failed;
1181 ret = radeon_pm_late_init(rdev);
1182 if (ret)
1183 goto dpm_failed;
1184 rdev->pm.dpm_enabled = true; 1177 rdev->pm.dpm_enabled = true;
1185 radeon_pm_compute_clocks(rdev);
1186 1178
1187 ret = device_create_file(rdev->dev, &dev_attr_power_dpm_state); 1179 ret = device_create_file(rdev->dev, &dev_attr_power_dpm_state);
1188 if (ret) 1180 if (ret)
@@ -1441,6 +1433,9 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
1441 struct drm_crtc *crtc; 1433 struct drm_crtc *crtc;
1442 struct radeon_crtc *radeon_crtc; 1434 struct radeon_crtc *radeon_crtc;
1443 1435
1436 if (!rdev->pm.dpm_enabled)
1437 return;
1438
1444 mutex_lock(&rdev->pm.mutex); 1439 mutex_lock(&rdev->pm.mutex);
1445 1440
1446 /* update active crtc counts */ 1441 /* update active crtc counts */
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
index 9566b5940a5a..b5c2369cda2f 100644
--- a/drivers/gpu/drm/radeon/rs400.c
+++ b/drivers/gpu/drm/radeon/rs400.c
@@ -474,6 +474,8 @@ int rs400_resume(struct radeon_device *rdev)
474 /* Initialize surface registers */ 474 /* Initialize surface registers */
475 radeon_surface_init(rdev); 475 radeon_surface_init(rdev);
476 476
477 radeon_pm_resume(rdev);
478
477 rdev->accel_working = true; 479 rdev->accel_working = true;
478 r = rs400_startup(rdev); 480 r = rs400_startup(rdev);
479 if (r) { 481 if (r) {
@@ -484,6 +486,7 @@ int rs400_resume(struct radeon_device *rdev)
484 486
485int rs400_suspend(struct radeon_device *rdev) 487int rs400_suspend(struct radeon_device *rdev)
486{ 488{
489 radeon_pm_suspend(rdev);
487 r100_cp_disable(rdev); 490 r100_cp_disable(rdev);
488 radeon_wb_disable(rdev); 491 radeon_wb_disable(rdev);
489 r100_irq_disable(rdev); 492 r100_irq_disable(rdev);
@@ -493,6 +496,7 @@ int rs400_suspend(struct radeon_device *rdev)
493 496
494void rs400_fini(struct radeon_device *rdev) 497void rs400_fini(struct radeon_device *rdev)
495{ 498{
499 radeon_pm_fini(rdev);
496 r100_cp_fini(rdev); 500 r100_cp_fini(rdev);
497 radeon_wb_fini(rdev); 501 radeon_wb_fini(rdev);
498 radeon_ib_pool_fini(rdev); 502 radeon_ib_pool_fini(rdev);
@@ -560,6 +564,9 @@ int rs400_init(struct radeon_device *rdev)
560 return r; 564 return r;
561 r300_set_reg_safe(rdev); 565 r300_set_reg_safe(rdev);
562 566
567 /* Initialize power management */
568 radeon_pm_init(rdev);
569
563 rdev->accel_working = true; 570 rdev->accel_working = true;
564 r = rs400_startup(rdev); 571 r = rs400_startup(rdev);
565 if (r) { 572 if (r) {
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 76cc8d3aafec..fdcde7693032 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -1048,6 +1048,8 @@ int rs600_resume(struct radeon_device *rdev)
1048 /* Initialize surface registers */ 1048 /* Initialize surface registers */
1049 radeon_surface_init(rdev); 1049 radeon_surface_init(rdev);
1050 1050
1051 radeon_pm_resume(rdev);
1052
1051 rdev->accel_working = true; 1053 rdev->accel_working = true;
1052 r = rs600_startup(rdev); 1054 r = rs600_startup(rdev);
1053 if (r) { 1055 if (r) {
@@ -1058,6 +1060,7 @@ int rs600_resume(struct radeon_device *rdev)
1058 1060
1059int rs600_suspend(struct radeon_device *rdev) 1061int rs600_suspend(struct radeon_device *rdev)
1060{ 1062{
1063 radeon_pm_suspend(rdev);
1061 r600_audio_fini(rdev); 1064 r600_audio_fini(rdev);
1062 r100_cp_disable(rdev); 1065 r100_cp_disable(rdev);
1063 radeon_wb_disable(rdev); 1066 radeon_wb_disable(rdev);
@@ -1068,6 +1071,7 @@ int rs600_suspend(struct radeon_device *rdev)
1068 1071
1069void rs600_fini(struct radeon_device *rdev) 1072void rs600_fini(struct radeon_device *rdev)
1070{ 1073{
1074 radeon_pm_fini(rdev);
1071 r600_audio_fini(rdev); 1075 r600_audio_fini(rdev);
1072 r100_cp_fini(rdev); 1076 r100_cp_fini(rdev);
1073 radeon_wb_fini(rdev); 1077 radeon_wb_fini(rdev);
@@ -1136,6 +1140,9 @@ int rs600_init(struct radeon_device *rdev)
1136 return r; 1140 return r;
1137 rs600_set_safe_registers(rdev); 1141 rs600_set_safe_registers(rdev);
1138 1142
1143 /* Initialize power management */
1144 radeon_pm_init(rdev);
1145
1139 rdev->accel_working = true; 1146 rdev->accel_working = true;
1140 r = rs600_startup(rdev); 1147 r = rs600_startup(rdev);
1141 if (r) { 1148 if (r) {
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
index 1c560629575a..e461b45f29a9 100644
--- a/drivers/gpu/drm/radeon/rs690.c
+++ b/drivers/gpu/drm/radeon/rs690.c
@@ -746,6 +746,8 @@ int rs690_resume(struct radeon_device *rdev)
746 /* Initialize surface registers */ 746 /* Initialize surface registers */
747 radeon_surface_init(rdev); 747 radeon_surface_init(rdev);
748 748
749 radeon_pm_resume(rdev);
750
749 rdev->accel_working = true; 751 rdev->accel_working = true;
750 r = rs690_startup(rdev); 752 r = rs690_startup(rdev);
751 if (r) { 753 if (r) {
@@ -756,6 +758,7 @@ int rs690_resume(struct radeon_device *rdev)
756 758
757int rs690_suspend(struct radeon_device *rdev) 759int rs690_suspend(struct radeon_device *rdev)
758{ 760{
761 radeon_pm_suspend(rdev);
759 r600_audio_fini(rdev); 762 r600_audio_fini(rdev);
760 r100_cp_disable(rdev); 763 r100_cp_disable(rdev);
761 radeon_wb_disable(rdev); 764 radeon_wb_disable(rdev);
@@ -766,6 +769,7 @@ int rs690_suspend(struct radeon_device *rdev)
766 769
767void rs690_fini(struct radeon_device *rdev) 770void rs690_fini(struct radeon_device *rdev)
768{ 771{
772 radeon_pm_fini(rdev);
769 r600_audio_fini(rdev); 773 r600_audio_fini(rdev);
770 r100_cp_fini(rdev); 774 r100_cp_fini(rdev);
771 radeon_wb_fini(rdev); 775 radeon_wb_fini(rdev);
@@ -835,6 +839,9 @@ int rs690_init(struct radeon_device *rdev)
835 return r; 839 return r;
836 rs600_set_safe_registers(rdev); 840 rs600_set_safe_registers(rdev);
837 841
842 /* Initialize power management */
843 radeon_pm_init(rdev);
844
838 rdev->accel_working = true; 845 rdev->accel_working = true;
839 r = rs690_startup(rdev); 846 r = rs690_startup(rdev);
840 if (r) { 847 if (r) {
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
index 5d1c316115ef..98e8138ff779 100644
--- a/drivers/gpu/drm/radeon/rv515.c
+++ b/drivers/gpu/drm/radeon/rv515.c
@@ -586,6 +586,8 @@ int rv515_resume(struct radeon_device *rdev)
586 /* Initialize surface registers */ 586 /* Initialize surface registers */
587 radeon_surface_init(rdev); 587 radeon_surface_init(rdev);
588 588
589 radeon_pm_resume(rdev);
590
589 rdev->accel_working = true; 591 rdev->accel_working = true;
590 r = rv515_startup(rdev); 592 r = rv515_startup(rdev);
591 if (r) { 593 if (r) {
@@ -596,6 +598,7 @@ int rv515_resume(struct radeon_device *rdev)
596 598
597int rv515_suspend(struct radeon_device *rdev) 599int rv515_suspend(struct radeon_device *rdev)
598{ 600{
601 radeon_pm_suspend(rdev);
599 r100_cp_disable(rdev); 602 r100_cp_disable(rdev);
600 radeon_wb_disable(rdev); 603 radeon_wb_disable(rdev);
601 rs600_irq_disable(rdev); 604 rs600_irq_disable(rdev);
@@ -612,6 +615,7 @@ void rv515_set_safe_registers(struct radeon_device *rdev)
612 615
613void rv515_fini(struct radeon_device *rdev) 616void rv515_fini(struct radeon_device *rdev)
614{ 617{
618 radeon_pm_fini(rdev);
615 r100_cp_fini(rdev); 619 r100_cp_fini(rdev);
616 radeon_wb_fini(rdev); 620 radeon_wb_fini(rdev);
617 radeon_ib_pool_fini(rdev); 621 radeon_ib_pool_fini(rdev);
@@ -685,6 +689,9 @@ int rv515_init(struct radeon_device *rdev)
685 return r; 689 return r;
686 rv515_set_safe_registers(rdev); 690 rv515_set_safe_registers(rdev);
687 691
692 /* Initialize power management */
693 radeon_pm_init(rdev);
694
688 rdev->accel_working = true; 695 rdev->accel_working = true;
689 r = rv515_startup(rdev); 696 r = rv515_startup(rdev);
690 if (r) { 697 if (r) {
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 45774ff77d92..82a6d44586f8 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -1784,6 +1784,8 @@ int rv770_resume(struct radeon_device *rdev)
1784 /* init golden registers */ 1784 /* init golden registers */
1785 rv770_init_golden_registers(rdev); 1785 rv770_init_golden_registers(rdev);
1786 1786
1787 radeon_pm_resume(rdev);
1788
1787 rdev->accel_working = true; 1789 rdev->accel_working = true;
1788 r = rv770_startup(rdev); 1790 r = rv770_startup(rdev);
1789 if (r) { 1791 if (r) {
@@ -1798,6 +1800,7 @@ int rv770_resume(struct radeon_device *rdev)
1798 1800
1799int rv770_suspend(struct radeon_device *rdev) 1801int rv770_suspend(struct radeon_device *rdev)
1800{ 1802{
1803 radeon_pm_suspend(rdev);
1801 r600_audio_fini(rdev); 1804 r600_audio_fini(rdev);
1802 uvd_v1_0_fini(rdev); 1805 uvd_v1_0_fini(rdev);
1803 radeon_uvd_suspend(rdev); 1806 radeon_uvd_suspend(rdev);
@@ -1876,6 +1879,9 @@ int rv770_init(struct radeon_device *rdev)
1876 } 1879 }
1877 } 1880 }
1878 1881
1882 /* Initialize power management */
1883 radeon_pm_init(rdev);
1884
1879 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; 1885 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1880 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); 1886 r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
1881 1887
@@ -1915,6 +1921,7 @@ int rv770_init(struct radeon_device *rdev)
1915 1921
1916void rv770_fini(struct radeon_device *rdev) 1922void rv770_fini(struct radeon_device *rdev)
1917{ 1923{
1924 radeon_pm_fini(rdev);
1918 r700_cp_fini(rdev); 1925 r700_cp_fini(rdev);
1919 r600_dma_fini(rdev); 1926 r600_dma_fini(rdev);
1920 r600_irq_fini(rdev); 1927 r600_irq_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index 1df46316d835..7619bc6bb242 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -1460,7 +1460,7 @@ static const u32 hainan_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
1460}; 1460};
1461 1461
1462/* ucode loading */ 1462/* ucode loading */
1463static int si_mc_load_microcode(struct radeon_device *rdev) 1463int si_mc_load_microcode(struct radeon_device *rdev)
1464{ 1464{
1465 const __be32 *fw_data; 1465 const __be32 *fw_data;
1466 u32 running, blackout = 0; 1466 u32 running, blackout = 0;
@@ -6322,10 +6322,12 @@ static int si_startup(struct radeon_device *rdev)
6322 6322
6323 si_mc_program(rdev); 6323 si_mc_program(rdev);
6324 6324
6325 r = si_mc_load_microcode(rdev); 6325 if (!rdev->pm.dpm_enabled) {
6326 if (r) { 6326 r = si_mc_load_microcode(rdev);
6327 DRM_ERROR("Failed to load MC firmware!\n"); 6327 if (r) {
6328 return r; 6328 DRM_ERROR("Failed to load MC firmware!\n");
6329 return r;
6330 }
6329 } 6331 }
6330 6332
6331 r = si_pcie_gart_enable(rdev); 6333 r = si_pcie_gart_enable(rdev);
@@ -6502,6 +6504,8 @@ int si_resume(struct radeon_device *rdev)
6502 /* init golden registers */ 6504 /* init golden registers */
6503 si_init_golden_registers(rdev); 6505 si_init_golden_registers(rdev);
6504 6506
6507 radeon_pm_resume(rdev);
6508
6505 rdev->accel_working = true; 6509 rdev->accel_working = true;
6506 r = si_startup(rdev); 6510 r = si_startup(rdev);
6507 if (r) { 6511 if (r) {
@@ -6516,6 +6520,7 @@ int si_resume(struct radeon_device *rdev)
6516 6520
6517int si_suspend(struct radeon_device *rdev) 6521int si_suspend(struct radeon_device *rdev)
6518{ 6522{
6523 radeon_pm_suspend(rdev);
6519 dce6_audio_fini(rdev); 6524 dce6_audio_fini(rdev);
6520 radeon_vm_manager_fini(rdev); 6525 radeon_vm_manager_fini(rdev);
6521 si_cp_enable(rdev, false); 6526 si_cp_enable(rdev, false);
@@ -6598,6 +6603,9 @@ int si_init(struct radeon_device *rdev)
6598 } 6603 }
6599 } 6604 }
6600 6605
6606 /* Initialize power management */
6607 radeon_pm_init(rdev);
6608
6601 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 6609 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6602 ring->ring_obj = NULL; 6610 ring->ring_obj = NULL;
6603 r600_ring_init(rdev, ring, 1024 * 1024); 6611 r600_ring_init(rdev, ring, 1024 * 1024);
@@ -6664,6 +6672,7 @@ int si_init(struct radeon_device *rdev)
6664 6672
6665void si_fini(struct radeon_device *rdev) 6673void si_fini(struct radeon_device *rdev)
6666{ 6674{
6675 radeon_pm_fini(rdev);
6667 si_cp_fini(rdev); 6676 si_cp_fini(rdev);
6668 cayman_dma_fini(rdev); 6677 cayman_dma_fini(rdev);
6669 si_fini_pg(rdev); 6678 si_fini_pg(rdev);
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c
index 05cdd8ddabc4..512919b0156a 100644
--- a/drivers/gpu/drm/radeon/si_dpm.c
+++ b/drivers/gpu/drm/radeon/si_dpm.c
@@ -1738,6 +1738,8 @@ struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
1738struct ni_power_info *ni_get_pi(struct radeon_device *rdev); 1738struct ni_power_info *ni_get_pi(struct radeon_device *rdev);
1739struct ni_ps *ni_get_ps(struct radeon_ps *rps); 1739struct ni_ps *ni_get_ps(struct radeon_ps *rps);
1740 1740
1741extern int si_mc_load_microcode(struct radeon_device *rdev);
1742
1741static int si_populate_voltage_value(struct radeon_device *rdev, 1743static int si_populate_voltage_value(struct radeon_device *rdev,
1742 const struct atom_voltage_table *table, 1744 const struct atom_voltage_table *table,
1743 u16 value, SISLANDS_SMC_VOLTAGE_VALUE *voltage); 1745 u16 value, SISLANDS_SMC_VOLTAGE_VALUE *voltage);
@@ -5751,6 +5753,11 @@ static void si_set_pcie_lane_width_in_smc(struct radeon_device *rdev,
5751 5753
5752void si_dpm_setup_asic(struct radeon_device *rdev) 5754void si_dpm_setup_asic(struct radeon_device *rdev)
5753{ 5755{
5756 int r;
5757
5758 r = si_mc_load_microcode(rdev);
5759 if (r)
5760 DRM_ERROR("Failed to load MC firmware!\n");
5754 rv770_get_memory_type(rdev); 5761 rv770_get_memory_type(rdev);
5755 si_read_clock_registers(rdev); 5762 si_read_clock_registers(rdev);
5756 si_enable_acpi_power_management(rdev); 5763 si_enable_acpi_power_management(rdev);