Subversion Repositories Kolibri OS

Rev

Rev 5271 | Rev 6661 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5271 Rev 6104
Line 1738... Line 1738...
1738
struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
1738
struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
1739
struct ni_power_info *ni_get_pi(struct radeon_device *rdev);
1739
struct ni_power_info *ni_get_pi(struct radeon_device *rdev);
1740
struct ni_ps *ni_get_ps(struct radeon_ps *rps);
1740
struct ni_ps *ni_get_ps(struct radeon_ps *rps);
Line 1741... Line 1741...
1741
 
1741
 
-
 
1742
extern int si_mc_load_microcode(struct radeon_device *rdev);
Line 1742... Line 1743...
1742
extern int si_mc_load_microcode(struct radeon_device *rdev);
1743
extern void vce_v1_0_enable_mgcg(struct radeon_device *rdev, bool enable);
1743
 
1744
 
1744
static int si_populate_voltage_value(struct radeon_device *rdev,
1745
static int si_populate_voltage_value(struct radeon_device *rdev,
1745
				     const struct atom_voltage_table *table,
1746
				     const struct atom_voltage_table *table,
Line 1754... Line 1755...
1754
					 SISLANDS_SMC_HW_PERFORMANCE_LEVEL *level);
1755
					 SISLANDS_SMC_HW_PERFORMANCE_LEVEL *level);
1755
static int si_calculate_sclk_params(struct radeon_device *rdev,
1756
static int si_calculate_sclk_params(struct radeon_device *rdev,
1756
				    u32 engine_clock,
1757
				    u32 engine_clock,
1757
				    SISLANDS_SMC_SCLK_VALUE *sclk);
1758
				    SISLANDS_SMC_SCLK_VALUE *sclk);
Line -... Line 1759...
-
 
1759
 
-
 
1760
static void si_thermal_start_smc_fan_control(struct radeon_device *rdev);
-
 
1761
static void si_fan_ctrl_set_default_mode(struct radeon_device *rdev);
1758
 
1762
 
1759
static struct si_power_info *si_get_pi(struct radeon_device *rdev)
1763
static struct si_power_info *si_get_pi(struct radeon_device *rdev)
1760
{
1764
{
Line 1761... Line 1765...
1761
        struct si_power_info *pi = rdev->pm.dpm.priv;
1765
        struct si_power_info *pi = rdev->pm.dpm.priv;
Line 2906... Line 2910...
2906
	kfree(spll_table);
2910
	kfree(spll_table);
Line 2907... Line 2911...
2907
 
2911
 
2908
	return ret;
2912
	return ret;
Line -... Line 2913...
-
 
2913
}
-
 
2914
 
-
 
2915
struct si_dpm_quirk {
-
 
2916
	u32 chip_vendor;
-
 
2917
	u32 chip_device;
-
 
2918
	u32 subsys_vendor;
-
 
2919
	u32 subsys_device;
-
 
2920
	u32 max_sclk;
-
 
2921
	u32 max_mclk;
-
 
2922
};
-
 
2923
 
-
 
2924
/* cards with dpm stability problems */
-
 
2925
static struct si_dpm_quirk si_dpm_quirk_list[] = {
-
 
2926
	/* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */
-
 
2927
	{ PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 },
-
 
2928
	{ PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 },
-
 
2929
	{ PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 },
-
 
2930
	{ PCI_VENDOR_ID_ATI, 0x6811, 0x1462, 0x2015, 0, 120000 },
-
 
2931
	{ PCI_VENDOR_ID_ATI, 0x6811, 0x1043, 0x2015, 0, 120000 },
-
 
2932
	{ 0, 0, 0, 0 },
-
 
2933
};
-
 
2934
 
-
 
2935
static u16 si_get_lower_of_leakage_and_vce_voltage(struct radeon_device *rdev,
-
 
2936
						   u16 vce_voltage)
-
 
2937
{
-
 
2938
	u16 highest_leakage = 0;
-
 
2939
	struct si_power_info *si_pi = si_get_pi(rdev);
-
 
2940
	int i;
-
 
2941
 
-
 
2942
	for (i = 0; i < si_pi->leakage_voltage.count; i++){
-
 
2943
		if (highest_leakage < si_pi->leakage_voltage.entries[i].voltage)
-
 
2944
			highest_leakage = si_pi->leakage_voltage.entries[i].voltage;
-
 
2945
	}
-
 
2946
 
-
 
2947
	if (si_pi->leakage_voltage.count && (highest_leakage < vce_voltage))
-
 
2948
		return highest_leakage;
-
 
2949
 
-
 
2950
	return vce_voltage;
-
 
2951
}
-
 
2952
 
-
 
2953
static int si_get_vce_clock_voltage(struct radeon_device *rdev,
-
 
2954
				    u32 evclk, u32 ecclk, u16 *voltage)
-
 
2955
{
-
 
2956
	u32 i;
-
 
2957
	int ret = -EINVAL;
-
 
2958
	struct radeon_vce_clock_voltage_dependency_table *table =
-
 
2959
		&rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
-
 
2960
 
-
 
2961
	if (((evclk == 0) && (ecclk == 0)) ||
-
 
2962
	    (table && (table->count == 0))) {
-
 
2963
		*voltage = 0;
-
 
2964
		return 0;
-
 
2965
	}
-
 
2966
 
-
 
2967
	for (i = 0; i < table->count; i++) {
-
 
2968
		if ((evclk <= table->entries[i].evclk) &&
-
 
2969
		    (ecclk <= table->entries[i].ecclk)) {
-
 
2970
			*voltage = table->entries[i].v;
-
 
2971
			ret = 0;
-
 
2972
			break;
-
 
2973
		}
-
 
2974
	}
-
 
2975
 
-
 
2976
	/* if no match return the highest voltage */
-
 
2977
	if (ret)
-
 
2978
		*voltage = table->entries[table->count - 1].v;
-
 
2979
 
-
 
2980
	*voltage = si_get_lower_of_leakage_and_vce_voltage(rdev, *voltage);
-
 
2981
 
-
 
2982
	return ret;
2909
}
2983
}
2910
 
2984
 
2911
static void si_apply_state_adjust_rules(struct radeon_device *rdev,
2985
static void si_apply_state_adjust_rules(struct radeon_device *rdev,
2912
					struct radeon_ps *rps)
2986
					struct radeon_ps *rps)
2913
{
2987
{
2914
	struct ni_ps *ps = ni_get_ps(rps);
2988
	struct ni_ps *ps = ni_get_ps(rps);
2915
	struct radeon_clock_and_voltage_limits *max_limits;
2989
	struct radeon_clock_and_voltage_limits *max_limits;
2916
	bool disable_mclk_switching = false;
2990
	bool disable_mclk_switching = false;
2917
	bool disable_sclk_switching = false;
2991
	bool disable_sclk_switching = false;
2918
	u32 mclk, sclk;
2992
	u32 mclk, sclk;
-
 
2993
	u16 vddc, vddci, min_vce_voltage = 0;
2919
	u16 vddc, vddci;
2994
	u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
-
 
2995
	u32 max_sclk = 0, max_mclk = 0;
-
 
2996
	int i;
-
 
2997
	struct si_dpm_quirk *p = si_dpm_quirk_list;
-
 
2998
 
-
 
2999
	/* Apply dpm quirks */
-
 
3000
	while (p && p->chip_device != 0) {
-
 
3001
		if (rdev->pdev->vendor == p->chip_vendor &&
-
 
3002
		    rdev->pdev->device == p->chip_device &&
-
 
3003
		    rdev->pdev->subsystem_vendor == p->subsys_vendor &&
-
 
3004
		    rdev->pdev->subsystem_device == p->subsys_device) {
-
 
3005
			max_sclk = p->max_sclk;
-
 
3006
			max_mclk = p->max_mclk;
-
 
3007
			break;
-
 
3008
		}
-
 
3009
		++p;
-
 
3010
	}
-
 
3011
 
-
 
3012
	if (rps->vce_active) {
-
 
3013
		rps->evclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].evclk;
-
 
3014
		rps->ecclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].ecclk;
-
 
3015
		si_get_vce_clock_voltage(rdev, rps->evclk, rps->ecclk,
-
 
3016
					 &min_vce_voltage);
-
 
3017
	} else {
-
 
3018
		rps->evclk = 0;
Line 2920... Line 3019...
2920
	u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
3019
		rps->ecclk = 0;
2921
	int i;
3020
	}
2922
 
3021
 
Line 2970... Line 3069...
2970
		}
3069
		}
2971
		if (max_mclk_vddc) {
3070
		if (max_mclk_vddc) {
2972
			if (ps->performance_levels[i].mclk > max_mclk_vddc)
3071
			if (ps->performance_levels[i].mclk > max_mclk_vddc)
2973
				ps->performance_levels[i].mclk = max_mclk_vddc;
3072
				ps->performance_levels[i].mclk = max_mclk_vddc;
2974
		}
3073
		}
-
 
3074
		if (max_mclk) {
-
 
3075
			if (ps->performance_levels[i].mclk > max_mclk)
-
 
3076
				ps->performance_levels[i].mclk = max_mclk;
-
 
3077
		}
-
 
3078
		if (max_sclk) {
-
 
3079
			if (ps->performance_levels[i].sclk > max_sclk)
-
 
3080
				ps->performance_levels[i].sclk = max_sclk;
-
 
3081
		}
2975
	}
3082
	}
Line 2976... Line 3083...
2976
 
3083
 
Line 2977... Line 3084...
2977
	/* XXX validate the min clocks required for display */
3084
	/* XXX validate the min clocks required for display */
Line 2990... Line 3097...
2990
	} else {
3097
	} else {
2991
		sclk = ps->performance_levels[0].sclk;
3098
		sclk = ps->performance_levels[0].sclk;
2992
		vddc = ps->performance_levels[0].vddc;
3099
		vddc = ps->performance_levels[0].vddc;
2993
	}
3100
	}
Line -... Line 3101...
-
 
3101
 
-
 
3102
	if (rps->vce_active) {
-
 
3103
		if (sclk < rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].sclk)
-
 
3104
			sclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].sclk;
-
 
3105
		if (mclk < rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].mclk)
-
 
3106
			mclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].mclk;
-
 
3107
	}
2994
 
3108
 
2995
	/* adjusted low state */
3109
	/* adjusted low state */
2996
	ps->performance_levels[0].sclk = sclk;
3110
	ps->performance_levels[0].sclk = sclk;
2997
	ps->performance_levels[0].mclk = mclk;
3111
	ps->performance_levels[0].mclk = mclk;
2998
	ps->performance_levels[0].vddc = vddc;
3112
	ps->performance_levels[0].vddc = vddc;
Line 3039... Line 3153...
3039
        for (i = 0; i < ps->performance_level_count; i++)
3153
        for (i = 0; i < ps->performance_level_count; i++)
3040
                btc_adjust_clock_combinations(rdev, max_limits,
3154
                btc_adjust_clock_combinations(rdev, max_limits,
3041
                                              &ps->performance_levels[i]);
3155
                                              &ps->performance_levels[i]);
Line 3042... Line 3156...
3042
 
3156
 
-
 
3157
	for (i = 0; i < ps->performance_level_count; i++) {
-
 
3158
		if (ps->performance_levels[i].vddc < min_vce_voltage)
3043
	for (i = 0; i < ps->performance_level_count; i++) {
3159
			ps->performance_levels[i].vddc = min_vce_voltage;
3044
		btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
3160
		btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
3045
						   ps->performance_levels[i].sclk,
3161
						   ps->performance_levels[i].sclk,
3046
						   max_limits->vddc,  &ps->performance_levels[i].vddc);
3162
						   max_limits->vddc,  &ps->performance_levels[i].vddc);
3047
		btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
3163
		btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
Line 3065... Line 3181...
3065
	ps->dc_compatible = true;
3181
	ps->dc_compatible = true;
3066
	for (i = 0; i < ps->performance_level_count; i++) {
3182
	for (i = 0; i < ps->performance_level_count; i++) {
3067
		if (ps->performance_levels[i].vddc > rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc)
3183
		if (ps->performance_levels[i].vddc > rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc)
3068
			ps->dc_compatible = false;
3184
			ps->dc_compatible = false;
3069
	}
3185
	}
3070
 
-
 
3071
}
3186
}
Line 3072... Line 3187...
3072
 
3187
 
3073
#if 0
3188
#if 0
3074
static int si_read_smc_soft_register(struct radeon_device *rdev,
3189
static int si_read_smc_soft_register(struct radeon_device *rdev,
Line 3318... Line 3433...
3318
	rdev->pm.dpm.forced_level = level;
3433
	rdev->pm.dpm.forced_level = level;
Line 3319... Line 3434...
3319
 
3434
 
3320
	return 0;
3435
	return 0;
Line -... Line 3436...
-
 
3436
}
3321
}
3437
 
3322
 
3438
#if 0
3323
static int si_set_boot_state(struct radeon_device *rdev)
3439
static int si_set_boot_state(struct radeon_device *rdev)
3324
{
3440
{
3325
	return (si_send_msg_to_smc(rdev, PPSMC_MSG_SwitchToInitialState) == PPSMC_Result_OK) ?
3441
	return (si_send_msg_to_smc(rdev, PPSMC_MSG_SwitchToInitialState) == PPSMC_Result_OK) ?
-
 
3442
		0 : -EINVAL;
Line 3326... Line 3443...
3326
		0 : -EINVAL;
3443
}
3327
}
3444
#endif
3328
 
3445
 
3329
static int si_set_sw_state(struct radeon_device *rdev)
3446
static int si_set_sw_state(struct radeon_device *rdev)
Line 5812... Line 5929...
5812
		lane_width = radeon_get_pcie_lanes(rdev);
5929
		lane_width = radeon_get_pcie_lanes(rdev);
5813
		si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width, lane_width);
5930
		si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width, lane_width);
5814
	}
5931
	}
5815
}
5932
}
Line -... Line 5933...
-
 
5933
 
-
 
5934
static void si_set_vce_clock(struct radeon_device *rdev,
-
 
5935
			     struct radeon_ps *new_rps,
-
 
5936
			     struct radeon_ps *old_rps)
-
 
5937
{
-
 
5938
	if ((old_rps->evclk != new_rps->evclk) ||
-
 
5939
	    (old_rps->ecclk != new_rps->ecclk)) {
-
 
5940
		/* turn the clocks on when encoding, off otherwise */
-
 
5941
		if (new_rps->evclk || new_rps->ecclk)
-
 
5942
			vce_v1_0_enable_mgcg(rdev, false);
-
 
5943
		else
-
 
5944
			vce_v1_0_enable_mgcg(rdev, true);
-
 
5945
		radeon_set_vce_clocks(rdev, new_rps->evclk, new_rps->ecclk);
-
 
5946
	}
-
 
5947
}
5816
 
5948
 
5817
void si_dpm_setup_asic(struct radeon_device *rdev)
5949
void si_dpm_setup_asic(struct radeon_device *rdev)
5818
{
5950
{
Line 5819... Line 5951...
5819
	int r;
5951
	int r;
Line 5932... Line 6064...
5932
	pwm_diff2 = rdev->pm.dpm.fan.pwm_high - rdev->pm.dpm.fan.pwm_med;
6064
	pwm_diff2 = rdev->pm.dpm.fan.pwm_high - rdev->pm.dpm.fan.pwm_med;
Line 5933... Line 6065...
5933
 
6065
 
5934
	slope1 = (u16)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100);
6066
	slope1 = (u16)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100);
Line -... Line 6067...
-
 
6067
	slope2 = (u16)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100);
-
 
6068
 
-
 
6069
	fan_table.temp_min = cpu_to_be16((50 + rdev->pm.dpm.fan.t_min) / 100);
-
 
6070
	fan_table.temp_med = cpu_to_be16((50 + rdev->pm.dpm.fan.t_med) / 100);
5935
	slope2 = (u16)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100);
6071
	fan_table.temp_max = cpu_to_be16((50 + rdev->pm.dpm.fan.t_max) / 100);
5936
 
6072
 
Line 5937... Line 6073...
5937
	fan_table.slope1 = cpu_to_be16(slope1);
6073
	fan_table.slope1 = cpu_to_be16(slope1);
Line 5971... Line 6107...
5971
	return 0;
6107
	return 0;
5972
}
6108
}
Line 5973... Line 6109...
5973
 
6109
 
5974
static int si_fan_ctrl_start_smc_fan_control(struct radeon_device *rdev)
6110
static int si_fan_ctrl_start_smc_fan_control(struct radeon_device *rdev)
-
 
6111
{
5975
{
6112
	struct si_power_info *si_pi = si_get_pi(rdev);
Line 5976... Line 6113...
5976
	PPSMC_Result ret;
6113
	PPSMC_Result ret;
5977
 
6114
 
-
 
6115
	ret = si_send_msg_to_smc(rdev, PPSMC_StartFanControl);
5978
	ret = si_send_msg_to_smc(rdev, PPSMC_StartFanControl);
6116
	if (ret == PPSMC_Result_OK) {
5979
	if (ret == PPSMC_Result_OK)
6117
		si_pi->fan_is_controlled_by_smc = true;
5980
		return 0;
6118
		return 0;
5981
	else
6119
	} else {
-
 
6120
		return -EINVAL;
Line 5982... Line 6121...
5982
		return -EINVAL;
6121
	}
5983
}
6122
}
-
 
6123
 
5984
 
6124
static int si_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev)
Line 5985... Line 6125...
5985
static int si_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev)
6125
{
-
 
6126
	struct si_power_info *si_pi = si_get_pi(rdev);
5986
{
6127
	PPSMC_Result ret;
-
 
6128
 
5987
	PPSMC_Result ret;
6129
	ret = si_send_msg_to_smc(rdev, PPSMC_StopFanControl);
5988
 
6130
 
5989
	ret = si_send_msg_to_smc(rdev, PPSMC_StopFanControl);
6131
	if (ret == PPSMC_Result_OK) {
5990
	if (ret == PPSMC_Result_OK)
6132
		si_pi->fan_is_controlled_by_smc = false;
-
 
6133
		return 0;
Line 5991... Line -...
5991
		return 0;
-
 
5992
	else
6134
	} else {
5993
		return -EINVAL;
6135
		return -EINVAL;
5994
}
6136
	}
5995
 
6137
}
5996
#if 0
6138
 
Line 6017... Line 6159...
6017
		*speed = 100;
6159
		*speed = 100;
Line 6018... Line 6160...
6018
 
6160
 
6019
	return 0;
6161
	return 0;
Line 6020... Line 6162...
6020
}
6162
}
6021
 
6163
 
6022
static int si_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev,
6164
int si_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev,
-
 
6165
				      u32 speed)
6023
					     u32 speed)
6166
{
6024
{
6167
	struct si_power_info *si_pi = si_get_pi(rdev);
6025
	u32 tmp;
6168
	u32 tmp;
Line 6026... Line 6169...
6026
	u32 duty, duty100;
6169
	u32 duty, duty100;
6027
	u64 tmp64;
6170
	u64 tmp64;
Line 6028... Line 6171...
6028
 
6171
 
6029
	if (rdev->pm.no_fan)
6172
	if (rdev->pm.no_fan)
Line 6030... Line 6173...
6030
		return -ENOENT;
6173
		return -ENOENT;
6031
 
6174
 
Line 6032... Line 6175...
6032
	if (speed > 100)
6175
	if (si_pi->fan_is_controlled_by_smc)
Line 6033... Line 6176...
6033
		return -EINVAL;
6176
		return -EINVAL;
6034
 
6177
 
Line 6046... Line 6189...
6046
 
6189
 
6047
	tmp = RREG32(CG_FDO_CTRL0) & ~FDO_STATIC_DUTY_MASK;
6190
	tmp = RREG32(CG_FDO_CTRL0) & ~FDO_STATIC_DUTY_MASK;
6048
	tmp |= FDO_STATIC_DUTY(duty);
6191
	tmp |= FDO_STATIC_DUTY(duty);
Line -... Line 6192...
-
 
6192
	WREG32(CG_FDO_CTRL0, tmp);
-
 
6193
 
-
 
6194
	return 0;
-
 
6195
}
-
 
6196
 
-
 
6197
void si_fan_ctrl_set_mode(struct radeon_device *rdev, u32 mode)
-
 
6198
{
-
 
6199
	if (mode) {
-
 
6200
		/* stop auto-manage */
6049
	WREG32(CG_FDO_CTRL0, tmp);
6201
		if (rdev->pm.dpm.fan.ucode_fan_control)
-
 
6202
			si_fan_ctrl_stop_smc_fan_control(rdev);
-
 
6203
		si_fan_ctrl_set_static_mode(rdev, mode);
-
 
6204
	} else {
-
 
6205
		/* restart auto-manage */
-
 
6206
		if (rdev->pm.dpm.fan.ucode_fan_control)
-
 
6207
			si_thermal_start_smc_fan_control(rdev);
-
 
6208
		else
-
 
6209
			si_fan_ctrl_set_default_mode(rdev);
-
 
6210
	}
-
 
6211
}
-
 
6212
 
-
 
6213
u32 si_fan_ctrl_get_mode(struct radeon_device *rdev)
-
 
6214
{
Line -... Line 6215...
-
 
6215
	struct si_power_info *si_pi = si_get_pi(rdev);
6050
 
6216
	u32 tmp;
-
 
6217
 
-
 
6218
	if (si_pi->fan_is_controlled_by_smc)
-
 
6219
		return 0;
6051
	si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC);
6220
 
Line -... Line 6221...
-
 
6221
	tmp = RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK;
6052
 
6222
	return (tmp >> FDO_PWM_MODE_SHIFT);
6053
	return 0;
6223
}
6054
}
6224
 
6055
 
6225
#if 0
6056
static int si_fan_ctrl_get_fan_speed_rpm(struct radeon_device *rdev,
6226
static int si_fan_ctrl_get_fan_speed_rpm(struct radeon_device *rdev,
Line 6462... Line 6632...
6462
	if (ret) {
6632
	if (ret) {
6463
		DRM_ERROR("si_set_sw_state failed\n");
6633
		DRM_ERROR("si_set_sw_state failed\n");
6464
		return ret;
6634
		return ret;
6465
	}
6635
	}
6466
	ni_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps);
6636
	ni_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps);
-
 
6637
	si_set_vce_clock(rdev, new_ps, old_ps);
6467
	if (eg_pi->pcie_performance_request)
6638
	if (eg_pi->pcie_performance_request)
6468
		si_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
6639
		si_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
6469
	ret = si_set_power_state_conditionally_enable_ulv(rdev, new_ps);
6640
	ret = si_set_power_state_conditionally_enable_ulv(rdev, new_ps);
6470
	if (ret) {
6641
	if (ret) {
6471
		DRM_ERROR("si_set_power_state_conditionally_enable_ulv failed\n");
6642
		DRM_ERROR("si_set_power_state_conditionally_enable_ulv failed\n");
Line 6497... Line 6668...
6497
	struct radeon_ps *new_ps = &eg_pi->requested_rps;
6668
	struct radeon_ps *new_ps = &eg_pi->requested_rps;
Line 6498... Line 6669...
6498
 
6669
 
6499
	ni_update_current_ps(rdev, new_ps);
6670
	ni_update_current_ps(rdev, new_ps);
Line 6500... Line 6671...
6500
}
6671
}
6501
 
6672
 
6502
 
6673
#if 0
6503
void si_dpm_reset_asic(struct radeon_device *rdev)
6674
void si_dpm_reset_asic(struct radeon_device *rdev)
6504
{
6675
{
6505
	si_restrict_performance_levels_before_switch(rdev);
6676
	si_restrict_performance_levels_before_switch(rdev);
6506
	si_disable_ulv(rdev);
6677
	si_disable_ulv(rdev);
-
 
6678
	si_set_boot_state(rdev);
Line 6507... Line 6679...
6507
	si_set_boot_state(rdev);
6679
}
6508
}
6680
#endif
6509
 
6681
 
6510
void si_dpm_display_configuration_changed(struct radeon_device *rdev)
6682
void si_dpm_display_configuration_changed(struct radeon_device *rdev)
Line 6707... Line 6879...
6707
			k++;
6879
			k++;
6708
		}
6880
		}
6709
		power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
6881
		power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
6710
	}
6882
	}
6711
	rdev->pm.dpm.num_ps = state_array->ucNumEntries;
6883
	rdev->pm.dpm.num_ps = state_array->ucNumEntries;
-
 
6884
 
-
 
6885
	/* fill in the vce power states */
-
 
6886
	for (i = 0; i < RADEON_MAX_VCE_LEVELS; i++) {
-
 
6887
		u32 sclk, mclk;
-
 
6888
		clock_array_index = rdev->pm.dpm.vce_states[i].clk_idx;
-
 
6889
		clock_info = (union pplib_clock_info *)
-
 
6890
			&clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
-
 
6891
		sclk = le16_to_cpu(clock_info->si.usEngineClockLow);
-
 
6892
		sclk |= clock_info->si.ucEngineClockHigh << 16;
-
 
6893
		mclk = le16_to_cpu(clock_info->si.usMemoryClockLow);
-
 
6894
		mclk |= clock_info->si.ucMemoryClockHigh << 16;
-
 
6895
		rdev->pm.dpm.vce_states[i].sclk = sclk;
-
 
6896
		rdev->pm.dpm.vce_states[i].mclk = mclk;
-
 
6897
	}
-
 
6898
 
6712
	return 0;
6899
	return 0;
6713
}
6900
}
Line 6714... Line 6901...
6714
 
6901
 
6715
int si_dpm_init(struct radeon_device *rdev)
6902
int si_dpm_init(struct radeon_device *rdev)
Line 6751... Line 6938...
6751
 
6938
 
6752
	ret = r600_get_platform_caps(rdev);
6939
	ret = r600_get_platform_caps(rdev);
6753
	if (ret)
6940
	if (ret)
Line 6754... Line 6941...
6754
		return ret;
6941
		return ret;
6755
 
6942
 
6756
	ret = si_parse_power_table(rdev);
6943
	ret = r600_parse_extended_power_table(rdev);
-
 
6944
	if (ret)
6757
	if (ret)
6945
		return ret;
6758
		return ret;
6946
 
6759
	ret = r600_parse_extended_power_table(rdev);
6947
	ret = si_parse_power_table(rdev);
Line 6760... Line 6948...
6760
	if (ret)
6948
	if (ret)
6761
		return ret;
6949
		return ret;
Line 6871... Line 7059...
6871
	    (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
7059
	    (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
6872
		rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
7060
		rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
6873
			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
7061
			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
Line 6874... Line 7062...
6874
 
7062
 
6875
	si_pi->fan_ctrl_is_in_default_mode = true;
-
 
Line 6876... Line 7063...
6876
	rdev->pm.dpm.fan.ucode_fan_control = false;
7063
	si_pi->fan_ctrl_is_in_default_mode = true;
6877
 
7064
 
Line 6878... Line 7065...
6878
	return 0;
7065
	return 0;
Line 6909... Line 7096...
6909
		seq_printf(m, "uvd    vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
7096
		seq_printf(m, "uvd    vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
6910
		seq_printf(m, "power level %d    sclk: %u mclk: %u vddc: %u vddci: %u pcie gen: %u\n",
7097
		seq_printf(m, "power level %d    sclk: %u mclk: %u vddc: %u vddci: %u pcie gen: %u\n",
6911
			   current_index, pl->sclk, pl->mclk, pl->vddc, pl->vddci, pl->pcie_gen + 1);
7098
			   current_index, pl->sclk, pl->mclk, pl->vddc, pl->vddci, pl->pcie_gen + 1);
6912
	}
7099
	}
6913
}
7100
}
-
 
7101
 
-
 
7102
u32 si_dpm_get_current_sclk(struct radeon_device *rdev)
-
 
7103
{
-
 
7104
	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
-
 
7105
	struct radeon_ps *rps = &eg_pi->current_rps;
-
 
7106
	struct ni_ps *ps = ni_get_ps(rps);
-
 
7107
	struct rv7xx_pl *pl;
-
 
7108
	u32 current_index =
-
 
7109
		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >>
-
 
7110
		CURRENT_STATE_INDEX_SHIFT;
-
 
7111
 
-
 
7112
	if (current_index >= ps->performance_level_count) {
-
 
7113
		return 0;
-
 
7114
	} else {
-
 
7115
		pl = &ps->performance_levels[current_index];
-
 
7116
		return pl->sclk;
-
 
7117
	}
-
 
7118
}
-
 
7119
 
-
 
7120
u32 si_dpm_get_current_mclk(struct radeon_device *rdev)
-
 
7121
{
-
 
7122
	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
-
 
7123
	struct radeon_ps *rps = &eg_pi->current_rps;
-
 
7124
	struct ni_ps *ps = ni_get_ps(rps);
-
 
7125
	struct rv7xx_pl *pl;
-
 
7126
	u32 current_index =
-
 
7127
		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >>
-
 
7128
		CURRENT_STATE_INDEX_SHIFT;
-
 
7129
 
-
 
7130
	if (current_index >= ps->performance_level_count) {
-
 
7131
		return 0;
-
 
7132
	} else {
-
 
7133
		pl = &ps->performance_levels[current_index];
-
 
7134
		return pl->mclk;
-
 
7135
	}
-
 
7136
}