1 | /* |
2 | * Permission is hereby granted, free of charge, to any person obtaining a |
3 | * copy of this software and associated documentation files (the "Software"), |
4 | * to deal in the Software without restriction, including without limitation |
5 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
6 | * and/or sell copies of the Software, and to permit persons to whom the |
7 | * Software is furnished to do so, subject to the following conditions: |
8 | * |
9 | * The above copyright notice and this permission notice shall be included in |
10 | * all copies or substantial portions of the Software. |
11 | * |
12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
13 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
14 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
15 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR |
16 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
17 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
18 | * OTHER DEALINGS IN THE SOFTWARE. |
19 | * |
20 | * Authors: Rafał Miłecki <zajec5@gmail.com> |
21 | * Alex Deucher <alexdeucher@gmail.com> |
22 | */ |
23 | |
24 | #include <linux/debugfs.h> |
25 | #include <linux/hwmon-sysfs.h> |
26 | #include <linux/hwmon.h> |
27 | #include <linux/pci.h> |
28 | #include <linux/power_supply.h> |
29 | |
30 | #include <drm/drm_vblank.h> |
31 | |
32 | #include "atom.h" |
33 | #include "avivod.h" |
34 | #include "r600_dpm.h" |
35 | #include "radeon.h" |
36 | #include "radeon_pm.h" |
37 | |
38 | #define RADEON_IDLE_LOOP_MS 100 |
39 | #define RADEON_RECLOCK_DELAY_MS 200 |
40 | #define RADEON_WAIT_VBLANK_TIMEOUT 200 |
41 | |
42 | static const char *radeon_pm_state_type_name[5] = { |
43 | "" , |
44 | "Powersave" , |
45 | "Battery" , |
46 | "Balanced" , |
47 | "Performance" , |
48 | }; |
49 | |
50 | static void radeon_dynpm_idle_work_handler(struct work_struct *work); |
51 | static void radeon_debugfs_pm_init(struct radeon_device *rdev); |
52 | static bool radeon_pm_in_vbl(struct radeon_device *rdev); |
53 | static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish); |
54 | static void radeon_pm_update_profile(struct radeon_device *rdev); |
55 | static void radeon_pm_set_clocks(struct radeon_device *rdev); |
56 | |
57 | int radeon_pm_get_type_index(struct radeon_device *rdev, |
58 | enum radeon_pm_state_type ps_type, |
59 | int instance) |
60 | { |
61 | int i; |
62 | int found_instance = -1; |
63 | |
64 | for (i = 0; i < rdev->pm.num_power_states; i++) { |
65 | if (rdev->pm.power_state[i].type == ps_type) { |
66 | found_instance++; |
67 | if (found_instance == instance) |
68 | return i; |
69 | } |
70 | } |
71 | /* return default if no match */ |
72 | return rdev->pm.default_power_state_index; |
73 | } |
74 | |
75 | void radeon_pm_acpi_event_handler(struct radeon_device *rdev) |
76 | { |
77 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { |
78 | mutex_lock(&rdev->pm.mutex); |
79 | if (power_supply_is_system_supplied() > 0) |
80 | rdev->pm.dpm.ac_power = true; |
81 | else |
82 | rdev->pm.dpm.ac_power = false; |
83 | if (rdev->family == CHIP_ARUBA) { |
84 | if (rdev->asic->dpm.enable_bapm) |
85 | radeon_dpm_enable_bapm(rdev, rdev->pm.dpm.ac_power); |
86 | } |
87 | mutex_unlock(lock: &rdev->pm.mutex); |
88 | } else if (rdev->pm.pm_method == PM_METHOD_PROFILE) { |
89 | if (rdev->pm.profile == PM_PROFILE_AUTO) { |
90 | mutex_lock(&rdev->pm.mutex); |
91 | radeon_pm_update_profile(rdev); |
92 | radeon_pm_set_clocks(rdev); |
93 | mutex_unlock(lock: &rdev->pm.mutex); |
94 | } |
95 | } |
96 | } |
97 | |
98 | static void radeon_pm_update_profile(struct radeon_device *rdev) |
99 | { |
100 | switch (rdev->pm.profile) { |
101 | case PM_PROFILE_DEFAULT: |
102 | rdev->pm.profile_index = PM_PROFILE_DEFAULT_IDX; |
103 | break; |
104 | case PM_PROFILE_AUTO: |
105 | if (power_supply_is_system_supplied() > 0) { |
106 | if (rdev->pm.active_crtc_count > 1) |
107 | rdev->pm.profile_index = PM_PROFILE_HIGH_MH_IDX; |
108 | else |
109 | rdev->pm.profile_index = PM_PROFILE_HIGH_SH_IDX; |
110 | } else { |
111 | if (rdev->pm.active_crtc_count > 1) |
112 | rdev->pm.profile_index = PM_PROFILE_MID_MH_IDX; |
113 | else |
114 | rdev->pm.profile_index = PM_PROFILE_MID_SH_IDX; |
115 | } |
116 | break; |
117 | case PM_PROFILE_LOW: |
118 | if (rdev->pm.active_crtc_count > 1) |
119 | rdev->pm.profile_index = PM_PROFILE_LOW_MH_IDX; |
120 | else |
121 | rdev->pm.profile_index = PM_PROFILE_LOW_SH_IDX; |
122 | break; |
123 | case PM_PROFILE_MID: |
124 | if (rdev->pm.active_crtc_count > 1) |
125 | rdev->pm.profile_index = PM_PROFILE_MID_MH_IDX; |
126 | else |
127 | rdev->pm.profile_index = PM_PROFILE_MID_SH_IDX; |
128 | break; |
129 | case PM_PROFILE_HIGH: |
130 | if (rdev->pm.active_crtc_count > 1) |
131 | rdev->pm.profile_index = PM_PROFILE_HIGH_MH_IDX; |
132 | else |
133 | rdev->pm.profile_index = PM_PROFILE_HIGH_SH_IDX; |
134 | break; |
135 | } |
136 | |
137 | if (rdev->pm.active_crtc_count == 0) { |
138 | rdev->pm.requested_power_state_index = |
139 | rdev->pm.profiles[rdev->pm.profile_index].dpms_off_ps_idx; |
140 | rdev->pm.requested_clock_mode_index = |
141 | rdev->pm.profiles[rdev->pm.profile_index].dpms_off_cm_idx; |
142 | } else { |
143 | rdev->pm.requested_power_state_index = |
144 | rdev->pm.profiles[rdev->pm.profile_index].dpms_on_ps_idx; |
145 | rdev->pm.requested_clock_mode_index = |
146 | rdev->pm.profiles[rdev->pm.profile_index].dpms_on_cm_idx; |
147 | } |
148 | } |
149 | |
150 | static void radeon_unmap_vram_bos(struct radeon_device *rdev) |
151 | { |
152 | struct radeon_bo *bo, *n; |
153 | |
154 | if (list_empty(head: &rdev->gem.objects)) |
155 | return; |
156 | |
157 | list_for_each_entry_safe(bo, n, &rdev->gem.objects, list) { |
158 | if (bo->tbo.resource->mem_type == TTM_PL_VRAM) |
159 | ttm_bo_unmap_virtual(bo: &bo->tbo); |
160 | } |
161 | } |
162 | |
163 | static void radeon_sync_with_vblank(struct radeon_device *rdev) |
164 | { |
165 | if (rdev->pm.active_crtcs) { |
166 | rdev->pm.vblank_sync = false; |
167 | wait_event_timeout( |
168 | rdev->irq.vblank_queue, rdev->pm.vblank_sync, |
169 | msecs_to_jiffies(RADEON_WAIT_VBLANK_TIMEOUT)); |
170 | } |
171 | } |
172 | |
173 | static void radeon_set_power_state(struct radeon_device *rdev) |
174 | { |
175 | u32 sclk, mclk; |
176 | bool misc_after = false; |
177 | |
178 | if ((rdev->pm.requested_clock_mode_index == rdev->pm.current_clock_mode_index) && |
179 | (rdev->pm.requested_power_state_index == rdev->pm.current_power_state_index)) |
180 | return; |
181 | |
182 | if (radeon_gui_idle(rdev)) { |
183 | sclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. |
184 | clock_info[rdev->pm.requested_clock_mode_index].sclk; |
185 | if (sclk > rdev->pm.default_sclk) |
186 | sclk = rdev->pm.default_sclk; |
187 | |
188 | /* starting with BTC, there is one state that is used for both |
189 | * MH and SH. Difference is that we always use the high clock index for |
190 | * mclk and vddci. |
191 | */ |
192 | if ((rdev->pm.pm_method == PM_METHOD_PROFILE) && |
193 | (rdev->family >= CHIP_BARTS) && |
194 | rdev->pm.active_crtc_count && |
195 | ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) || |
196 | (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX))) |
197 | mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. |
198 | clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].mclk; |
199 | else |
200 | mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. |
201 | clock_info[rdev->pm.requested_clock_mode_index].mclk; |
202 | |
203 | if (mclk > rdev->pm.default_mclk) |
204 | mclk = rdev->pm.default_mclk; |
205 | |
206 | /* upvolt before raising clocks, downvolt after lowering clocks */ |
207 | if (sclk < rdev->pm.current_sclk) |
208 | misc_after = true; |
209 | |
210 | radeon_sync_with_vblank(rdev); |
211 | |
212 | if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
213 | if (!radeon_pm_in_vbl(rdev)) |
214 | return; |
215 | } |
216 | |
217 | radeon_pm_prepare(rdev); |
218 | |
219 | if (!misc_after) |
220 | /* voltage, pcie lanes, etc.*/ |
221 | radeon_pm_misc(rdev); |
222 | |
223 | /* set engine clock */ |
224 | if (sclk != rdev->pm.current_sclk) { |
225 | radeon_pm_debug_check_in_vbl(rdev, finish: false); |
226 | radeon_set_engine_clock(rdev, sclk); |
227 | radeon_pm_debug_check_in_vbl(rdev, finish: true); |
228 | rdev->pm.current_sclk = sclk; |
229 | DRM_DEBUG_DRIVER("Setting: e: %d\n" , sclk); |
230 | } |
231 | |
232 | /* set memory clock */ |
233 | if (rdev->asic->pm.set_memory_clock && (mclk != rdev->pm.current_mclk)) { |
234 | radeon_pm_debug_check_in_vbl(rdev, finish: false); |
235 | radeon_set_memory_clock(rdev, mclk); |
236 | radeon_pm_debug_check_in_vbl(rdev, finish: true); |
237 | rdev->pm.current_mclk = mclk; |
238 | DRM_DEBUG_DRIVER("Setting: m: %d\n" , mclk); |
239 | } |
240 | |
241 | if (misc_after) |
242 | /* voltage, pcie lanes, etc.*/ |
243 | radeon_pm_misc(rdev); |
244 | |
245 | radeon_pm_finish(rdev); |
246 | |
247 | rdev->pm.current_power_state_index = rdev->pm.requested_power_state_index; |
248 | rdev->pm.current_clock_mode_index = rdev->pm.requested_clock_mode_index; |
249 | } else |
250 | DRM_DEBUG_DRIVER("pm: GUI not idle!!!\n" ); |
251 | } |
252 | |
253 | static void radeon_pm_set_clocks(struct radeon_device *rdev) |
254 | { |
255 | struct drm_crtc *crtc; |
256 | int i, r; |
257 | |
258 | /* no need to take locks, etc. if nothing's going to change */ |
259 | if ((rdev->pm.requested_clock_mode_index == rdev->pm.current_clock_mode_index) && |
260 | (rdev->pm.requested_power_state_index == rdev->pm.current_power_state_index)) |
261 | return; |
262 | |
263 | down_write(sem: &rdev->pm.mclk_lock); |
264 | mutex_lock(&rdev->ring_lock); |
265 | |
266 | /* wait for the rings to drain */ |
267 | for (i = 0; i < RADEON_NUM_RINGS; i++) { |
268 | struct radeon_ring *ring = &rdev->ring[i]; |
269 | if (!ring->ready) { |
270 | continue; |
271 | } |
272 | r = radeon_fence_wait_empty(rdev, ring: i); |
273 | if (r) { |
274 | /* needs a GPU reset dont reset here */ |
275 | mutex_unlock(lock: &rdev->ring_lock); |
276 | up_write(sem: &rdev->pm.mclk_lock); |
277 | return; |
278 | } |
279 | } |
280 | |
281 | radeon_unmap_vram_bos(rdev); |
282 | |
283 | if (rdev->irq.installed) { |
284 | i = 0; |
285 | drm_for_each_crtc(crtc, rdev_to_drm(rdev)) { |
286 | if (rdev->pm.active_crtcs & (1 << i)) { |
287 | /* This can fail if a modeset is in progress */ |
288 | if (drm_crtc_vblank_get(crtc) == 0) |
289 | rdev->pm.req_vblank |= (1 << i); |
290 | else |
291 | DRM_DEBUG_DRIVER("crtc %d no vblank, can glitch\n" , |
292 | i); |
293 | } |
294 | i++; |
295 | } |
296 | } |
297 | |
298 | radeon_set_power_state(rdev); |
299 | |
300 | if (rdev->irq.installed) { |
301 | i = 0; |
302 | drm_for_each_crtc(crtc, rdev_to_drm(rdev)) { |
303 | if (rdev->pm.req_vblank & (1 << i)) { |
304 | rdev->pm.req_vblank &= ~(1 << i); |
305 | drm_crtc_vblank_put(crtc); |
306 | } |
307 | i++; |
308 | } |
309 | } |
310 | |
311 | /* update display watermarks based on new power state */ |
312 | radeon_update_bandwidth_info(rdev); |
313 | if (rdev->pm.active_crtc_count) |
314 | radeon_bandwidth_update(rdev); |
315 | |
316 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; |
317 | |
318 | mutex_unlock(lock: &rdev->ring_lock); |
319 | up_write(sem: &rdev->pm.mclk_lock); |
320 | } |
321 | |
322 | static void radeon_pm_print_states(struct radeon_device *rdev) |
323 | { |
324 | int i, j; |
325 | struct radeon_power_state *power_state; |
326 | struct radeon_pm_clock_info *clock_info; |
327 | |
328 | DRM_DEBUG_DRIVER("%d Power State(s)\n" , rdev->pm.num_power_states); |
329 | for (i = 0; i < rdev->pm.num_power_states; i++) { |
330 | power_state = &rdev->pm.power_state[i]; |
331 | DRM_DEBUG_DRIVER("State %d: %s\n" , i, |
332 | radeon_pm_state_type_name[power_state->type]); |
333 | if (i == rdev->pm.default_power_state_index) |
334 | DRM_DEBUG_DRIVER("\tDefault" ); |
335 | if ((rdev->flags & RADEON_IS_PCIE) && !(rdev->flags & RADEON_IS_IGP)) |
336 | DRM_DEBUG_DRIVER("\t%d PCIE Lanes\n" , power_state->pcie_lanes); |
337 | if (power_state->flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY) |
338 | DRM_DEBUG_DRIVER("\tSingle display only\n" ); |
339 | DRM_DEBUG_DRIVER("\t%d Clock Mode(s)\n" , power_state->num_clock_modes); |
340 | for (j = 0; j < power_state->num_clock_modes; j++) { |
341 | clock_info = &(power_state->clock_info[j]); |
342 | if (rdev->flags & RADEON_IS_IGP) |
343 | DRM_DEBUG_DRIVER("\t\t%d e: %d\n" , |
344 | j, |
345 | clock_info->sclk * 10); |
346 | else |
347 | DRM_DEBUG_DRIVER("\t\t%d e: %d\tm: %d\tv: %d\n" , |
348 | j, |
349 | clock_info->sclk * 10, |
350 | clock_info->mclk * 10, |
351 | clock_info->voltage.voltage); |
352 | } |
353 | } |
354 | } |
355 | |
356 | static ssize_t radeon_get_pm_profile(struct device *dev, |
357 | struct device_attribute *attr, |
358 | char *buf) |
359 | { |
360 | struct drm_device *ddev = dev_get_drvdata(dev); |
361 | struct radeon_device *rdev = ddev->dev_private; |
362 | int cp = rdev->pm.profile; |
363 | |
364 | return sysfs_emit(buf, fmt: "%s\n" , (cp == PM_PROFILE_AUTO) ? "auto" : |
365 | (cp == PM_PROFILE_LOW) ? "low" : |
366 | (cp == PM_PROFILE_MID) ? "mid" : |
367 | (cp == PM_PROFILE_HIGH) ? "high" : "default" ); |
368 | } |
369 | |
370 | static ssize_t radeon_set_pm_profile(struct device *dev, |
371 | struct device_attribute *attr, |
372 | const char *buf, |
373 | size_t count) |
374 | { |
375 | struct drm_device *ddev = dev_get_drvdata(dev); |
376 | struct radeon_device *rdev = ddev->dev_private; |
377 | |
378 | /* Can't set profile when the card is off */ |
379 | if ((rdev->flags & RADEON_IS_PX) && |
380 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
381 | return -EINVAL; |
382 | |
383 | mutex_lock(&rdev->pm.mutex); |
384 | if (rdev->pm.pm_method == PM_METHOD_PROFILE) { |
385 | if (strncmp("default" , buf, strlen("default" )) == 0) |
386 | rdev->pm.profile = PM_PROFILE_DEFAULT; |
387 | else if (strncmp("auto" , buf, strlen("auto" )) == 0) |
388 | rdev->pm.profile = PM_PROFILE_AUTO; |
389 | else if (strncmp("low" , buf, strlen("low" )) == 0) |
390 | rdev->pm.profile = PM_PROFILE_LOW; |
391 | else if (strncmp("mid" , buf, strlen("mid" )) == 0) |
392 | rdev->pm.profile = PM_PROFILE_MID; |
393 | else if (strncmp("high" , buf, strlen("high" )) == 0) |
394 | rdev->pm.profile = PM_PROFILE_HIGH; |
395 | else { |
396 | count = -EINVAL; |
397 | goto fail; |
398 | } |
399 | radeon_pm_update_profile(rdev); |
400 | radeon_pm_set_clocks(rdev); |
401 | } else |
402 | count = -EINVAL; |
403 | |
404 | fail: |
405 | mutex_unlock(lock: &rdev->pm.mutex); |
406 | |
407 | return count; |
408 | } |
409 | |
410 | static ssize_t radeon_get_pm_method(struct device *dev, |
411 | struct device_attribute *attr, |
412 | char *buf) |
413 | { |
414 | struct drm_device *ddev = dev_get_drvdata(dev); |
415 | struct radeon_device *rdev = ddev->dev_private; |
416 | int pm = rdev->pm.pm_method; |
417 | |
418 | return sysfs_emit(buf, fmt: "%s\n" , (pm == PM_METHOD_DYNPM) ? "dynpm" : |
419 | (pm == PM_METHOD_PROFILE) ? "profile" : "dpm" ); |
420 | } |
421 | |
422 | static ssize_t radeon_set_pm_method(struct device *dev, |
423 | struct device_attribute *attr, |
424 | const char *buf, |
425 | size_t count) |
426 | { |
427 | struct drm_device *ddev = dev_get_drvdata(dev); |
428 | struct radeon_device *rdev = ddev->dev_private; |
429 | |
430 | /* Can't set method when the card is off */ |
431 | if ((rdev->flags & RADEON_IS_PX) && |
432 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) { |
433 | count = -EINVAL; |
434 | goto fail; |
435 | } |
436 | |
437 | /* we don't support the legacy modes with dpm */ |
438 | if (rdev->pm.pm_method == PM_METHOD_DPM) { |
439 | count = -EINVAL; |
440 | goto fail; |
441 | } |
442 | |
443 | if (strncmp("dynpm" , buf, strlen("dynpm" )) == 0) { |
444 | mutex_lock(&rdev->pm.mutex); |
445 | rdev->pm.pm_method = PM_METHOD_DYNPM; |
446 | rdev->pm.dynpm_state = DYNPM_STATE_PAUSED; |
447 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; |
448 | mutex_unlock(lock: &rdev->pm.mutex); |
449 | } else if (strncmp("profile" , buf, strlen("profile" )) == 0) { |
450 | mutex_lock(&rdev->pm.mutex); |
451 | /* disable dynpm */ |
452 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; |
453 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; |
454 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
455 | mutex_unlock(lock: &rdev->pm.mutex); |
456 | cancel_delayed_work_sync(dwork: &rdev->pm.dynpm_idle_work); |
457 | } else { |
458 | count = -EINVAL; |
459 | goto fail; |
460 | } |
461 | radeon_pm_compute_clocks(rdev); |
462 | fail: |
463 | return count; |
464 | } |
465 | |
466 | static ssize_t radeon_get_dpm_state(struct device *dev, |
467 | struct device_attribute *attr, |
468 | char *buf) |
469 | { |
470 | struct drm_device *ddev = dev_get_drvdata(dev); |
471 | struct radeon_device *rdev = ddev->dev_private; |
472 | enum radeon_pm_state_type pm = rdev->pm.dpm.user_state; |
473 | |
474 | return sysfs_emit(buf, fmt: "%s\n" , |
475 | (pm == POWER_STATE_TYPE_BATTERY) ? "battery" : |
476 | (pm == POWER_STATE_TYPE_BALANCED) ? "balanced" : "performance" ); |
477 | } |
478 | |
479 | static ssize_t radeon_set_dpm_state(struct device *dev, |
480 | struct device_attribute *attr, |
481 | const char *buf, |
482 | size_t count) |
483 | { |
484 | struct drm_device *ddev = dev_get_drvdata(dev); |
485 | struct radeon_device *rdev = ddev->dev_private; |
486 | |
487 | mutex_lock(&rdev->pm.mutex); |
488 | if (strncmp("battery" , buf, strlen("battery" )) == 0) |
489 | rdev->pm.dpm.user_state = POWER_STATE_TYPE_BATTERY; |
490 | else if (strncmp("balanced" , buf, strlen("balanced" )) == 0) |
491 | rdev->pm.dpm.user_state = POWER_STATE_TYPE_BALANCED; |
492 | else if (strncmp("performance" , buf, strlen("performance" )) == 0) |
493 | rdev->pm.dpm.user_state = POWER_STATE_TYPE_PERFORMANCE; |
494 | else { |
495 | mutex_unlock(lock: &rdev->pm.mutex); |
496 | count = -EINVAL; |
497 | goto fail; |
498 | } |
499 | mutex_unlock(lock: &rdev->pm.mutex); |
500 | |
501 | /* Can't set dpm state when the card is off */ |
502 | if (!(rdev->flags & RADEON_IS_PX) || |
503 | (ddev->switch_power_state == DRM_SWITCH_POWER_ON)) |
504 | radeon_pm_compute_clocks(rdev); |
505 | |
506 | fail: |
507 | return count; |
508 | } |
509 | |
510 | static ssize_t radeon_get_dpm_forced_performance_level(struct device *dev, |
511 | struct device_attribute *attr, |
512 | char *buf) |
513 | { |
514 | struct drm_device *ddev = dev_get_drvdata(dev); |
515 | struct radeon_device *rdev = ddev->dev_private; |
516 | enum radeon_dpm_forced_level level = rdev->pm.dpm.forced_level; |
517 | |
518 | if ((rdev->flags & RADEON_IS_PX) && |
519 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
520 | return sysfs_emit(buf, fmt: "off\n" ); |
521 | |
522 | return sysfs_emit(buf, fmt: "%s\n" , |
523 | (level == RADEON_DPM_FORCED_LEVEL_AUTO) ? "auto" : |
524 | (level == RADEON_DPM_FORCED_LEVEL_LOW) ? "low" : "high" ); |
525 | } |
526 | |
527 | static ssize_t radeon_set_dpm_forced_performance_level(struct device *dev, |
528 | struct device_attribute *attr, |
529 | const char *buf, |
530 | size_t count) |
531 | { |
532 | struct drm_device *ddev = dev_get_drvdata(dev); |
533 | struct radeon_device *rdev = ddev->dev_private; |
534 | enum radeon_dpm_forced_level level; |
535 | int ret = 0; |
536 | |
537 | /* Can't force performance level when the card is off */ |
538 | if ((rdev->flags & RADEON_IS_PX) && |
539 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
540 | return -EINVAL; |
541 | |
542 | mutex_lock(&rdev->pm.mutex); |
543 | if (strncmp("low" , buf, strlen("low" )) == 0) { |
544 | level = RADEON_DPM_FORCED_LEVEL_LOW; |
545 | } else if (strncmp("high" , buf, strlen("high" )) == 0) { |
546 | level = RADEON_DPM_FORCED_LEVEL_HIGH; |
547 | } else if (strncmp("auto" , buf, strlen("auto" )) == 0) { |
548 | level = RADEON_DPM_FORCED_LEVEL_AUTO; |
549 | } else { |
550 | count = -EINVAL; |
551 | goto fail; |
552 | } |
553 | if (rdev->asic->dpm.force_performance_level) { |
554 | if (rdev->pm.dpm.thermal_active) { |
555 | count = -EINVAL; |
556 | goto fail; |
557 | } |
558 | ret = radeon_dpm_force_performance_level(rdev, level); |
559 | if (ret) |
560 | count = -EINVAL; |
561 | } |
562 | fail: |
563 | mutex_unlock(lock: &rdev->pm.mutex); |
564 | |
565 | return count; |
566 | } |
567 | |
568 | static ssize_t radeon_hwmon_get_pwm1_enable(struct device *dev, |
569 | struct device_attribute *attr, |
570 | char *buf) |
571 | { |
572 | struct radeon_device *rdev = dev_get_drvdata(dev); |
573 | u32 pwm_mode = 0; |
574 | |
575 | if (rdev->asic->dpm.fan_ctrl_get_mode) |
576 | pwm_mode = rdev->asic->dpm.fan_ctrl_get_mode(rdev); |
577 | |
578 | /* never 0 (full-speed), fuse or smc-controlled always */ |
579 | return sprintf(buf, fmt: "%i\n" , pwm_mode == FDO_PWM_MODE_STATIC ? 1 : 2); |
580 | } |
581 | |
582 | static ssize_t radeon_hwmon_set_pwm1_enable(struct device *dev, |
583 | struct device_attribute *attr, |
584 | const char *buf, |
585 | size_t count) |
586 | { |
587 | struct radeon_device *rdev = dev_get_drvdata(dev); |
588 | int err; |
589 | int value; |
590 | |
591 | if (!rdev->asic->dpm.fan_ctrl_set_mode) |
592 | return -EINVAL; |
593 | |
594 | err = kstrtoint(s: buf, base: 10, res: &value); |
595 | if (err) |
596 | return err; |
597 | |
598 | switch (value) { |
599 | case 1: /* manual, percent-based */ |
600 | rdev->asic->dpm.fan_ctrl_set_mode(rdev, FDO_PWM_MODE_STATIC); |
601 | break; |
602 | default: /* disable */ |
603 | rdev->asic->dpm.fan_ctrl_set_mode(rdev, 0); |
604 | break; |
605 | } |
606 | |
607 | return count; |
608 | } |
609 | |
610 | static ssize_t radeon_hwmon_get_pwm1_min(struct device *dev, |
611 | struct device_attribute *attr, |
612 | char *buf) |
613 | { |
614 | return sprintf(buf, fmt: "%i\n" , 0); |
615 | } |
616 | |
617 | static ssize_t radeon_hwmon_get_pwm1_max(struct device *dev, |
618 | struct device_attribute *attr, |
619 | char *buf) |
620 | { |
621 | return sprintf(buf, fmt: "%i\n" , 255); |
622 | } |
623 | |
624 | static ssize_t radeon_hwmon_set_pwm1(struct device *dev, |
625 | struct device_attribute *attr, |
626 | const char *buf, size_t count) |
627 | { |
628 | struct radeon_device *rdev = dev_get_drvdata(dev); |
629 | int err; |
630 | u32 value; |
631 | |
632 | err = kstrtou32(s: buf, base: 10, res: &value); |
633 | if (err) |
634 | return err; |
635 | |
636 | value = (value * 100) / 255; |
637 | |
638 | err = rdev->asic->dpm.set_fan_speed_percent(rdev, value); |
639 | if (err) |
640 | return err; |
641 | |
642 | return count; |
643 | } |
644 | |
645 | static ssize_t radeon_hwmon_get_pwm1(struct device *dev, |
646 | struct device_attribute *attr, |
647 | char *buf) |
648 | { |
649 | struct radeon_device *rdev = dev_get_drvdata(dev); |
650 | int err; |
651 | u32 speed; |
652 | |
653 | err = rdev->asic->dpm.get_fan_speed_percent(rdev, &speed); |
654 | if (err) |
655 | return err; |
656 | |
657 | speed = (speed * 255) / 100; |
658 | |
659 | return sprintf(buf, fmt: "%i\n" , speed); |
660 | } |
661 | |
662 | static DEVICE_ATTR(power_profile, S_IRUGO | S_IWUSR, radeon_get_pm_profile, radeon_set_pm_profile); |
663 | static DEVICE_ATTR(power_method, S_IRUGO | S_IWUSR, radeon_get_pm_method, radeon_set_pm_method); |
664 | static DEVICE_ATTR(power_dpm_state, S_IRUGO | S_IWUSR, radeon_get_dpm_state, radeon_set_dpm_state); |
665 | static DEVICE_ATTR(power_dpm_force_performance_level, S_IRUGO | S_IWUSR, |
666 | radeon_get_dpm_forced_performance_level, |
667 | radeon_set_dpm_forced_performance_level); |
668 | |
669 | static ssize_t radeon_hwmon_show_temp(struct device *dev, |
670 | struct device_attribute *attr, |
671 | char *buf) |
672 | { |
673 | struct radeon_device *rdev = dev_get_drvdata(dev); |
674 | struct drm_device *ddev = rdev_to_drm(rdev); |
675 | int temp; |
676 | |
677 | /* Can't get temperature when the card is off */ |
678 | if ((rdev->flags & RADEON_IS_PX) && |
679 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
680 | return -EINVAL; |
681 | |
682 | if (rdev->asic->pm.get_temperature) |
683 | temp = radeon_get_temperature(rdev); |
684 | else |
685 | temp = 0; |
686 | |
687 | return sysfs_emit(buf, fmt: "%d\n" , temp); |
688 | } |
689 | |
690 | static ssize_t radeon_hwmon_show_temp_thresh(struct device *dev, |
691 | struct device_attribute *attr, |
692 | char *buf) |
693 | { |
694 | struct radeon_device *rdev = dev_get_drvdata(dev); |
695 | int hyst = to_sensor_dev_attr(attr)->index; |
696 | int temp; |
697 | |
698 | if (hyst) |
699 | temp = rdev->pm.dpm.thermal.min_temp; |
700 | else |
701 | temp = rdev->pm.dpm.thermal.max_temp; |
702 | |
703 | return sysfs_emit(buf, fmt: "%d\n" , temp); |
704 | } |
705 | |
706 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, radeon_hwmon_show_temp, NULL, 0); |
707 | static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, radeon_hwmon_show_temp_thresh, NULL, 0); |
708 | static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, radeon_hwmon_show_temp_thresh, NULL, 1); |
709 | static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, radeon_hwmon_get_pwm1, radeon_hwmon_set_pwm1, 0); |
710 | static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, radeon_hwmon_get_pwm1_enable, radeon_hwmon_set_pwm1_enable, 0); |
711 | static SENSOR_DEVICE_ATTR(pwm1_min, S_IRUGO, radeon_hwmon_get_pwm1_min, NULL, 0); |
712 | static SENSOR_DEVICE_ATTR(pwm1_max, S_IRUGO, radeon_hwmon_get_pwm1_max, NULL, 0); |
713 | |
714 | static ssize_t radeon_hwmon_show_sclk(struct device *dev, |
715 | struct device_attribute *attr, char *buf) |
716 | { |
717 | struct radeon_device *rdev = dev_get_drvdata(dev); |
718 | struct drm_device *ddev = rdev_to_drm(rdev); |
719 | u32 sclk = 0; |
720 | |
721 | /* Can't get clock frequency when the card is off */ |
722 | if ((rdev->flags & RADEON_IS_PX) && |
723 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
724 | return -EINVAL; |
725 | |
726 | if (rdev->asic->dpm.get_current_sclk) |
727 | sclk = radeon_dpm_get_current_sclk(rdev); |
728 | |
729 | /* Value returned by dpm is in 10 KHz units, need to convert it into Hz |
730 | for hwmon */ |
731 | sclk *= 10000; |
732 | |
733 | return sysfs_emit(buf, fmt: "%u\n" , sclk); |
734 | } |
735 | |
736 | static SENSOR_DEVICE_ATTR(freq1_input, S_IRUGO, radeon_hwmon_show_sclk, NULL, |
737 | 0); |
738 | |
739 | static ssize_t radeon_hwmon_show_vddc(struct device *dev, |
740 | struct device_attribute *attr, char *buf) |
741 | { |
742 | struct radeon_device *rdev = dev_get_drvdata(dev); |
743 | struct drm_device *ddev = rdev_to_drm(rdev); |
744 | u16 vddc = 0; |
745 | |
746 | /* Can't get vddc when the card is off */ |
747 | if ((rdev->flags & RADEON_IS_PX) && |
748 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
749 | return -EINVAL; |
750 | |
751 | if (rdev->asic->dpm.get_current_vddc) |
752 | vddc = rdev->asic->dpm.get_current_vddc(rdev); |
753 | |
754 | return sysfs_emit(buf, fmt: "%u\n" , vddc); |
755 | } |
756 | |
757 | static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, radeon_hwmon_show_vddc, NULL, |
758 | 0); |
759 | |
760 | static struct attribute *hwmon_attributes[] = { |
761 | &sensor_dev_attr_temp1_input.dev_attr.attr, |
762 | &sensor_dev_attr_temp1_crit.dev_attr.attr, |
763 | &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr, |
764 | &sensor_dev_attr_pwm1.dev_attr.attr, |
765 | &sensor_dev_attr_pwm1_enable.dev_attr.attr, |
766 | &sensor_dev_attr_pwm1_min.dev_attr.attr, |
767 | &sensor_dev_attr_pwm1_max.dev_attr.attr, |
768 | &sensor_dev_attr_freq1_input.dev_attr.attr, |
769 | &sensor_dev_attr_in0_input.dev_attr.attr, |
770 | NULL |
771 | }; |
772 | |
773 | static umode_t hwmon_attributes_visible(struct kobject *kobj, |
774 | struct attribute *attr, int index) |
775 | { |
776 | struct device *dev = kobj_to_dev(kobj); |
777 | struct radeon_device *rdev = dev_get_drvdata(dev); |
778 | umode_t effective_mode = attr->mode; |
779 | |
780 | /* Skip attributes if DPM is not enabled */ |
781 | if (rdev->pm.pm_method != PM_METHOD_DPM && |
782 | (attr == &sensor_dev_attr_temp1_crit.dev_attr.attr || |
783 | attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr || |
784 | attr == &sensor_dev_attr_pwm1.dev_attr.attr || |
785 | attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr || |
786 | attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || |
787 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr || |
788 | attr == &sensor_dev_attr_freq1_input.dev_attr.attr || |
789 | attr == &sensor_dev_attr_in0_input.dev_attr.attr)) |
790 | return 0; |
791 | |
792 | /* Skip vddc attribute if get_current_vddc is not implemented */ |
793 | if (attr == &sensor_dev_attr_in0_input.dev_attr.attr && |
794 | !rdev->asic->dpm.get_current_vddc) |
795 | return 0; |
796 | |
797 | /* Skip fan attributes if fan is not present */ |
798 | if (rdev->pm.no_fan && |
799 | (attr == &sensor_dev_attr_pwm1.dev_attr.attr || |
800 | attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr || |
801 | attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || |
802 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr)) |
803 | return 0; |
804 | |
805 | /* mask fan attributes if we have no bindings for this asic to expose */ |
806 | if ((!rdev->asic->dpm.get_fan_speed_percent && |
807 | attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't query fan */ |
808 | (!rdev->asic->dpm.fan_ctrl_get_mode && |
809 | attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't query state */ |
810 | effective_mode &= ~S_IRUGO; |
811 | |
812 | if ((!rdev->asic->dpm.set_fan_speed_percent && |
813 | attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't manage fan */ |
814 | (!rdev->asic->dpm.fan_ctrl_set_mode && |
815 | attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't manage state */ |
816 | effective_mode &= ~S_IWUSR; |
817 | |
818 | /* hide max/min values if we can't both query and manage the fan */ |
819 | if ((!rdev->asic->dpm.set_fan_speed_percent && |
820 | !rdev->asic->dpm.get_fan_speed_percent) && |
821 | (attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || |
822 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr)) |
823 | return 0; |
824 | |
825 | return effective_mode; |
826 | } |
827 | |
828 | static const struct attribute_group hwmon_attrgroup = { |
829 | .attrs = hwmon_attributes, |
830 | .is_visible = hwmon_attributes_visible, |
831 | }; |
832 | |
833 | static const struct attribute_group *hwmon_groups[] = { |
834 | &hwmon_attrgroup, |
835 | NULL |
836 | }; |
837 | |
838 | static int radeon_hwmon_init(struct radeon_device *rdev) |
839 | { |
840 | int err = 0; |
841 | |
842 | switch (rdev->pm.int_thermal_type) { |
843 | case THERMAL_TYPE_RV6XX: |
844 | case THERMAL_TYPE_RV770: |
845 | case THERMAL_TYPE_EVERGREEN: |
846 | case THERMAL_TYPE_NI: |
847 | case THERMAL_TYPE_SUMO: |
848 | case THERMAL_TYPE_SI: |
849 | case THERMAL_TYPE_CI: |
850 | case THERMAL_TYPE_KV: |
851 | if (rdev->asic->pm.get_temperature == NULL) |
852 | return err; |
853 | rdev->pm.int_hwmon_dev = hwmon_device_register_with_groups(dev: rdev->dev, |
854 | name: "radeon" , drvdata: rdev, |
855 | groups: hwmon_groups); |
856 | if (IS_ERR(ptr: rdev->pm.int_hwmon_dev)) { |
857 | err = PTR_ERR(ptr: rdev->pm.int_hwmon_dev); |
858 | dev_err(rdev->dev, |
859 | "Unable to register hwmon device: %d\n" , err); |
860 | } |
861 | break; |
862 | default: |
863 | break; |
864 | } |
865 | |
866 | return err; |
867 | } |
868 | |
869 | static void radeon_hwmon_fini(struct radeon_device *rdev) |
870 | { |
871 | if (rdev->pm.int_hwmon_dev) |
872 | hwmon_device_unregister(dev: rdev->pm.int_hwmon_dev); |
873 | } |
874 | |
875 | static void radeon_dpm_thermal_work_handler(struct work_struct *work) |
876 | { |
877 | struct radeon_device *rdev = |
878 | container_of(work, struct radeon_device, |
879 | pm.dpm.thermal.work); |
880 | /* switch to the thermal state */ |
881 | enum radeon_pm_state_type dpm_state = POWER_STATE_TYPE_INTERNAL_THERMAL; |
882 | |
883 | if (!rdev->pm.dpm_enabled) |
884 | return; |
885 | |
886 | if (rdev->asic->pm.get_temperature) { |
887 | int temp = radeon_get_temperature(rdev); |
888 | |
889 | if (temp < rdev->pm.dpm.thermal.min_temp) |
890 | /* switch back the user state */ |
891 | dpm_state = rdev->pm.dpm.user_state; |
892 | } else { |
893 | if (rdev->pm.dpm.thermal.high_to_low) |
894 | /* switch back the user state */ |
895 | dpm_state = rdev->pm.dpm.user_state; |
896 | } |
897 | mutex_lock(&rdev->pm.mutex); |
898 | if (dpm_state == POWER_STATE_TYPE_INTERNAL_THERMAL) |
899 | rdev->pm.dpm.thermal_active = true; |
900 | else |
901 | rdev->pm.dpm.thermal_active = false; |
902 | rdev->pm.dpm.state = dpm_state; |
903 | mutex_unlock(lock: &rdev->pm.mutex); |
904 | |
905 | radeon_pm_compute_clocks(rdev); |
906 | } |
907 | |
908 | static bool radeon_dpm_single_display(struct radeon_device *rdev) |
909 | { |
910 | bool single_display = (rdev->pm.dpm.new_active_crtc_count < 2) ? |
911 | true : false; |
912 | |
913 | /* check if the vblank period is too short to adjust the mclk */ |
914 | if (single_display && rdev->asic->dpm.vblank_too_short) { |
915 | if (radeon_dpm_vblank_too_short(rdev)) |
916 | single_display = false; |
917 | } |
918 | |
919 | /* 120hz tends to be problematic even if they are under the |
920 | * vblank limit. |
921 | */ |
922 | if (single_display && (r600_dpm_get_vrefresh(rdev) >= 120)) |
923 | single_display = false; |
924 | |
925 | return single_display; |
926 | } |
927 | |
928 | static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev, |
929 | enum radeon_pm_state_type dpm_state) |
930 | { |
931 | int i; |
932 | struct radeon_ps *ps; |
933 | u32 ui_class; |
934 | bool single_display = radeon_dpm_single_display(rdev); |
935 | |
936 | /* certain older asics have a separare 3D performance state, |
937 | * so try that first if the user selected performance |
938 | */ |
939 | if (dpm_state == POWER_STATE_TYPE_PERFORMANCE) |
940 | dpm_state = POWER_STATE_TYPE_INTERNAL_3DPERF; |
941 | /* balanced states don't exist at the moment */ |
942 | if (dpm_state == POWER_STATE_TYPE_BALANCED) |
943 | dpm_state = POWER_STATE_TYPE_PERFORMANCE; |
944 | |
945 | restart_search: |
946 | /* Pick the best power state based on current conditions */ |
947 | for (i = 0; i < rdev->pm.dpm.num_ps; i++) { |
948 | ps = &rdev->pm.dpm.ps[i]; |
949 | ui_class = ps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK; |
950 | switch (dpm_state) { |
951 | /* user states */ |
952 | case POWER_STATE_TYPE_BATTERY: |
953 | if (ui_class == ATOM_PPLIB_CLASSIFICATION_UI_BATTERY) { |
954 | if (ps->caps & ATOM_PPLIB_SINGLE_DISPLAY_ONLY) { |
955 | if (single_display) |
956 | return ps; |
957 | } else |
958 | return ps; |
959 | } |
960 | break; |
961 | case POWER_STATE_TYPE_BALANCED: |
962 | if (ui_class == ATOM_PPLIB_CLASSIFICATION_UI_BALANCED) { |
963 | if (ps->caps & ATOM_PPLIB_SINGLE_DISPLAY_ONLY) { |
964 | if (single_display) |
965 | return ps; |
966 | } else |
967 | return ps; |
968 | } |
969 | break; |
970 | case POWER_STATE_TYPE_PERFORMANCE: |
971 | if (ui_class == ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) { |
972 | if (ps->caps & ATOM_PPLIB_SINGLE_DISPLAY_ONLY) { |
973 | if (single_display) |
974 | return ps; |
975 | } else |
976 | return ps; |
977 | } |
978 | break; |
979 | /* internal states */ |
980 | case POWER_STATE_TYPE_INTERNAL_UVD: |
981 | if (rdev->pm.dpm.uvd_ps) |
982 | return rdev->pm.dpm.uvd_ps; |
983 | else |
984 | break; |
985 | case POWER_STATE_TYPE_INTERNAL_UVD_SD: |
986 | if (ps->class & ATOM_PPLIB_CLASSIFICATION_SDSTATE) |
987 | return ps; |
988 | break; |
989 | case POWER_STATE_TYPE_INTERNAL_UVD_HD: |
990 | if (ps->class & ATOM_PPLIB_CLASSIFICATION_HDSTATE) |
991 | return ps; |
992 | break; |
993 | case POWER_STATE_TYPE_INTERNAL_UVD_HD2: |
994 | if (ps->class & ATOM_PPLIB_CLASSIFICATION_HD2STATE) |
995 | return ps; |
996 | break; |
997 | case POWER_STATE_TYPE_INTERNAL_UVD_MVC: |
998 | if (ps->class2 & ATOM_PPLIB_CLASSIFICATION2_MVC) |
999 | return ps; |
1000 | break; |
1001 | case POWER_STATE_TYPE_INTERNAL_BOOT: |
1002 | return rdev->pm.dpm.boot_ps; |
1003 | case POWER_STATE_TYPE_INTERNAL_THERMAL: |
1004 | if (ps->class & ATOM_PPLIB_CLASSIFICATION_THERMAL) |
1005 | return ps; |
1006 | break; |
1007 | case POWER_STATE_TYPE_INTERNAL_ACPI: |
1008 | if (ps->class & ATOM_PPLIB_CLASSIFICATION_ACPI) |
1009 | return ps; |
1010 | break; |
1011 | case POWER_STATE_TYPE_INTERNAL_ULV: |
1012 | if (ps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV) |
1013 | return ps; |
1014 | break; |
1015 | case POWER_STATE_TYPE_INTERNAL_3DPERF: |
1016 | if (ps->class & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE) |
1017 | return ps; |
1018 | break; |
1019 | default: |
1020 | break; |
1021 | } |
1022 | } |
1023 | /* use a fallback state if we didn't match */ |
1024 | switch (dpm_state) { |
1025 | case POWER_STATE_TYPE_INTERNAL_UVD_SD: |
1026 | dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD; |
1027 | goto restart_search; |
1028 | case POWER_STATE_TYPE_INTERNAL_UVD_HD: |
1029 | case POWER_STATE_TYPE_INTERNAL_UVD_HD2: |
1030 | case POWER_STATE_TYPE_INTERNAL_UVD_MVC: |
1031 | if (rdev->pm.dpm.uvd_ps) { |
1032 | return rdev->pm.dpm.uvd_ps; |
1033 | } else { |
1034 | dpm_state = POWER_STATE_TYPE_PERFORMANCE; |
1035 | goto restart_search; |
1036 | } |
1037 | case POWER_STATE_TYPE_INTERNAL_THERMAL: |
1038 | dpm_state = POWER_STATE_TYPE_INTERNAL_ACPI; |
1039 | goto restart_search; |
1040 | case POWER_STATE_TYPE_INTERNAL_ACPI: |
1041 | dpm_state = POWER_STATE_TYPE_BATTERY; |
1042 | goto restart_search; |
1043 | case POWER_STATE_TYPE_BATTERY: |
1044 | case POWER_STATE_TYPE_BALANCED: |
1045 | case POWER_STATE_TYPE_INTERNAL_3DPERF: |
1046 | dpm_state = POWER_STATE_TYPE_PERFORMANCE; |
1047 | goto restart_search; |
1048 | default: |
1049 | break; |
1050 | } |
1051 | |
1052 | return NULL; |
1053 | } |
1054 | |
1055 | static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev) |
1056 | { |
1057 | int i; |
1058 | struct radeon_ps *ps; |
1059 | enum radeon_pm_state_type dpm_state; |
1060 | int ret; |
1061 | bool single_display = radeon_dpm_single_display(rdev); |
1062 | |
1063 | /* if dpm init failed */ |
1064 | if (!rdev->pm.dpm_enabled) |
1065 | return; |
1066 | |
1067 | if (rdev->pm.dpm.user_state != rdev->pm.dpm.state) { |
1068 | /* add other state override checks here */ |
1069 | if ((!rdev->pm.dpm.thermal_active) && |
1070 | (!rdev->pm.dpm.uvd_active)) |
1071 | rdev->pm.dpm.state = rdev->pm.dpm.user_state; |
1072 | } |
1073 | dpm_state = rdev->pm.dpm.state; |
1074 | |
1075 | ps = radeon_dpm_pick_power_state(rdev, dpm_state); |
1076 | if (ps) |
1077 | rdev->pm.dpm.requested_ps = ps; |
1078 | else |
1079 | return; |
1080 | |
1081 | /* no need to reprogram if nothing changed unless we are on BTC+ */ |
1082 | if (rdev->pm.dpm.current_ps == rdev->pm.dpm.requested_ps) { |
1083 | /* vce just modifies an existing state so force a change */ |
1084 | if (ps->vce_active != rdev->pm.dpm.vce_active) |
1085 | goto force; |
1086 | /* user has made a display change (such as timing) */ |
1087 | if (rdev->pm.dpm.single_display != single_display) |
1088 | goto force; |
1089 | if ((rdev->family < CHIP_BARTS) || (rdev->flags & RADEON_IS_IGP)) { |
1090 | /* for pre-BTC and APUs if the num crtcs changed but state is the same, |
1091 | * all we need to do is update the display configuration. |
1092 | */ |
1093 | if (rdev->pm.dpm.new_active_crtcs != rdev->pm.dpm.current_active_crtcs) { |
1094 | /* update display watermarks based on new power state */ |
1095 | radeon_bandwidth_update(rdev); |
1096 | /* update displays */ |
1097 | radeon_dpm_display_configuration_changed(rdev); |
1098 | rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; |
1099 | rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; |
1100 | } |
1101 | return; |
1102 | } else { |
1103 | /* for BTC+ if the num crtcs hasn't changed and state is the same, |
1104 | * nothing to do, if the num crtcs is > 1 and state is the same, |
1105 | * update display configuration. |
1106 | */ |
1107 | if (rdev->pm.dpm.new_active_crtcs == |
1108 | rdev->pm.dpm.current_active_crtcs) { |
1109 | return; |
1110 | } else { |
1111 | if ((rdev->pm.dpm.current_active_crtc_count > 1) && |
1112 | (rdev->pm.dpm.new_active_crtc_count > 1)) { |
1113 | /* update display watermarks based on new power state */ |
1114 | radeon_bandwidth_update(rdev); |
1115 | /* update displays */ |
1116 | radeon_dpm_display_configuration_changed(rdev); |
1117 | rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; |
1118 | rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; |
1119 | return; |
1120 | } |
1121 | } |
1122 | } |
1123 | } |
1124 | |
1125 | force: |
1126 | if (radeon_dpm == 1) { |
1127 | printk("switching from power state:\n" ); |
1128 | radeon_dpm_print_power_state(rdev, rdev->pm.dpm.current_ps); |
1129 | printk("switching to power state:\n" ); |
1130 | radeon_dpm_print_power_state(rdev, rdev->pm.dpm.requested_ps); |
1131 | } |
1132 | |
1133 | down_write(sem: &rdev->pm.mclk_lock); |
1134 | mutex_lock(&rdev->ring_lock); |
1135 | |
1136 | /* update whether vce is active */ |
1137 | ps->vce_active = rdev->pm.dpm.vce_active; |
1138 | |
1139 | ret = radeon_dpm_pre_set_power_state(rdev); |
1140 | if (ret) |
1141 | goto done; |
1142 | |
1143 | /* update display watermarks based on new power state */ |
1144 | radeon_bandwidth_update(rdev); |
1145 | /* update displays */ |
1146 | radeon_dpm_display_configuration_changed(rdev); |
1147 | |
1148 | /* wait for the rings to drain */ |
1149 | for (i = 0; i < RADEON_NUM_RINGS; i++) { |
1150 | struct radeon_ring *ring = &rdev->ring[i]; |
1151 | if (ring->ready) |
1152 | radeon_fence_wait_empty(rdev, ring: i); |
1153 | } |
1154 | |
1155 | /* program the new power state */ |
1156 | radeon_dpm_set_power_state(rdev); |
1157 | |
1158 | /* update current power state */ |
1159 | rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps; |
1160 | |
1161 | radeon_dpm_post_set_power_state(rdev); |
1162 | |
1163 | rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; |
1164 | rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; |
1165 | rdev->pm.dpm.single_display = single_display; |
1166 | |
1167 | if (rdev->asic->dpm.force_performance_level) { |
1168 | if (rdev->pm.dpm.thermal_active) { |
1169 | enum radeon_dpm_forced_level level = rdev->pm.dpm.forced_level; |
1170 | /* force low perf level for thermal */ |
1171 | radeon_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_LOW); |
1172 | /* save the user's level */ |
1173 | rdev->pm.dpm.forced_level = level; |
1174 | } else { |
1175 | /* otherwise, user selected level */ |
1176 | radeon_dpm_force_performance_level(rdev, rdev->pm.dpm.forced_level); |
1177 | } |
1178 | } |
1179 | |
1180 | done: |
1181 | mutex_unlock(lock: &rdev->ring_lock); |
1182 | up_write(sem: &rdev->pm.mclk_lock); |
1183 | } |
1184 | |
1185 | void radeon_dpm_enable_uvd(struct radeon_device *rdev, bool enable) |
1186 | { |
1187 | enum radeon_pm_state_type dpm_state; |
1188 | |
1189 | if (rdev->asic->dpm.powergate_uvd) { |
1190 | mutex_lock(&rdev->pm.mutex); |
1191 | /* don't powergate anything if we |
1192 | have active but pause streams */ |
1193 | enable |= rdev->pm.dpm.sd > 0; |
1194 | enable |= rdev->pm.dpm.hd > 0; |
1195 | /* enable/disable UVD */ |
1196 | radeon_dpm_powergate_uvd(rdev, !enable); |
1197 | mutex_unlock(lock: &rdev->pm.mutex); |
1198 | } else { |
1199 | if (enable) { |
1200 | mutex_lock(&rdev->pm.mutex); |
1201 | rdev->pm.dpm.uvd_active = true; |
1202 | /* disable this for now */ |
1203 | #if 0 |
1204 | if ((rdev->pm.dpm.sd == 1) && (rdev->pm.dpm.hd == 0)) |
1205 | dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_SD; |
1206 | else if ((rdev->pm.dpm.sd == 2) && (rdev->pm.dpm.hd == 0)) |
1207 | dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD; |
1208 | else if ((rdev->pm.dpm.sd == 0) && (rdev->pm.dpm.hd == 1)) |
1209 | dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD; |
1210 | else if ((rdev->pm.dpm.sd == 0) && (rdev->pm.dpm.hd == 2)) |
1211 | dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD2; |
1212 | else |
1213 | #endif |
1214 | dpm_state = POWER_STATE_TYPE_INTERNAL_UVD; |
1215 | rdev->pm.dpm.state = dpm_state; |
1216 | mutex_unlock(lock: &rdev->pm.mutex); |
1217 | } else { |
1218 | mutex_lock(&rdev->pm.mutex); |
1219 | rdev->pm.dpm.uvd_active = false; |
1220 | mutex_unlock(lock: &rdev->pm.mutex); |
1221 | } |
1222 | |
1223 | radeon_pm_compute_clocks(rdev); |
1224 | } |
1225 | } |
1226 | |
1227 | void radeon_dpm_enable_vce(struct radeon_device *rdev, bool enable) |
1228 | { |
1229 | if (enable) { |
1230 | mutex_lock(&rdev->pm.mutex); |
1231 | rdev->pm.dpm.vce_active = true; |
1232 | /* XXX select vce level based on ring/task */ |
1233 | rdev->pm.dpm.vce_level = RADEON_VCE_LEVEL_AC_ALL; |
1234 | mutex_unlock(lock: &rdev->pm.mutex); |
1235 | } else { |
1236 | mutex_lock(&rdev->pm.mutex); |
1237 | rdev->pm.dpm.vce_active = false; |
1238 | mutex_unlock(lock: &rdev->pm.mutex); |
1239 | } |
1240 | |
1241 | radeon_pm_compute_clocks(rdev); |
1242 | } |
1243 | |
1244 | static void radeon_pm_suspend_old(struct radeon_device *rdev) |
1245 | { |
1246 | mutex_lock(&rdev->pm.mutex); |
1247 | if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
1248 | if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) |
1249 | rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED; |
1250 | } |
1251 | mutex_unlock(lock: &rdev->pm.mutex); |
1252 | |
1253 | cancel_delayed_work_sync(dwork: &rdev->pm.dynpm_idle_work); |
1254 | } |
1255 | |
1256 | static void radeon_pm_suspend_dpm(struct radeon_device *rdev) |
1257 | { |
1258 | mutex_lock(&rdev->pm.mutex); |
1259 | /* disable dpm */ |
1260 | radeon_dpm_disable(rdev); |
1261 | /* reset the power state */ |
1262 | rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps; |
1263 | rdev->pm.dpm_enabled = false; |
1264 | mutex_unlock(lock: &rdev->pm.mutex); |
1265 | } |
1266 | |
1267 | void radeon_pm_suspend(struct radeon_device *rdev) |
1268 | { |
1269 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
1270 | radeon_pm_suspend_dpm(rdev); |
1271 | else |
1272 | radeon_pm_suspend_old(rdev); |
1273 | } |
1274 | |
1275 | static void radeon_pm_resume_old(struct radeon_device *rdev) |
1276 | { |
1277 | /* set up the default clocks if the MC ucode is loaded */ |
1278 | if ((rdev->family >= CHIP_BARTS) && |
1279 | (rdev->family <= CHIP_CAYMAN) && |
1280 | rdev->mc_fw) { |
1281 | if (rdev->pm.default_vddc) |
1282 | radeon_atom_set_voltage(rdev, voltage_level: rdev->pm.default_vddc, |
1283 | SET_VOLTAGE_TYPE_ASIC_VDDC); |
1284 | if (rdev->pm.default_vddci) |
1285 | radeon_atom_set_voltage(rdev, voltage_level: rdev->pm.default_vddci, |
1286 | SET_VOLTAGE_TYPE_ASIC_VDDCI); |
1287 | if (rdev->pm.default_sclk) |
1288 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
1289 | if (rdev->pm.default_mclk) |
1290 | radeon_set_memory_clock(rdev, rdev->pm.default_mclk); |
1291 | } |
1292 | /* asic init will reset the default power state */ |
1293 | mutex_lock(&rdev->pm.mutex); |
1294 | rdev->pm.current_power_state_index = rdev->pm.default_power_state_index; |
1295 | rdev->pm.current_clock_mode_index = 0; |
1296 | rdev->pm.current_sclk = rdev->pm.default_sclk; |
1297 | rdev->pm.current_mclk = rdev->pm.default_mclk; |
1298 | if (rdev->pm.power_state) { |
1299 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; |
1300 | rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci; |
1301 | } |
1302 | if (rdev->pm.pm_method == PM_METHOD_DYNPM |
1303 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { |
1304 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; |
1305 | schedule_delayed_work(dwork: &rdev->pm.dynpm_idle_work, |
1306 | delay: msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); |
1307 | } |
1308 | mutex_unlock(lock: &rdev->pm.mutex); |
1309 | radeon_pm_compute_clocks(rdev); |
1310 | } |
1311 | |
1312 | static void radeon_pm_resume_dpm(struct radeon_device *rdev) |
1313 | { |
1314 | int ret; |
1315 | |
1316 | /* asic init will reset to the boot state */ |
1317 | mutex_lock(&rdev->pm.mutex); |
1318 | rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps; |
1319 | radeon_dpm_setup_asic(rdev); |
1320 | ret = radeon_dpm_enable(rdev); |
1321 | mutex_unlock(lock: &rdev->pm.mutex); |
1322 | if (ret) |
1323 | goto dpm_resume_fail; |
1324 | rdev->pm.dpm_enabled = true; |
1325 | return; |
1326 | |
1327 | dpm_resume_fail: |
1328 | DRM_ERROR("radeon: dpm resume failed\n" ); |
1329 | if ((rdev->family >= CHIP_BARTS) && |
1330 | (rdev->family <= CHIP_CAYMAN) && |
1331 | rdev->mc_fw) { |
1332 | if (rdev->pm.default_vddc) |
1333 | radeon_atom_set_voltage(rdev, voltage_level: rdev->pm.default_vddc, |
1334 | SET_VOLTAGE_TYPE_ASIC_VDDC); |
1335 | if (rdev->pm.default_vddci) |
1336 | radeon_atom_set_voltage(rdev, voltage_level: rdev->pm.default_vddci, |
1337 | SET_VOLTAGE_TYPE_ASIC_VDDCI); |
1338 | if (rdev->pm.default_sclk) |
1339 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
1340 | if (rdev->pm.default_mclk) |
1341 | radeon_set_memory_clock(rdev, rdev->pm.default_mclk); |
1342 | } |
1343 | } |
1344 | |
1345 | void radeon_pm_resume(struct radeon_device *rdev) |
1346 | { |
1347 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
1348 | radeon_pm_resume_dpm(rdev); |
1349 | else |
1350 | radeon_pm_resume_old(rdev); |
1351 | } |
1352 | |
1353 | static int radeon_pm_init_old(struct radeon_device *rdev) |
1354 | { |
1355 | int ret; |
1356 | |
1357 | rdev->pm.profile = PM_PROFILE_DEFAULT; |
1358 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; |
1359 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; |
1360 | rdev->pm.dynpm_can_upclock = true; |
1361 | rdev->pm.dynpm_can_downclock = true; |
1362 | rdev->pm.default_sclk = rdev->clock.default_sclk; |
1363 | rdev->pm.default_mclk = rdev->clock.default_mclk; |
1364 | rdev->pm.current_sclk = rdev->clock.default_sclk; |
1365 | rdev->pm.current_mclk = rdev->clock.default_mclk; |
1366 | rdev->pm.int_thermal_type = THERMAL_TYPE_NONE; |
1367 | |
1368 | if (rdev->bios) { |
1369 | if (rdev->is_atom_bios) |
1370 | radeon_atombios_get_power_modes(rdev); |
1371 | else |
1372 | radeon_combios_get_power_modes(rdev); |
1373 | radeon_pm_print_states(rdev); |
1374 | radeon_pm_init_profile(rdev); |
1375 | /* set up the default clocks if the MC ucode is loaded */ |
1376 | if ((rdev->family >= CHIP_BARTS) && |
1377 | (rdev->family <= CHIP_CAYMAN) && |
1378 | rdev->mc_fw) { |
1379 | if (rdev->pm.default_vddc) |
1380 | radeon_atom_set_voltage(rdev, voltage_level: rdev->pm.default_vddc, |
1381 | SET_VOLTAGE_TYPE_ASIC_VDDC); |
1382 | if (rdev->pm.default_vddci) |
1383 | radeon_atom_set_voltage(rdev, voltage_level: rdev->pm.default_vddci, |
1384 | SET_VOLTAGE_TYPE_ASIC_VDDCI); |
1385 | if (rdev->pm.default_sclk) |
1386 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
1387 | if (rdev->pm.default_mclk) |
1388 | radeon_set_memory_clock(rdev, rdev->pm.default_mclk); |
1389 | } |
1390 | } |
1391 | |
1392 | /* set up the internal thermal sensor if applicable */ |
1393 | ret = radeon_hwmon_init(rdev); |
1394 | if (ret) |
1395 | return ret; |
1396 | |
1397 | INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler); |
1398 | |
1399 | if (rdev->pm.num_power_states > 1) { |
1400 | radeon_debugfs_pm_init(rdev); |
1401 | DRM_INFO("radeon: power management initialized\n" ); |
1402 | } |
1403 | |
1404 | return 0; |
1405 | } |
1406 | |
1407 | static void radeon_dpm_print_power_states(struct radeon_device *rdev) |
1408 | { |
1409 | int i; |
1410 | |
1411 | for (i = 0; i < rdev->pm.dpm.num_ps; i++) { |
1412 | printk("== power state %d ==\n" , i); |
1413 | radeon_dpm_print_power_state(rdev, &rdev->pm.dpm.ps[i]); |
1414 | } |
1415 | } |
1416 | |
1417 | static int radeon_pm_init_dpm(struct radeon_device *rdev) |
1418 | { |
1419 | int ret; |
1420 | |
1421 | /* default to balanced state */ |
1422 | rdev->pm.dpm.state = POWER_STATE_TYPE_BALANCED; |
1423 | rdev->pm.dpm.user_state = POWER_STATE_TYPE_BALANCED; |
1424 | rdev->pm.dpm.forced_level = RADEON_DPM_FORCED_LEVEL_AUTO; |
1425 | rdev->pm.default_sclk = rdev->clock.default_sclk; |
1426 | rdev->pm.default_mclk = rdev->clock.default_mclk; |
1427 | rdev->pm.current_sclk = rdev->clock.default_sclk; |
1428 | rdev->pm.current_mclk = rdev->clock.default_mclk; |
1429 | rdev->pm.int_thermal_type = THERMAL_TYPE_NONE; |
1430 | |
1431 | if (rdev->bios && rdev->is_atom_bios) |
1432 | radeon_atombios_get_power_modes(rdev); |
1433 | else |
1434 | return -EINVAL; |
1435 | |
1436 | /* set up the internal thermal sensor if applicable */ |
1437 | ret = radeon_hwmon_init(rdev); |
1438 | if (ret) |
1439 | return ret; |
1440 | |
1441 | INIT_WORK(&rdev->pm.dpm.thermal.work, radeon_dpm_thermal_work_handler); |
1442 | mutex_lock(&rdev->pm.mutex); |
1443 | radeon_dpm_init(rdev); |
1444 | rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps; |
1445 | if (radeon_dpm == 1) |
1446 | radeon_dpm_print_power_states(rdev); |
1447 | radeon_dpm_setup_asic(rdev); |
1448 | ret = radeon_dpm_enable(rdev); |
1449 | mutex_unlock(lock: &rdev->pm.mutex); |
1450 | if (ret) |
1451 | goto dpm_failed; |
1452 | rdev->pm.dpm_enabled = true; |
1453 | |
1454 | radeon_debugfs_pm_init(rdev); |
1455 | |
1456 | DRM_INFO("radeon: dpm initialized\n" ); |
1457 | |
1458 | return 0; |
1459 | |
1460 | dpm_failed: |
1461 | rdev->pm.dpm_enabled = false; |
1462 | if ((rdev->family >= CHIP_BARTS) && |
1463 | (rdev->family <= CHIP_CAYMAN) && |
1464 | rdev->mc_fw) { |
1465 | if (rdev->pm.default_vddc) |
1466 | radeon_atom_set_voltage(rdev, voltage_level: rdev->pm.default_vddc, |
1467 | SET_VOLTAGE_TYPE_ASIC_VDDC); |
1468 | if (rdev->pm.default_vddci) |
1469 | radeon_atom_set_voltage(rdev, voltage_level: rdev->pm.default_vddci, |
1470 | SET_VOLTAGE_TYPE_ASIC_VDDCI); |
1471 | if (rdev->pm.default_sclk) |
1472 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
1473 | if (rdev->pm.default_mclk) |
1474 | radeon_set_memory_clock(rdev, rdev->pm.default_mclk); |
1475 | } |
1476 | DRM_ERROR("radeon: dpm initialization failed\n" ); |
1477 | return ret; |
1478 | } |
1479 | |
1480 | struct radeon_dpm_quirk { |
1481 | u32 chip_vendor; |
1482 | u32 chip_device; |
1483 | u32 subsys_vendor; |
1484 | u32 subsys_device; |
1485 | }; |
1486 | |
1487 | /* cards with dpm stability problems */ |
1488 | static struct radeon_dpm_quirk radeon_dpm_quirk_list[] = { |
1489 | /* TURKS - https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1386534 */ |
1490 | { PCI_VENDOR_ID_ATI, 0x6759, 0x1682, 0x3195 }, |
1491 | /* TURKS - https://bugzilla.kernel.org/show_bug.cgi?id=83731 */ |
1492 | { PCI_VENDOR_ID_ATI, 0x6840, 0x1179, 0xfb81 }, |
1493 | { 0, 0, 0, 0 }, |
1494 | }; |
1495 | |
1496 | int radeon_pm_init(struct radeon_device *rdev) |
1497 | { |
1498 | struct radeon_dpm_quirk *p = radeon_dpm_quirk_list; |
1499 | bool disable_dpm = false; |
1500 | |
1501 | /* Apply dpm quirks */ |
1502 | while (p && p->chip_device != 0) { |
1503 | if (rdev->pdev->vendor == p->chip_vendor && |
1504 | rdev->pdev->device == p->chip_device && |
1505 | rdev->pdev->subsystem_vendor == p->subsys_vendor && |
1506 | rdev->pdev->subsystem_device == p->subsys_device) { |
1507 | disable_dpm = true; |
1508 | break; |
1509 | } |
1510 | ++p; |
1511 | } |
1512 | |
1513 | /* enable dpm on rv6xx+ */ |
1514 | switch (rdev->family) { |
1515 | case CHIP_RV610: |
1516 | case CHIP_RV630: |
1517 | case CHIP_RV620: |
1518 | case CHIP_RV635: |
1519 | case CHIP_RV670: |
1520 | case CHIP_RS780: |
1521 | case CHIP_RS880: |
1522 | case CHIP_RV770: |
1523 | /* DPM requires the RLC, RV770+ dGPU requires SMC */ |
1524 | if (!rdev->rlc_fw) |
1525 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1526 | else if ((rdev->family >= CHIP_RV770) && |
1527 | (!(rdev->flags & RADEON_IS_IGP)) && |
1528 | (!rdev->smc_fw)) |
1529 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1530 | else if (radeon_dpm == 1) |
1531 | rdev->pm.pm_method = PM_METHOD_DPM; |
1532 | else |
1533 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1534 | break; |
1535 | case CHIP_RV730: |
1536 | case CHIP_RV710: |
1537 | case CHIP_RV740: |
1538 | case CHIP_CEDAR: |
1539 | case CHIP_REDWOOD: |
1540 | case CHIP_JUNIPER: |
1541 | case CHIP_CYPRESS: |
1542 | case CHIP_HEMLOCK: |
1543 | case CHIP_PALM: |
1544 | case CHIP_SUMO: |
1545 | case CHIP_SUMO2: |
1546 | case CHIP_BARTS: |
1547 | case CHIP_TURKS: |
1548 | case CHIP_CAICOS: |
1549 | case CHIP_CAYMAN: |
1550 | case CHIP_ARUBA: |
1551 | case CHIP_TAHITI: |
1552 | case CHIP_PITCAIRN: |
1553 | case CHIP_VERDE: |
1554 | case CHIP_OLAND: |
1555 | case CHIP_HAINAN: |
1556 | case CHIP_BONAIRE: |
1557 | case CHIP_KABINI: |
1558 | case CHIP_KAVERI: |
1559 | case CHIP_HAWAII: |
1560 | case CHIP_MULLINS: |
1561 | /* DPM requires the RLC, RV770+ dGPU requires SMC */ |
1562 | if (!rdev->rlc_fw) |
1563 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1564 | else if ((rdev->family >= CHIP_RV770) && |
1565 | (!(rdev->flags & RADEON_IS_IGP)) && |
1566 | (!rdev->smc_fw)) |
1567 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1568 | else if (disable_dpm && (radeon_dpm == -1)) |
1569 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1570 | else if (radeon_dpm == 0) |
1571 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1572 | else |
1573 | rdev->pm.pm_method = PM_METHOD_DPM; |
1574 | break; |
1575 | default: |
1576 | /* default to profile method */ |
1577 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1578 | break; |
1579 | } |
1580 | |
1581 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
1582 | return radeon_pm_init_dpm(rdev); |
1583 | else |
1584 | return radeon_pm_init_old(rdev); |
1585 | } |
1586 | |
1587 | int radeon_pm_late_init(struct radeon_device *rdev) |
1588 | { |
1589 | int ret = 0; |
1590 | |
1591 | if (rdev->pm.pm_method == PM_METHOD_DPM) { |
1592 | if (rdev->pm.dpm_enabled) { |
1593 | if (!rdev->pm.sysfs_initialized) { |
1594 | ret = device_create_file(device: rdev->dev, entry: &dev_attr_power_dpm_state); |
1595 | if (ret) |
1596 | DRM_ERROR("failed to create device file for dpm state\n" ); |
1597 | ret = device_create_file(device: rdev->dev, entry: &dev_attr_power_dpm_force_performance_level); |
1598 | if (ret) |
1599 | DRM_ERROR("failed to create device file for dpm state\n" ); |
1600 | /* XXX: these are noops for dpm but are here for backwards compat */ |
1601 | ret = device_create_file(device: rdev->dev, entry: &dev_attr_power_profile); |
1602 | if (ret) |
1603 | DRM_ERROR("failed to create device file for power profile\n" ); |
1604 | ret = device_create_file(device: rdev->dev, entry: &dev_attr_power_method); |
1605 | if (ret) |
1606 | DRM_ERROR("failed to create device file for power method\n" ); |
1607 | rdev->pm.sysfs_initialized = true; |
1608 | } |
1609 | |
1610 | mutex_lock(&rdev->pm.mutex); |
1611 | ret = radeon_dpm_late_enable(rdev); |
1612 | mutex_unlock(lock: &rdev->pm.mutex); |
1613 | if (ret) { |
1614 | rdev->pm.dpm_enabled = false; |
1615 | DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n" ); |
1616 | } else { |
1617 | /* set the dpm state for PX since there won't be |
1618 | * a modeset to call this. |
1619 | */ |
1620 | radeon_pm_compute_clocks(rdev); |
1621 | } |
1622 | } |
1623 | } else { |
1624 | if ((rdev->pm.num_power_states > 1) && |
1625 | (!rdev->pm.sysfs_initialized)) { |
1626 | /* where's the best place to put these? */ |
1627 | ret = device_create_file(device: rdev->dev, entry: &dev_attr_power_profile); |
1628 | if (ret) |
1629 | DRM_ERROR("failed to create device file for power profile\n" ); |
1630 | ret = device_create_file(device: rdev->dev, entry: &dev_attr_power_method); |
1631 | if (ret) |
1632 | DRM_ERROR("failed to create device file for power method\n" ); |
1633 | else |
1634 | rdev->pm.sysfs_initialized = true; |
1635 | } |
1636 | } |
1637 | return ret; |
1638 | } |
1639 | |
1640 | static void radeon_pm_fini_old(struct radeon_device *rdev) |
1641 | { |
1642 | if (rdev->pm.num_power_states > 1) { |
1643 | mutex_lock(&rdev->pm.mutex); |
1644 | if (rdev->pm.pm_method == PM_METHOD_PROFILE) { |
1645 | rdev->pm.profile = PM_PROFILE_DEFAULT; |
1646 | radeon_pm_update_profile(rdev); |
1647 | radeon_pm_set_clocks(rdev); |
1648 | } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
1649 | /* reset default clocks */ |
1650 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; |
1651 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; |
1652 | radeon_pm_set_clocks(rdev); |
1653 | } |
1654 | mutex_unlock(lock: &rdev->pm.mutex); |
1655 | |
1656 | cancel_delayed_work_sync(dwork: &rdev->pm.dynpm_idle_work); |
1657 | |
1658 | device_remove_file(dev: rdev->dev, attr: &dev_attr_power_profile); |
1659 | device_remove_file(dev: rdev->dev, attr: &dev_attr_power_method); |
1660 | } |
1661 | |
1662 | radeon_hwmon_fini(rdev); |
1663 | kfree(objp: rdev->pm.power_state); |
1664 | } |
1665 | |
1666 | static void radeon_pm_fini_dpm(struct radeon_device *rdev) |
1667 | { |
1668 | if (rdev->pm.num_power_states > 1) { |
1669 | mutex_lock(&rdev->pm.mutex); |
1670 | radeon_dpm_disable(rdev); |
1671 | mutex_unlock(lock: &rdev->pm.mutex); |
1672 | |
1673 | device_remove_file(dev: rdev->dev, attr: &dev_attr_power_dpm_state); |
1674 | device_remove_file(dev: rdev->dev, attr: &dev_attr_power_dpm_force_performance_level); |
1675 | /* XXX backwards compat */ |
1676 | device_remove_file(dev: rdev->dev, attr: &dev_attr_power_profile); |
1677 | device_remove_file(dev: rdev->dev, attr: &dev_attr_power_method); |
1678 | } |
1679 | radeon_dpm_fini(rdev); |
1680 | |
1681 | radeon_hwmon_fini(rdev); |
1682 | kfree(objp: rdev->pm.power_state); |
1683 | } |
1684 | |
1685 | void radeon_pm_fini(struct radeon_device *rdev) |
1686 | { |
1687 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
1688 | radeon_pm_fini_dpm(rdev); |
1689 | else |
1690 | radeon_pm_fini_old(rdev); |
1691 | } |
1692 | |
1693 | static void radeon_pm_compute_clocks_old(struct radeon_device *rdev) |
1694 | { |
1695 | struct drm_device *ddev = rdev_to_drm(rdev); |
1696 | struct drm_crtc *crtc; |
1697 | struct radeon_crtc *radeon_crtc; |
1698 | |
1699 | if (rdev->pm.num_power_states < 2) |
1700 | return; |
1701 | |
1702 | mutex_lock(&rdev->pm.mutex); |
1703 | |
1704 | rdev->pm.active_crtcs = 0; |
1705 | rdev->pm.active_crtc_count = 0; |
1706 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
1707 | list_for_each_entry(crtc, |
1708 | &ddev->mode_config.crtc_list, head) { |
1709 | radeon_crtc = to_radeon_crtc(crtc); |
1710 | if (radeon_crtc->enabled) { |
1711 | rdev->pm.active_crtcs |= (1 << radeon_crtc->crtc_id); |
1712 | rdev->pm.active_crtc_count++; |
1713 | } |
1714 | } |
1715 | } |
1716 | |
1717 | if (rdev->pm.pm_method == PM_METHOD_PROFILE) { |
1718 | radeon_pm_update_profile(rdev); |
1719 | radeon_pm_set_clocks(rdev); |
1720 | } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
1721 | if (rdev->pm.dynpm_state != DYNPM_STATE_DISABLED) { |
1722 | if (rdev->pm.active_crtc_count > 1) { |
1723 | if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) { |
1724 | cancel_delayed_work(dwork: &rdev->pm.dynpm_idle_work); |
1725 | |
1726 | rdev->pm.dynpm_state = DYNPM_STATE_PAUSED; |
1727 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; |
1728 | radeon_pm_get_dynpm_state(rdev); |
1729 | radeon_pm_set_clocks(rdev); |
1730 | |
1731 | DRM_DEBUG_DRIVER("radeon: dynamic power management deactivated\n" ); |
1732 | } |
1733 | } else if (rdev->pm.active_crtc_count == 1) { |
1734 | /* TODO: Increase clocks if needed for current mode */ |
1735 | |
1736 | if (rdev->pm.dynpm_state == DYNPM_STATE_MINIMUM) { |
1737 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; |
1738 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_UPCLOCK; |
1739 | radeon_pm_get_dynpm_state(rdev); |
1740 | radeon_pm_set_clocks(rdev); |
1741 | |
1742 | schedule_delayed_work(dwork: &rdev->pm.dynpm_idle_work, |
1743 | delay: msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); |
1744 | } else if (rdev->pm.dynpm_state == DYNPM_STATE_PAUSED) { |
1745 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; |
1746 | schedule_delayed_work(dwork: &rdev->pm.dynpm_idle_work, |
1747 | delay: msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); |
1748 | DRM_DEBUG_DRIVER("radeon: dynamic power management activated\n" ); |
1749 | } |
1750 | } else { /* count == 0 */ |
1751 | if (rdev->pm.dynpm_state != DYNPM_STATE_MINIMUM) { |
1752 | cancel_delayed_work(dwork: &rdev->pm.dynpm_idle_work); |
1753 | |
1754 | rdev->pm.dynpm_state = DYNPM_STATE_MINIMUM; |
1755 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_MINIMUM; |
1756 | radeon_pm_get_dynpm_state(rdev); |
1757 | radeon_pm_set_clocks(rdev); |
1758 | } |
1759 | } |
1760 | } |
1761 | } |
1762 | |
1763 | mutex_unlock(lock: &rdev->pm.mutex); |
1764 | } |
1765 | |
1766 | static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev) |
1767 | { |
1768 | struct drm_device *ddev = rdev_to_drm(rdev); |
1769 | struct drm_crtc *crtc; |
1770 | struct radeon_crtc *radeon_crtc; |
1771 | struct radeon_connector *radeon_connector; |
1772 | |
1773 | if (!rdev->pm.dpm_enabled) |
1774 | return; |
1775 | |
1776 | mutex_lock(&rdev->pm.mutex); |
1777 | |
1778 | /* update active crtc counts */ |
1779 | rdev->pm.dpm.new_active_crtcs = 0; |
1780 | rdev->pm.dpm.new_active_crtc_count = 0; |
1781 | rdev->pm.dpm.high_pixelclock_count = 0; |
1782 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
1783 | list_for_each_entry(crtc, |
1784 | &ddev->mode_config.crtc_list, head) { |
1785 | radeon_crtc = to_radeon_crtc(crtc); |
1786 | if (crtc->enabled) { |
1787 | rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id); |
1788 | rdev->pm.dpm.new_active_crtc_count++; |
1789 | if (!radeon_crtc->connector) |
1790 | continue; |
1791 | |
1792 | radeon_connector = to_radeon_connector(radeon_crtc->connector); |
1793 | if (radeon_connector->pixelclock_for_modeset > 297000) |
1794 | rdev->pm.dpm.high_pixelclock_count++; |
1795 | } |
1796 | } |
1797 | } |
1798 | |
1799 | /* update battery/ac status */ |
1800 | if (power_supply_is_system_supplied() > 0) |
1801 | rdev->pm.dpm.ac_power = true; |
1802 | else |
1803 | rdev->pm.dpm.ac_power = false; |
1804 | |
1805 | radeon_dpm_change_power_state_locked(rdev); |
1806 | |
1807 | mutex_unlock(lock: &rdev->pm.mutex); |
1808 | |
1809 | } |
1810 | |
1811 | void radeon_pm_compute_clocks(struct radeon_device *rdev) |
1812 | { |
1813 | if (rdev->pm.pm_method == PM_METHOD_DPM) |
1814 | radeon_pm_compute_clocks_dpm(rdev); |
1815 | else |
1816 | radeon_pm_compute_clocks_old(rdev); |
1817 | } |
1818 | |
1819 | static bool radeon_pm_in_vbl(struct radeon_device *rdev) |
1820 | { |
1821 | int crtc, vpos, hpos, vbl_status; |
1822 | bool in_vbl = true; |
1823 | |
1824 | /* Iterate over all active crtc's. All crtc's must be in vblank, |
1825 | * otherwise return in_vbl == false. |
1826 | */ |
1827 | for (crtc = 0; (crtc < rdev->num_crtc) && in_vbl; crtc++) { |
1828 | if (rdev->pm.active_crtcs & (1 << crtc)) { |
1829 | vbl_status = radeon_get_crtc_scanoutpos(dev: rdev_to_drm(rdev), |
1830 | pipe: crtc, |
1831 | USE_REAL_VBLANKSTART, |
1832 | vpos: &vpos, hpos: &hpos, NULL, NULL, |
1833 | mode: &rdev->mode_info.crtcs[crtc]->base.hwmode); |
1834 | if ((vbl_status & DRM_SCANOUTPOS_VALID) && |
1835 | !(vbl_status & DRM_SCANOUTPOS_IN_VBLANK)) |
1836 | in_vbl = false; |
1837 | } |
1838 | } |
1839 | |
1840 | return in_vbl; |
1841 | } |
1842 | |
1843 | static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish) |
1844 | { |
1845 | u32 stat_crtc = 0; |
1846 | bool in_vbl = radeon_pm_in_vbl(rdev); |
1847 | |
1848 | if (!in_vbl) |
1849 | DRM_DEBUG_DRIVER("not in vbl for pm change %08x at %s\n" , stat_crtc, |
1850 | finish ? "exit" : "entry" ); |
1851 | return in_vbl; |
1852 | } |
1853 | |
1854 | static void radeon_dynpm_idle_work_handler(struct work_struct *work) |
1855 | { |
1856 | struct radeon_device *rdev; |
1857 | |
1858 | rdev = container_of(work, struct radeon_device, |
1859 | pm.dynpm_idle_work.work); |
1860 | |
1861 | mutex_lock(&rdev->pm.mutex); |
1862 | if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) { |
1863 | int not_processed = 0; |
1864 | int i; |
1865 | |
1866 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { |
1867 | struct radeon_ring *ring = &rdev->ring[i]; |
1868 | |
1869 | if (ring->ready) { |
1870 | not_processed += radeon_fence_count_emitted(rdev, ring: i); |
1871 | if (not_processed >= 3) |
1872 | break; |
1873 | } |
1874 | } |
1875 | |
1876 | if (not_processed >= 3) { /* should upclock */ |
1877 | if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_DOWNCLOCK) { |
1878 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; |
1879 | } else if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_NONE && |
1880 | rdev->pm.dynpm_can_upclock) { |
1881 | rdev->pm.dynpm_planned_action = |
1882 | DYNPM_ACTION_UPCLOCK; |
1883 | rdev->pm.dynpm_action_timeout = jiffies + |
1884 | msecs_to_jiffies(RADEON_RECLOCK_DELAY_MS); |
1885 | } |
1886 | } else if (not_processed == 0) { /* should downclock */ |
1887 | if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_UPCLOCK) { |
1888 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; |
1889 | } else if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_NONE && |
1890 | rdev->pm.dynpm_can_downclock) { |
1891 | rdev->pm.dynpm_planned_action = |
1892 | DYNPM_ACTION_DOWNCLOCK; |
1893 | rdev->pm.dynpm_action_timeout = jiffies + |
1894 | msecs_to_jiffies(RADEON_RECLOCK_DELAY_MS); |
1895 | } |
1896 | } |
1897 | |
1898 | /* Note, radeon_pm_set_clocks is called with static_switch set |
1899 | * to false since we want to wait for vbl to avoid flicker. |
1900 | */ |
1901 | if (rdev->pm.dynpm_planned_action != DYNPM_ACTION_NONE && |
1902 | time_after(jiffies, rdev->pm.dynpm_action_timeout)) { |
1903 | radeon_pm_get_dynpm_state(rdev); |
1904 | radeon_pm_set_clocks(rdev); |
1905 | } |
1906 | |
1907 | schedule_delayed_work(dwork: &rdev->pm.dynpm_idle_work, |
1908 | delay: msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); |
1909 | } |
1910 | mutex_unlock(lock: &rdev->pm.mutex); |
1911 | } |
1912 | |
1913 | /* |
1914 | * Debugfs info |
1915 | */ |
1916 | #if defined(CONFIG_DEBUG_FS) |
1917 | |
1918 | static int radeon_debugfs_pm_info_show(struct seq_file *m, void *unused) |
1919 | { |
1920 | struct radeon_device *rdev = m->private; |
1921 | struct drm_device *ddev = rdev_to_drm(rdev); |
1922 | |
1923 | if ((rdev->flags & RADEON_IS_PX) && |
1924 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) { |
1925 | seq_printf(m, fmt: "PX asic powered off\n" ); |
1926 | } else if (rdev->pm.dpm_enabled) { |
1927 | mutex_lock(&rdev->pm.mutex); |
1928 | if (rdev->asic->dpm.debugfs_print_current_performance_level) |
1929 | radeon_dpm_debugfs_print_current_performance_level(rdev, m); |
1930 | else |
1931 | seq_printf(m, fmt: "Debugfs support not implemented for this asic\n" ); |
1932 | mutex_unlock(lock: &rdev->pm.mutex); |
1933 | } else { |
1934 | seq_printf(m, fmt: "default engine clock: %u0 kHz\n" , rdev->pm.default_sclk); |
1935 | /* radeon_get_engine_clock is not reliable on APUs so just print the current clock */ |
1936 | if ((rdev->family >= CHIP_PALM) && (rdev->flags & RADEON_IS_IGP)) |
1937 | seq_printf(m, fmt: "current engine clock: %u0 kHz\n" , rdev->pm.current_sclk); |
1938 | else |
1939 | seq_printf(m, fmt: "current engine clock: %u0 kHz\n" , radeon_get_engine_clock(rdev)); |
1940 | seq_printf(m, fmt: "default memory clock: %u0 kHz\n" , rdev->pm.default_mclk); |
1941 | if (rdev->asic->pm.get_memory_clock) |
1942 | seq_printf(m, fmt: "current memory clock: %u0 kHz\n" , radeon_get_memory_clock(rdev)); |
1943 | if (rdev->pm.current_vddc) |
1944 | seq_printf(m, fmt: "voltage: %u mV\n" , rdev->pm.current_vddc); |
1945 | if (rdev->asic->pm.get_pcie_lanes) |
1946 | seq_printf(m, fmt: "PCIE lanes: %d\n" , radeon_get_pcie_lanes(rdev)); |
1947 | } |
1948 | |
1949 | return 0; |
1950 | } |
1951 | |
1952 | DEFINE_SHOW_ATTRIBUTE(radeon_debugfs_pm_info); |
1953 | #endif |
1954 | |
1955 | static void radeon_debugfs_pm_init(struct radeon_device *rdev) |
1956 | { |
1957 | #if defined(CONFIG_DEBUG_FS) |
1958 | struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; |
1959 | |
1960 | debugfs_create_file("radeon_pm_info" , 0444, root, rdev, |
1961 | &radeon_debugfs_pm_info_fops); |
1962 | |
1963 | #endif |
1964 | } |
1965 | |