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 | }>><>><>>>>>><>><>>>>>=>>>>>>=>>><>>><>>>>>>><>>>>>>>><>>=>><>>>>=>> |