diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 128 |
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 | ||
71 | void r100_get_power_state(struct radeon_device *rdev, | 71 | void 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 | ||
154 | void r100_set_power_state(struct radeon_device *rdev, bool static_switch) | 153 | void 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 | ||
227 | void r100_pm_misc(struct radeon_device *rdev) | 182 | void r100_pm_misc(struct radeon_device *rdev) |
@@ -3815,7 +3770,6 @@ int r100_suspend(struct radeon_device *rdev) | |||
3815 | 3770 | ||
3816 | void r100_fini(struct radeon_device *rdev) | 3771 | void 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); |