1 /*
2 * Copyright 2011 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: Alex Deucher
23 */
24
25 #include "amdgpu.h"
26 #include "amdgpu_atombios.h"
27 #include "amdgpu_i2c.h"
28 #include "amdgpu_dpm.h"
29 #include "atom.h"
30 #include "amd_pcie.h"
31 #include "amdgpu_display.h"
32 #include "hwmgr.h"
33 #include <linux/power_supply.h>
34 #include "amdgpu_smu.h"
35
36 #define amdgpu_dpm_notify_ac_dc(adev) \
37 ((adev)->powerplay.pp_funcs->notify_ac_dc((adev)->powerplay.pp_handle))
38
39 #define amdgpu_dpm_is_legacy_dpm(adev) ((adev)->powerplay.pp_handle == (adev))
40
amdgpu_dpm_get_sclk(struct amdgpu_device * adev,bool low)41 int amdgpu_dpm_get_sclk(struct amdgpu_device *adev, bool low)
42 {
43 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
44 int ret = 0;
45
46 if (!pp_funcs->get_sclk)
47 return 0;
48
49 mutex_lock(&adev->pm.mutex);
50 ret = pp_funcs->get_sclk((adev)->powerplay.pp_handle,
51 low);
52 mutex_unlock(&adev->pm.mutex);
53
54 return ret;
55 }
56
amdgpu_dpm_get_mclk(struct amdgpu_device * adev,bool low)57 int amdgpu_dpm_get_mclk(struct amdgpu_device *adev, bool low)
58 {
59 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
60 int ret = 0;
61
62 if (!pp_funcs->get_mclk)
63 return 0;
64
65 mutex_lock(&adev->pm.mutex);
66 ret = pp_funcs->get_mclk((adev)->powerplay.pp_handle,
67 low);
68 mutex_unlock(&adev->pm.mutex);
69
70 return ret;
71 }
72
amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device * adev,uint32_t block_type,bool gate,int inst)73 int amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device *adev,
74 uint32_t block_type,
75 bool gate,
76 int inst)
77 {
78 int ret = 0;
79 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
80 enum ip_power_state pwr_state = gate ? POWER_STATE_OFF : POWER_STATE_ON;
81 bool is_vcn = block_type == AMD_IP_BLOCK_TYPE_VCN;
82
83 mutex_lock(&adev->pm.mutex);
84
85 if (atomic_read(&adev->pm.pwr_state[block_type]) == pwr_state &&
86 (!is_vcn || adev->vcn.num_vcn_inst == 1)) {
87 dev_dbg(adev->dev, "IP block%d already in the target %s state!",
88 block_type, gate ? "gate" : "ungate");
89 goto out_unlock;
90 }
91
92 switch (block_type) {
93 case AMD_IP_BLOCK_TYPE_UVD:
94 case AMD_IP_BLOCK_TYPE_VCE:
95 case AMD_IP_BLOCK_TYPE_GFX:
96 case AMD_IP_BLOCK_TYPE_SDMA:
97 case AMD_IP_BLOCK_TYPE_JPEG:
98 case AMD_IP_BLOCK_TYPE_GMC:
99 case AMD_IP_BLOCK_TYPE_ACP:
100 case AMD_IP_BLOCK_TYPE_VPE:
101 case AMD_IP_BLOCK_TYPE_ISP:
102 if (pp_funcs && pp_funcs->set_powergating_by_smu)
103 ret = (pp_funcs->set_powergating_by_smu(
104 (adev)->powerplay.pp_handle, block_type, gate, 0));
105 break;
106 case AMD_IP_BLOCK_TYPE_VCN:
107 if (pp_funcs && pp_funcs->set_powergating_by_smu)
108 ret = (pp_funcs->set_powergating_by_smu(
109 (adev)->powerplay.pp_handle, block_type, gate, inst));
110 break;
111 default:
112 break;
113 }
114
115 if (!ret)
116 atomic_set(&adev->pm.pwr_state[block_type], pwr_state);
117
118 out_unlock:
119 mutex_unlock(&adev->pm.mutex);
120
121 return ret;
122 }
123
amdgpu_dpm_set_gfx_power_up_by_imu(struct amdgpu_device * adev)124 int amdgpu_dpm_set_gfx_power_up_by_imu(struct amdgpu_device *adev)
125 {
126 struct smu_context *smu = adev->powerplay.pp_handle;
127 int ret = -EOPNOTSUPP;
128
129 mutex_lock(&adev->pm.mutex);
130 ret = smu_set_gfx_power_up_by_imu(smu);
131 mutex_unlock(&adev->pm.mutex);
132
133 msleep(10);
134
135 return ret;
136 }
137
amdgpu_dpm_baco_enter(struct amdgpu_device * adev)138 int amdgpu_dpm_baco_enter(struct amdgpu_device *adev)
139 {
140 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
141 void *pp_handle = adev->powerplay.pp_handle;
142 int ret = 0;
143
144 if (!pp_funcs || !pp_funcs->set_asic_baco_state)
145 return -ENOENT;
146
147 mutex_lock(&adev->pm.mutex);
148
149 /* enter BACO state */
150 ret = pp_funcs->set_asic_baco_state(pp_handle, 1);
151
152 mutex_unlock(&adev->pm.mutex);
153
154 return ret;
155 }
156
amdgpu_dpm_baco_exit(struct amdgpu_device * adev)157 int amdgpu_dpm_baco_exit(struct amdgpu_device *adev)
158 {
159 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
160 void *pp_handle = adev->powerplay.pp_handle;
161 int ret = 0;
162
163 if (!pp_funcs || !pp_funcs->set_asic_baco_state)
164 return -ENOENT;
165
166 mutex_lock(&adev->pm.mutex);
167
168 /* exit BACO state */
169 ret = pp_funcs->set_asic_baco_state(pp_handle, 0);
170
171 mutex_unlock(&adev->pm.mutex);
172
173 return ret;
174 }
175
amdgpu_dpm_set_mp1_state(struct amdgpu_device * adev,enum pp_mp1_state mp1_state)176 int amdgpu_dpm_set_mp1_state(struct amdgpu_device *adev,
177 enum pp_mp1_state mp1_state)
178 {
179 int ret = 0;
180 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
181
182 if (mp1_state == PP_MP1_STATE_FLR) {
183 /* VF lost access to SMU */
184 if (amdgpu_sriov_vf(adev))
185 adev->pm.dpm_enabled = false;
186 } else if (pp_funcs && pp_funcs->set_mp1_state) {
187 mutex_lock(&adev->pm.mutex);
188
189 ret = pp_funcs->set_mp1_state(
190 adev->powerplay.pp_handle,
191 mp1_state);
192
193 mutex_unlock(&adev->pm.mutex);
194 }
195
196 return ret;
197 }
198
amdgpu_dpm_is_baco_supported(struct amdgpu_device * adev)199 int amdgpu_dpm_is_baco_supported(struct amdgpu_device *adev)
200 {
201 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
202 void *pp_handle = adev->powerplay.pp_handle;
203 int ret;
204
205 if (!pp_funcs || !pp_funcs->get_asic_baco_capability)
206 return 0;
207 /* Don't use baco for reset in S3.
208 * This is a workaround for some platforms
209 * where entering BACO during suspend
210 * seems to cause reboots or hangs.
211 * This might be related to the fact that BACO controls
212 * power to the whole GPU including devices like audio and USB.
213 * Powering down/up everything may adversely affect these other
214 * devices. Needs more investigation.
215 */
216 if (adev->in_s3)
217 return 0;
218
219 mutex_lock(&adev->pm.mutex);
220
221 ret = pp_funcs->get_asic_baco_capability(pp_handle);
222
223 mutex_unlock(&adev->pm.mutex);
224
225 return ret;
226 }
227
amdgpu_dpm_mode2_reset(struct amdgpu_device * adev)228 int amdgpu_dpm_mode2_reset(struct amdgpu_device *adev)
229 {
230 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
231 void *pp_handle = adev->powerplay.pp_handle;
232 int ret = 0;
233
234 if (!pp_funcs || !pp_funcs->asic_reset_mode_2)
235 return -ENOENT;
236
237 mutex_lock(&adev->pm.mutex);
238
239 ret = pp_funcs->asic_reset_mode_2(pp_handle);
240
241 mutex_unlock(&adev->pm.mutex);
242
243 return ret;
244 }
245
amdgpu_dpm_enable_gfx_features(struct amdgpu_device * adev)246 int amdgpu_dpm_enable_gfx_features(struct amdgpu_device *adev)
247 {
248 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
249 void *pp_handle = adev->powerplay.pp_handle;
250 int ret = 0;
251
252 if (!pp_funcs || !pp_funcs->asic_reset_enable_gfx_features)
253 return -ENOENT;
254
255 mutex_lock(&adev->pm.mutex);
256
257 ret = pp_funcs->asic_reset_enable_gfx_features(pp_handle);
258
259 mutex_unlock(&adev->pm.mutex);
260
261 return ret;
262 }
263
amdgpu_dpm_baco_reset(struct amdgpu_device * adev)264 int amdgpu_dpm_baco_reset(struct amdgpu_device *adev)
265 {
266 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
267 void *pp_handle = adev->powerplay.pp_handle;
268 int ret = 0;
269
270 if (!pp_funcs || !pp_funcs->set_asic_baco_state)
271 return -ENOENT;
272
273 mutex_lock(&adev->pm.mutex);
274
275 /* enter BACO state */
276 ret = pp_funcs->set_asic_baco_state(pp_handle, 1);
277 if (ret)
278 goto out;
279
280 /* exit BACO state */
281 ret = pp_funcs->set_asic_baco_state(pp_handle, 0);
282
283 out:
284 mutex_unlock(&adev->pm.mutex);
285 return ret;
286 }
287
amdgpu_dpm_is_mode1_reset_supported(struct amdgpu_device * adev)288 bool amdgpu_dpm_is_mode1_reset_supported(struct amdgpu_device *adev)
289 {
290 struct smu_context *smu = adev->powerplay.pp_handle;
291 bool support_mode1_reset = false;
292
293 if (is_support_sw_smu(adev)) {
294 mutex_lock(&adev->pm.mutex);
295 support_mode1_reset = smu_mode1_reset_is_support(smu);
296 mutex_unlock(&adev->pm.mutex);
297 }
298
299 return support_mode1_reset;
300 }
301
amdgpu_dpm_mode1_reset(struct amdgpu_device * adev)302 int amdgpu_dpm_mode1_reset(struct amdgpu_device *adev)
303 {
304 struct smu_context *smu = adev->powerplay.pp_handle;
305 int ret = -EOPNOTSUPP;
306
307 if (is_support_sw_smu(adev)) {
308 mutex_lock(&adev->pm.mutex);
309 ret = smu_mode1_reset(smu);
310 mutex_unlock(&adev->pm.mutex);
311 }
312
313 return ret;
314 }
315
amdgpu_dpm_is_link_reset_supported(struct amdgpu_device * adev)316 bool amdgpu_dpm_is_link_reset_supported(struct amdgpu_device *adev)
317 {
318 struct smu_context *smu = adev->powerplay.pp_handle;
319 bool support_link_reset = false;
320
321 if (is_support_sw_smu(adev)) {
322 mutex_lock(&adev->pm.mutex);
323 support_link_reset = smu_link_reset_is_support(smu);
324 mutex_unlock(&adev->pm.mutex);
325 }
326
327 return support_link_reset;
328 }
329
amdgpu_dpm_link_reset(struct amdgpu_device * adev)330 int amdgpu_dpm_link_reset(struct amdgpu_device *adev)
331 {
332 struct smu_context *smu = adev->powerplay.pp_handle;
333 int ret = -EOPNOTSUPP;
334
335 if (is_support_sw_smu(adev)) {
336 mutex_lock(&adev->pm.mutex);
337 ret = smu_link_reset(smu);
338 mutex_unlock(&adev->pm.mutex);
339 }
340
341 return ret;
342 }
343
amdgpu_dpm_switch_power_profile(struct amdgpu_device * adev,enum PP_SMC_POWER_PROFILE type,bool en)344 int amdgpu_dpm_switch_power_profile(struct amdgpu_device *adev,
345 enum PP_SMC_POWER_PROFILE type,
346 bool en)
347 {
348 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
349 int ret = 0;
350
351 if (amdgpu_sriov_vf(adev) ||
352 amdgpu_in_reset(adev))
353 return 0;
354
355 if (pp_funcs && pp_funcs->switch_power_profile) {
356 mutex_lock(&adev->pm.mutex);
357 ret = pp_funcs->switch_power_profile(
358 adev->powerplay.pp_handle, type, en);
359 mutex_unlock(&adev->pm.mutex);
360 }
361
362 return ret;
363 }
364
amdgpu_dpm_pause_power_profile(struct amdgpu_device * adev,bool pause)365 int amdgpu_dpm_pause_power_profile(struct amdgpu_device *adev,
366 bool pause)
367 {
368 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
369 int ret = 0;
370
371 if (amdgpu_sriov_vf(adev) ||
372 amdgpu_in_reset(adev))
373 return 0;
374
375 if (pp_funcs && pp_funcs->pause_power_profile) {
376 mutex_lock(&adev->pm.mutex);
377 ret = pp_funcs->pause_power_profile(
378 adev->powerplay.pp_handle, pause);
379 mutex_unlock(&adev->pm.mutex);
380 }
381
382 return ret;
383 }
384
amdgpu_dpm_set_xgmi_pstate(struct amdgpu_device * adev,uint32_t pstate)385 int amdgpu_dpm_set_xgmi_pstate(struct amdgpu_device *adev,
386 uint32_t pstate)
387 {
388 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
389 int ret = 0;
390
391 if (pp_funcs && pp_funcs->set_xgmi_pstate) {
392 mutex_lock(&adev->pm.mutex);
393 ret = pp_funcs->set_xgmi_pstate(adev->powerplay.pp_handle,
394 pstate);
395 mutex_unlock(&adev->pm.mutex);
396 }
397
398 return ret;
399 }
400
amdgpu_dpm_set_df_cstate(struct amdgpu_device * adev,uint32_t cstate)401 int amdgpu_dpm_set_df_cstate(struct amdgpu_device *adev,
402 uint32_t cstate)
403 {
404 int ret = 0;
405 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
406 void *pp_handle = adev->powerplay.pp_handle;
407
408 if (pp_funcs && pp_funcs->set_df_cstate) {
409 mutex_lock(&adev->pm.mutex);
410 ret = pp_funcs->set_df_cstate(pp_handle, cstate);
411 mutex_unlock(&adev->pm.mutex);
412 }
413
414 return ret;
415 }
416
amdgpu_dpm_get_pm_policy_info(struct amdgpu_device * adev,enum pp_pm_policy p_type,char * buf)417 ssize_t amdgpu_dpm_get_pm_policy_info(struct amdgpu_device *adev,
418 enum pp_pm_policy p_type, char *buf)
419 {
420 struct smu_context *smu = adev->powerplay.pp_handle;
421 int ret = -EOPNOTSUPP;
422
423 if (is_support_sw_smu(adev)) {
424 mutex_lock(&adev->pm.mutex);
425 ret = smu_get_pm_policy_info(smu, p_type, buf);
426 mutex_unlock(&adev->pm.mutex);
427 }
428
429 return ret;
430 }
431
amdgpu_dpm_set_pm_policy(struct amdgpu_device * adev,int policy_type,int policy_level)432 int amdgpu_dpm_set_pm_policy(struct amdgpu_device *adev, int policy_type,
433 int policy_level)
434 {
435 struct smu_context *smu = adev->powerplay.pp_handle;
436 int ret = -EOPNOTSUPP;
437
438 if (is_support_sw_smu(adev)) {
439 mutex_lock(&adev->pm.mutex);
440 ret = smu_set_pm_policy(smu, policy_type, policy_level);
441 mutex_unlock(&adev->pm.mutex);
442 }
443
444 return ret;
445 }
446
amdgpu_dpm_enable_mgpu_fan_boost(struct amdgpu_device * adev)447 int amdgpu_dpm_enable_mgpu_fan_boost(struct amdgpu_device *adev)
448 {
449 void *pp_handle = adev->powerplay.pp_handle;
450 const struct amd_pm_funcs *pp_funcs =
451 adev->powerplay.pp_funcs;
452 int ret = 0;
453
454 if (pp_funcs && pp_funcs->enable_mgpu_fan_boost) {
455 mutex_lock(&adev->pm.mutex);
456 ret = pp_funcs->enable_mgpu_fan_boost(pp_handle);
457 mutex_unlock(&adev->pm.mutex);
458 }
459
460 return ret;
461 }
462
amdgpu_dpm_set_clockgating_by_smu(struct amdgpu_device * adev,uint32_t msg_id)463 int amdgpu_dpm_set_clockgating_by_smu(struct amdgpu_device *adev,
464 uint32_t msg_id)
465 {
466 void *pp_handle = adev->powerplay.pp_handle;
467 const struct amd_pm_funcs *pp_funcs =
468 adev->powerplay.pp_funcs;
469 int ret = 0;
470
471 if (pp_funcs && pp_funcs->set_clockgating_by_smu) {
472 mutex_lock(&adev->pm.mutex);
473 ret = pp_funcs->set_clockgating_by_smu(pp_handle,
474 msg_id);
475 mutex_unlock(&adev->pm.mutex);
476 }
477
478 return ret;
479 }
480
amdgpu_dpm_smu_i2c_bus_access(struct amdgpu_device * adev,bool acquire)481 int amdgpu_dpm_smu_i2c_bus_access(struct amdgpu_device *adev,
482 bool acquire)
483 {
484 void *pp_handle = adev->powerplay.pp_handle;
485 const struct amd_pm_funcs *pp_funcs =
486 adev->powerplay.pp_funcs;
487 int ret = -EOPNOTSUPP;
488
489 if (pp_funcs && pp_funcs->smu_i2c_bus_access) {
490 mutex_lock(&adev->pm.mutex);
491 ret = pp_funcs->smu_i2c_bus_access(pp_handle,
492 acquire);
493 mutex_unlock(&adev->pm.mutex);
494 }
495
496 return ret;
497 }
498
amdgpu_pm_acpi_event_handler(struct amdgpu_device * adev)499 void amdgpu_pm_acpi_event_handler(struct amdgpu_device *adev)
500 {
501 if (adev->pm.dpm_enabled) {
502 mutex_lock(&adev->pm.mutex);
503 if (power_supply_is_system_supplied() > 0)
504 adev->pm.ac_power = true;
505 else
506 adev->pm.ac_power = false;
507
508 if (adev->powerplay.pp_funcs &&
509 adev->powerplay.pp_funcs->notify_ac_dc)
510 amdgpu_dpm_notify_ac_dc(adev);
511
512 if (is_support_sw_smu(adev))
513 smu_set_ac_dc(adev->powerplay.pp_handle, true);
514
515 mutex_unlock(&adev->pm.mutex);
516 }
517 }
518
amdgpu_dpm_read_sensor(struct amdgpu_device * adev,enum amd_pp_sensors sensor,void * data,uint32_t * size)519 int amdgpu_dpm_read_sensor(struct amdgpu_device *adev, enum amd_pp_sensors sensor,
520 void *data, uint32_t *size)
521 {
522 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
523 int ret = -EINVAL;
524
525 if (!data || !size)
526 return -EINVAL;
527
528 if (pp_funcs && pp_funcs->read_sensor) {
529 mutex_lock(&adev->pm.mutex);
530 ret = pp_funcs->read_sensor(adev->powerplay.pp_handle,
531 sensor,
532 data,
533 size);
534 mutex_unlock(&adev->pm.mutex);
535 }
536
537 return ret;
538 }
539
amdgpu_dpm_get_apu_thermal_limit(struct amdgpu_device * adev,uint32_t * limit)540 int amdgpu_dpm_get_apu_thermal_limit(struct amdgpu_device *adev, uint32_t *limit)
541 {
542 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
543 int ret = -EOPNOTSUPP;
544
545 if (pp_funcs && pp_funcs->get_apu_thermal_limit) {
546 mutex_lock(&adev->pm.mutex);
547 ret = pp_funcs->get_apu_thermal_limit(adev->powerplay.pp_handle, limit);
548 mutex_unlock(&adev->pm.mutex);
549 }
550
551 return ret;
552 }
553
amdgpu_dpm_set_apu_thermal_limit(struct amdgpu_device * adev,uint32_t limit)554 int amdgpu_dpm_set_apu_thermal_limit(struct amdgpu_device *adev, uint32_t limit)
555 {
556 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
557 int ret = -EOPNOTSUPP;
558
559 if (pp_funcs && pp_funcs->set_apu_thermal_limit) {
560 mutex_lock(&adev->pm.mutex);
561 ret = pp_funcs->set_apu_thermal_limit(adev->powerplay.pp_handle, limit);
562 mutex_unlock(&adev->pm.mutex);
563 }
564
565 return ret;
566 }
567
amdgpu_dpm_compute_clocks(struct amdgpu_device * adev)568 void amdgpu_dpm_compute_clocks(struct amdgpu_device *adev)
569 {
570 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
571 int i;
572
573 if (!adev->pm.dpm_enabled)
574 return;
575
576 if (!pp_funcs->pm_compute_clocks)
577 return;
578
579 if (adev->mode_info.num_crtc)
580 amdgpu_display_bandwidth_update(adev);
581
582 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
583 struct amdgpu_ring *ring = adev->rings[i];
584 if (ring && ring->sched.ready)
585 amdgpu_fence_wait_empty(ring);
586 }
587
588 mutex_lock(&adev->pm.mutex);
589 pp_funcs->pm_compute_clocks(adev->powerplay.pp_handle);
590 mutex_unlock(&adev->pm.mutex);
591 }
592
amdgpu_dpm_enable_uvd(struct amdgpu_device * adev,bool enable)593 void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable)
594 {
595 int ret = 0;
596
597 if (adev->family == AMDGPU_FAMILY_SI) {
598 mutex_lock(&adev->pm.mutex);
599 if (enable) {
600 adev->pm.dpm.uvd_active = true;
601 adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_UVD;
602 } else {
603 adev->pm.dpm.uvd_active = false;
604 }
605 mutex_unlock(&adev->pm.mutex);
606
607 amdgpu_dpm_compute_clocks(adev);
608 return;
609 }
610
611 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_UVD, !enable, 0);
612 if (ret)
613 drm_err(adev_to_drm(adev), "DPM %s uvd failed, ret = %d.\n",
614 enable ? "enable" : "disable", ret);
615 }
616
amdgpu_dpm_enable_vcn(struct amdgpu_device * adev,bool enable,int inst)617 void amdgpu_dpm_enable_vcn(struct amdgpu_device *adev, bool enable, int inst)
618 {
619 int ret = 0;
620
621 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCN, !enable, inst);
622 if (ret)
623 drm_err(adev_to_drm(adev), "DPM %s vcn failed, ret = %d.\n",
624 enable ? "enable" : "disable", ret);
625 }
626
amdgpu_dpm_enable_vce(struct amdgpu_device * adev,bool enable)627 void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable)
628 {
629 int ret = 0;
630
631 if (adev->family == AMDGPU_FAMILY_SI) {
632 mutex_lock(&adev->pm.mutex);
633 if (enable) {
634 adev->pm.dpm.vce_active = true;
635 /* XXX select vce level based on ring/task */
636 adev->pm.dpm.vce_level = AMD_VCE_LEVEL_AC_ALL;
637 } else {
638 adev->pm.dpm.vce_active = false;
639 }
640 mutex_unlock(&adev->pm.mutex);
641
642 amdgpu_dpm_compute_clocks(adev);
643 return;
644 }
645
646 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCE, !enable, 0);
647 if (ret)
648 drm_err(adev_to_drm(adev), "DPM %s vce failed, ret = %d.\n",
649 enable ? "enable" : "disable", ret);
650 }
651
amdgpu_dpm_enable_jpeg(struct amdgpu_device * adev,bool enable)652 void amdgpu_dpm_enable_jpeg(struct amdgpu_device *adev, bool enable)
653 {
654 int ret = 0;
655
656 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_JPEG, !enable, 0);
657 if (ret)
658 drm_err(adev_to_drm(adev), "Dpm %s jpeg failed, ret = %d.\n",
659 enable ? "enable" : "disable", ret);
660 }
661
amdgpu_dpm_enable_vpe(struct amdgpu_device * adev,bool enable)662 void amdgpu_dpm_enable_vpe(struct amdgpu_device *adev, bool enable)
663 {
664 int ret = 0;
665
666 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VPE, !enable, 0);
667 if (ret)
668 drm_err(adev_to_drm(adev), "DPM %s vpe failed, ret = %d.\n",
669 enable ? "enable" : "disable", ret);
670 }
671
amdgpu_pm_load_smu_firmware(struct amdgpu_device * adev,uint32_t * smu_version)672 int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version)
673 {
674 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
675 int r = 0;
676
677 if (!pp_funcs || !pp_funcs->load_firmware ||
678 (is_support_sw_smu(adev) && (adev->flags & AMD_IS_APU)))
679 return 0;
680
681 mutex_lock(&adev->pm.mutex);
682 r = pp_funcs->load_firmware(adev->powerplay.pp_handle);
683 if (r) {
684 pr_err("smu firmware loading failed\n");
685 goto out;
686 }
687
688 if (smu_version)
689 *smu_version = adev->pm.fw_version;
690
691 out:
692 mutex_unlock(&adev->pm.mutex);
693 return r;
694 }
695
amdgpu_dpm_handle_passthrough_sbr(struct amdgpu_device * adev,bool enable)696 int amdgpu_dpm_handle_passthrough_sbr(struct amdgpu_device *adev, bool enable)
697 {
698 int ret = 0;
699
700 if (is_support_sw_smu(adev)) {
701 mutex_lock(&adev->pm.mutex);
702 ret = smu_handle_passthrough_sbr(adev->powerplay.pp_handle,
703 enable);
704 mutex_unlock(&adev->pm.mutex);
705 }
706
707 return ret;
708 }
709
amdgpu_dpm_send_hbm_bad_pages_num(struct amdgpu_device * adev,uint32_t size)710 int amdgpu_dpm_send_hbm_bad_pages_num(struct amdgpu_device *adev, uint32_t size)
711 {
712 struct smu_context *smu = adev->powerplay.pp_handle;
713 int ret = 0;
714
715 if (!is_support_sw_smu(adev))
716 return -EOPNOTSUPP;
717
718 mutex_lock(&adev->pm.mutex);
719 ret = smu_send_hbm_bad_pages_num(smu, size);
720 mutex_unlock(&adev->pm.mutex);
721
722 return ret;
723 }
724
amdgpu_dpm_send_hbm_bad_channel_flag(struct amdgpu_device * adev,uint32_t size)725 int amdgpu_dpm_send_hbm_bad_channel_flag(struct amdgpu_device *adev, uint32_t size)
726 {
727 struct smu_context *smu = adev->powerplay.pp_handle;
728 int ret = 0;
729
730 if (!is_support_sw_smu(adev))
731 return -EOPNOTSUPP;
732
733 mutex_lock(&adev->pm.mutex);
734 ret = smu_send_hbm_bad_channel_flag(smu, size);
735 mutex_unlock(&adev->pm.mutex);
736
737 return ret;
738 }
739
amdgpu_dpm_send_rma_reason(struct amdgpu_device * adev)740 int amdgpu_dpm_send_rma_reason(struct amdgpu_device *adev)
741 {
742 struct smu_context *smu = adev->powerplay.pp_handle;
743 int ret;
744
745 if (!is_support_sw_smu(adev))
746 return -EOPNOTSUPP;
747
748 mutex_lock(&adev->pm.mutex);
749 ret = smu_send_rma_reason(smu);
750 mutex_unlock(&adev->pm.mutex);
751
752 return ret;
753 }
754
755 /**
756 * amdgpu_dpm_reset_sdma_is_supported - Check if SDMA reset is supported
757 * @adev: amdgpu_device pointer
758 *
759 * This function checks if the SMU supports resetting the SDMA engine.
760 * It returns false if the hardware does not support software SMU or
761 * if the feature is not supported.
762 */
amdgpu_dpm_reset_sdma_is_supported(struct amdgpu_device * adev)763 bool amdgpu_dpm_reset_sdma_is_supported(struct amdgpu_device *adev)
764 {
765 struct smu_context *smu = adev->powerplay.pp_handle;
766 bool ret;
767
768 if (!is_support_sw_smu(adev))
769 return false;
770
771 mutex_lock(&adev->pm.mutex);
772 ret = smu_reset_sdma_is_supported(smu);
773 mutex_unlock(&adev->pm.mutex);
774
775 return ret;
776 }
777
amdgpu_dpm_reset_sdma(struct amdgpu_device * adev,uint32_t inst_mask)778 int amdgpu_dpm_reset_sdma(struct amdgpu_device *adev, uint32_t inst_mask)
779 {
780 struct smu_context *smu = adev->powerplay.pp_handle;
781 int ret;
782
783 if (!is_support_sw_smu(adev))
784 return -EOPNOTSUPP;
785
786 mutex_lock(&adev->pm.mutex);
787 ret = smu_reset_sdma(smu, inst_mask);
788 mutex_unlock(&adev->pm.mutex);
789
790 return ret;
791 }
792
amdgpu_dpm_reset_vcn(struct amdgpu_device * adev,uint32_t inst_mask)793 int amdgpu_dpm_reset_vcn(struct amdgpu_device *adev, uint32_t inst_mask)
794 {
795 struct smu_context *smu = adev->powerplay.pp_handle;
796 int ret;
797
798 if (!is_support_sw_smu(adev))
799 return -EOPNOTSUPP;
800
801 mutex_lock(&adev->pm.mutex);
802 ret = smu_reset_vcn(smu, inst_mask);
803 mutex_unlock(&adev->pm.mutex);
804
805 return ret;
806 }
807
amdgpu_dpm_reset_vcn_is_supported(struct amdgpu_device * adev)808 bool amdgpu_dpm_reset_vcn_is_supported(struct amdgpu_device *adev)
809 {
810 struct smu_context *smu = adev->powerplay.pp_handle;
811 bool ret;
812
813 if (!is_support_sw_smu(adev))
814 return false;
815
816 mutex_lock(&adev->pm.mutex);
817 ret = smu_reset_vcn_is_supported(smu);
818 mutex_unlock(&adev->pm.mutex);
819
820 return ret;
821 }
822
amdgpu_dpm_get_dpm_freq_range(struct amdgpu_device * adev,enum pp_clock_type type,uint32_t * min,uint32_t * max)823 int amdgpu_dpm_get_dpm_freq_range(struct amdgpu_device *adev,
824 enum pp_clock_type type,
825 uint32_t *min,
826 uint32_t *max)
827 {
828 int ret = 0;
829
830 if (type != PP_SCLK)
831 return -EINVAL;
832
833 if (!is_support_sw_smu(adev))
834 return -EOPNOTSUPP;
835
836 mutex_lock(&adev->pm.mutex);
837 ret = smu_get_dpm_freq_range(adev->powerplay.pp_handle,
838 SMU_SCLK,
839 min,
840 max);
841 mutex_unlock(&adev->pm.mutex);
842
843 return ret;
844 }
845
amdgpu_dpm_set_soft_freq_range(struct amdgpu_device * adev,enum pp_clock_type type,uint32_t min,uint32_t max)846 int amdgpu_dpm_set_soft_freq_range(struct amdgpu_device *adev,
847 enum pp_clock_type type,
848 uint32_t min,
849 uint32_t max)
850 {
851 struct smu_context *smu = adev->powerplay.pp_handle;
852
853 if (!is_support_sw_smu(adev))
854 return -EOPNOTSUPP;
855
856 guard(mutex)(&adev->pm.mutex);
857
858 return smu_set_soft_freq_range(smu,
859 type,
860 min,
861 max);
862 }
863
amdgpu_dpm_write_watermarks_table(struct amdgpu_device * adev)864 int amdgpu_dpm_write_watermarks_table(struct amdgpu_device *adev)
865 {
866 struct smu_context *smu = adev->powerplay.pp_handle;
867 int ret = 0;
868
869 if (!is_support_sw_smu(adev))
870 return 0;
871
872 mutex_lock(&adev->pm.mutex);
873 ret = smu_write_watermarks_table(smu);
874 mutex_unlock(&adev->pm.mutex);
875
876 return ret;
877 }
878
amdgpu_dpm_wait_for_event(struct amdgpu_device * adev,enum smu_event_type event,uint64_t event_arg)879 int amdgpu_dpm_wait_for_event(struct amdgpu_device *adev,
880 enum smu_event_type event,
881 uint64_t event_arg)
882 {
883 struct smu_context *smu = adev->powerplay.pp_handle;
884 int ret = 0;
885
886 if (!is_support_sw_smu(adev))
887 return -EOPNOTSUPP;
888
889 mutex_lock(&adev->pm.mutex);
890 ret = smu_wait_for_event(smu, event, event_arg);
891 mutex_unlock(&adev->pm.mutex);
892
893 return ret;
894 }
895
amdgpu_dpm_set_residency_gfxoff(struct amdgpu_device * adev,bool value)896 int amdgpu_dpm_set_residency_gfxoff(struct amdgpu_device *adev, bool value)
897 {
898 struct smu_context *smu = adev->powerplay.pp_handle;
899 int ret = 0;
900
901 if (!is_support_sw_smu(adev))
902 return -EOPNOTSUPP;
903
904 mutex_lock(&adev->pm.mutex);
905 ret = smu_set_residency_gfxoff(smu, value);
906 mutex_unlock(&adev->pm.mutex);
907
908 return ret;
909 }
910
amdgpu_dpm_get_residency_gfxoff(struct amdgpu_device * adev,u32 * value)911 int amdgpu_dpm_get_residency_gfxoff(struct amdgpu_device *adev, u32 *value)
912 {
913 struct smu_context *smu = adev->powerplay.pp_handle;
914 int ret = 0;
915
916 if (!is_support_sw_smu(adev))
917 return -EOPNOTSUPP;
918
919 mutex_lock(&adev->pm.mutex);
920 ret = smu_get_residency_gfxoff(smu, value);
921 mutex_unlock(&adev->pm.mutex);
922
923 return ret;
924 }
925
amdgpu_dpm_get_entrycount_gfxoff(struct amdgpu_device * adev,u64 * value)926 int amdgpu_dpm_get_entrycount_gfxoff(struct amdgpu_device *adev, u64 *value)
927 {
928 struct smu_context *smu = adev->powerplay.pp_handle;
929 int ret = 0;
930
931 if (!is_support_sw_smu(adev))
932 return -EOPNOTSUPP;
933
934 mutex_lock(&adev->pm.mutex);
935 ret = smu_get_entrycount_gfxoff(smu, value);
936 mutex_unlock(&adev->pm.mutex);
937
938 return ret;
939 }
940
amdgpu_dpm_get_status_gfxoff(struct amdgpu_device * adev,uint32_t * value)941 int amdgpu_dpm_get_status_gfxoff(struct amdgpu_device *adev, uint32_t *value)
942 {
943 struct smu_context *smu = adev->powerplay.pp_handle;
944 int ret = 0;
945
946 if (!is_support_sw_smu(adev))
947 return -EOPNOTSUPP;
948
949 mutex_lock(&adev->pm.mutex);
950 ret = smu_get_status_gfxoff(smu, value);
951 mutex_unlock(&adev->pm.mutex);
952
953 return ret;
954 }
955
amdgpu_dpm_get_thermal_throttling_counter(struct amdgpu_device * adev)956 uint64_t amdgpu_dpm_get_thermal_throttling_counter(struct amdgpu_device *adev)
957 {
958 struct smu_context *smu = adev->powerplay.pp_handle;
959
960 if (!is_support_sw_smu(adev))
961 return 0;
962
963 return atomic64_read(&smu->throttle_int_counter);
964 }
965
966 /* amdgpu_dpm_gfx_state_change - Handle gfx power state change set
967 * @adev: amdgpu_device pointer
968 * @state: gfx power state(1 -sGpuChangeState_D0Entry and 2 -sGpuChangeState_D3Entry)
969 *
970 */
amdgpu_dpm_gfx_state_change(struct amdgpu_device * adev,enum gfx_change_state state)971 void amdgpu_dpm_gfx_state_change(struct amdgpu_device *adev,
972 enum gfx_change_state state)
973 {
974 mutex_lock(&adev->pm.mutex);
975 if (adev->powerplay.pp_funcs &&
976 adev->powerplay.pp_funcs->gfx_state_change_set)
977 ((adev)->powerplay.pp_funcs->gfx_state_change_set(
978 (adev)->powerplay.pp_handle, state));
979 mutex_unlock(&adev->pm.mutex);
980 }
981
amdgpu_dpm_get_ecc_info(struct amdgpu_device * adev,void * umc_ecc)982 int amdgpu_dpm_get_ecc_info(struct amdgpu_device *adev,
983 void *umc_ecc)
984 {
985 struct smu_context *smu = adev->powerplay.pp_handle;
986 int ret = 0;
987
988 if (!is_support_sw_smu(adev))
989 return -EOPNOTSUPP;
990
991 mutex_lock(&adev->pm.mutex);
992 ret = smu_get_ecc_info(smu, umc_ecc);
993 mutex_unlock(&adev->pm.mutex);
994
995 return ret;
996 }
997
amdgpu_dpm_get_vce_clock_state(struct amdgpu_device * adev,uint32_t idx)998 struct amd_vce_state *amdgpu_dpm_get_vce_clock_state(struct amdgpu_device *adev,
999 uint32_t idx)
1000 {
1001 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1002 struct amd_vce_state *vstate = NULL;
1003
1004 if (!pp_funcs->get_vce_clock_state)
1005 return NULL;
1006
1007 mutex_lock(&adev->pm.mutex);
1008 vstate = pp_funcs->get_vce_clock_state(adev->powerplay.pp_handle,
1009 idx);
1010 mutex_unlock(&adev->pm.mutex);
1011
1012 return vstate;
1013 }
1014
amdgpu_dpm_get_current_power_state(struct amdgpu_device * adev,enum amd_pm_state_type * state)1015 void amdgpu_dpm_get_current_power_state(struct amdgpu_device *adev,
1016 enum amd_pm_state_type *state)
1017 {
1018 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1019
1020 mutex_lock(&adev->pm.mutex);
1021
1022 if (!pp_funcs->get_current_power_state) {
1023 *state = adev->pm.dpm.user_state;
1024 goto out;
1025 }
1026
1027 *state = pp_funcs->get_current_power_state(adev->powerplay.pp_handle);
1028 if (*state < POWER_STATE_TYPE_DEFAULT ||
1029 *state > POWER_STATE_TYPE_INTERNAL_3DPERF)
1030 *state = adev->pm.dpm.user_state;
1031
1032 out:
1033 mutex_unlock(&adev->pm.mutex);
1034 }
1035
amdgpu_dpm_set_power_state(struct amdgpu_device * adev,enum amd_pm_state_type state)1036 void amdgpu_dpm_set_power_state(struct amdgpu_device *adev,
1037 enum amd_pm_state_type state)
1038 {
1039 mutex_lock(&adev->pm.mutex);
1040 adev->pm.dpm.user_state = state;
1041 mutex_unlock(&adev->pm.mutex);
1042
1043 if (is_support_sw_smu(adev))
1044 return;
1045
1046 if (amdgpu_dpm_dispatch_task(adev,
1047 AMD_PP_TASK_ENABLE_USER_STATE,
1048 &state) == -EOPNOTSUPP)
1049 amdgpu_dpm_compute_clocks(adev);
1050 }
1051
amdgpu_dpm_get_performance_level(struct amdgpu_device * adev)1052 enum amd_dpm_forced_level amdgpu_dpm_get_performance_level(struct amdgpu_device *adev)
1053 {
1054 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1055 enum amd_dpm_forced_level level;
1056
1057 if (!pp_funcs)
1058 return AMD_DPM_FORCED_LEVEL_AUTO;
1059
1060 mutex_lock(&adev->pm.mutex);
1061 if (pp_funcs->get_performance_level)
1062 level = pp_funcs->get_performance_level(adev->powerplay.pp_handle);
1063 else
1064 level = adev->pm.dpm.forced_level;
1065 mutex_unlock(&adev->pm.mutex);
1066
1067 return level;
1068 }
1069
amdgpu_dpm_enter_umd_state(struct amdgpu_device * adev)1070 static void amdgpu_dpm_enter_umd_state(struct amdgpu_device *adev)
1071 {
1072 /* enter UMD Pstate */
1073 amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_GFX,
1074 AMD_PG_STATE_UNGATE);
1075 amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_GFX,
1076 AMD_CG_STATE_UNGATE);
1077 }
1078
amdgpu_dpm_exit_umd_state(struct amdgpu_device * adev)1079 static void amdgpu_dpm_exit_umd_state(struct amdgpu_device *adev)
1080 {
1081 /* exit UMD Pstate */
1082 amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_GFX,
1083 AMD_CG_STATE_GATE);
1084 amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_GFX,
1085 AMD_PG_STATE_GATE);
1086 }
1087
amdgpu_dpm_force_performance_level(struct amdgpu_device * adev,enum amd_dpm_forced_level level)1088 int amdgpu_dpm_force_performance_level(struct amdgpu_device *adev,
1089 enum amd_dpm_forced_level level)
1090 {
1091 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1092 enum amd_dpm_forced_level current_level;
1093 uint32_t profile_mode_mask = AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD |
1094 AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK |
1095 AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK |
1096 AMD_DPM_FORCED_LEVEL_PROFILE_PEAK;
1097
1098 if (!pp_funcs || !pp_funcs->force_performance_level)
1099 return 0;
1100
1101 if (adev->pm.dpm.thermal_active)
1102 return -EINVAL;
1103
1104 current_level = amdgpu_dpm_get_performance_level(adev);
1105 if (current_level == level)
1106 return 0;
1107
1108 if (!(current_level & profile_mode_mask) &&
1109 (level == AMD_DPM_FORCED_LEVEL_PROFILE_EXIT))
1110 return -EINVAL;
1111
1112 if (adev->asic_type == CHIP_RAVEN) {
1113 if (!(adev->apu_flags & AMD_APU_IS_RAVEN2)) {
1114 if (current_level != AMD_DPM_FORCED_LEVEL_MANUAL &&
1115 level == AMD_DPM_FORCED_LEVEL_MANUAL)
1116 amdgpu_gfx_off_ctrl(adev, false);
1117 else if (current_level == AMD_DPM_FORCED_LEVEL_MANUAL &&
1118 level != AMD_DPM_FORCED_LEVEL_MANUAL)
1119 amdgpu_gfx_off_ctrl(adev, true);
1120 }
1121 }
1122
1123 if (!(current_level & profile_mode_mask) && (level & profile_mode_mask))
1124 amdgpu_dpm_enter_umd_state(adev);
1125 else if ((current_level & profile_mode_mask) &&
1126 !(level & profile_mode_mask))
1127 amdgpu_dpm_exit_umd_state(adev);
1128
1129 mutex_lock(&adev->pm.mutex);
1130
1131 if (pp_funcs->force_performance_level(adev->powerplay.pp_handle,
1132 level)) {
1133 mutex_unlock(&adev->pm.mutex);
1134 /* If new level failed, retain the umd state as before */
1135 if (!(current_level & profile_mode_mask) &&
1136 (level & profile_mode_mask))
1137 amdgpu_dpm_exit_umd_state(adev);
1138 else if ((current_level & profile_mode_mask) &&
1139 !(level & profile_mode_mask))
1140 amdgpu_dpm_enter_umd_state(adev);
1141
1142 return -EINVAL;
1143 }
1144
1145 adev->pm.dpm.forced_level = level;
1146
1147 mutex_unlock(&adev->pm.mutex);
1148
1149 return 0;
1150 }
1151
amdgpu_dpm_get_pp_num_states(struct amdgpu_device * adev,struct pp_states_info * states)1152 int amdgpu_dpm_get_pp_num_states(struct amdgpu_device *adev,
1153 struct pp_states_info *states)
1154 {
1155 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1156 int ret = 0;
1157
1158 if (!pp_funcs->get_pp_num_states)
1159 return -EOPNOTSUPP;
1160
1161 mutex_lock(&adev->pm.mutex);
1162 ret = pp_funcs->get_pp_num_states(adev->powerplay.pp_handle,
1163 states);
1164 mutex_unlock(&adev->pm.mutex);
1165
1166 return ret;
1167 }
1168
amdgpu_dpm_dispatch_task(struct amdgpu_device * adev,enum amd_pp_task task_id,enum amd_pm_state_type * user_state)1169 int amdgpu_dpm_dispatch_task(struct amdgpu_device *adev,
1170 enum amd_pp_task task_id,
1171 enum amd_pm_state_type *user_state)
1172 {
1173 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1174 int ret = 0;
1175
1176 if (!pp_funcs->dispatch_tasks)
1177 return -EOPNOTSUPP;
1178
1179 mutex_lock(&adev->pm.mutex);
1180 ret = pp_funcs->dispatch_tasks(adev->powerplay.pp_handle,
1181 task_id,
1182 user_state);
1183 mutex_unlock(&adev->pm.mutex);
1184
1185 return ret;
1186 }
1187
amdgpu_dpm_is_pp_table_allowed(struct amdgpu_device * adev)1188 static bool amdgpu_dpm_is_pp_table_allowed(struct amdgpu_device *adev)
1189 {
1190 return !amdgpu_sriov_vf(adev) &&
1191 !(adev->flags & AMD_IS_APU) &&
1192 !adev->scpm_enabled;
1193 }
1194
amdgpu_dpm_get_pp_table(struct amdgpu_device * adev,char * table,size_t size)1195 int amdgpu_dpm_get_pp_table(struct amdgpu_device *adev, char *table,
1196 size_t size)
1197 {
1198 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1199 char *pptable = NULL;
1200 int ret = 0;
1201
1202 if ((!table && size) || (table && !size))
1203 return -EINVAL;
1204
1205 if (!amdgpu_dpm_is_pp_table_allowed(adev) ||
1206 !pp_funcs->get_pp_table)
1207 return -EOPNOTSUPP;
1208
1209 mutex_lock(&adev->pm.mutex);
1210 ret = pp_funcs->get_pp_table(adev->powerplay.pp_handle,
1211 &pptable);
1212 if (ret > 0 && !pptable) {
1213 ret = -EINVAL;
1214 } else if (ret > 0 && table) {
1215 ret = min_t(size_t, ret, size);
1216 memcpy(table, pptable, ret);
1217 }
1218 mutex_unlock(&adev->pm.mutex);
1219
1220 return ret;
1221 }
1222
amdgpu_dpm_set_fine_grain_clk_vol(struct amdgpu_device * adev,uint32_t type,long * input,uint32_t size)1223 int amdgpu_dpm_set_fine_grain_clk_vol(struct amdgpu_device *adev,
1224 uint32_t type,
1225 long *input,
1226 uint32_t size)
1227 {
1228 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1229 int ret = 0;
1230
1231 if (!pp_funcs->set_fine_grain_clk_vol)
1232 return 0;
1233
1234 mutex_lock(&adev->pm.mutex);
1235 ret = pp_funcs->set_fine_grain_clk_vol(adev->powerplay.pp_handle,
1236 type,
1237 input,
1238 size);
1239 mutex_unlock(&adev->pm.mutex);
1240
1241 return ret;
1242 }
1243
amdgpu_dpm_odn_edit_dpm_table(struct amdgpu_device * adev,uint32_t type,long * input,uint32_t size)1244 int amdgpu_dpm_odn_edit_dpm_table(struct amdgpu_device *adev,
1245 uint32_t type,
1246 long *input,
1247 uint32_t size)
1248 {
1249 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1250 int ret = 0;
1251
1252 if (!pp_funcs->odn_edit_dpm_table)
1253 return 0;
1254
1255 mutex_lock(&adev->pm.mutex);
1256 ret = pp_funcs->odn_edit_dpm_table(adev->powerplay.pp_handle,
1257 type,
1258 input,
1259 size);
1260 mutex_unlock(&adev->pm.mutex);
1261
1262 return ret;
1263 }
1264
amdgpu_dpm_emit_clock_levels(struct amdgpu_device * adev,enum pp_clock_type type,char * buf,int * offset)1265 int amdgpu_dpm_emit_clock_levels(struct amdgpu_device *adev,
1266 enum pp_clock_type type,
1267 char *buf,
1268 int *offset)
1269 {
1270 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1271 int ret = 0;
1272
1273 if (!pp_funcs->emit_clock_levels)
1274 return -ENOENT;
1275
1276 mutex_lock(&adev->pm.mutex);
1277 ret = pp_funcs->emit_clock_levels(adev->powerplay.pp_handle,
1278 type,
1279 buf,
1280 offset);
1281 mutex_unlock(&adev->pm.mutex);
1282
1283 return ret;
1284 }
1285
amdgpu_dpm_set_ppfeature_status(struct amdgpu_device * adev,uint64_t ppfeature_masks)1286 int amdgpu_dpm_set_ppfeature_status(struct amdgpu_device *adev,
1287 uint64_t ppfeature_masks)
1288 {
1289 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1290 int ret = 0;
1291
1292 if (!pp_funcs->set_ppfeature_status)
1293 return 0;
1294
1295 mutex_lock(&adev->pm.mutex);
1296 ret = pp_funcs->set_ppfeature_status(adev->powerplay.pp_handle,
1297 ppfeature_masks);
1298 mutex_unlock(&adev->pm.mutex);
1299
1300 return ret;
1301 }
1302
amdgpu_dpm_get_ppfeature_status(struct amdgpu_device * adev,char * buf)1303 int amdgpu_dpm_get_ppfeature_status(struct amdgpu_device *adev, char *buf)
1304 {
1305 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1306 int ret = 0;
1307
1308 if (!pp_funcs->get_ppfeature_status)
1309 return 0;
1310
1311 mutex_lock(&adev->pm.mutex);
1312 ret = pp_funcs->get_ppfeature_status(adev->powerplay.pp_handle,
1313 buf);
1314 mutex_unlock(&adev->pm.mutex);
1315
1316 return ret;
1317 }
1318
amdgpu_dpm_force_clock_level(struct amdgpu_device * adev,enum pp_clock_type type,uint32_t mask)1319 int amdgpu_dpm_force_clock_level(struct amdgpu_device *adev,
1320 enum pp_clock_type type,
1321 uint32_t mask)
1322 {
1323 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1324 int ret = 0;
1325
1326 if (!pp_funcs->force_clock_level)
1327 return 0;
1328
1329 mutex_lock(&adev->pm.mutex);
1330 ret = pp_funcs->force_clock_level(adev->powerplay.pp_handle,
1331 type,
1332 mask);
1333 mutex_unlock(&adev->pm.mutex);
1334
1335 return ret;
1336 }
1337
amdgpu_dpm_get_sclk_od(struct amdgpu_device * adev)1338 int amdgpu_dpm_get_sclk_od(struct amdgpu_device *adev)
1339 {
1340 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1341 int ret = 0;
1342
1343 if (!pp_funcs->get_sclk_od)
1344 return -EOPNOTSUPP;
1345
1346 mutex_lock(&adev->pm.mutex);
1347 ret = pp_funcs->get_sclk_od(adev->powerplay.pp_handle);
1348 mutex_unlock(&adev->pm.mutex);
1349
1350 return ret;
1351 }
1352
amdgpu_dpm_set_sclk_od(struct amdgpu_device * adev,uint32_t value)1353 int amdgpu_dpm_set_sclk_od(struct amdgpu_device *adev, uint32_t value)
1354 {
1355 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1356
1357 if (is_support_sw_smu(adev))
1358 return -EOPNOTSUPP;
1359
1360 mutex_lock(&adev->pm.mutex);
1361 if (pp_funcs->set_sclk_od)
1362 pp_funcs->set_sclk_od(adev->powerplay.pp_handle, value);
1363 mutex_unlock(&adev->pm.mutex);
1364
1365 if (amdgpu_dpm_dispatch_task(adev,
1366 AMD_PP_TASK_READJUST_POWER_STATE,
1367 NULL) == -EOPNOTSUPP) {
1368 adev->pm.dpm.current_ps = adev->pm.dpm.boot_ps;
1369 amdgpu_dpm_compute_clocks(adev);
1370 }
1371
1372 return 0;
1373 }
1374
amdgpu_dpm_get_mclk_od(struct amdgpu_device * adev)1375 int amdgpu_dpm_get_mclk_od(struct amdgpu_device *adev)
1376 {
1377 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1378 int ret = 0;
1379
1380 if (!pp_funcs->get_mclk_od)
1381 return -EOPNOTSUPP;
1382
1383 mutex_lock(&adev->pm.mutex);
1384 ret = pp_funcs->get_mclk_od(adev->powerplay.pp_handle);
1385 mutex_unlock(&adev->pm.mutex);
1386
1387 return ret;
1388 }
1389
amdgpu_dpm_set_mclk_od(struct amdgpu_device * adev,uint32_t value)1390 int amdgpu_dpm_set_mclk_od(struct amdgpu_device *adev, uint32_t value)
1391 {
1392 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1393
1394 if (is_support_sw_smu(adev))
1395 return -EOPNOTSUPP;
1396
1397 mutex_lock(&adev->pm.mutex);
1398 if (pp_funcs->set_mclk_od)
1399 pp_funcs->set_mclk_od(adev->powerplay.pp_handle, value);
1400 mutex_unlock(&adev->pm.mutex);
1401
1402 if (amdgpu_dpm_dispatch_task(adev,
1403 AMD_PP_TASK_READJUST_POWER_STATE,
1404 NULL) == -EOPNOTSUPP) {
1405 adev->pm.dpm.current_ps = adev->pm.dpm.boot_ps;
1406 amdgpu_dpm_compute_clocks(adev);
1407 }
1408
1409 return 0;
1410 }
1411
amdgpu_dpm_get_power_profile_mode(struct amdgpu_device * adev,char * buf)1412 int amdgpu_dpm_get_power_profile_mode(struct amdgpu_device *adev,
1413 char *buf)
1414 {
1415 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1416 int ret = 0;
1417
1418 if (!pp_funcs->get_power_profile_mode)
1419 return -EOPNOTSUPP;
1420
1421 mutex_lock(&adev->pm.mutex);
1422 ret = pp_funcs->get_power_profile_mode(adev->powerplay.pp_handle,
1423 buf);
1424 mutex_unlock(&adev->pm.mutex);
1425
1426 return ret;
1427 }
1428
amdgpu_dpm_set_power_profile_mode(struct amdgpu_device * adev,long * input,uint32_t size)1429 int amdgpu_dpm_set_power_profile_mode(struct amdgpu_device *adev,
1430 long *input, uint32_t size)
1431 {
1432 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1433 int ret = 0;
1434
1435 if (!pp_funcs->set_power_profile_mode)
1436 return 0;
1437
1438 mutex_lock(&adev->pm.mutex);
1439 ret = pp_funcs->set_power_profile_mode(adev->powerplay.pp_handle,
1440 input,
1441 size);
1442 mutex_unlock(&adev->pm.mutex);
1443
1444 return ret;
1445 }
1446
amdgpu_dpm_get_gpu_metrics(struct amdgpu_device * adev,void * buf,size_t size)1447 ssize_t amdgpu_dpm_get_gpu_metrics(struct amdgpu_device *adev, void *buf,
1448 size_t size)
1449 {
1450 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1451 void *table;
1452 ssize_t ret;
1453
1454 if (!pp_funcs->get_gpu_metrics)
1455 return 0;
1456
1457 mutex_lock(&adev->pm.mutex);
1458 ret = pp_funcs->get_gpu_metrics(adev->powerplay.pp_handle,
1459 &table);
1460 if (ret > 0) {
1461 ret = min_t(ssize_t, ret, size);
1462 memcpy(buf, table, ret);
1463 }
1464 mutex_unlock(&adev->pm.mutex);
1465
1466 return ret;
1467 }
1468
amdgpu_dpm_get_pm_metrics(struct amdgpu_device * adev,void * pm_metrics,size_t size)1469 ssize_t amdgpu_dpm_get_pm_metrics(struct amdgpu_device *adev, void *pm_metrics,
1470 size_t size)
1471 {
1472 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1473 int ret = 0;
1474
1475 if (!pp_funcs->get_pm_metrics)
1476 return -EOPNOTSUPP;
1477
1478 mutex_lock(&adev->pm.mutex);
1479 ret = pp_funcs->get_pm_metrics(adev->powerplay.pp_handle, pm_metrics,
1480 size);
1481 mutex_unlock(&adev->pm.mutex);
1482
1483 return ret;
1484 }
1485
amdgpu_dpm_get_fan_control_mode(struct amdgpu_device * adev,uint32_t * fan_mode)1486 int amdgpu_dpm_get_fan_control_mode(struct amdgpu_device *adev,
1487 uint32_t *fan_mode)
1488 {
1489 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1490 int ret = 0;
1491
1492 if (!pp_funcs->get_fan_control_mode)
1493 return -EOPNOTSUPP;
1494
1495 mutex_lock(&adev->pm.mutex);
1496 ret = pp_funcs->get_fan_control_mode(adev->powerplay.pp_handle,
1497 fan_mode);
1498 mutex_unlock(&adev->pm.mutex);
1499
1500 return ret;
1501 }
1502
amdgpu_dpm_set_fan_speed_pwm(struct amdgpu_device * adev,uint32_t speed)1503 int amdgpu_dpm_set_fan_speed_pwm(struct amdgpu_device *adev,
1504 uint32_t speed)
1505 {
1506 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1507 int ret = 0;
1508
1509 if (!pp_funcs->set_fan_speed_pwm)
1510 return -EOPNOTSUPP;
1511
1512 mutex_lock(&adev->pm.mutex);
1513 ret = pp_funcs->set_fan_speed_pwm(adev->powerplay.pp_handle,
1514 speed);
1515 mutex_unlock(&adev->pm.mutex);
1516
1517 return ret;
1518 }
1519
amdgpu_dpm_get_fan_speed_pwm(struct amdgpu_device * adev,uint32_t * speed)1520 int amdgpu_dpm_get_fan_speed_pwm(struct amdgpu_device *adev,
1521 uint32_t *speed)
1522 {
1523 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1524 int ret = 0;
1525
1526 if (!pp_funcs->get_fan_speed_pwm)
1527 return -EOPNOTSUPP;
1528
1529 mutex_lock(&adev->pm.mutex);
1530 ret = pp_funcs->get_fan_speed_pwm(adev->powerplay.pp_handle,
1531 speed);
1532 mutex_unlock(&adev->pm.mutex);
1533
1534 return ret;
1535 }
1536
amdgpu_dpm_get_fan_speed_rpm(struct amdgpu_device * adev,uint32_t * speed)1537 int amdgpu_dpm_get_fan_speed_rpm(struct amdgpu_device *adev,
1538 uint32_t *speed)
1539 {
1540 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1541 int ret = 0;
1542
1543 if (!pp_funcs->get_fan_speed_rpm)
1544 return -EOPNOTSUPP;
1545
1546 mutex_lock(&adev->pm.mutex);
1547 ret = pp_funcs->get_fan_speed_rpm(adev->powerplay.pp_handle,
1548 speed);
1549 mutex_unlock(&adev->pm.mutex);
1550
1551 return ret;
1552 }
1553
amdgpu_dpm_set_fan_speed_rpm(struct amdgpu_device * adev,uint32_t speed)1554 int amdgpu_dpm_set_fan_speed_rpm(struct amdgpu_device *adev,
1555 uint32_t speed)
1556 {
1557 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1558 int ret = 0;
1559
1560 if (!pp_funcs->set_fan_speed_rpm)
1561 return -EOPNOTSUPP;
1562
1563 mutex_lock(&adev->pm.mutex);
1564 ret = pp_funcs->set_fan_speed_rpm(adev->powerplay.pp_handle,
1565 speed);
1566 mutex_unlock(&adev->pm.mutex);
1567
1568 return ret;
1569 }
1570
amdgpu_dpm_set_fan_control_mode(struct amdgpu_device * adev,uint32_t mode)1571 int amdgpu_dpm_set_fan_control_mode(struct amdgpu_device *adev,
1572 uint32_t mode)
1573 {
1574 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1575 int ret = 0;
1576
1577 if (!pp_funcs->set_fan_control_mode)
1578 return -EOPNOTSUPP;
1579
1580 mutex_lock(&adev->pm.mutex);
1581 ret = pp_funcs->set_fan_control_mode(adev->powerplay.pp_handle,
1582 mode);
1583 mutex_unlock(&adev->pm.mutex);
1584
1585 return ret;
1586 }
1587
amdgpu_dpm_get_power_limit(struct amdgpu_device * adev,uint32_t * limit,enum pp_power_limit_level pp_limit_level,enum pp_power_type power_type)1588 int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev,
1589 uint32_t *limit,
1590 enum pp_power_limit_level pp_limit_level,
1591 enum pp_power_type power_type)
1592 {
1593 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1594 int ret = 0;
1595
1596 if (!pp_funcs->get_power_limit)
1597 return -EOPNOTSUPP;
1598
1599 mutex_lock(&adev->pm.mutex);
1600 ret = pp_funcs->get_power_limit(adev->powerplay.pp_handle,
1601 limit,
1602 pp_limit_level,
1603 power_type);
1604 mutex_unlock(&adev->pm.mutex);
1605
1606 return ret;
1607 }
1608
amdgpu_dpm_set_power_limit(struct amdgpu_device * adev,uint32_t limit_type,uint32_t limit)1609 int amdgpu_dpm_set_power_limit(struct amdgpu_device *adev,
1610 uint32_t limit_type,
1611 uint32_t limit)
1612 {
1613 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1614 int ret = 0;
1615
1616 if (!pp_funcs->set_power_limit)
1617 return -EINVAL;
1618
1619 mutex_lock(&adev->pm.mutex);
1620 ret = pp_funcs->set_power_limit(adev->powerplay.pp_handle,
1621 limit_type, limit);
1622 mutex_unlock(&adev->pm.mutex);
1623
1624 return ret;
1625 }
1626
amdgpu_dpm_is_cclk_dpm_supported(struct amdgpu_device * adev)1627 int amdgpu_dpm_is_cclk_dpm_supported(struct amdgpu_device *adev)
1628 {
1629 bool cclk_dpm_supported = false;
1630
1631 if (!is_support_sw_smu(adev))
1632 return false;
1633
1634 mutex_lock(&adev->pm.mutex);
1635 cclk_dpm_supported = is_support_cclk_dpm(adev);
1636 mutex_unlock(&adev->pm.mutex);
1637
1638 return (int)cclk_dpm_supported;
1639 }
1640
amdgpu_dpm_debugfs_print_current_performance_level(struct amdgpu_device * adev,struct seq_file * m)1641 int amdgpu_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev,
1642 struct seq_file *m)
1643 {
1644 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1645
1646 if (!pp_funcs->debugfs_print_current_performance_level)
1647 return -EOPNOTSUPP;
1648
1649 mutex_lock(&adev->pm.mutex);
1650 pp_funcs->debugfs_print_current_performance_level(adev->powerplay.pp_handle,
1651 m);
1652 mutex_unlock(&adev->pm.mutex);
1653
1654 return 0;
1655 }
1656
amdgpu_dpm_get_smu_prv_buf_details(struct amdgpu_device * adev,void ** addr,size_t * size)1657 int amdgpu_dpm_get_smu_prv_buf_details(struct amdgpu_device *adev,
1658 void **addr,
1659 size_t *size)
1660 {
1661 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1662 int ret = 0;
1663
1664 if (!pp_funcs->get_smu_prv_buf_details)
1665 return -ENOSYS;
1666
1667 mutex_lock(&adev->pm.mutex);
1668 ret = pp_funcs->get_smu_prv_buf_details(adev->powerplay.pp_handle,
1669 addr,
1670 size);
1671 mutex_unlock(&adev->pm.mutex);
1672
1673 return ret;
1674 }
1675
amdgpu_dpm_is_overdrive_supported(struct amdgpu_device * adev)1676 int amdgpu_dpm_is_overdrive_supported(struct amdgpu_device *adev)
1677 {
1678 if (is_support_sw_smu(adev)) {
1679 struct smu_context *smu = adev->powerplay.pp_handle;
1680
1681 return (smu->od_enabled || smu->is_apu);
1682 } else {
1683 struct pp_hwmgr *hwmgr;
1684
1685 /*
1686 * dpm on some legacy asics don't carry od_enabled member
1687 * as its pp_handle is casted directly from adev.
1688 */
1689 if (amdgpu_dpm_is_legacy_dpm(adev))
1690 return false;
1691
1692 hwmgr = (struct pp_hwmgr *)adev->powerplay.pp_handle;
1693
1694 return hwmgr->od_enabled;
1695 }
1696 }
1697
amdgpu_dpm_is_overdrive_enabled(struct amdgpu_device * adev)1698 int amdgpu_dpm_is_overdrive_enabled(struct amdgpu_device *adev)
1699 {
1700 if (is_support_sw_smu(adev)) {
1701 struct smu_context *smu = adev->powerplay.pp_handle;
1702
1703 return smu->od_enabled;
1704 } else {
1705 struct pp_hwmgr *hwmgr;
1706
1707 /*
1708 * dpm on some legacy asics don't carry od_enabled member
1709 * as its pp_handle is casted directly from adev.
1710 */
1711 if (amdgpu_dpm_is_legacy_dpm(adev))
1712 return false;
1713
1714 hwmgr = (struct pp_hwmgr *)adev->powerplay.pp_handle;
1715
1716 return hwmgr->od_enabled;
1717 }
1718 }
1719
amdgpu_dpm_set_pp_table(struct amdgpu_device * adev,const char * buf,size_t size)1720 int amdgpu_dpm_set_pp_table(struct amdgpu_device *adev,
1721 const char *buf,
1722 size_t size)
1723 {
1724 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1725 int ret = 0;
1726
1727 if (!buf || !size)
1728 return -EINVAL;
1729
1730 if (!amdgpu_dpm_is_pp_table_allowed(adev) ||
1731 !pp_funcs->set_pp_table)
1732 return -EOPNOTSUPP;
1733
1734 mutex_lock(&adev->pm.mutex);
1735 ret = pp_funcs->set_pp_table(adev->powerplay.pp_handle,
1736 buf,
1737 size);
1738 mutex_unlock(&adev->pm.mutex);
1739
1740 return ret;
1741 }
1742
amdgpu_dpm_get_num_cpu_cores(struct amdgpu_device * adev)1743 int amdgpu_dpm_get_num_cpu_cores(struct amdgpu_device *adev)
1744 {
1745 struct smu_context *smu = adev->powerplay.pp_handle;
1746
1747 if (!is_support_sw_smu(adev))
1748 return INT_MAX;
1749
1750 return smu->cpu_core_num;
1751 }
1752
amdgpu_dpm_stb_debug_fs_init(struct amdgpu_device * adev)1753 void amdgpu_dpm_stb_debug_fs_init(struct amdgpu_device *adev)
1754 {
1755 if (!is_support_sw_smu(adev))
1756 return;
1757
1758 amdgpu_smu_stb_debug_fs_init(adev);
1759 }
1760
amdgpu_dpm_display_configuration_change(struct amdgpu_device * adev,const struct amd_pp_display_configuration * input)1761 int amdgpu_dpm_display_configuration_change(struct amdgpu_device *adev,
1762 const struct amd_pp_display_configuration *input)
1763 {
1764 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1765 int ret = 0;
1766
1767 if (!pp_funcs->display_configuration_change)
1768 return 0;
1769
1770 mutex_lock(&adev->pm.mutex);
1771 ret = pp_funcs->display_configuration_change(adev->powerplay.pp_handle,
1772 input);
1773 mutex_unlock(&adev->pm.mutex);
1774
1775 return ret;
1776 }
1777
amdgpu_dpm_get_clock_by_type(struct amdgpu_device * adev,enum amd_pp_clock_type type,struct amd_pp_clocks * clocks)1778 int amdgpu_dpm_get_clock_by_type(struct amdgpu_device *adev,
1779 enum amd_pp_clock_type type,
1780 struct amd_pp_clocks *clocks)
1781 {
1782 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1783 int ret = 0;
1784
1785 if (!pp_funcs->get_clock_by_type)
1786 return 0;
1787
1788 mutex_lock(&adev->pm.mutex);
1789 ret = pp_funcs->get_clock_by_type(adev->powerplay.pp_handle,
1790 type,
1791 clocks);
1792 mutex_unlock(&adev->pm.mutex);
1793
1794 return ret;
1795 }
1796
amdgpu_dpm_get_display_mode_validation_clks(struct amdgpu_device * adev,struct amd_pp_simple_clock_info * clocks)1797 int amdgpu_dpm_get_display_mode_validation_clks(struct amdgpu_device *adev,
1798 struct amd_pp_simple_clock_info *clocks)
1799 {
1800 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1801 int ret = 0;
1802
1803 if (!pp_funcs->get_display_mode_validation_clocks)
1804 return 0;
1805
1806 mutex_lock(&adev->pm.mutex);
1807 ret = pp_funcs->get_display_mode_validation_clocks(adev->powerplay.pp_handle,
1808 clocks);
1809 mutex_unlock(&adev->pm.mutex);
1810
1811 return ret;
1812 }
1813
amdgpu_dpm_get_clock_by_type_with_latency(struct amdgpu_device * adev,enum amd_pp_clock_type type,struct pp_clock_levels_with_latency * clocks)1814 int amdgpu_dpm_get_clock_by_type_with_latency(struct amdgpu_device *adev,
1815 enum amd_pp_clock_type type,
1816 struct pp_clock_levels_with_latency *clocks)
1817 {
1818 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1819 int ret = 0;
1820
1821 if (!pp_funcs->get_clock_by_type_with_latency)
1822 return 0;
1823
1824 mutex_lock(&adev->pm.mutex);
1825 ret = pp_funcs->get_clock_by_type_with_latency(adev->powerplay.pp_handle,
1826 type,
1827 clocks);
1828 mutex_unlock(&adev->pm.mutex);
1829
1830 return ret;
1831 }
1832
amdgpu_dpm_get_clock_by_type_with_voltage(struct amdgpu_device * adev,enum amd_pp_clock_type type,struct pp_clock_levels_with_voltage * clocks)1833 int amdgpu_dpm_get_clock_by_type_with_voltage(struct amdgpu_device *adev,
1834 enum amd_pp_clock_type type,
1835 struct pp_clock_levels_with_voltage *clocks)
1836 {
1837 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1838 int ret = 0;
1839
1840 if (!pp_funcs->get_clock_by_type_with_voltage)
1841 return 0;
1842
1843 mutex_lock(&adev->pm.mutex);
1844 ret = pp_funcs->get_clock_by_type_with_voltage(adev->powerplay.pp_handle,
1845 type,
1846 clocks);
1847 mutex_unlock(&adev->pm.mutex);
1848
1849 return ret;
1850 }
1851
amdgpu_dpm_set_watermarks_for_clocks_ranges(struct amdgpu_device * adev,void * clock_ranges)1852 int amdgpu_dpm_set_watermarks_for_clocks_ranges(struct amdgpu_device *adev,
1853 void *clock_ranges)
1854 {
1855 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1856 int ret = 0;
1857
1858 if (!pp_funcs->set_watermarks_for_clocks_ranges)
1859 return -EOPNOTSUPP;
1860
1861 mutex_lock(&adev->pm.mutex);
1862 ret = pp_funcs->set_watermarks_for_clocks_ranges(adev->powerplay.pp_handle,
1863 clock_ranges);
1864 mutex_unlock(&adev->pm.mutex);
1865
1866 return ret;
1867 }
1868
amdgpu_dpm_display_clock_voltage_request(struct amdgpu_device * adev,struct pp_display_clock_request * clock)1869 int amdgpu_dpm_display_clock_voltage_request(struct amdgpu_device *adev,
1870 struct pp_display_clock_request *clock)
1871 {
1872 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1873 int ret = 0;
1874
1875 if (!pp_funcs->display_clock_voltage_request)
1876 return -EOPNOTSUPP;
1877
1878 mutex_lock(&adev->pm.mutex);
1879 ret = pp_funcs->display_clock_voltage_request(adev->powerplay.pp_handle,
1880 clock);
1881 mutex_unlock(&adev->pm.mutex);
1882
1883 return ret;
1884 }
1885
amdgpu_dpm_get_current_clocks(struct amdgpu_device * adev,struct amd_pp_clock_info * clocks)1886 int amdgpu_dpm_get_current_clocks(struct amdgpu_device *adev,
1887 struct amd_pp_clock_info *clocks)
1888 {
1889 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1890 int ret = 0;
1891
1892 if (!pp_funcs->get_current_clocks)
1893 return -EOPNOTSUPP;
1894
1895 mutex_lock(&adev->pm.mutex);
1896 ret = pp_funcs->get_current_clocks(adev->powerplay.pp_handle,
1897 clocks);
1898 mutex_unlock(&adev->pm.mutex);
1899
1900 return ret;
1901 }
1902
amdgpu_dpm_notify_smu_enable_pwe(struct amdgpu_device * adev)1903 void amdgpu_dpm_notify_smu_enable_pwe(struct amdgpu_device *adev)
1904 {
1905 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1906
1907 if (!pp_funcs->notify_smu_enable_pwe)
1908 return;
1909
1910 mutex_lock(&adev->pm.mutex);
1911 pp_funcs->notify_smu_enable_pwe(adev->powerplay.pp_handle);
1912 mutex_unlock(&adev->pm.mutex);
1913 }
1914
amdgpu_dpm_set_active_display_count(struct amdgpu_device * adev,uint32_t count)1915 int amdgpu_dpm_set_active_display_count(struct amdgpu_device *adev,
1916 uint32_t count)
1917 {
1918 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1919 int ret = 0;
1920
1921 if (!pp_funcs->set_active_display_count)
1922 return -EOPNOTSUPP;
1923
1924 mutex_lock(&adev->pm.mutex);
1925 ret = pp_funcs->set_active_display_count(adev->powerplay.pp_handle,
1926 count);
1927 mutex_unlock(&adev->pm.mutex);
1928
1929 return ret;
1930 }
1931
amdgpu_dpm_set_min_deep_sleep_dcefclk(struct amdgpu_device * adev,uint32_t clock)1932 int amdgpu_dpm_set_min_deep_sleep_dcefclk(struct amdgpu_device *adev,
1933 uint32_t clock)
1934 {
1935 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1936 int ret = 0;
1937
1938 if (!pp_funcs->set_min_deep_sleep_dcefclk)
1939 return -EOPNOTSUPP;
1940
1941 mutex_lock(&adev->pm.mutex);
1942 ret = pp_funcs->set_min_deep_sleep_dcefclk(adev->powerplay.pp_handle,
1943 clock);
1944 mutex_unlock(&adev->pm.mutex);
1945
1946 return ret;
1947 }
1948
amdgpu_dpm_set_hard_min_dcefclk_by_freq(struct amdgpu_device * adev,uint32_t clock)1949 void amdgpu_dpm_set_hard_min_dcefclk_by_freq(struct amdgpu_device *adev,
1950 uint32_t clock)
1951 {
1952 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1953
1954 if (!pp_funcs->set_hard_min_dcefclk_by_freq)
1955 return;
1956
1957 mutex_lock(&adev->pm.mutex);
1958 pp_funcs->set_hard_min_dcefclk_by_freq(adev->powerplay.pp_handle,
1959 clock);
1960 mutex_unlock(&adev->pm.mutex);
1961 }
1962
amdgpu_dpm_set_hard_min_fclk_by_freq(struct amdgpu_device * adev,uint32_t clock)1963 void amdgpu_dpm_set_hard_min_fclk_by_freq(struct amdgpu_device *adev,
1964 uint32_t clock)
1965 {
1966 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1967
1968 if (!pp_funcs->set_hard_min_fclk_by_freq)
1969 return;
1970
1971 mutex_lock(&adev->pm.mutex);
1972 pp_funcs->set_hard_min_fclk_by_freq(adev->powerplay.pp_handle,
1973 clock);
1974 mutex_unlock(&adev->pm.mutex);
1975 }
1976
amdgpu_dpm_display_disable_memory_clock_switch(struct amdgpu_device * adev,bool disable_memory_clock_switch)1977 int amdgpu_dpm_display_disable_memory_clock_switch(struct amdgpu_device *adev,
1978 bool disable_memory_clock_switch)
1979 {
1980 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1981 int ret = 0;
1982
1983 if (!pp_funcs->display_disable_memory_clock_switch)
1984 return 0;
1985
1986 mutex_lock(&adev->pm.mutex);
1987 ret = pp_funcs->display_disable_memory_clock_switch(adev->powerplay.pp_handle,
1988 disable_memory_clock_switch);
1989 mutex_unlock(&adev->pm.mutex);
1990
1991 return ret;
1992 }
1993
amdgpu_dpm_get_max_sustainable_clocks_by_dc(struct amdgpu_device * adev,struct pp_smu_nv_clock_table * max_clocks)1994 int amdgpu_dpm_get_max_sustainable_clocks_by_dc(struct amdgpu_device *adev,
1995 struct pp_smu_nv_clock_table *max_clocks)
1996 {
1997 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
1998 int ret = 0;
1999
2000 if (!pp_funcs->get_max_sustainable_clocks_by_dc)
2001 return -EOPNOTSUPP;
2002
2003 mutex_lock(&adev->pm.mutex);
2004 ret = pp_funcs->get_max_sustainable_clocks_by_dc(adev->powerplay.pp_handle,
2005 max_clocks);
2006 mutex_unlock(&adev->pm.mutex);
2007
2008 return ret;
2009 }
2010
amdgpu_dpm_get_uclk_dpm_states(struct amdgpu_device * adev,unsigned int * clock_values_in_khz,unsigned int * num_states)2011 enum pp_smu_status amdgpu_dpm_get_uclk_dpm_states(struct amdgpu_device *adev,
2012 unsigned int *clock_values_in_khz,
2013 unsigned int *num_states)
2014 {
2015 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
2016 int ret = 0;
2017
2018 if (!pp_funcs->get_uclk_dpm_states)
2019 return -EOPNOTSUPP;
2020
2021 mutex_lock(&adev->pm.mutex);
2022 ret = pp_funcs->get_uclk_dpm_states(adev->powerplay.pp_handle,
2023 clock_values_in_khz,
2024 num_states);
2025 mutex_unlock(&adev->pm.mutex);
2026
2027 return ret;
2028 }
2029
amdgpu_dpm_get_dpm_clock_table(struct amdgpu_device * adev,struct dpm_clocks * clock_table)2030 int amdgpu_dpm_get_dpm_clock_table(struct amdgpu_device *adev,
2031 struct dpm_clocks *clock_table)
2032 {
2033 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
2034 int ret = 0;
2035
2036 if (!pp_funcs->get_dpm_clock_table)
2037 return -EOPNOTSUPP;
2038
2039 mutex_lock(&adev->pm.mutex);
2040 ret = pp_funcs->get_dpm_clock_table(adev->powerplay.pp_handle,
2041 clock_table);
2042 mutex_unlock(&adev->pm.mutex);
2043
2044 return ret;
2045 }
2046
2047 /**
2048 * amdgpu_dpm_get_temp_metrics - Retrieve metrics for a specific compute
2049 * partition
2050 * @adev: Pointer to the device.
2051 * @type: Identifier for the temperature type metrics to be fetched.
2052 * @table: Pointer to a buffer where the metrics will be stored. If NULL, the
2053 * function returns the size of the metrics structure.
2054 *
2055 * This function retrieves metrics for a specific temperature type, If the
2056 * table parameter is NULL, the function returns the size of the metrics
2057 * structure without populating it.
2058 *
2059 * Return: Size of the metrics structure on success, or a negative error code on failure.
2060 */
amdgpu_dpm_get_temp_metrics(struct amdgpu_device * adev,enum smu_temp_metric_type type,void * table)2061 ssize_t amdgpu_dpm_get_temp_metrics(struct amdgpu_device *adev,
2062 enum smu_temp_metric_type type, void *table)
2063 {
2064 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
2065 int ret;
2066
2067 if (!pp_funcs->get_temp_metrics ||
2068 !amdgpu_dpm_is_temp_metrics_supported(adev, type))
2069 return -EOPNOTSUPP;
2070
2071 mutex_lock(&adev->pm.mutex);
2072 ret = pp_funcs->get_temp_metrics(adev->powerplay.pp_handle, type, table);
2073 mutex_unlock(&adev->pm.mutex);
2074
2075 return ret;
2076 }
2077
2078 /**
2079 * amdgpu_dpm_is_temp_metrics_supported - Return if specific temperature metrics support
2080 * is available
2081 * @adev: Pointer to the device.
2082 * @type: Identifier for the temperature type metrics to be fetched.
2083 *
2084 * This function returns metrics if specific temperature metrics type is supported or not.
2085 *
2086 * Return: True in case of metrics type supported else false.
2087 */
amdgpu_dpm_is_temp_metrics_supported(struct amdgpu_device * adev,enum smu_temp_metric_type type)2088 bool amdgpu_dpm_is_temp_metrics_supported(struct amdgpu_device *adev,
2089 enum smu_temp_metric_type type)
2090 {
2091 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
2092 bool support_temp_metrics = false;
2093
2094 if (!pp_funcs->temp_metrics_is_supported)
2095 return support_temp_metrics;
2096
2097 if (is_support_sw_smu(adev)) {
2098 mutex_lock(&adev->pm.mutex);
2099 support_temp_metrics =
2100 pp_funcs->temp_metrics_is_supported(adev->powerplay.pp_handle, type);
2101 mutex_unlock(&adev->pm.mutex);
2102 }
2103
2104 return support_temp_metrics;
2105 }
2106
2107 /**
2108 * amdgpu_dpm_get_xcp_metrics - Retrieve metrics for a specific compute
2109 * partition
2110 * @adev: Pointer to the device.
2111 * @xcp_id: Identifier of the XCP for which metrics are to be retrieved.
2112 * @table: Pointer to a buffer where the metrics will be stored. If NULL, the
2113 * function returns the size of the metrics structure.
2114 *
2115 * This function retrieves metrics for a specific XCP, including details such as
2116 * VCN/JPEG activity, clock frequencies, and other performance metrics. If the
2117 * table parameter is NULL, the function returns the size of the metrics
2118 * structure without populating it.
2119 *
2120 * Return: Size of the metrics structure on success, or a negative error code on failure.
2121 */
amdgpu_dpm_get_xcp_metrics(struct amdgpu_device * adev,int xcp_id,void * table)2122 ssize_t amdgpu_dpm_get_xcp_metrics(struct amdgpu_device *adev, int xcp_id,
2123 void *table)
2124 {
2125 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
2126 int ret = 0;
2127
2128 if (!pp_funcs->get_xcp_metrics)
2129 return 0;
2130
2131 mutex_lock(&adev->pm.mutex);
2132 ret = pp_funcs->get_xcp_metrics(adev->powerplay.pp_handle, xcp_id,
2133 table);
2134 mutex_unlock(&adev->pm.mutex);
2135
2136 return ret;
2137 }
2138