]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/gpu/drm/amd/powerplay/amd_powerplay.c
Merge tag 'armsoc-dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[linux.git] / drivers / gpu / drm / amd / powerplay / amd_powerplay.c
1 /*
2  * Copyright 2015 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  */
23 #include "pp_debug.h"
24 #include <linux/types.h>
25 #include <linux/kernel.h>
26 #include <linux/gfp.h>
27 #include <linux/slab.h>
28 #include <linux/firmware.h>
29 #include "amd_shared.h"
30 #include "amd_powerplay.h"
31 #include "power_state.h"
32 #include "amdgpu.h"
33 #include "hwmgr.h"
34
35
36 static const struct amd_pm_funcs pp_dpm_funcs;
37
38 static int amd_powerplay_create(struct amdgpu_device *adev)
39 {
40         struct pp_hwmgr *hwmgr;
41
42         if (adev == NULL)
43                 return -EINVAL;
44
45         hwmgr = kzalloc(sizeof(struct pp_hwmgr), GFP_KERNEL);
46         if (hwmgr == NULL)
47                 return -ENOMEM;
48
49         hwmgr->adev = adev;
50         hwmgr->not_vf = !amdgpu_sriov_vf(adev);
51         hwmgr->pm_en = (amdgpu_dpm && hwmgr->not_vf) ? true : false;
52         hwmgr->device = amdgpu_cgs_create_device(adev);
53         mutex_init(&hwmgr->smu_lock);
54         hwmgr->chip_family = adev->family;
55         hwmgr->chip_id = adev->asic_type;
56         hwmgr->feature_mask = adev->powerplay.pp_feature;
57         hwmgr->display_config = &adev->pm.pm_display_cfg;
58         adev->powerplay.pp_handle = hwmgr;
59         adev->powerplay.pp_funcs = &pp_dpm_funcs;
60         return 0;
61 }
62
63
64 static void amd_powerplay_destroy(struct amdgpu_device *adev)
65 {
66         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
67
68         kfree(hwmgr->hardcode_pp_table);
69         hwmgr->hardcode_pp_table = NULL;
70
71         kfree(hwmgr);
72         hwmgr = NULL;
73 }
74
75 static int pp_early_init(void *handle)
76 {
77         int ret;
78         struct amdgpu_device *adev = handle;
79
80         ret = amd_powerplay_create(adev);
81
82         if (ret != 0)
83                 return ret;
84
85         ret = hwmgr_early_init(adev->powerplay.pp_handle);
86         if (ret)
87                 return -EINVAL;
88
89         return 0;
90 }
91
92 static int pp_sw_init(void *handle)
93 {
94         struct amdgpu_device *adev = handle;
95         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
96         int ret = 0;
97
98         ret = hwmgr_sw_init(hwmgr);
99
100         pr_debug("powerplay sw init %s\n", ret ? "failed" : "successfully");
101
102         return ret;
103 }
104
105 static int pp_sw_fini(void *handle)
106 {
107         struct amdgpu_device *adev = handle;
108         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
109
110         hwmgr_sw_fini(hwmgr);
111
112         release_firmware(adev->pm.fw);
113         adev->pm.fw = NULL;
114
115         return 0;
116 }
117
118 static int pp_hw_init(void *handle)
119 {
120         int ret = 0;
121         struct amdgpu_device *adev = handle;
122         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
123
124         ret = hwmgr_hw_init(hwmgr);
125
126         if (ret)
127                 pr_err("powerplay hw init failed\n");
128
129         return ret;
130 }
131
132 static int pp_hw_fini(void *handle)
133 {
134         struct amdgpu_device *adev = handle;
135         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
136
137         hwmgr_hw_fini(hwmgr);
138
139         return 0;
140 }
141
142 static void pp_reserve_vram_for_smu(struct amdgpu_device *adev)
143 {
144         int r = -EINVAL;
145         void *cpu_ptr = NULL;
146         uint64_t gpu_addr;
147         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
148
149         if (amdgpu_bo_create_kernel(adev, adev->pm.smu_prv_buffer_size,
150                                                 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
151                                                 &adev->pm.smu_prv_buffer,
152                                                 &gpu_addr,
153                                                 &cpu_ptr)) {
154                 DRM_ERROR("amdgpu: failed to create smu prv buffer\n");
155                 return;
156         }
157
158         if (hwmgr->hwmgr_func->notify_cac_buffer_info)
159                 r = hwmgr->hwmgr_func->notify_cac_buffer_info(hwmgr,
160                                         lower_32_bits((unsigned long)cpu_ptr),
161                                         upper_32_bits((unsigned long)cpu_ptr),
162                                         lower_32_bits(gpu_addr),
163                                         upper_32_bits(gpu_addr),
164                                         adev->pm.smu_prv_buffer_size);
165
166         if (r) {
167                 amdgpu_bo_free_kernel(&adev->pm.smu_prv_buffer, NULL, NULL);
168                 adev->pm.smu_prv_buffer = NULL;
169                 DRM_ERROR("amdgpu: failed to notify SMU buffer address\n");
170         }
171 }
172
173 static int pp_late_init(void *handle)
174 {
175         struct amdgpu_device *adev = handle;
176         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
177
178         if (hwmgr && hwmgr->pm_en) {
179                 mutex_lock(&hwmgr->smu_lock);
180                 hwmgr_handle_task(hwmgr,
181                                         AMD_PP_TASK_COMPLETE_INIT, NULL);
182                 mutex_unlock(&hwmgr->smu_lock);
183         }
184         if (adev->pm.smu_prv_buffer_size != 0)
185                 pp_reserve_vram_for_smu(adev);
186
187         return 0;
188 }
189
190 static void pp_late_fini(void *handle)
191 {
192         struct amdgpu_device *adev = handle;
193
194         if (adev->pm.smu_prv_buffer)
195                 amdgpu_bo_free_kernel(&adev->pm.smu_prv_buffer, NULL, NULL);
196         amd_powerplay_destroy(adev);
197 }
198
199
200 static bool pp_is_idle(void *handle)
201 {
202         return false;
203 }
204
205 static int pp_wait_for_idle(void *handle)
206 {
207         return 0;
208 }
209
210 static int pp_sw_reset(void *handle)
211 {
212         return 0;
213 }
214
215 static int pp_set_powergating_state(void *handle,
216                                     enum amd_powergating_state state)
217 {
218         return 0;
219 }
220
221 static int pp_suspend(void *handle)
222 {
223         struct amdgpu_device *adev = handle;
224         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
225
226         return hwmgr_suspend(hwmgr);
227 }
228
229 static int pp_resume(void *handle)
230 {
231         struct amdgpu_device *adev = handle;
232         struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
233
234         return hwmgr_resume(hwmgr);
235 }
236
237 static int pp_set_clockgating_state(void *handle,
238                                           enum amd_clockgating_state state)
239 {
240         return 0;
241 }
242
243 static const struct amd_ip_funcs pp_ip_funcs = {
244         .name = "powerplay",
245         .early_init = pp_early_init,
246         .late_init = pp_late_init,
247         .sw_init = pp_sw_init,
248         .sw_fini = pp_sw_fini,
249         .hw_init = pp_hw_init,
250         .hw_fini = pp_hw_fini,
251         .late_fini = pp_late_fini,
252         .suspend = pp_suspend,
253         .resume = pp_resume,
254         .is_idle = pp_is_idle,
255         .wait_for_idle = pp_wait_for_idle,
256         .soft_reset = pp_sw_reset,
257         .set_clockgating_state = pp_set_clockgating_state,
258         .set_powergating_state = pp_set_powergating_state,
259 };
260
261 const struct amdgpu_ip_block_version pp_smu_ip_block =
262 {
263         .type = AMD_IP_BLOCK_TYPE_SMC,
264         .major = 1,
265         .minor = 0,
266         .rev = 0,
267         .funcs = &pp_ip_funcs,
268 };
269
270 /* This interface only be supported On Vi,
271  * because only smu7/8 can help to load gfx/sdma fw,
272  * smu need to be enabled before load other ip's fw.
273  * so call start smu to load smu7 fw and other ip's fw
274  */
275 static int pp_dpm_load_fw(void *handle)
276 {
277         struct pp_hwmgr *hwmgr = handle;
278
279         if (!hwmgr || !hwmgr->smumgr_funcs || !hwmgr->smumgr_funcs->start_smu)
280                 return -EINVAL;
281
282         if (hwmgr->smumgr_funcs->start_smu(hwmgr)) {
283                 pr_err("fw load failed\n");
284                 return -EINVAL;
285         }
286
287         return 0;
288 }
289
290 static int pp_dpm_fw_loading_complete(void *handle)
291 {
292         return 0;
293 }
294
295 static int pp_set_clockgating_by_smu(void *handle, uint32_t msg_id)
296 {
297         struct pp_hwmgr *hwmgr = handle;
298
299         if (!hwmgr || !hwmgr->pm_en)
300                 return -EINVAL;
301
302         if (hwmgr->hwmgr_func->update_clock_gatings == NULL) {
303                 pr_info("%s was not implemented.\n", __func__);
304                 return 0;
305         }
306
307         return hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
308 }
309
310 static void pp_dpm_en_umd_pstate(struct pp_hwmgr  *hwmgr,
311                                                 enum amd_dpm_forced_level *level)
312 {
313         uint32_t profile_mode_mask = AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD |
314                                         AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK |
315                                         AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK |
316                                         AMD_DPM_FORCED_LEVEL_PROFILE_PEAK;
317
318         if (!(hwmgr->dpm_level & profile_mode_mask)) {
319                 /* enter umd pstate, save current level, disable gfx cg*/
320                 if (*level & profile_mode_mask) {
321                         hwmgr->saved_dpm_level = hwmgr->dpm_level;
322                         hwmgr->en_umd_pstate = true;
323                         amdgpu_device_ip_set_clockgating_state(hwmgr->adev,
324                                                 AMD_IP_BLOCK_TYPE_GFX,
325                                                 AMD_CG_STATE_UNGATE);
326                         amdgpu_device_ip_set_powergating_state(hwmgr->adev,
327                                         AMD_IP_BLOCK_TYPE_GFX,
328                                         AMD_PG_STATE_UNGATE);
329                 }
330         } else {
331                 /* exit umd pstate, restore level, enable gfx cg*/
332                 if (!(*level & profile_mode_mask)) {
333                         if (*level == AMD_DPM_FORCED_LEVEL_PROFILE_EXIT)
334                                 *level = hwmgr->saved_dpm_level;
335                         hwmgr->en_umd_pstate = false;
336                         amdgpu_device_ip_set_clockgating_state(hwmgr->adev,
337                                         AMD_IP_BLOCK_TYPE_GFX,
338                                         AMD_CG_STATE_GATE);
339                         amdgpu_device_ip_set_powergating_state(hwmgr->adev,
340                                         AMD_IP_BLOCK_TYPE_GFX,
341                                         AMD_PG_STATE_GATE);
342                 }
343         }
344 }
345
346 static int pp_dpm_force_performance_level(void *handle,
347                                         enum amd_dpm_forced_level level)
348 {
349         struct pp_hwmgr *hwmgr = handle;
350
351         if (!hwmgr || !hwmgr->pm_en)
352                 return -EINVAL;
353
354         if (level == hwmgr->dpm_level)
355                 return 0;
356
357         mutex_lock(&hwmgr->smu_lock);
358         pp_dpm_en_umd_pstate(hwmgr, &level);
359         hwmgr->request_dpm_level = level;
360         hwmgr_handle_task(hwmgr, AMD_PP_TASK_READJUST_POWER_STATE, NULL);
361         mutex_unlock(&hwmgr->smu_lock);
362
363         return 0;
364 }
365
366 static enum amd_dpm_forced_level pp_dpm_get_performance_level(
367                                                                 void *handle)
368 {
369         struct pp_hwmgr *hwmgr = handle;
370         enum amd_dpm_forced_level level;
371
372         if (!hwmgr || !hwmgr->pm_en)
373                 return -EINVAL;
374
375         mutex_lock(&hwmgr->smu_lock);
376         level = hwmgr->dpm_level;
377         mutex_unlock(&hwmgr->smu_lock);
378         return level;
379 }
380
381 static uint32_t pp_dpm_get_sclk(void *handle, bool low)
382 {
383         struct pp_hwmgr *hwmgr = handle;
384         uint32_t clk = 0;
385
386         if (!hwmgr || !hwmgr->pm_en)
387                 return 0;
388
389         if (hwmgr->hwmgr_func->get_sclk == NULL) {
390                 pr_info("%s was not implemented.\n", __func__);
391                 return 0;
392         }
393         mutex_lock(&hwmgr->smu_lock);
394         clk = hwmgr->hwmgr_func->get_sclk(hwmgr, low);
395         mutex_unlock(&hwmgr->smu_lock);
396         return clk;
397 }
398
399 static uint32_t pp_dpm_get_mclk(void *handle, bool low)
400 {
401         struct pp_hwmgr *hwmgr = handle;
402         uint32_t clk = 0;
403
404         if (!hwmgr || !hwmgr->pm_en)
405                 return 0;
406
407         if (hwmgr->hwmgr_func->get_mclk == NULL) {
408                 pr_info("%s was not implemented.\n", __func__);
409                 return 0;
410         }
411         mutex_lock(&hwmgr->smu_lock);
412         clk = hwmgr->hwmgr_func->get_mclk(hwmgr, low);
413         mutex_unlock(&hwmgr->smu_lock);
414         return clk;
415 }
416
417 static void pp_dpm_powergate_vce(void *handle, bool gate)
418 {
419         struct pp_hwmgr *hwmgr = handle;
420
421         if (!hwmgr || !hwmgr->pm_en)
422                 return;
423
424         if (hwmgr->hwmgr_func->powergate_vce == NULL) {
425                 pr_info("%s was not implemented.\n", __func__);
426                 return;
427         }
428         mutex_lock(&hwmgr->smu_lock);
429         hwmgr->hwmgr_func->powergate_vce(hwmgr, gate);
430         mutex_unlock(&hwmgr->smu_lock);
431 }
432
433 static void pp_dpm_powergate_uvd(void *handle, bool gate)
434 {
435         struct pp_hwmgr *hwmgr = handle;
436
437         if (!hwmgr || !hwmgr->pm_en)
438                 return;
439
440         if (hwmgr->hwmgr_func->powergate_uvd == NULL) {
441                 pr_info("%s was not implemented.\n", __func__);
442                 return;
443         }
444         mutex_lock(&hwmgr->smu_lock);
445         hwmgr->hwmgr_func->powergate_uvd(hwmgr, gate);
446         mutex_unlock(&hwmgr->smu_lock);
447 }
448
449 static int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_task task_id,
450                 enum amd_pm_state_type *user_state)
451 {
452         int ret = 0;
453         struct pp_hwmgr *hwmgr = handle;
454
455         if (!hwmgr || !hwmgr->pm_en)
456                 return -EINVAL;
457
458         mutex_lock(&hwmgr->smu_lock);
459         ret = hwmgr_handle_task(hwmgr, task_id, user_state);
460         mutex_unlock(&hwmgr->smu_lock);
461
462         return ret;
463 }
464
465 static enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle)
466 {
467         struct pp_hwmgr *hwmgr = handle;
468         struct pp_power_state *state;
469         enum amd_pm_state_type pm_type;
470
471         if (!hwmgr || !hwmgr->pm_en || !hwmgr->current_ps)
472                 return -EINVAL;
473
474         mutex_lock(&hwmgr->smu_lock);
475
476         state = hwmgr->current_ps;
477
478         switch (state->classification.ui_label) {
479         case PP_StateUILabel_Battery:
480                 pm_type = POWER_STATE_TYPE_BATTERY;
481                 break;
482         case PP_StateUILabel_Balanced:
483                 pm_type = POWER_STATE_TYPE_BALANCED;
484                 break;
485         case PP_StateUILabel_Performance:
486                 pm_type = POWER_STATE_TYPE_PERFORMANCE;
487                 break;
488         default:
489                 if (state->classification.flags & PP_StateClassificationFlag_Boot)
490                         pm_type = POWER_STATE_TYPE_INTERNAL_BOOT;
491                 else
492                         pm_type = POWER_STATE_TYPE_DEFAULT;
493                 break;
494         }
495         mutex_unlock(&hwmgr->smu_lock);
496
497         return pm_type;
498 }
499
500 static void pp_dpm_set_fan_control_mode(void *handle, uint32_t mode)
501 {
502         struct pp_hwmgr *hwmgr = handle;
503
504         if (!hwmgr || !hwmgr->pm_en)
505                 return;
506
507         if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) {
508                 pr_info("%s was not implemented.\n", __func__);
509                 return;
510         }
511         mutex_lock(&hwmgr->smu_lock);
512         hwmgr->hwmgr_func->set_fan_control_mode(hwmgr, mode);
513         mutex_unlock(&hwmgr->smu_lock);
514 }
515
516 static uint32_t pp_dpm_get_fan_control_mode(void *handle)
517 {
518         struct pp_hwmgr *hwmgr = handle;
519         uint32_t mode = 0;
520
521         if (!hwmgr || !hwmgr->pm_en)
522                 return 0;
523
524         if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) {
525                 pr_info("%s was not implemented.\n", __func__);
526                 return 0;
527         }
528         mutex_lock(&hwmgr->smu_lock);
529         mode = hwmgr->hwmgr_func->get_fan_control_mode(hwmgr);
530         mutex_unlock(&hwmgr->smu_lock);
531         return mode;
532 }
533
534 static int pp_dpm_set_fan_speed_percent(void *handle, uint32_t percent)
535 {
536         struct pp_hwmgr *hwmgr = handle;
537         int ret = 0;
538
539         if (!hwmgr || !hwmgr->pm_en)
540                 return -EINVAL;
541
542         if (hwmgr->hwmgr_func->set_fan_speed_percent == NULL) {
543                 pr_info("%s was not implemented.\n", __func__);
544                 return 0;
545         }
546         mutex_lock(&hwmgr->smu_lock);
547         ret = hwmgr->hwmgr_func->set_fan_speed_percent(hwmgr, percent);
548         mutex_unlock(&hwmgr->smu_lock);
549         return ret;
550 }
551
552 static int pp_dpm_get_fan_speed_percent(void *handle, uint32_t *speed)
553 {
554         struct pp_hwmgr *hwmgr = handle;
555         int ret = 0;
556
557         if (!hwmgr || !hwmgr->pm_en)
558                 return -EINVAL;
559
560         if (hwmgr->hwmgr_func->get_fan_speed_percent == NULL) {
561                 pr_info("%s was not implemented.\n", __func__);
562                 return 0;
563         }
564
565         mutex_lock(&hwmgr->smu_lock);
566         ret = hwmgr->hwmgr_func->get_fan_speed_percent(hwmgr, speed);
567         mutex_unlock(&hwmgr->smu_lock);
568         return ret;
569 }
570
571 static int pp_dpm_get_fan_speed_rpm(void *handle, uint32_t *rpm)
572 {
573         struct pp_hwmgr *hwmgr = handle;
574         int ret = 0;
575
576         if (!hwmgr || !hwmgr->pm_en)
577                 return -EINVAL;
578
579         if (hwmgr->hwmgr_func->get_fan_speed_rpm == NULL)
580                 return -EINVAL;
581
582         mutex_lock(&hwmgr->smu_lock);
583         ret = hwmgr->hwmgr_func->get_fan_speed_rpm(hwmgr, rpm);
584         mutex_unlock(&hwmgr->smu_lock);
585         return ret;
586 }
587
588 static int pp_dpm_set_fan_speed_rpm(void *handle, uint32_t rpm)
589 {
590         struct pp_hwmgr *hwmgr = handle;
591         int ret = 0;
592
593         if (!hwmgr || !hwmgr->pm_en)
594                 return -EINVAL;
595
596         if (hwmgr->hwmgr_func->set_fan_speed_rpm == NULL) {
597                 pr_info("%s was not implemented.\n", __func__);
598                 return 0;
599         }
600         mutex_lock(&hwmgr->smu_lock);
601         ret = hwmgr->hwmgr_func->set_fan_speed_rpm(hwmgr, rpm);
602         mutex_unlock(&hwmgr->smu_lock);
603         return ret;
604 }
605
606 static int pp_dpm_get_pp_num_states(void *handle,
607                 struct pp_states_info *data)
608 {
609         struct pp_hwmgr *hwmgr = handle;
610         int i;
611
612         memset(data, 0, sizeof(*data));
613
614         if (!hwmgr || !hwmgr->pm_en ||!hwmgr->ps)
615                 return -EINVAL;
616
617         mutex_lock(&hwmgr->smu_lock);
618
619         data->nums = hwmgr->num_ps;
620
621         for (i = 0; i < hwmgr->num_ps; i++) {
622                 struct pp_power_state *state = (struct pp_power_state *)
623                                 ((unsigned long)hwmgr->ps + i * hwmgr->ps_size);
624                 switch (state->classification.ui_label) {
625                 case PP_StateUILabel_Battery:
626                         data->states[i] = POWER_STATE_TYPE_BATTERY;
627                         break;
628                 case PP_StateUILabel_Balanced:
629                         data->states[i] = POWER_STATE_TYPE_BALANCED;
630                         break;
631                 case PP_StateUILabel_Performance:
632                         data->states[i] = POWER_STATE_TYPE_PERFORMANCE;
633                         break;
634                 default:
635                         if (state->classification.flags & PP_StateClassificationFlag_Boot)
636                                 data->states[i] = POWER_STATE_TYPE_INTERNAL_BOOT;
637                         else
638                                 data->states[i] = POWER_STATE_TYPE_DEFAULT;
639                 }
640         }
641         mutex_unlock(&hwmgr->smu_lock);
642         return 0;
643 }
644
645 static int pp_dpm_get_pp_table(void *handle, char **table)
646 {
647         struct pp_hwmgr *hwmgr = handle;
648         int size = 0;
649
650         if (!hwmgr || !hwmgr->pm_en ||!hwmgr->soft_pp_table)
651                 return -EINVAL;
652
653         mutex_lock(&hwmgr->smu_lock);
654         *table = (char *)hwmgr->soft_pp_table;
655         size = hwmgr->soft_pp_table_size;
656         mutex_unlock(&hwmgr->smu_lock);
657         return size;
658 }
659
660 static int amd_powerplay_reset(void *handle)
661 {
662         struct pp_hwmgr *hwmgr = handle;
663         int ret;
664
665         ret = hwmgr_hw_fini(hwmgr);
666         if (ret)
667                 return ret;
668
669         ret = hwmgr_hw_init(hwmgr);
670         if (ret)
671                 return ret;
672
673         return hwmgr_handle_task(hwmgr, AMD_PP_TASK_COMPLETE_INIT, NULL);
674 }
675
676 static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)
677 {
678         struct pp_hwmgr *hwmgr = handle;
679         int ret = -ENOMEM;
680
681         if (!hwmgr || !hwmgr->pm_en)
682                 return -EINVAL;
683
684         mutex_lock(&hwmgr->smu_lock);
685         if (!hwmgr->hardcode_pp_table) {
686                 hwmgr->hardcode_pp_table = kmemdup(hwmgr->soft_pp_table,
687                                                    hwmgr->soft_pp_table_size,
688                                                    GFP_KERNEL);
689                 if (!hwmgr->hardcode_pp_table)
690                         goto err;
691         }
692
693         memcpy(hwmgr->hardcode_pp_table, buf, size);
694
695         hwmgr->soft_pp_table = hwmgr->hardcode_pp_table;
696
697         ret = amd_powerplay_reset(handle);
698         if (ret)
699                 goto err;
700
701         if (hwmgr->hwmgr_func->avfs_control) {
702                 ret = hwmgr->hwmgr_func->avfs_control(hwmgr, false);
703                 if (ret)
704                         goto err;
705         }
706         mutex_unlock(&hwmgr->smu_lock);
707         return 0;
708 err:
709         mutex_unlock(&hwmgr->smu_lock);
710         return ret;
711 }
712
713 static int pp_dpm_force_clock_level(void *handle,
714                 enum pp_clock_type type, uint32_t mask)
715 {
716         struct pp_hwmgr *hwmgr = handle;
717         int ret = 0;
718
719         if (!hwmgr || !hwmgr->pm_en)
720                 return -EINVAL;
721
722         if (hwmgr->hwmgr_func->force_clock_level == NULL) {
723                 pr_info("%s was not implemented.\n", __func__);
724                 return 0;
725         }
726         mutex_lock(&hwmgr->smu_lock);
727         if (hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL)
728                 ret = hwmgr->hwmgr_func->force_clock_level(hwmgr, type, mask);
729         else
730                 ret = -EINVAL;
731         mutex_unlock(&hwmgr->smu_lock);
732         return ret;
733 }
734
735 static int pp_dpm_print_clock_levels(void *handle,
736                 enum pp_clock_type type, char *buf)
737 {
738         struct pp_hwmgr *hwmgr = handle;
739         int ret = 0;
740
741         if (!hwmgr || !hwmgr->pm_en)
742                 return -EINVAL;
743
744         if (hwmgr->hwmgr_func->print_clock_levels == NULL) {
745                 pr_info("%s was not implemented.\n", __func__);
746                 return 0;
747         }
748         mutex_lock(&hwmgr->smu_lock);
749         ret = hwmgr->hwmgr_func->print_clock_levels(hwmgr, type, buf);
750         mutex_unlock(&hwmgr->smu_lock);
751         return ret;
752 }
753
754 static int pp_dpm_get_sclk_od(void *handle)
755 {
756         struct pp_hwmgr *hwmgr = handle;
757         int ret = 0;
758
759         if (!hwmgr || !hwmgr->pm_en)
760                 return -EINVAL;
761
762         if (hwmgr->hwmgr_func->get_sclk_od == NULL) {
763                 pr_info("%s was not implemented.\n", __func__);
764                 return 0;
765         }
766         mutex_lock(&hwmgr->smu_lock);
767         ret = hwmgr->hwmgr_func->get_sclk_od(hwmgr);
768         mutex_unlock(&hwmgr->smu_lock);
769         return ret;
770 }
771
772 static int pp_dpm_set_sclk_od(void *handle, uint32_t value)
773 {
774         struct pp_hwmgr *hwmgr = handle;
775         int ret = 0;
776
777         if (!hwmgr || !hwmgr->pm_en)
778                 return -EINVAL;
779
780         if (hwmgr->hwmgr_func->set_sclk_od == NULL) {
781                 pr_info("%s was not implemented.\n", __func__);
782                 return 0;
783         }
784
785         mutex_lock(&hwmgr->smu_lock);
786         ret = hwmgr->hwmgr_func->set_sclk_od(hwmgr, value);
787         mutex_unlock(&hwmgr->smu_lock);
788         return ret;
789 }
790
791 static int pp_dpm_get_mclk_od(void *handle)
792 {
793         struct pp_hwmgr *hwmgr = handle;
794         int ret = 0;
795
796         if (!hwmgr || !hwmgr->pm_en)
797                 return -EINVAL;
798
799         if (hwmgr->hwmgr_func->get_mclk_od == NULL) {
800                 pr_info("%s was not implemented.\n", __func__);
801                 return 0;
802         }
803         mutex_lock(&hwmgr->smu_lock);
804         ret = hwmgr->hwmgr_func->get_mclk_od(hwmgr);
805         mutex_unlock(&hwmgr->smu_lock);
806         return ret;
807 }
808
809 static int pp_dpm_set_mclk_od(void *handle, uint32_t value)
810 {
811         struct pp_hwmgr *hwmgr = handle;
812         int ret = 0;
813
814         if (!hwmgr || !hwmgr->pm_en)
815                 return -EINVAL;
816
817         if (hwmgr->hwmgr_func->set_mclk_od == NULL) {
818                 pr_info("%s was not implemented.\n", __func__);
819                 return 0;
820         }
821         mutex_lock(&hwmgr->smu_lock);
822         ret = hwmgr->hwmgr_func->set_mclk_od(hwmgr, value);
823         mutex_unlock(&hwmgr->smu_lock);
824         return ret;
825 }
826
827 static int pp_dpm_read_sensor(void *handle, int idx,
828                               void *value, int *size)
829 {
830         struct pp_hwmgr *hwmgr = handle;
831         int ret = 0;
832
833         if (!hwmgr || !hwmgr->pm_en || !value)
834                 return -EINVAL;
835
836         switch (idx) {
837         case AMDGPU_PP_SENSOR_STABLE_PSTATE_SCLK:
838                 *((uint32_t *)value) = hwmgr->pstate_sclk;
839                 return 0;
840         case AMDGPU_PP_SENSOR_STABLE_PSTATE_MCLK:
841                 *((uint32_t *)value) = hwmgr->pstate_mclk;
842                 return 0;
843         case AMDGPU_PP_SENSOR_MIN_FAN_RPM:
844                 *((uint32_t *)value) = hwmgr->thermal_controller.fanInfo.ulMinRPM;
845                 return 0;
846         case AMDGPU_PP_SENSOR_MAX_FAN_RPM:
847                 *((uint32_t *)value) = hwmgr->thermal_controller.fanInfo.ulMaxRPM;
848                 return 0;
849         default:
850                 mutex_lock(&hwmgr->smu_lock);
851                 ret = hwmgr->hwmgr_func->read_sensor(hwmgr, idx, value, size);
852                 mutex_unlock(&hwmgr->smu_lock);
853                 return ret;
854         }
855 }
856
857 static struct amd_vce_state*
858 pp_dpm_get_vce_clock_state(void *handle, unsigned idx)
859 {
860         struct pp_hwmgr *hwmgr = handle;
861
862         if (!hwmgr || !hwmgr->pm_en)
863                 return NULL;
864
865         if (idx < hwmgr->num_vce_state_tables)
866                 return &hwmgr->vce_states[idx];
867         return NULL;
868 }
869
870 static int pp_get_power_profile_mode(void *handle, char *buf)
871 {
872         struct pp_hwmgr *hwmgr = handle;
873
874         if (!hwmgr || !hwmgr->pm_en || !buf)
875                 return -EINVAL;
876
877         if (hwmgr->hwmgr_func->get_power_profile_mode == NULL) {
878                 pr_info("%s was not implemented.\n", __func__);
879                 return snprintf(buf, PAGE_SIZE, "\n");
880         }
881
882         return hwmgr->hwmgr_func->get_power_profile_mode(hwmgr, buf);
883 }
884
885 static int pp_set_power_profile_mode(void *handle, long *input, uint32_t size)
886 {
887         struct pp_hwmgr *hwmgr = handle;
888         int ret = -EINVAL;
889
890         if (!hwmgr || !hwmgr->pm_en)
891                 return ret;
892
893         if (hwmgr->hwmgr_func->set_power_profile_mode == NULL) {
894                 pr_info("%s was not implemented.\n", __func__);
895                 return ret;
896         }
897
898         if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) {
899                 pr_info("power profile setting is for manual dpm mode only.\n");
900                 return ret;
901         }
902
903         mutex_lock(&hwmgr->smu_lock);
904         ret = hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, input, size);
905         mutex_unlock(&hwmgr->smu_lock);
906         return ret;
907 }
908
909 static int pp_odn_edit_dpm_table(void *handle, uint32_t type, long *input, uint32_t size)
910 {
911         struct pp_hwmgr *hwmgr = handle;
912
913         if (!hwmgr || !hwmgr->pm_en)
914                 return -EINVAL;
915
916         if (hwmgr->hwmgr_func->odn_edit_dpm_table == NULL) {
917                 pr_info("%s was not implemented.\n", __func__);
918                 return -EINVAL;
919         }
920
921         return hwmgr->hwmgr_func->odn_edit_dpm_table(hwmgr, type, input, size);
922 }
923
924 static int pp_dpm_switch_power_profile(void *handle,
925                 enum PP_SMC_POWER_PROFILE type, bool en)
926 {
927         struct pp_hwmgr *hwmgr = handle;
928         long workload;
929         uint32_t index;
930
931         if (!hwmgr || !hwmgr->pm_en)
932                 return -EINVAL;
933
934         if (hwmgr->hwmgr_func->set_power_profile_mode == NULL) {
935                 pr_info("%s was not implemented.\n", __func__);
936                 return -EINVAL;
937         }
938
939         if (!(type < PP_SMC_POWER_PROFILE_CUSTOM))
940                 return -EINVAL;
941
942         mutex_lock(&hwmgr->smu_lock);
943
944         if (!en) {
945                 hwmgr->workload_mask &= ~(1 << hwmgr->workload_prority[type]);
946                 index = fls(hwmgr->workload_mask);
947                 index = index > 0 && index <= Workload_Policy_Max ? index - 1 : 0;
948                 workload = hwmgr->workload_setting[index];
949         } else {
950                 hwmgr->workload_mask |= (1 << hwmgr->workload_prority[type]);
951                 index = fls(hwmgr->workload_mask);
952                 index = index <= Workload_Policy_Max ? index - 1 : 0;
953                 workload = hwmgr->workload_setting[index];
954         }
955
956         if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL)
957                 hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, &workload, 0);
958         mutex_unlock(&hwmgr->smu_lock);
959
960         return 0;
961 }
962
963 static int pp_set_power_limit(void *handle, uint32_t limit)
964 {
965         struct pp_hwmgr *hwmgr = handle;
966
967         if (!hwmgr || !hwmgr->pm_en)
968                 return -EINVAL;
969
970         if (hwmgr->hwmgr_func->set_power_limit == NULL) {
971                 pr_info("%s was not implemented.\n", __func__);
972                 return -EINVAL;
973         }
974
975         if (limit == 0)
976                 limit = hwmgr->default_power_limit;
977
978         if (limit > hwmgr->default_power_limit)
979                 return -EINVAL;
980
981         mutex_lock(&hwmgr->smu_lock);
982         hwmgr->hwmgr_func->set_power_limit(hwmgr, limit);
983         hwmgr->power_limit = limit;
984         mutex_unlock(&hwmgr->smu_lock);
985         return 0;
986 }
987
988 static int pp_get_power_limit(void *handle, uint32_t *limit, bool default_limit)
989 {
990         struct pp_hwmgr *hwmgr = handle;
991
992         if (!hwmgr || !hwmgr->pm_en ||!limit)
993                 return -EINVAL;
994
995         mutex_lock(&hwmgr->smu_lock);
996
997         if (default_limit)
998                 *limit = hwmgr->default_power_limit;
999         else
1000                 *limit = hwmgr->power_limit;
1001
1002         mutex_unlock(&hwmgr->smu_lock);
1003
1004         return 0;
1005 }
1006
1007 static int pp_display_configuration_change(void *handle,
1008         const struct amd_pp_display_configuration *display_config)
1009 {
1010         struct pp_hwmgr *hwmgr = handle;
1011
1012         if (!hwmgr || !hwmgr->pm_en)
1013                 return -EINVAL;
1014
1015         mutex_lock(&hwmgr->smu_lock);
1016         phm_store_dal_configuration_data(hwmgr, display_config);
1017         mutex_unlock(&hwmgr->smu_lock);
1018         return 0;
1019 }
1020
1021 static int pp_get_display_power_level(void *handle,
1022                 struct amd_pp_simple_clock_info *output)
1023 {
1024         struct pp_hwmgr *hwmgr = handle;
1025         int ret = 0;
1026
1027         if (!hwmgr || !hwmgr->pm_en ||!output)
1028                 return -EINVAL;
1029
1030         mutex_lock(&hwmgr->smu_lock);
1031         ret = phm_get_dal_power_level(hwmgr, output);
1032         mutex_unlock(&hwmgr->smu_lock);
1033         return ret;
1034 }
1035
1036 static int pp_get_current_clocks(void *handle,
1037                 struct amd_pp_clock_info *clocks)
1038 {
1039         struct amd_pp_simple_clock_info simple_clocks = { 0 };
1040         struct pp_clock_info hw_clocks;
1041         struct pp_hwmgr *hwmgr = handle;
1042         int ret = 0;
1043
1044         if (!hwmgr || !hwmgr->pm_en)
1045                 return -EINVAL;
1046
1047         mutex_lock(&hwmgr->smu_lock);
1048
1049         phm_get_dal_power_level(hwmgr, &simple_clocks);
1050
1051         if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
1052                                         PHM_PlatformCaps_PowerContainment))
1053                 ret = phm_get_clock_info(hwmgr, &hwmgr->current_ps->hardware,
1054                                         &hw_clocks, PHM_PerformanceLevelDesignation_PowerContainment);
1055         else
1056                 ret = phm_get_clock_info(hwmgr, &hwmgr->current_ps->hardware,
1057                                         &hw_clocks, PHM_PerformanceLevelDesignation_Activity);
1058
1059         if (ret) {
1060                 pr_info("Error in phm_get_clock_info \n");
1061                 mutex_unlock(&hwmgr->smu_lock);
1062                 return -EINVAL;
1063         }
1064
1065         clocks->min_engine_clock = hw_clocks.min_eng_clk;
1066         clocks->max_engine_clock = hw_clocks.max_eng_clk;
1067         clocks->min_memory_clock = hw_clocks.min_mem_clk;
1068         clocks->max_memory_clock = hw_clocks.max_mem_clk;
1069         clocks->min_bus_bandwidth = hw_clocks.min_bus_bandwidth;
1070         clocks->max_bus_bandwidth = hw_clocks.max_bus_bandwidth;
1071
1072         clocks->max_engine_clock_in_sr = hw_clocks.max_eng_clk;
1073         clocks->min_engine_clock_in_sr = hw_clocks.min_eng_clk;
1074
1075         if (simple_clocks.level == 0)
1076                 clocks->max_clocks_state = PP_DAL_POWERLEVEL_7;
1077         else
1078                 clocks->max_clocks_state = simple_clocks.level;
1079
1080         if (0 == phm_get_current_shallow_sleep_clocks(hwmgr, &hwmgr->current_ps->hardware, &hw_clocks)) {
1081                 clocks->max_engine_clock_in_sr = hw_clocks.max_eng_clk;
1082                 clocks->min_engine_clock_in_sr = hw_clocks.min_eng_clk;
1083         }
1084         mutex_unlock(&hwmgr->smu_lock);
1085         return 0;
1086 }
1087
1088 static int pp_get_clock_by_type(void *handle, enum amd_pp_clock_type type, struct amd_pp_clocks *clocks)
1089 {
1090         struct pp_hwmgr *hwmgr = handle;
1091         int ret = 0;
1092
1093         if (!hwmgr || !hwmgr->pm_en)
1094                 return -EINVAL;
1095
1096         if (clocks == NULL)
1097                 return -EINVAL;
1098
1099         mutex_lock(&hwmgr->smu_lock);
1100         ret = phm_get_clock_by_type(hwmgr, type, clocks);
1101         mutex_unlock(&hwmgr->smu_lock);
1102         return ret;
1103 }
1104
1105 static int pp_get_clock_by_type_with_latency(void *handle,
1106                 enum amd_pp_clock_type type,
1107                 struct pp_clock_levels_with_latency *clocks)
1108 {
1109         struct pp_hwmgr *hwmgr = handle;
1110         int ret = 0;
1111
1112         if (!hwmgr || !hwmgr->pm_en ||!clocks)
1113                 return -EINVAL;
1114
1115         mutex_lock(&hwmgr->smu_lock);
1116         ret = phm_get_clock_by_type_with_latency(hwmgr, type, clocks);
1117         mutex_unlock(&hwmgr->smu_lock);
1118         return ret;
1119 }
1120
1121 static int pp_get_clock_by_type_with_voltage(void *handle,
1122                 enum amd_pp_clock_type type,
1123                 struct pp_clock_levels_with_voltage *clocks)
1124 {
1125         struct pp_hwmgr *hwmgr = handle;
1126         int ret = 0;
1127
1128         if (!hwmgr || !hwmgr->pm_en ||!clocks)
1129                 return -EINVAL;
1130
1131         mutex_lock(&hwmgr->smu_lock);
1132
1133         ret = phm_get_clock_by_type_with_voltage(hwmgr, type, clocks);
1134
1135         mutex_unlock(&hwmgr->smu_lock);
1136         return ret;
1137 }
1138
1139 static int pp_set_watermarks_for_clocks_ranges(void *handle,
1140                 void *clock_ranges)
1141 {
1142         struct pp_hwmgr *hwmgr = handle;
1143         int ret = 0;
1144
1145         if (!hwmgr || !hwmgr->pm_en || !clock_ranges)
1146                 return -EINVAL;
1147
1148         mutex_lock(&hwmgr->smu_lock);
1149         ret = phm_set_watermarks_for_clocks_ranges(hwmgr,
1150                         clock_ranges);
1151         mutex_unlock(&hwmgr->smu_lock);
1152
1153         return ret;
1154 }
1155
1156 static int pp_display_clock_voltage_request(void *handle,
1157                 struct pp_display_clock_request *clock)
1158 {
1159         struct pp_hwmgr *hwmgr = handle;
1160         int ret = 0;
1161
1162         if (!hwmgr || !hwmgr->pm_en ||!clock)
1163                 return -EINVAL;
1164
1165         mutex_lock(&hwmgr->smu_lock);
1166         ret = phm_display_clock_voltage_request(hwmgr, clock);
1167         mutex_unlock(&hwmgr->smu_lock);
1168
1169         return ret;
1170 }
1171
1172 static int pp_get_display_mode_validation_clocks(void *handle,
1173                 struct amd_pp_simple_clock_info *clocks)
1174 {
1175         struct pp_hwmgr *hwmgr = handle;
1176         int ret = 0;
1177
1178         if (!hwmgr || !hwmgr->pm_en ||!clocks)
1179                 return -EINVAL;
1180
1181         clocks->level = PP_DAL_POWERLEVEL_7;
1182
1183         mutex_lock(&hwmgr->smu_lock);
1184
1185         if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_DynamicPatchPowerState))
1186                 ret = phm_get_max_high_clocks(hwmgr, clocks);
1187
1188         mutex_unlock(&hwmgr->smu_lock);
1189         return ret;
1190 }
1191
1192 static int pp_dpm_powergate_mmhub(void *handle)
1193 {
1194         struct pp_hwmgr *hwmgr = handle;
1195
1196         if (!hwmgr || !hwmgr->pm_en)
1197                 return -EINVAL;
1198
1199         if (hwmgr->hwmgr_func->powergate_mmhub == NULL) {
1200                 pr_info("%s was not implemented.\n", __func__);
1201                 return 0;
1202         }
1203
1204         return hwmgr->hwmgr_func->powergate_mmhub(hwmgr);
1205 }
1206
1207 static int pp_dpm_powergate_gfx(void *handle, bool gate)
1208 {
1209         struct pp_hwmgr *hwmgr = handle;
1210
1211         if (!hwmgr || !hwmgr->pm_en)
1212                 return 0;
1213
1214         if (hwmgr->hwmgr_func->powergate_gfx == NULL) {
1215                 pr_info("%s was not implemented.\n", __func__);
1216                 return 0;
1217         }
1218
1219         return hwmgr->hwmgr_func->powergate_gfx(hwmgr, gate);
1220 }
1221
1222 static void pp_dpm_powergate_acp(void *handle, bool gate)
1223 {
1224         struct pp_hwmgr *hwmgr = handle;
1225
1226         if (!hwmgr || !hwmgr->pm_en)
1227                 return;
1228
1229         if (hwmgr->hwmgr_func->powergate_acp == NULL) {
1230                 pr_info("%s was not implemented.\n", __func__);
1231                 return;
1232         }
1233
1234         hwmgr->hwmgr_func->powergate_acp(hwmgr, gate);
1235 }
1236
1237 static void pp_dpm_powergate_sdma(void *handle, bool gate)
1238 {
1239         struct pp_hwmgr *hwmgr = handle;
1240
1241         if (!hwmgr)
1242                 return;
1243
1244         if (hwmgr->hwmgr_func->powergate_sdma == NULL) {
1245                 pr_info("%s was not implemented.\n", __func__);
1246                 return;
1247         }
1248
1249         hwmgr->hwmgr_func->powergate_sdma(hwmgr, gate);
1250 }
1251
1252 static int pp_set_powergating_by_smu(void *handle,
1253                                 uint32_t block_type, bool gate)
1254 {
1255         int ret = 0;
1256
1257         switch (block_type) {
1258         case AMD_IP_BLOCK_TYPE_UVD:
1259         case AMD_IP_BLOCK_TYPE_VCN:
1260                 pp_dpm_powergate_uvd(handle, gate);
1261                 break;
1262         case AMD_IP_BLOCK_TYPE_VCE:
1263                 pp_dpm_powergate_vce(handle, gate);
1264                 break;
1265         case AMD_IP_BLOCK_TYPE_GMC:
1266                 pp_dpm_powergate_mmhub(handle);
1267                 break;
1268         case AMD_IP_BLOCK_TYPE_GFX:
1269                 ret = pp_dpm_powergate_gfx(handle, gate);
1270                 break;
1271         case AMD_IP_BLOCK_TYPE_ACP:
1272                 pp_dpm_powergate_acp(handle, gate);
1273                 break;
1274         case AMD_IP_BLOCK_TYPE_SDMA:
1275                 pp_dpm_powergate_sdma(handle, gate);
1276                 break;
1277         default:
1278                 break;
1279         }
1280         return ret;
1281 }
1282
1283 static int pp_notify_smu_enable_pwe(void *handle)
1284 {
1285         struct pp_hwmgr *hwmgr = handle;
1286
1287         if (!hwmgr || !hwmgr->pm_en)
1288                 return -EINVAL;
1289
1290         if (hwmgr->hwmgr_func->smus_notify_pwe == NULL) {
1291                 pr_info("%s was not implemented.\n", __func__);
1292                 return -EINVAL;;
1293         }
1294
1295         mutex_lock(&hwmgr->smu_lock);
1296         hwmgr->hwmgr_func->smus_notify_pwe(hwmgr);
1297         mutex_unlock(&hwmgr->smu_lock);
1298
1299         return 0;
1300 }
1301
1302 static int pp_enable_mgpu_fan_boost(void *handle)
1303 {
1304         struct pp_hwmgr *hwmgr = handle;
1305
1306         if (!hwmgr || !hwmgr->pm_en)
1307                 return -EINVAL;
1308
1309         if (hwmgr->hwmgr_func->enable_mgpu_fan_boost == NULL) {
1310                 return 0;
1311         }
1312
1313         mutex_lock(&hwmgr->smu_lock);
1314         hwmgr->hwmgr_func->enable_mgpu_fan_boost(hwmgr);
1315         mutex_unlock(&hwmgr->smu_lock);
1316
1317         return 0;
1318 }
1319
1320 static const struct amd_pm_funcs pp_dpm_funcs = {
1321         .load_firmware = pp_dpm_load_fw,
1322         .wait_for_fw_loading_complete = pp_dpm_fw_loading_complete,
1323         .force_performance_level = pp_dpm_force_performance_level,
1324         .get_performance_level = pp_dpm_get_performance_level,
1325         .get_current_power_state = pp_dpm_get_current_power_state,
1326         .dispatch_tasks = pp_dpm_dispatch_tasks,
1327         .set_fan_control_mode = pp_dpm_set_fan_control_mode,
1328         .get_fan_control_mode = pp_dpm_get_fan_control_mode,
1329         .set_fan_speed_percent = pp_dpm_set_fan_speed_percent,
1330         .get_fan_speed_percent = pp_dpm_get_fan_speed_percent,
1331         .get_fan_speed_rpm = pp_dpm_get_fan_speed_rpm,
1332         .set_fan_speed_rpm = pp_dpm_set_fan_speed_rpm,
1333         .get_pp_num_states = pp_dpm_get_pp_num_states,
1334         .get_pp_table = pp_dpm_get_pp_table,
1335         .set_pp_table = pp_dpm_set_pp_table,
1336         .force_clock_level = pp_dpm_force_clock_level,
1337         .print_clock_levels = pp_dpm_print_clock_levels,
1338         .get_sclk_od = pp_dpm_get_sclk_od,
1339         .set_sclk_od = pp_dpm_set_sclk_od,
1340         .get_mclk_od = pp_dpm_get_mclk_od,
1341         .set_mclk_od = pp_dpm_set_mclk_od,
1342         .read_sensor = pp_dpm_read_sensor,
1343         .get_vce_clock_state = pp_dpm_get_vce_clock_state,
1344         .switch_power_profile = pp_dpm_switch_power_profile,
1345         .set_clockgating_by_smu = pp_set_clockgating_by_smu,
1346         .set_powergating_by_smu = pp_set_powergating_by_smu,
1347         .get_power_profile_mode = pp_get_power_profile_mode,
1348         .set_power_profile_mode = pp_set_power_profile_mode,
1349         .odn_edit_dpm_table = pp_odn_edit_dpm_table,
1350         .set_power_limit = pp_set_power_limit,
1351         .get_power_limit = pp_get_power_limit,
1352 /* export to DC */
1353         .get_sclk = pp_dpm_get_sclk,
1354         .get_mclk = pp_dpm_get_mclk,
1355         .display_configuration_change = pp_display_configuration_change,
1356         .get_display_power_level = pp_get_display_power_level,
1357         .get_current_clocks = pp_get_current_clocks,
1358         .get_clock_by_type = pp_get_clock_by_type,
1359         .get_clock_by_type_with_latency = pp_get_clock_by_type_with_latency,
1360         .get_clock_by_type_with_voltage = pp_get_clock_by_type_with_voltage,
1361         .set_watermarks_for_clocks_ranges = pp_set_watermarks_for_clocks_ranges,
1362         .display_clock_voltage_request = pp_display_clock_voltage_request,
1363         .get_display_mode_validation_clocks = pp_get_display_mode_validation_clocks,
1364         .notify_smu_enable_pwe = pp_notify_smu_enable_pwe,
1365         .enable_mgpu_fan_boost = pp_enable_mgpu_fan_boost,
1366 };