aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r100.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r--drivers/gpu/drm/radeon/r100.c128
1 files changed, 40 insertions, 88 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 4161a35dd3d3..4c5d21bfa2c4 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -68,22 +68,21 @@ MODULE_FIRMWARE(FIRMWARE_R520);
68 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 68 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
69 */ 69 */
70 70
71void r100_get_power_state(struct radeon_device *rdev, 71void r100_pm_get_dynpm_state(struct radeon_device *rdev)
72 enum radeon_pm_action action)
73{ 72{
74 int i; 73 int i;
75 rdev->pm.can_upclock = true; 74 rdev->pm.dynpm_can_upclock = true;
76 rdev->pm.can_downclock = true; 75 rdev->pm.dynpm_can_downclock = true;
77 76
78 switch (action) { 77 switch (rdev->pm.dynpm_planned_action) {
79 case PM_ACTION_MINIMUM: 78 case DYNPM_ACTION_MINIMUM:
80 rdev->pm.requested_power_state_index = 0; 79 rdev->pm.requested_power_state_index = 0;
81 rdev->pm.can_downclock = false; 80 rdev->pm.dynpm_can_downclock = false;
82 break; 81 break;
83 case PM_ACTION_DOWNCLOCK: 82 case DYNPM_ACTION_DOWNCLOCK:
84 if (rdev->pm.current_power_state_index == 0) { 83 if (rdev->pm.current_power_state_index == 0) {
85 rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index; 84 rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;
86 rdev->pm.can_downclock = false; 85 rdev->pm.dynpm_can_downclock = false;
87 } else { 86 } else {
88 if (rdev->pm.active_crtc_count > 1) { 87 if (rdev->pm.active_crtc_count > 1) {
89 for (i = 0; i < rdev->pm.num_power_states; i++) { 88 for (i = 0; i < rdev->pm.num_power_states; i++) {
@@ -108,10 +107,10 @@ void r100_get_power_state(struct radeon_device *rdev,
108 rdev->pm.requested_power_state_index++; 107 rdev->pm.requested_power_state_index++;
109 } 108 }
110 break; 109 break;
111 case PM_ACTION_UPCLOCK: 110 case DYNPM_ACTION_UPCLOCK:
112 if (rdev->pm.current_power_state_index == (rdev->pm.num_power_states - 1)) { 111 if (rdev->pm.current_power_state_index == (rdev->pm.num_power_states - 1)) {
113 rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index; 112 rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;
114 rdev->pm.can_upclock = false; 113 rdev->pm.dynpm_can_upclock = false;
115 } else { 114 } else {
116 if (rdev->pm.active_crtc_count > 1) { 115 if (rdev->pm.active_crtc_count > 1) {
117 for (i = (rdev->pm.num_power_states - 1); i >= 0; i--) { 116 for (i = (rdev->pm.num_power_states - 1); i >= 0; i--) {
@@ -130,11 +129,11 @@ void r100_get_power_state(struct radeon_device *rdev,
130 rdev->pm.current_power_state_index + 1; 129 rdev->pm.current_power_state_index + 1;
131 } 130 }
132 break; 131 break;
133 case PM_ACTION_DEFAULT: 132 case DYNPM_ACTION_DEFAULT:
134 rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index; 133 rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index;
135 rdev->pm.can_upclock = false; 134 rdev->pm.dynpm_can_upclock = false;
136 break; 135 break;
137 case PM_ACTION_NONE: 136 case DYNPM_ACTION_NONE:
138 default: 137 default:
139 DRM_ERROR("Requested mode for not defined action\n"); 138 DRM_ERROR("Requested mode for not defined action\n");
140 return; 139 return;
@@ -151,77 +150,33 @@ void r100_get_power_state(struct radeon_device *rdev,
151 pcie_lanes); 150 pcie_lanes);
152} 151}
153 152
154void r100_set_power_state(struct radeon_device *rdev, bool static_switch) 153void r100_pm_init_profile(struct radeon_device *rdev)
155{ 154{
156 u32 sclk, mclk; 155 /* default */
157 156 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
158 if (rdev->pm.current_power_state_index == rdev->pm.requested_power_state_index) 157 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
159 return; 158 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
160 159 rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
161 if (radeon_gui_idle(rdev)) { 160 /* low sh */
162 161 rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 0;
163 sclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. 162 rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 0;
164 clock_info[rdev->pm.requested_clock_mode_index].sclk; 163 rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
165 if (sclk > rdev->clock.default_sclk) 164 rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
166 sclk = rdev->clock.default_sclk; 165 /* high sh */
167 166 rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 0;
168 mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. 167 rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
169 clock_info[rdev->pm.requested_clock_mode_index].mclk; 168 rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
170 if (mclk > rdev->clock.default_mclk) 169 rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0;
171 mclk = rdev->clock.default_mclk; 170 /* low mh */
172 /* don't change the mclk with multiple crtcs */ 171 rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 0;
173 if (rdev->pm.active_crtc_count > 1) 172 rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
174 mclk = rdev->clock.default_mclk; 173 rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
175 174 rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
176 /* voltage, pcie lanes, etc.*/ 175 /* high mh */
177 radeon_pm_misc(rdev); 176 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 0;
178 177 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
179 if (static_switch) { 178 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
180 radeon_pm_prepare(rdev); 179 rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0;
181 /* set engine clock */
182 if (sclk != rdev->pm.current_sclk) {
183 radeon_set_engine_clock(rdev, sclk);
184 rdev->pm.current_sclk = sclk;
185 DRM_INFO("Setting: e: %d\n", sclk);
186 }
187 /* set memory clock */
188 if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
189 radeon_set_memory_clock(rdev, mclk);
190 rdev->pm.current_mclk = mclk;
191 DRM_INFO("Setting: m: %d\n", mclk);
192 }
193 radeon_pm_finish(rdev);
194 } else {
195 radeon_sync_with_vblank(rdev);
196
197 if (!radeon_pm_in_vbl(rdev))
198 return;
199
200 radeon_pm_prepare(rdev);
201 /* set engine clock */
202 if (sclk != rdev->pm.current_sclk) {
203 radeon_pm_debug_check_in_vbl(rdev, false);
204 radeon_set_engine_clock(rdev, sclk);
205 radeon_pm_debug_check_in_vbl(rdev, true);
206 rdev->pm.current_sclk = sclk;
207 DRM_INFO("Setting: e: %d\n", sclk);
208 }
209
210 /* set memory clock */
211 if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
212 radeon_pm_debug_check_in_vbl(rdev, false);
213 radeon_set_memory_clock(rdev, mclk);
214 radeon_pm_debug_check_in_vbl(rdev, true);
215 rdev->pm.current_mclk = mclk;
216 DRM_INFO("Setting: m: %d\n", mclk);
217 }
218 radeon_pm_finish(rdev);
219 }
220
221 rdev->pm.current_power_state_index = rdev->pm.requested_power_state_index;
222 rdev->pm.current_clock_mode_index = rdev->pm.requested_clock_mode_index;
223 } else
224 DRM_INFO("pm: GUI not idle!!!\n");
225} 180}
226 181
227void r100_pm_misc(struct radeon_device *rdev) 182void r100_pm_misc(struct radeon_device *rdev)
@@ -3815,7 +3770,6 @@ int r100_suspend(struct radeon_device *rdev)
3815 3770
3816void r100_fini(struct radeon_device *rdev) 3771void r100_fini(struct radeon_device *rdev)
3817{ 3772{
3818 radeon_pm_fini(rdev);
3819 r100_cp_fini(rdev); 3773 r100_cp_fini(rdev);
3820 r100_wb_fini(rdev); 3774 r100_wb_fini(rdev);
3821 r100_ib_fini(rdev); 3775 r100_ib_fini(rdev);
@@ -3871,8 +3825,6 @@ int r100_init(struct radeon_device *rdev)
3871 r100_errata(rdev); 3825 r100_errata(rdev);
3872 /* Initialize clocks */ 3826 /* Initialize clocks */
3873 radeon_get_clock_info(rdev->ddev); 3827 radeon_get_clock_info(rdev->ddev);
3874 /* Initialize power management */
3875 radeon_pm_init(rdev);
3876 /* initialize AGP */ 3828 /* initialize AGP */
3877 if (rdev->flags & RADEON_IS_AGP) { 3829 if (rdev->flags & RADEON_IS_AGP) {
3878 r = radeon_agp_init(rdev); 3830 r = radeon_agp_init(rdev);