aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-03-22 15:59:10 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-06-27 19:16:39 -0400
commit4489cd62e5a2a4900422424457c6e8dca875056b (patch)
tree8a7bccd0b4cd944185e438145bcfb29b8a7aab5f /drivers
parentf907eec036511ed2ff8cc5de58b6a1cef4bb4033 (diff)
drm/radeon/dpm: validate voltages against dispclk requirements
Validate the voltages against the voltage requirements of the dispclk. We currently don't adjust the disp clock so it never changes, but we need to filter out voltage levels that are too low none the less. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/btc_dpm.c28
-rw-r--r--drivers/gpu/drm/radeon/ni_dpm.c21
-rw-r--r--drivers/gpu/drm/radeon/radeon.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c1
4 files changed, 48 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/btc_dpm.c b/drivers/gpu/drm/radeon/btc_dpm.c
index e0d315e7fd01..a55b23dce6da 100644
--- a/drivers/gpu/drm/radeon/btc_dpm.c
+++ b/drivers/gpu/drm/radeon/btc_dpm.c
@@ -2178,21 +2178,26 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev,
2178 ps->low.mclk, max_limits->vddci, &ps->low.vddci); 2178 ps->low.mclk, max_limits->vddci, &ps->low.vddci);
2179 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 2179 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2180 ps->low.mclk, max_limits->vddc, &ps->low.vddc); 2180 ps->low.mclk, max_limits->vddc, &ps->low.vddc);
2181 /* XXX validate the voltage required for display */ 2181 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
2182 rdev->clock.current_dispclk, max_limits->vddc, &ps->low.vddc);
2183
2182 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 2184 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2183 ps->medium.sclk, max_limits->vddc, &ps->medium.vddc); 2185 ps->medium.sclk, max_limits->vddc, &ps->medium.vddc);
2184 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 2186 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2185 ps->medium.mclk, max_limits->vddci, &ps->medium.vddci); 2187 ps->medium.mclk, max_limits->vddci, &ps->medium.vddci);
2186 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 2188 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2187 ps->medium.mclk, max_limits->vddc, &ps->medium.vddc); 2189 ps->medium.mclk, max_limits->vddc, &ps->medium.vddc);
2188 /* XXX validate the voltage required for display */ 2190 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
2191 rdev->clock.current_dispclk, max_limits->vddc, &ps->medium.vddc);
2192
2189 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 2193 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2190 ps->high.sclk, max_limits->vddc, &ps->high.vddc); 2194 ps->high.sclk, max_limits->vddc, &ps->high.vddc);
2191 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 2195 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2192 ps->high.mclk, max_limits->vddci, &ps->high.vddci); 2196 ps->high.mclk, max_limits->vddci, &ps->high.vddci);
2193 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 2197 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2194 ps->high.mclk, max_limits->vddc, &ps->high.vddc); 2198 ps->high.mclk, max_limits->vddc, &ps->high.vddc);
2195 /* XXX validate the voltage required for display */ 2199 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
2200 rdev->clock.current_dispclk, max_limits->vddc, &ps->high.vddc);
2196 2201
2197 btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci, 2202 btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
2198 &ps->low.vddc, &ps->low.vddci); 2203 &ps->low.vddc, &ps->low.vddci);
@@ -2495,6 +2500,22 @@ int btc_dpm_init(struct radeon_device *rdev)
2495 if (ret) 2500 if (ret)
2496 return ret; 2501 return ret;
2497 2502
2503 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
2504 kzalloc(4 * sizeof(struct radeon_clock_voltage_dependency_entry), GFP_KERNEL);
2505 if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
2506 r600_free_extended_power_table(rdev);
2507 return -ENOMEM;
2508 }
2509 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
2510 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
2511 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
2512 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
2513 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 800;
2514 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
2515 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 800;
2516 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
2517 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 800;
2518
2498 if (rdev->pm.dpm.voltage_response_time == 0) 2519 if (rdev->pm.dpm.voltage_response_time == 0)
2499 rdev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT; 2520 rdev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT;
2500 if (rdev->pm.dpm.backbias_response_time == 0) 2521 if (rdev->pm.dpm.backbias_response_time == 0)
@@ -2628,6 +2649,7 @@ void btc_dpm_fini(struct radeon_device *rdev)
2628 } 2649 }
2629 kfree(rdev->pm.dpm.ps); 2650 kfree(rdev->pm.dpm.ps);
2630 kfree(rdev->pm.dpm.priv); 2651 kfree(rdev->pm.dpm.priv);
2652 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
2631 r600_free_extended_power_table(rdev); 2653 r600_free_extended_power_table(rdev);
2632} 2654}
2633 2655
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c
index af059655055d..21c064badaa2 100644
--- a/drivers/gpu/drm/radeon/ni_dpm.c
+++ b/drivers/gpu/drm/radeon/ni_dpm.c
@@ -866,7 +866,9 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,
866 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 866 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
867 ps->performance_levels[i].mclk, 867 ps->performance_levels[i].mclk,
868 max_limits->vddc, &ps->performance_levels[i].vddc); 868 max_limits->vddc, &ps->performance_levels[i].vddc);
869 /* XXX validate the voltage required for display */ 869 btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
870 rdev->clock.current_dispclk,
871 max_limits->vddc, &ps->performance_levels[i].vddc);
870 } 872 }
871 873
872 for (i = 0; i < ps->performance_level_count; i++) { 874 for (i = 0; i < ps->performance_level_count; i++) {
@@ -3910,6 +3912,22 @@ int ni_dpm_init(struct radeon_device *rdev)
3910 if (ret) 3912 if (ret)
3911 return ret; 3913 return ret;
3912 3914
3915 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
3916 kzalloc(4 * sizeof(struct radeon_clock_voltage_dependency_entry), GFP_KERNEL);
3917 if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
3918 r600_free_extended_power_table(rdev);
3919 return -ENOMEM;
3920 }
3921 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
3922 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
3923 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
3924 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
3925 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 720;
3926 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
3927 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 810;
3928 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
3929 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 900;
3930
3913 ni_patch_dependency_tables_based_on_leakage(rdev); 3931 ni_patch_dependency_tables_based_on_leakage(rdev);
3914 3932
3915 if (rdev->pm.dpm.voltage_response_time == 0) 3933 if (rdev->pm.dpm.voltage_response_time == 0)
@@ -4094,6 +4112,7 @@ void ni_dpm_fini(struct radeon_device *rdev)
4094 } 4112 }
4095 kfree(rdev->pm.dpm.ps); 4113 kfree(rdev->pm.dpm.ps);
4096 kfree(rdev->pm.dpm.priv); 4114 kfree(rdev->pm.dpm.priv);
4115 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
4097 r600_free_extended_power_table(rdev); 4116 r600_free_extended_power_table(rdev);
4098} 4117}
4099 4118
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index e6ded6fc186b..9de8ae20bc99 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -200,6 +200,7 @@ struct radeon_clock {
200 uint32_t default_mclk; 200 uint32_t default_mclk;
201 uint32_t default_sclk; 201 uint32_t default_sclk;
202 uint32_t default_dispclk; 202 uint32_t default_dispclk;
203 uint32_t current_dispclk;
203 uint32_t dp_extclk; 204 uint32_t dp_extclk;
204 uint32_t max_pixel_clock; 205 uint32_t max_pixel_clock;
205}; 206};
@@ -1298,6 +1299,7 @@ struct radeon_dpm_dynamic_state {
1298 struct radeon_clock_voltage_dependency_table vddc_dependency_on_sclk; 1299 struct radeon_clock_voltage_dependency_table vddc_dependency_on_sclk;
1299 struct radeon_clock_voltage_dependency_table vddci_dependency_on_mclk; 1300 struct radeon_clock_voltage_dependency_table vddci_dependency_on_mclk;
1300 struct radeon_clock_voltage_dependency_table vddc_dependency_on_mclk; 1301 struct radeon_clock_voltage_dependency_table vddc_dependency_on_mclk;
1302 struct radeon_clock_voltage_dependency_table vddc_dependency_on_dispclk;
1301 struct radeon_clock_array valid_sclk_values; 1303 struct radeon_clock_array valid_sclk_values;
1302 struct radeon_clock_array valid_mclk_values; 1304 struct radeon_clock_array valid_mclk_values;
1303 struct radeon_clock_and_voltage_limits max_clock_voltage_on_dc; 1305 struct radeon_clock_and_voltage_limits max_clock_voltage_on_dc;
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index 0ac7294867a3..c707ed034713 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -1243,6 +1243,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1243 } 1243 }
1244 rdev->clock.dp_extclk = 1244 rdev->clock.dp_extclk =
1245 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq); 1245 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq);
1246 rdev->clock.current_dispclk = rdev->clock.default_dispclk;
1246 } 1247 }
1247 *dcpll = *p1pll; 1248 *dcpll = *p1pll;
1248 1249