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