[PATCH] drm/radeon: Remove limitation on clock speeds
Alexandre Demers
alexandre.f.demers at gmail.com
Tue Sep 23 12:38:10 PDT 2014
It seems good to me.
For the serie
Reviewed-by: Alexandre Demers <alexandre.f.demers at gmail.com>
For for 1 and 5
Tested-by: Alexandre Demers <alexandre.f.demers at gmail.com> on kernel 3.17-rc6
On Tue, Sep 23, 2014 at 9:52 AM, Alex Deucher <alexdeucher at gmail.com> wrote:
> On Tue, Sep 23, 2014 at 1:08 AM, Alexandre Demers
> <alexandre.f.demers at gmail.com> wrote:
>> Typo: this should be "Tested on kernel 3.17-rc6 on..."
>>
>> Alexandre Demers
>>
>>
>> On 23/09/14 12:42 AM, Alexandre Demers wrote:
>>>
>>> Now that vddci has been fixed for dpm, we can let the GPUs
>>> use their maximum values when not using the reference ones.
>>>
>>> Fixes bug 69721: Can't reach maximum memory speed (or core
>>> speed) when using dpm=1 on r600g on cards not sticking to
>>> reference board
>>>
>>> Tested on kernel 3.17-rc7 on a cayman gpu.
>>>
>>> Signed-off-by: Alexandre Demers <alexandre.f.demers at gmail.com>
>
> Thanks for testing this. I'd rather split this up into multiple
> patches in case we need to revert it on a specific asic family if
> problems arise. How about the attached patches?
>
> Alex
>
>>>
>>> ---
>>> drivers/gpu/drm/radeon/btc_dpm.c | 51
>>> ----------------------------------------
>>> drivers/gpu/drm/radeon/btc_dpm.h | 2 --
>>> drivers/gpu/drm/radeon/ci_dpm.c | 26 --------------------
>>> drivers/gpu/drm/radeon/ni_dpm.c | 24 -------------------
>>> drivers/gpu/drm/radeon/si_dpm.c | 24 -------------------
>>> 5 files changed, 127 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/radeon/btc_dpm.c
>>> b/drivers/gpu/drm/radeon/btc_dpm.c
>>> index f81d7ca..300d971 100644
>>> --- a/drivers/gpu/drm/radeon/btc_dpm.c
>>> +++ b/drivers/gpu/drm/radeon/btc_dpm.c
>>> @@ -1170,23 +1170,6 @@ static const struct radeon_blacklist_clocks
>>> btc_blacklist_clocks[] =
>>> { 25000, 30000, RADEON_SCLK_UP }
>>> };
>>> -void btc_get_max_clock_from_voltage_dependency_table(struct
>>> radeon_clock_voltage_dependency_table *table,
>>> - u32 *max_clock)
>>> -{
>>> - u32 i, clock = 0;
>>> -
>>> - if ((table == NULL) || (table->count == 0)) {
>>> - *max_clock = clock;
>>> - return;
>>> - }
>>> -
>>> - for (i = 0; i < table->count; i++) {
>>> - if (clock < table->entries[i].clk)
>>> - clock = table->entries[i].clk;
>>> - }
>>> - *max_clock = clock;
>>> -}
>>> -
>>> void btc_apply_voltage_dependency_rules(struct
>>> radeon_clock_voltage_dependency_table *table,
>>> u32 clock, u16 max_voltage, u16
>>> *voltage)
>>> {
>>> @@ -2099,7 +2082,6 @@ static void btc_apply_state_adjust_rules(struct
>>> radeon_device *rdev,
>>> bool disable_mclk_switching;
>>> u32 mclk, sclk;
>>> u16 vddc, vddci;
>>> - u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
>>> if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
>>> btc_dpm_vblank_too_short(rdev))
>>> @@ -2141,39 +2123,6 @@ static void btc_apply_state_adjust_rules(struct
>>> radeon_device *rdev,
>>> ps->low.vddci = max_limits->vddci;
>>> }
>>> - /* limit clocks to max supported clocks based on voltage
>>> dependency tables */
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
>>> - &max_sclk_vddc);
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
>>> - &max_mclk_vddci);
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
>>> - &max_mclk_vddc);
>>> -
>>> - if (max_sclk_vddc) {
>>> - if (ps->low.sclk > max_sclk_vddc)
>>> - ps->low.sclk = max_sclk_vddc;
>>> - if (ps->medium.sclk > max_sclk_vddc)
>>> - ps->medium.sclk = max_sclk_vddc;
>>> - if (ps->high.sclk > max_sclk_vddc)
>>> - ps->high.sclk = max_sclk_vddc;
>>> - }
>>> - if (max_mclk_vddci) {
>>> - if (ps->low.mclk > max_mclk_vddci)
>>> - ps->low.mclk = max_mclk_vddci;
>>> - if (ps->medium.mclk > max_mclk_vddci)
>>> - ps->medium.mclk = max_mclk_vddci;
>>> - if (ps->high.mclk > max_mclk_vddci)
>>> - ps->high.mclk = max_mclk_vddci;
>>> - }
>>> - if (max_mclk_vddc) {
>>> - if (ps->low.mclk > max_mclk_vddc)
>>> - ps->low.mclk = max_mclk_vddc;
>>> - if (ps->medium.mclk > max_mclk_vddc)
>>> - ps->medium.mclk = max_mclk_vddc;
>>> - if (ps->high.mclk > max_mclk_vddc)
>>> - ps->high.mclk = max_mclk_vddc;
>>> - }
>>> -
>>> /* XXX validate the min clocks required for display */
>>> if (disable_mclk_switching) {
>>> diff --git a/drivers/gpu/drm/radeon/btc_dpm.h
>>> b/drivers/gpu/drm/radeon/btc_dpm.h
>>> index 3b6f12b..1a15e0e 100644
>>> --- a/drivers/gpu/drm/radeon/btc_dpm.h
>>> +++ b/drivers/gpu/drm/radeon/btc_dpm.h
>>> @@ -46,8 +46,6 @@ void btc_adjust_clock_combinations(struct radeon_device
>>> *rdev,
>>> struct rv7xx_pl *pl);
>>> void btc_apply_voltage_dependency_rules(struct
>>> radeon_clock_voltage_dependency_table *table,
>>> u32 clock, u16 max_voltage, u16
>>> *voltage);
>>> -void btc_get_max_clock_from_voltage_dependency_table(struct
>>> radeon_clock_voltage_dependency_table *table,
>>> - u32 *max_clock);
>>> void btc_apply_voltage_delta_rules(struct radeon_device *rdev,
>>> u16 max_vddc, u16 max_vddci,
>>> u16 *vddc, u16 *vddci);
>>> diff --git a/drivers/gpu/drm/radeon/ci_dpm.c
>>> b/drivers/gpu/drm/radeon/ci_dpm.c
>>> index d416bb2..d199be3 100644
>>> --- a/drivers/gpu/drm/radeon/ci_dpm.c
>>> +++ b/drivers/gpu/drm/radeon/ci_dpm.c
>>> @@ -162,8 +162,6 @@ static const struct ci_pt_config_reg didt_config_ci[]
>>> =
>>> };
>>> extern u8 rv770_get_memory_module_index(struct radeon_device *rdev);
>>> -extern void btc_get_max_clock_from_voltage_dependency_table(struct
>>> radeon_clock_voltage_dependency_table *table,
>>> - u32
>>> *max_clock);
>>> extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev,
>>> u32 arb_freq_src, u32
>>> arb_freq_dest);
>>> extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock);
>>> @@ -748,7 +746,6 @@ static void ci_apply_state_adjust_rules(struct
>>> radeon_device *rdev,
>>> struct radeon_clock_and_voltage_limits *max_limits;
>>> bool disable_mclk_switching;
>>> u32 sclk, mclk;
>>> - u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
>>> int i;
>>> if (rps->vce_active) {
>>> @@ -784,29 +781,6 @@ static void ci_apply_state_adjust_rules(struct
>>> radeon_device *rdev,
>>> }
>>> }
>>> - /* limit clocks to max supported clocks based on voltage
>>> dependency tables */
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
>>> - &max_sclk_vddc);
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
>>> - &max_mclk_vddci);
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
>>> - &max_mclk_vddc);
>>> -
>>> - for (i = 0; i < ps->performance_level_count; i++) {
>>> - if (max_sclk_vddc) {
>>> - if (ps->performance_levels[i].sclk >
>>> max_sclk_vddc)
>>> - ps->performance_levels[i].sclk =
>>> max_sclk_vddc;
>>> - }
>>> - if (max_mclk_vddci) {
>>> - if (ps->performance_levels[i].mclk >
>>> max_mclk_vddci)
>>> - ps->performance_levels[i].mclk =
>>> max_mclk_vddci;
>>> - }
>>> - if (max_mclk_vddc) {
>>> - if (ps->performance_levels[i].mclk >
>>> max_mclk_vddc)
>>> - ps->performance_levels[i].mclk =
>>> max_mclk_vddc;
>>> - }
>>> - }
>>> -
>>> /* XXX validate the min clocks required for display */
>>> if (disable_mclk_switching) {
>>> diff --git a/drivers/gpu/drm/radeon/ni_dpm.c
>>> b/drivers/gpu/drm/radeon/ni_dpm.c
>>> index 01fc488..715b181 100644
>>> --- a/drivers/gpu/drm/radeon/ni_dpm.c
>>> +++ b/drivers/gpu/drm/radeon/ni_dpm.c
>>> @@ -789,7 +789,6 @@ static void ni_apply_state_adjust_rules(struct
>>> radeon_device *rdev,
>>> bool disable_mclk_switching;
>>> u32 mclk;
>>> u16 vddci;
>>> - u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
>>> int i;
>>> if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
>>> @@ -816,29 +815,6 @@ static void ni_apply_state_adjust_rules(struct
>>> radeon_device *rdev,
>>> }
>>> }
>>> - /* limit clocks to max supported clocks based on voltage
>>> dependency tables */
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
>>> - &max_sclk_vddc);
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
>>> - &max_mclk_vddci);
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
>>> - &max_mclk_vddc);
>>> -
>>> - for (i = 0; i < ps->performance_level_count; i++) {
>>> - if (max_sclk_vddc) {
>>> - if (ps->performance_levels[i].sclk >
>>> max_sclk_vddc)
>>> - ps->performance_levels[i].sclk =
>>> max_sclk_vddc;
>>> - }
>>> - if (max_mclk_vddci) {
>>> - if (ps->performance_levels[i].mclk >
>>> max_mclk_vddci)
>>> - ps->performance_levels[i].mclk =
>>> max_mclk_vddci;
>>> - }
>>> - if (max_mclk_vddc) {
>>> - if (ps->performance_levels[i].mclk >
>>> max_mclk_vddc)
>>> - ps->performance_levels[i].mclk =
>>> max_mclk_vddc;
>>> - }
>>> - }
>>> -
>>> /* XXX validate the min clocks required for display */
>>> /* adjust low state */
>>> diff --git a/drivers/gpu/drm/radeon/si_dpm.c
>>> b/drivers/gpu/drm/radeon/si_dpm.c
>>> index 70e61ff..9e4d5d7 100644
>>> --- a/drivers/gpu/drm/radeon/si_dpm.c
>>> +++ b/drivers/gpu/drm/radeon/si_dpm.c
>>> @@ -2916,7 +2916,6 @@ static void si_apply_state_adjust_rules(struct
>>> radeon_device *rdev,
>>> bool disable_sclk_switching = false;
>>> u32 mclk, sclk;
>>> u16 vddc, vddci;
>>> - u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
>>> int i;
>>> if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
>>> @@ -2950,29 +2949,6 @@ static void si_apply_state_adjust_rules(struct
>>> radeon_device *rdev,
>>> }
>>> }
>>> - /* limit clocks to max supported clocks based on voltage
>>> dependency tables */
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
>>> - &max_sclk_vddc);
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
>>> - &max_mclk_vddci);
>>> -
>>> btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
>>> - &max_mclk_vddc);
>>> -
>>> - for (i = 0; i < ps->performance_level_count; i++) {
>>> - if (max_sclk_vddc) {
>>> - if (ps->performance_levels[i].sclk >
>>> max_sclk_vddc)
>>> - ps->performance_levels[i].sclk =
>>> max_sclk_vddc;
>>> - }
>>> - if (max_mclk_vddci) {
>>> - if (ps->performance_levels[i].mclk >
>>> max_mclk_vddci)
>>> - ps->performance_levels[i].mclk =
>>> max_mclk_vddci;
>>> - }
>>> - if (max_mclk_vddc) {
>>> - if (ps->performance_levels[i].mclk >
>>> max_mclk_vddc)
>>> - ps->performance_levels[i].mclk =
>>> max_mclk_vddc;
>>> - }
>>> - }
>>> -
>>> /* XXX validate the min clocks required for display */
>>> if (disable_mclk_switching) {
>>
>>
More information about the dri-devel
mailing list