diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 25 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 18 |
3 files changed, 29 insertions, 17 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 5598f9559a64..8c62b2f58923 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -823,6 +823,9 @@ struct radeon_pm { | |||
| 823 | u32 current_sclk; | 823 | u32 current_sclk; |
| 824 | u32 current_mclk; | 824 | u32 current_mclk; |
| 825 | u32 current_vddc; | 825 | u32 current_vddc; |
| 826 | u32 default_sclk; | ||
| 827 | u32 default_mclk; | ||
| 828 | u32 default_vddc; | ||
| 826 | struct radeon_i2c_chan *i2c_bus; | 829 | struct radeon_i2c_chan *i2c_bus; |
| 827 | /* selected pm method */ | 830 | /* selected pm method */ |
| 828 | enum radeon_pm_method pm_method; | 831 | enum radeon_pm_method pm_method; |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 03f1c9a10ba4..1573202a6418 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -2249,15 +2249,22 @@ static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rde | |||
| 2249 | rdev->pm.default_power_state_index = state_index; | 2249 | rdev->pm.default_power_state_index = state_index; |
| 2250 | rdev->pm.power_state[state_index].default_clock_mode = | 2250 | rdev->pm.power_state[state_index].default_clock_mode = |
| 2251 | &rdev->pm.power_state[state_index].clock_info[mode_index - 1]; | 2251 | &rdev->pm.power_state[state_index].clock_info[mode_index - 1]; |
| 2252 | /* patch the table values with the default slck/mclk from firmware info */ | 2252 | if (ASIC_IS_DCE5(rdev)) { |
| 2253 | for (j = 0; j < mode_index; j++) { | 2253 | /* NI chips post without MC ucode, so default clocks are strobe mode only */ |
| 2254 | rdev->pm.power_state[state_index].clock_info[j].mclk = | 2254 | rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk; |
| 2255 | rdev->clock.default_mclk; | 2255 | rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk; |
| 2256 | rdev->pm.power_state[state_index].clock_info[j].sclk = | 2256 | rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage; |
| 2257 | rdev->clock.default_sclk; | 2257 | } else { |
| 2258 | if (vddc) | 2258 | /* patch the table values with the default slck/mclk from firmware info */ |
| 2259 | rdev->pm.power_state[state_index].clock_info[j].voltage.voltage = | 2259 | for (j = 0; j < mode_index; j++) { |
| 2260 | vddc; | 2260 | rdev->pm.power_state[state_index].clock_info[j].mclk = |
| 2261 | rdev->clock.default_mclk; | ||
| 2262 | rdev->pm.power_state[state_index].clock_info[j].sclk = | ||
| 2263 | rdev->clock.default_sclk; | ||
| 2264 | if (vddc) | ||
| 2265 | rdev->pm.power_state[state_index].clock_info[j].voltage.voltage = | ||
| 2266 | vddc; | ||
| 2267 | } | ||
| 2261 | } | 2268 | } |
| 2262 | } | 2269 | } |
| 2263 | } | 2270 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 7ad2e1a6991d..9052d1e3a5fe 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -167,13 +167,13 @@ static void radeon_set_power_state(struct radeon_device *rdev) | |||
| 167 | if (radeon_gui_idle(rdev)) { | 167 | if (radeon_gui_idle(rdev)) { |
| 168 | sclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. | 168 | sclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. |
| 169 | clock_info[rdev->pm.requested_clock_mode_index].sclk; | 169 | clock_info[rdev->pm.requested_clock_mode_index].sclk; |
| 170 | if (sclk > rdev->clock.default_sclk) | 170 | if (sclk > rdev->pm.default_sclk) |
| 171 | sclk = rdev->clock.default_sclk; | 171 | sclk = rdev->pm.default_sclk; |
| 172 | 172 | ||
| 173 | mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. | 173 | mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. |
| 174 | clock_info[rdev->pm.requested_clock_mode_index].mclk; | 174 | clock_info[rdev->pm.requested_clock_mode_index].mclk; |
| 175 | if (mclk > rdev->clock.default_mclk) | 175 | if (mclk > rdev->pm.default_mclk) |
| 176 | mclk = rdev->clock.default_mclk; | 176 | mclk = rdev->pm.default_mclk; |
| 177 | 177 | ||
| 178 | /* upvolt before raising clocks, downvolt after lowering clocks */ | 178 | /* upvolt before raising clocks, downvolt after lowering clocks */ |
| 179 | if (sclk < rdev->pm.current_sclk) | 179 | if (sclk < rdev->pm.current_sclk) |
| @@ -534,8 +534,8 @@ void radeon_pm_resume(struct radeon_device *rdev) | |||
| 534 | mutex_lock(&rdev->pm.mutex); | 534 | mutex_lock(&rdev->pm.mutex); |
| 535 | rdev->pm.current_power_state_index = rdev->pm.default_power_state_index; | 535 | rdev->pm.current_power_state_index = rdev->pm.default_power_state_index; |
| 536 | rdev->pm.current_clock_mode_index = 0; | 536 | rdev->pm.current_clock_mode_index = 0; |
| 537 | rdev->pm.current_sclk = rdev->clock.default_sclk; | 537 | rdev->pm.current_sclk = rdev->pm.default_sclk; |
| 538 | rdev->pm.current_mclk = rdev->clock.default_mclk; | 538 | rdev->pm.current_mclk = rdev->pm.default_mclk; |
| 539 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; | 539 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; |
| 540 | if (rdev->pm.pm_method == PM_METHOD_DYNPM | 540 | if (rdev->pm.pm_method == PM_METHOD_DYNPM |
| 541 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { | 541 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { |
| @@ -558,6 +558,8 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
| 558 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; | 558 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; |
| 559 | rdev->pm.dynpm_can_upclock = true; | 559 | rdev->pm.dynpm_can_upclock = true; |
| 560 | rdev->pm.dynpm_can_downclock = true; | 560 | rdev->pm.dynpm_can_downclock = true; |
| 561 | rdev->pm.default_sclk = rdev->clock.default_sclk; | ||
| 562 | rdev->pm.default_mclk = rdev->clock.default_mclk; | ||
| 561 | rdev->pm.current_sclk = rdev->clock.default_sclk; | 563 | rdev->pm.current_sclk = rdev->clock.default_sclk; |
| 562 | rdev->pm.current_mclk = rdev->clock.default_mclk; | 564 | rdev->pm.current_mclk = rdev->clock.default_mclk; |
| 563 | rdev->pm.int_thermal_type = THERMAL_TYPE_NONE; | 565 | rdev->pm.int_thermal_type = THERMAL_TYPE_NONE; |
| @@ -804,9 +806,9 @@ static int radeon_debugfs_pm_info(struct seq_file *m, void *data) | |||
| 804 | struct drm_device *dev = node->minor->dev; | 806 | struct drm_device *dev = node->minor->dev; |
| 805 | struct radeon_device *rdev = dev->dev_private; | 807 | struct radeon_device *rdev = dev->dev_private; |
| 806 | 808 | ||
| 807 | seq_printf(m, "default engine clock: %u0 kHz\n", rdev->clock.default_sclk); | 809 | seq_printf(m, "default engine clock: %u0 kHz\n", rdev->pm.default_sclk); |
| 808 | seq_printf(m, "current engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev)); | 810 | seq_printf(m, "current engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev)); |
| 809 | seq_printf(m, "default memory clock: %u0 kHz\n", rdev->clock.default_mclk); | 811 | seq_printf(m, "default memory clock: %u0 kHz\n", rdev->pm.default_mclk); |
| 810 | if (rdev->asic->get_memory_clock) | 812 | if (rdev->asic->get_memory_clock) |
| 811 | seq_printf(m, "current memory clock: %u0 kHz\n", radeon_get_memory_clock(rdev)); | 813 | seq_printf(m, "current memory clock: %u0 kHz\n", radeon_get_memory_clock(rdev)); |
| 812 | if (rdev->pm.current_vddc) | 814 | if (rdev->pm.current_vddc) |
