aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2011-01-06 21:19:26 -0500
committerDave Airlie <airlied@redhat.com>2011-01-06 23:11:34 -0500
commit9ace9f7b168fef492f731ba60da5c76bc0776e6d (patch)
tree7cc2fa7be499117334a40eeb1ead7929f1728825
parent03f40090555bd3de9fc80aa4e805ac7fa9c39dfe (diff)
drm/radeon/kms: adjust default clock/vddc tracking for pm on DCE5
NI chips no longer load the MC ucode in the asic_init sequence so the asic comes up in a basic mode with low engine/memory clocks and a voltage. Once the MC ucode is loaded by the driver the card can be programmed to it's proper default clocks and voltage. As such the default clocks in the firmware info table as the post clocks, not the default running clocks. Track the default post clocks and default running clocks separately to handle this. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon.h3
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c25
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c18
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)