Lines Matching full:smu
53 static int smu_force_smuclk_levels(struct smu_context *smu,
56 static int smu_handle_task(struct smu_context *smu,
60 static int smu_reset(struct smu_context *smu);
62 static int smu_set_fan_control_mode(struct smu_context *smu, int value);
65 static int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled);
70 struct smu_context *smu = handle; in smu_sys_get_pp_feature_mask() local
73 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_sys_get_pp_feature_mask()
76 mutex_lock(&smu->mutex); in smu_sys_get_pp_feature_mask()
78 size = smu_get_pp_feature_mask(smu, buf); in smu_sys_get_pp_feature_mask()
80 mutex_unlock(&smu->mutex); in smu_sys_get_pp_feature_mask()
88 struct smu_context *smu = handle; in smu_sys_set_pp_feature_mask() local
91 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_sys_set_pp_feature_mask()
94 mutex_lock(&smu->mutex); in smu_sys_set_pp_feature_mask()
96 ret = smu_set_pp_feature_mask(smu, new_mask); in smu_sys_set_pp_feature_mask()
98 mutex_unlock(&smu->mutex); in smu_sys_set_pp_feature_mask()
106 struct smu_context *smu = &adev->smu; in smu_get_status_gfxoff() local
108 if (is_support_sw_smu(adev) && smu->ppt_funcs->get_gfx_off_status) in smu_get_status_gfxoff()
109 *value = smu_get_gfx_off_status(smu); in smu_get_status_gfxoff()
116 int smu_set_soft_freq_range(struct smu_context *smu, in smu_set_soft_freq_range() argument
123 mutex_lock(&smu->mutex); in smu_set_soft_freq_range()
125 if (smu->ppt_funcs->set_soft_freq_limited_range) in smu_set_soft_freq_range()
126 ret = smu->ppt_funcs->set_soft_freq_limited_range(smu, in smu_set_soft_freq_range()
131 mutex_unlock(&smu->mutex); in smu_set_soft_freq_range()
136 int smu_get_dpm_freq_range(struct smu_context *smu, in smu_get_dpm_freq_range() argument
146 mutex_lock(&smu->mutex); in smu_get_dpm_freq_range()
148 if (smu->ppt_funcs->get_dpm_ultimate_freq) in smu_get_dpm_freq_range()
149 ret = smu->ppt_funcs->get_dpm_ultimate_freq(smu, in smu_get_dpm_freq_range()
154 mutex_unlock(&smu->mutex); in smu_get_dpm_freq_range()
161 struct smu_context *smu = handle; in smu_get_mclk() local
165 ret = smu_get_dpm_freq_range(smu, SMU_UCLK, in smu_get_mclk()
175 struct smu_context *smu = handle; in smu_get_sclk() local
179 ret = smu_get_dpm_freq_range(smu, SMU_GFXCLK, in smu_get_sclk()
187 static int smu_dpm_set_vcn_enable_locked(struct smu_context *smu, in smu_dpm_set_vcn_enable_locked() argument
190 struct smu_power_context *smu_power = &smu->smu_power; in smu_dpm_set_vcn_enable_locked()
194 if (!smu->ppt_funcs->dpm_set_vcn_enable) in smu_dpm_set_vcn_enable_locked()
200 ret = smu->ppt_funcs->dpm_set_vcn_enable(smu, enable); in smu_dpm_set_vcn_enable_locked()
207 static int smu_dpm_set_vcn_enable(struct smu_context *smu, in smu_dpm_set_vcn_enable() argument
210 struct smu_power_context *smu_power = &smu->smu_power; in smu_dpm_set_vcn_enable()
216 ret = smu_dpm_set_vcn_enable_locked(smu, enable); in smu_dpm_set_vcn_enable()
223 static int smu_dpm_set_jpeg_enable_locked(struct smu_context *smu, in smu_dpm_set_jpeg_enable_locked() argument
226 struct smu_power_context *smu_power = &smu->smu_power; in smu_dpm_set_jpeg_enable_locked()
230 if (!smu->ppt_funcs->dpm_set_jpeg_enable) in smu_dpm_set_jpeg_enable_locked()
236 ret = smu->ppt_funcs->dpm_set_jpeg_enable(smu, enable); in smu_dpm_set_jpeg_enable_locked()
243 static int smu_dpm_set_jpeg_enable(struct smu_context *smu, in smu_dpm_set_jpeg_enable() argument
246 struct smu_power_context *smu_power = &smu->smu_power; in smu_dpm_set_jpeg_enable()
252 ret = smu_dpm_set_jpeg_enable_locked(smu, enable); in smu_dpm_set_jpeg_enable()
266 * This API uses no smu->mutex lock protection due to:
270 * Under this case, the smu->mutex lock protection is already enforced on
277 struct smu_context *smu = handle; in smu_dpm_set_power_gate() local
280 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_dpm_set_power_gate()
290 ret = smu_dpm_set_vcn_enable(smu, !gate); in smu_dpm_set_power_gate()
292 dev_err(smu->adev->dev, "Failed to power %s VCN!\n", in smu_dpm_set_power_gate()
296 ret = smu_gfx_off_control(smu, gate); in smu_dpm_set_power_gate()
298 dev_err(smu->adev->dev, "Failed to %s gfxoff!\n", in smu_dpm_set_power_gate()
302 ret = smu_powergate_sdma(smu, gate); in smu_dpm_set_power_gate()
304 dev_err(smu->adev->dev, "Failed to power %s SDMA!\n", in smu_dpm_set_power_gate()
308 ret = smu_dpm_set_jpeg_enable(smu, !gate); in smu_dpm_set_power_gate()
310 dev_err(smu->adev->dev, "Failed to power %s JPEG!\n", in smu_dpm_set_power_gate()
314 dev_err(smu->adev->dev, "Unsupported block type!\n"); in smu_dpm_set_power_gate()
324 * @smu: smu_context pointer
329 static void smu_set_user_clk_dependencies(struct smu_context *smu, enum smu_clk_type clk) in smu_set_user_clk_dependencies() argument
331 if (smu->adev->in_suspend) in smu_set_user_clk_dependencies()
335 smu->user_dpm_profile.clk_dependency = 0; in smu_set_user_clk_dependencies()
336 smu->user_dpm_profile.clk_dependency = BIT(SMU_FCLK) | BIT(SMU_SOCCLK); in smu_set_user_clk_dependencies()
339 if (smu->user_dpm_profile.clk_dependency == (BIT(SMU_FCLK) | BIT(SMU_SOCCLK))) in smu_set_user_clk_dependencies()
342 smu->user_dpm_profile.clk_dependency = 0; in smu_set_user_clk_dependencies()
343 smu->user_dpm_profile.clk_dependency = BIT(SMU_MCLK) | BIT(SMU_SOCCLK); in smu_set_user_clk_dependencies()
346 if (smu->user_dpm_profile.clk_dependency == (BIT(SMU_FCLK) | BIT(SMU_SOCCLK))) in smu_set_user_clk_dependencies()
349 smu->user_dpm_profile.clk_dependency = 0; in smu_set_user_clk_dependencies()
350 smu->user_dpm_profile.clk_dependency = BIT(SMU_MCLK) | BIT(SMU_FCLK); in smu_set_user_clk_dependencies()
359 * @smu: smu_context pointer
364 static void smu_restore_dpm_user_profile(struct smu_context *smu) in smu_restore_dpm_user_profile() argument
366 struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); in smu_restore_dpm_user_profile()
369 if (!smu->adev->in_suspend) in smu_restore_dpm_user_profile()
372 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_restore_dpm_user_profile()
376 smu->user_dpm_profile.flags |= SMU_DPM_USER_PROFILE_RESTORE; in smu_restore_dpm_user_profile()
379 if (smu->user_dpm_profile.power_limit) { in smu_restore_dpm_user_profile()
380 ret = smu_set_power_limit(smu, smu->user_dpm_profile.power_limit); in smu_restore_dpm_user_profile()
382 dev_err(smu->adev->dev, "Failed to set power limit value\n"); in smu_restore_dpm_user_profile()
391 * Iterate over smu clk type and force the saved user clk in smu_restore_dpm_user_profile()
394 if (!(smu->user_dpm_profile.clk_dependency & BIT(clk_type)) && in smu_restore_dpm_user_profile()
395 smu->user_dpm_profile.clk_mask[clk_type]) { in smu_restore_dpm_user_profile()
396 ret = smu_force_smuclk_levels(smu, clk_type, in smu_restore_dpm_user_profile()
397 smu->user_dpm_profile.clk_mask[clk_type]); in smu_restore_dpm_user_profile()
399 dev_err(smu->adev->dev, in smu_restore_dpm_user_profile()
406 if (smu->user_dpm_profile.fan_mode == AMD_FAN_CTRL_MANUAL || in smu_restore_dpm_user_profile()
407 smu->user_dpm_profile.fan_mode == AMD_FAN_CTRL_NONE) { in smu_restore_dpm_user_profile()
408 ret = smu_set_fan_control_mode(smu, smu->user_dpm_profile.fan_mode); in smu_restore_dpm_user_profile()
410 smu->user_dpm_profile.fan_speed_pwm = 0; in smu_restore_dpm_user_profile()
411 smu->user_dpm_profile.fan_speed_rpm = 0; in smu_restore_dpm_user_profile()
412 smu->user_dpm_profile.fan_mode = AMD_FAN_CTRL_AUTO; in smu_restore_dpm_user_profile()
413 dev_err(smu->adev->dev, "Failed to set manual fan control mode\n"); in smu_restore_dpm_user_profile()
416 if (smu->user_dpm_profile.fan_speed_pwm) { in smu_restore_dpm_user_profile()
417 ret = smu_set_fan_speed_pwm(smu, smu->user_dpm_profile.fan_speed_pwm); in smu_restore_dpm_user_profile()
419 dev_err(smu->adev->dev, "Failed to set manual fan speed in pwm\n"); in smu_restore_dpm_user_profile()
422 if (smu->user_dpm_profile.fan_speed_rpm) { in smu_restore_dpm_user_profile()
423 ret = smu_set_fan_speed_rpm(smu, smu->user_dpm_profile.fan_speed_rpm); in smu_restore_dpm_user_profile()
425 dev_err(smu->adev->dev, "Failed to set manual fan speed in rpm\n"); in smu_restore_dpm_user_profile()
430 if (smu->user_dpm_profile.user_od) { in smu_restore_dpm_user_profile()
431 if (smu->ppt_funcs->restore_user_od_settings) { in smu_restore_dpm_user_profile()
432 ret = smu->ppt_funcs->restore_user_od_settings(smu); in smu_restore_dpm_user_profile()
434 dev_err(smu->adev->dev, "Failed to upload customized OD settings\n"); in smu_restore_dpm_user_profile()
439 smu->user_dpm_profile.flags &= ~SMU_DPM_USER_PROFILE_RESTORE; in smu_restore_dpm_user_profile()
466 struct smu_context *smu = &adev->smu; in is_support_cclk_dpm() local
471 if (!smu_feature_is_enabled(smu, SMU_FEATURE_CCLK_DPM_BIT)) in is_support_cclk_dpm()
481 struct smu_context *smu = handle; in smu_sys_get_pp_table() local
482 struct smu_table_context *smu_table = &smu->smu_table; in smu_sys_get_pp_table()
485 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_sys_get_pp_table()
491 mutex_lock(&smu->mutex); in smu_sys_get_pp_table()
500 mutex_unlock(&smu->mutex); in smu_sys_get_pp_table()
509 struct smu_context *smu = handle; in smu_sys_set_pp_table() local
510 struct smu_table_context *smu_table = &smu->smu_table; in smu_sys_set_pp_table()
514 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_sys_set_pp_table()
518 dev_err(smu->adev->dev, "pp table size not matched !\n"); in smu_sys_set_pp_table()
522 mutex_lock(&smu->mutex); in smu_sys_set_pp_table()
538 smu->uploading_custom_pp_table = true; in smu_sys_set_pp_table()
540 ret = smu_reset(smu); in smu_sys_set_pp_table()
542 dev_info(smu->adev->dev, "smu reset failed, ret = %d\n", ret); in smu_sys_set_pp_table()
544 smu->uploading_custom_pp_table = false; in smu_sys_set_pp_table()
547 mutex_unlock(&smu->mutex); in smu_sys_set_pp_table()
551 static int smu_get_driver_allowed_feature_mask(struct smu_context *smu) in smu_get_driver_allowed_feature_mask() argument
553 struct smu_feature *feature = &smu->smu_feature; in smu_get_driver_allowed_feature_mask()
559 ret = smu_get_allowed_feature_mask(smu, allowed_feature_mask, in smu_get_driver_allowed_feature_mask()
573 struct smu_context *smu = &adev->smu; in smu_set_funcs() local
576 smu->od_enabled = true; in smu_set_funcs()
582 navi10_set_ppt_funcs(smu); in smu_set_funcs()
586 arcturus_set_ppt_funcs(smu); in smu_set_funcs()
588 smu->od_enabled =false; in smu_set_funcs()
594 sienna_cichlid_set_ppt_funcs(smu); in smu_set_funcs()
597 aldebaran_set_ppt_funcs(smu); in smu_set_funcs()
599 smu->od_enabled = true; in smu_set_funcs()
602 renoir_set_ppt_funcs(smu); in smu_set_funcs()
605 vangogh_set_ppt_funcs(smu); in smu_set_funcs()
608 yellow_carp_set_ppt_funcs(smu); in smu_set_funcs()
611 cyan_skillfish_set_ppt_funcs(smu); in smu_set_funcs()
623 struct smu_context *smu = &adev->smu; in smu_early_init() local
625 smu->adev = adev; in smu_early_init()
626 smu->pm_enabled = !!amdgpu_dpm; in smu_early_init()
627 smu->is_apu = false; in smu_early_init()
628 mutex_init(&smu->mutex); in smu_early_init()
629 mutex_init(&smu->smu_baco.mutex); in smu_early_init()
630 smu->smu_baco.state = SMU_BACO_STATE_EXIT; in smu_early_init()
631 smu->smu_baco.platform_support = false; in smu_early_init()
632 smu->user_dpm_profile.fan_mode = -1; in smu_early_init()
634 adev->powerplay.pp_handle = smu; in smu_early_init()
640 static int smu_set_default_dpm_table(struct smu_context *smu) in smu_set_default_dpm_table() argument
642 struct smu_power_context *smu_power = &smu->smu_power; in smu_set_default_dpm_table()
647 if (!smu->ppt_funcs->set_default_dpm_table) in smu_set_default_dpm_table()
656 ret = smu_dpm_set_vcn_enable_locked(smu, true); in smu_set_default_dpm_table()
660 ret = smu_dpm_set_jpeg_enable_locked(smu, true); in smu_set_default_dpm_table()
664 ret = smu->ppt_funcs->set_default_dpm_table(smu); in smu_set_default_dpm_table()
666 dev_err(smu->adev->dev, in smu_set_default_dpm_table()
669 smu_dpm_set_jpeg_enable_locked(smu, !jpeg_gate); in smu_set_default_dpm_table()
671 smu_dpm_set_vcn_enable_locked(smu, !vcn_gate); in smu_set_default_dpm_table()
683 struct smu_context *smu = &adev->smu; in smu_late_init() local
686 smu_set_fine_grain_gfx_freq_parameters(smu); in smu_late_init()
688 if (!smu->pm_enabled) in smu_late_init()
691 ret = smu_post_init(smu); in smu_late_init()
693 dev_err(adev->dev, "Failed to post smu init!\n"); in smu_late_init()
700 if (!amdgpu_sriov_vf(adev) || smu->od_enabled) { in smu_late_init()
701 ret = smu_set_default_od_settings(smu); in smu_late_init()
708 ret = smu_populate_umd_state_clk(smu); in smu_late_init()
714 ret = smu_get_asic_power_limits(smu, in smu_late_init()
715 &smu->current_power_limit, in smu_late_init()
716 &smu->default_power_limit, in smu_late_init()
717 &smu->max_power_limit); in smu_late_init()
724 smu_get_unique_id(smu); in smu_late_init()
726 smu_get_fan_parameters(smu); in smu_late_init()
728 smu_handle_task(&adev->smu, in smu_late_init()
729 smu->smu_dpm.dpm_level, in smu_late_init()
733 smu_restore_dpm_user_profile(smu); in smu_late_init()
738 static int smu_init_fb_allocations(struct smu_context *smu) in smu_init_fb_allocations() argument
740 struct amdgpu_device *adev = smu->adev; in smu_init_fb_allocations()
741 struct smu_table_context *smu_table = &smu->smu_table; in smu_init_fb_allocations()
796 static int smu_fini_fb_allocations(struct smu_context *smu) in smu_fini_fb_allocations() argument
798 struct smu_table_context *smu_table = &smu->smu_table; in smu_fini_fb_allocations()
817 * @smu: amdgpu_device pointer
824 static int smu_alloc_memory_pool(struct smu_context *smu) in smu_alloc_memory_pool() argument
826 struct amdgpu_device *adev = smu->adev; in smu_alloc_memory_pool()
827 struct smu_table_context *smu_table = &smu->smu_table; in smu_alloc_memory_pool()
829 uint64_t pool_size = smu->pool_size; in smu_alloc_memory_pool()
861 static int smu_free_memory_pool(struct smu_context *smu) in smu_free_memory_pool() argument
863 struct smu_table_context *smu_table = &smu->smu_table; in smu_free_memory_pool()
878 static int smu_alloc_dummy_read_table(struct smu_context *smu) in smu_alloc_dummy_read_table() argument
880 struct smu_table_context *smu_table = &smu->smu_table; in smu_alloc_dummy_read_table()
883 struct amdgpu_device *adev = smu->adev; in smu_alloc_dummy_read_table()
903 static void smu_free_dummy_read_table(struct smu_context *smu) in smu_free_dummy_read_table() argument
905 struct smu_table_context *smu_table = &smu->smu_table; in smu_free_dummy_read_table()
917 static int smu_smc_table_sw_init(struct smu_context *smu) in smu_smc_table_sw_init() argument
925 ret = smu_init_smc_tables(smu); in smu_smc_table_sw_init()
927 dev_err(smu->adev->dev, "Failed to init smc tables!\n"); in smu_smc_table_sw_init()
935 ret = smu_init_power(smu); in smu_smc_table_sw_init()
937 dev_err(smu->adev->dev, "Failed to init smu_init_power!\n"); in smu_smc_table_sw_init()
944 ret = smu_init_fb_allocations(smu); in smu_smc_table_sw_init()
948 ret = smu_alloc_memory_pool(smu); in smu_smc_table_sw_init()
952 ret = smu_alloc_dummy_read_table(smu); in smu_smc_table_sw_init()
956 ret = smu_i2c_init(smu, &smu->adev->pm.smu_i2c); in smu_smc_table_sw_init()
963 static int smu_smc_table_sw_fini(struct smu_context *smu) in smu_smc_table_sw_fini() argument
967 smu_i2c_fini(smu, &smu->adev->pm.smu_i2c); in smu_smc_table_sw_fini()
969 smu_free_dummy_read_table(smu); in smu_smc_table_sw_fini()
971 ret = smu_free_memory_pool(smu); in smu_smc_table_sw_fini()
975 ret = smu_fini_fb_allocations(smu); in smu_smc_table_sw_fini()
979 ret = smu_fini_power(smu); in smu_smc_table_sw_fini()
981 dev_err(smu->adev->dev, "Failed to init smu_fini_power!\n"); in smu_smc_table_sw_fini()
985 ret = smu_fini_smc_tables(smu); in smu_smc_table_sw_fini()
987 dev_err(smu->adev->dev, "Failed to smu_fini_smc_tables!\n"); in smu_smc_table_sw_fini()
996 struct smu_context *smu = container_of(work, struct smu_context, in smu_throttling_logging_work_fn() local
999 smu_log_thermal_throttling(smu); in smu_throttling_logging_work_fn()
1004 struct smu_context *smu = container_of(work, struct smu_context, in smu_interrupt_work_fn() local
1007 mutex_lock(&smu->mutex); in smu_interrupt_work_fn()
1009 if (smu->ppt_funcs && smu->ppt_funcs->interrupt_work) in smu_interrupt_work_fn()
1010 smu->ppt_funcs->interrupt_work(smu); in smu_interrupt_work_fn()
1012 mutex_unlock(&smu->mutex); in smu_interrupt_work_fn()
1018 struct smu_context *smu = &adev->smu; in smu_sw_init() local
1021 smu->pool_size = adev->pm.smu_prv_buffer_size; in smu_sw_init()
1022 smu->smu_feature.feature_num = SMU_FEATURE_MAX; in smu_sw_init()
1023 mutex_init(&smu->smu_feature.mutex); in smu_sw_init()
1024 bitmap_zero(smu->smu_feature.supported, SMU_FEATURE_MAX); in smu_sw_init()
1025 bitmap_zero(smu->smu_feature.enabled, SMU_FEATURE_MAX); in smu_sw_init()
1026 bitmap_zero(smu->smu_feature.allowed, SMU_FEATURE_MAX); in smu_sw_init()
1028 mutex_init(&smu->sensor_lock); in smu_sw_init()
1029 mutex_init(&smu->metrics_lock); in smu_sw_init()
1030 mutex_init(&smu->message_lock); in smu_sw_init()
1032 INIT_WORK(&smu->throttling_logging_work, smu_throttling_logging_work_fn); in smu_sw_init()
1033 INIT_WORK(&smu->interrupt_work, smu_interrupt_work_fn); in smu_sw_init()
1034 atomic64_set(&smu->throttle_int_counter, 0); in smu_sw_init()
1035 smu->watermarks_bitmap = 0; in smu_sw_init()
1036 smu->power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; in smu_sw_init()
1037 smu->default_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; in smu_sw_init()
1039 atomic_set(&smu->smu_power.power_gate.vcn_gated, 1); in smu_sw_init()
1040 atomic_set(&smu->smu_power.power_gate.jpeg_gated, 1); in smu_sw_init()
1041 mutex_init(&smu->smu_power.power_gate.vcn_gate_lock); in smu_sw_init()
1042 mutex_init(&smu->smu_power.power_gate.jpeg_gate_lock); in smu_sw_init()
1044 smu->workload_mask = 1 << smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT]; in smu_sw_init()
1045 smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT] = 0; in smu_sw_init()
1046 smu->workload_prority[PP_SMC_POWER_PROFILE_FULLSCREEN3D] = 1; in smu_sw_init()
1047 smu->workload_prority[PP_SMC_POWER_PROFILE_POWERSAVING] = 2; in smu_sw_init()
1048 smu->workload_prority[PP_SMC_POWER_PROFILE_VIDEO] = 3; in smu_sw_init()
1049 smu->workload_prority[PP_SMC_POWER_PROFILE_VR] = 4; in smu_sw_init()
1050 smu->workload_prority[PP_SMC_POWER_PROFILE_COMPUTE] = 5; in smu_sw_init()
1051 smu->workload_prority[PP_SMC_POWER_PROFILE_CUSTOM] = 6; in smu_sw_init()
1053 smu->workload_setting[0] = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; in smu_sw_init()
1054 smu->workload_setting[1] = PP_SMC_POWER_PROFILE_FULLSCREEN3D; in smu_sw_init()
1055 smu->workload_setting[2] = PP_SMC_POWER_PROFILE_POWERSAVING; in smu_sw_init()
1056 smu->workload_setting[3] = PP_SMC_POWER_PROFILE_VIDEO; in smu_sw_init()
1057 smu->workload_setting[4] = PP_SMC_POWER_PROFILE_VR; in smu_sw_init()
1058 smu->workload_setting[5] = PP_SMC_POWER_PROFILE_COMPUTE; in smu_sw_init()
1059 smu->workload_setting[6] = PP_SMC_POWER_PROFILE_CUSTOM; in smu_sw_init()
1060 smu->display_config = &adev->pm.pm_display_cfg; in smu_sw_init()
1062 smu->smu_dpm.dpm_level = AMD_DPM_FORCED_LEVEL_AUTO; in smu_sw_init()
1063 smu->smu_dpm.requested_dpm_level = AMD_DPM_FORCED_LEVEL_AUTO; in smu_sw_init()
1065 ret = smu_init_microcode(smu); in smu_sw_init()
1067 dev_err(adev->dev, "Failed to load smu firmware!\n"); in smu_sw_init()
1071 ret = smu_smc_table_sw_init(smu); in smu_sw_init()
1077 ret = smu_register_irq_handler(smu); in smu_sw_init()
1084 if (!smu->ppt_funcs->get_fan_control_mode) in smu_sw_init()
1085 smu->adev->pm.no_fan = true; in smu_sw_init()
1093 struct smu_context *smu = &adev->smu; in smu_sw_fini() local
1096 ret = smu_smc_table_sw_fini(smu); in smu_sw_fini()
1102 smu_fini_microcode(smu); in smu_sw_fini()
1107 static int smu_get_thermal_temperature_range(struct smu_context *smu) in smu_get_thermal_temperature_range() argument
1109 struct amdgpu_device *adev = smu->adev; in smu_get_thermal_temperature_range()
1111 &smu->thermal_range; in smu_get_thermal_temperature_range()
1114 if (!smu->ppt_funcs->get_thermal_temperature_range) in smu_get_thermal_temperature_range()
1117 ret = smu->ppt_funcs->get_thermal_temperature_range(smu, range); in smu_get_thermal_temperature_range()
1134 static int smu_smc_hw_setup(struct smu_context *smu) in smu_smc_hw_setup() argument
1136 struct amdgpu_device *adev = smu->adev; in smu_smc_hw_setup()
1140 if (adev->in_suspend && smu_is_dpm_running(smu)) { in smu_smc_hw_setup()
1145 ret = smu_system_features_control(smu, true); in smu_smc_hw_setup()
1149 ret = smu_init_display_count(smu, 0); in smu_smc_hw_setup()
1155 ret = smu_set_driver_table_location(smu); in smu_smc_hw_setup()
1164 ret = smu_set_tool_table_location(smu); in smu_smc_hw_setup()
1174 ret = smu_notify_memory_pool_location(smu); in smu_smc_hw_setup()
1180 /* smu_dump_pptable(smu); */ in smu_smc_hw_setup()
1182 * Copy pptable bo in the vram to smc with SMU MSGs such as in smu_smc_hw_setup()
1185 ret = smu_write_pptable(smu); in smu_smc_hw_setup()
1192 ret = smu_run_btc(smu); in smu_smc_hw_setup()
1196 ret = smu_feature_set_allowed_mask(smu); in smu_smc_hw_setup()
1202 ret = smu_system_features_control(smu, true); in smu_smc_hw_setup()
1208 if (!smu_is_dpm_running(smu)) in smu_smc_hw_setup()
1236 ret = smu_update_pcie_parameters(smu, pcie_gen, pcie_width); in smu_smc_hw_setup()
1242 ret = smu_get_thermal_temperature_range(smu); in smu_smc_hw_setup()
1248 ret = smu_enable_thermal_alert(smu); in smu_smc_hw_setup()
1259 ret = smu_set_default_dpm_table(smu); in smu_smc_hw_setup()
1265 ret = smu_notify_display_change(smu); in smu_smc_hw_setup()
1273 ret = smu_set_min_dcef_deep_sleep(smu, in smu_smc_hw_setup()
1274 smu->smu_table.boot_values.dcefclk / 100); in smu_smc_hw_setup()
1281 static int smu_start_smc_engine(struct smu_context *smu) in smu_start_smc_engine() argument
1283 struct amdgpu_device *adev = smu->adev; in smu_start_smc_engine()
1288 if (smu->ppt_funcs->load_microcode) { in smu_start_smc_engine()
1289 ret = smu->ppt_funcs->load_microcode(smu); in smu_start_smc_engine()
1296 if (smu->ppt_funcs->check_fw_status) { in smu_start_smc_engine()
1297 ret = smu->ppt_funcs->check_fw_status(smu); in smu_start_smc_engine()
1308 ret = smu_check_fw_version(smu); in smu_start_smc_engine()
1319 struct smu_context *smu = &adev->smu; in smu_hw_init() local
1322 smu->pm_enabled = false; in smu_hw_init()
1326 ret = smu_start_smc_engine(smu); in smu_hw_init()
1332 if (smu->is_apu) { in smu_hw_init()
1333 smu_powergate_sdma(&adev->smu, false); in smu_hw_init()
1334 smu_dpm_set_vcn_enable(smu, true); in smu_hw_init()
1335 smu_dpm_set_jpeg_enable(smu, true); in smu_hw_init()
1336 smu_set_gfx_cgpg(&adev->smu, true); in smu_hw_init()
1339 if (!smu->pm_enabled) in smu_hw_init()
1343 ret = smu_get_vbios_bootup_values(smu); in smu_hw_init()
1349 ret = smu_setup_pptable(smu); in smu_hw_init()
1355 ret = smu_get_driver_allowed_feature_mask(smu); in smu_hw_init()
1359 ret = smu_smc_hw_setup(smu); in smu_hw_init()
1368 * 2. DAL settings come between .hw_init and .late_init of SMU. in smu_hw_init()
1372 ret = smu_init_max_sustainable_clocks(smu); in smu_hw_init()
1380 dev_info(adev->dev, "SMU is initialized successfully!\n"); in smu_hw_init()
1385 static int smu_disable_dpms(struct smu_context *smu) in smu_disable_dpms() argument
1387 struct amdgpu_device *adev = smu->adev; in smu_disable_dpms()
1389 bool use_baco = !smu->is_apu && in smu_disable_dpms()
1402 * - SMU firmware can handle the DPM reenablement in smu_disable_dpms()
1405 if (smu->uploading_custom_pp_table && in smu_disable_dpms()
1408 return smu_disable_all_features_with_exception(smu, in smu_disable_dpms()
1419 return smu_disable_all_features_with_exception(smu, in smu_disable_dpms()
1427 if (use_baco && smu_feature_is_enabled(smu, SMU_FEATURE_BACO_BIT)) { in smu_disable_dpms()
1428 ret = smu_disable_all_features_with_exception(smu, in smu_disable_dpms()
1432 dev_err(adev->dev, "Failed to disable smu features except BACO.\n"); in smu_disable_dpms()
1434 ret = smu_system_features_control(smu, false); in smu_disable_dpms()
1436 dev_err(adev->dev, "Failed to disable smu features.\n"); in smu_disable_dpms()
1446 static int smu_smc_hw_cleanup(struct smu_context *smu) in smu_smc_hw_cleanup() argument
1448 struct amdgpu_device *adev = smu->adev; in smu_smc_hw_cleanup()
1451 cancel_work_sync(&smu->throttling_logging_work); in smu_smc_hw_cleanup()
1452 cancel_work_sync(&smu->interrupt_work); in smu_smc_hw_cleanup()
1454 ret = smu_disable_thermal_alert(smu); in smu_smc_hw_cleanup()
1460 ret = smu_disable_dpms(smu); in smu_smc_hw_cleanup()
1472 struct smu_context *smu = &adev->smu; in smu_hw_fini() local
1477 if (smu->is_apu) { in smu_hw_fini()
1478 smu_powergate_sdma(&adev->smu, true); in smu_hw_fini()
1481 smu_dpm_set_vcn_enable(smu, false); in smu_hw_fini()
1482 smu_dpm_set_jpeg_enable(smu, false); in smu_hw_fini()
1487 if (!smu->pm_enabled) in smu_hw_fini()
1492 return smu_smc_hw_cleanup(smu); in smu_hw_fini()
1495 static int smu_reset(struct smu_context *smu) in smu_reset() argument
1497 struct amdgpu_device *adev = smu->adev; in smu_reset()
1500 amdgpu_gfx_off_ctrl(smu->adev, false); in smu_reset()
1514 amdgpu_gfx_off_ctrl(smu->adev, true); in smu_reset()
1522 struct smu_context *smu = &adev->smu; in smu_suspend() local
1528 if (!smu->pm_enabled) in smu_suspend()
1533 ret = smu_smc_hw_cleanup(smu); in smu_suspend()
1537 smu->watermarks_bitmap &= ~(WATERMARKS_LOADED); in smu_suspend()
1540 if (smu->is_apu && !adev->in_s0ix) in smu_suspend()
1541 smu_set_gfx_cgpg(&adev->smu, false); in smu_suspend()
1550 struct smu_context *smu = &adev->smu; in smu_resume() local
1555 if (!smu->pm_enabled) in smu_resume()
1558 dev_info(adev->dev, "SMU is resuming...\n"); in smu_resume()
1560 ret = smu_start_smc_engine(smu); in smu_resume()
1566 ret = smu_smc_hw_setup(smu); in smu_resume()
1572 if (smu->is_apu) in smu_resume()
1573 smu_set_gfx_cgpg(&adev->smu, true); in smu_resume()
1575 smu->disable_uclk_switch = 0; in smu_resume()
1579 dev_info(adev->dev, "SMU is resumed successfully!\n"); in smu_resume()
1587 struct smu_context *smu = handle; in smu_display_configuration_change() local
1591 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_display_configuration_change()
1597 mutex_lock(&smu->mutex); in smu_display_configuration_change()
1599 smu_set_min_dcef_deep_sleep(smu, in smu_display_configuration_change()
1607 mutex_unlock(&smu->mutex); in smu_display_configuration_change()
1632 struct smu_context *smu = (struct smu_context*)(handle); in smu_enable_umd_pstate() local
1633 struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); in smu_enable_umd_pstate()
1635 if (!smu->is_apu && !smu_dpm_ctx->dpm_context) in smu_enable_umd_pstate()
1643 smu_gpo_control(smu, false); in smu_enable_umd_pstate()
1644 amdgpu_device_ip_set_powergating_state(smu->adev, in smu_enable_umd_pstate()
1647 amdgpu_device_ip_set_clockgating_state(smu->adev, in smu_enable_umd_pstate()
1650 smu_gfx_ulv_control(smu, false); in smu_enable_umd_pstate()
1651 smu_deep_sleep_control(smu, false); in smu_enable_umd_pstate()
1652 amdgpu_asic_update_umd_stable_pstate(smu->adev, true); in smu_enable_umd_pstate()
1660 amdgpu_asic_update_umd_stable_pstate(smu->adev, false); in smu_enable_umd_pstate()
1661 smu_deep_sleep_control(smu, true); in smu_enable_umd_pstate()
1662 smu_gfx_ulv_control(smu, true); in smu_enable_umd_pstate()
1663 amdgpu_device_ip_set_clockgating_state(smu->adev, in smu_enable_umd_pstate()
1666 amdgpu_device_ip_set_powergating_state(smu->adev, in smu_enable_umd_pstate()
1669 smu_gpo_control(smu, true); in smu_enable_umd_pstate()
1676 static int smu_bump_power_profile_mode(struct smu_context *smu, in smu_bump_power_profile_mode() argument
1682 if (smu->ppt_funcs->set_power_profile_mode) in smu_bump_power_profile_mode()
1683 ret = smu->ppt_funcs->set_power_profile_mode(smu, param, param_size); in smu_bump_power_profile_mode()
1688 static int smu_adjust_power_state_dynamic(struct smu_context *smu, in smu_adjust_power_state_dynamic() argument
1695 struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); in smu_adjust_power_state_dynamic()
1698 ret = smu_display_config_changed(smu); in smu_adjust_power_state_dynamic()
1700 dev_err(smu->adev->dev, "Failed to change display config!"); in smu_adjust_power_state_dynamic()
1705 ret = smu_apply_clocks_adjust_rules(smu); in smu_adjust_power_state_dynamic()
1707 dev_err(smu->adev->dev, "Failed to apply clocks adjust rules!"); in smu_adjust_power_state_dynamic()
1712 ret = smu_notify_smc_display_config(smu); in smu_adjust_power_state_dynamic()
1714 dev_err(smu->adev->dev, "Failed to notify smc display config!"); in smu_adjust_power_state_dynamic()
1720 ret = smu_asic_set_performance_level(smu, level); in smu_adjust_power_state_dynamic()
1722 dev_err(smu->adev->dev, "Failed to set performance level!"); in smu_adjust_power_state_dynamic()
1732 index = fls(smu->workload_mask); in smu_adjust_power_state_dynamic()
1734 workload = smu->workload_setting[index]; in smu_adjust_power_state_dynamic()
1736 if (smu->power_profile_mode != workload) in smu_adjust_power_state_dynamic()
1737 smu_bump_power_profile_mode(smu, &workload, 0); in smu_adjust_power_state_dynamic()
1743 static int smu_handle_task(struct smu_context *smu, in smu_handle_task() argument
1750 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_handle_task()
1754 mutex_lock(&smu->mutex); in smu_handle_task()
1758 ret = smu_pre_display_config_changed(smu); in smu_handle_task()
1761 ret = smu_adjust_power_state_dynamic(smu, level, false); in smu_handle_task()
1765 ret = smu_adjust_power_state_dynamic(smu, level, true); in smu_handle_task()
1773 mutex_unlock(&smu->mutex); in smu_handle_task()
1782 struct smu_context *smu = handle; in smu_handle_dpm_task() local
1783 struct smu_dpm_context *smu_dpm = &smu->smu_dpm; in smu_handle_dpm_task()
1785 return smu_handle_task(smu, smu_dpm->dpm_level, task_id, true); in smu_handle_dpm_task()
1793 struct smu_context *smu = handle; in smu_switch_power_profile() local
1794 struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); in smu_switch_power_profile()
1798 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_switch_power_profile()
1804 mutex_lock(&smu->mutex); in smu_switch_power_profile()
1807 smu->workload_mask &= ~(1 << smu->workload_prority[type]); in smu_switch_power_profile()
1808 index = fls(smu->workload_mask); in smu_switch_power_profile()
1810 workload = smu->workload_setting[index]; in smu_switch_power_profile()
1812 smu->workload_mask |= (1 << smu->workload_prority[type]); in smu_switch_power_profile()
1813 index = fls(smu->workload_mask); in smu_switch_power_profile()
1815 workload = smu->workload_setting[index]; in smu_switch_power_profile()
1820 smu_bump_power_profile_mode(smu, &workload, 0); in smu_switch_power_profile()
1822 mutex_unlock(&smu->mutex); in smu_switch_power_profile()
1829 struct smu_context *smu = handle; in smu_get_performance_level() local
1830 struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); in smu_get_performance_level()
1833 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_performance_level()
1836 if (!smu->is_apu && !smu_dpm_ctx->dpm_context) in smu_get_performance_level()
1839 mutex_lock(&(smu->mutex)); in smu_get_performance_level()
1841 mutex_unlock(&(smu->mutex)); in smu_get_performance_level()
1849 struct smu_context *smu = handle; in smu_force_performance_level() local
1850 struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); in smu_force_performance_level()
1853 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_force_performance_level()
1856 if (!smu->is_apu && !smu_dpm_ctx->dpm_context) in smu_force_performance_level()
1859 mutex_lock(&smu->mutex); in smu_force_performance_level()
1861 ret = smu_enable_umd_pstate(smu, &level); in smu_force_performance_level()
1863 mutex_unlock(&smu->mutex); in smu_force_performance_level()
1867 ret = smu_handle_task(smu, level, in smu_force_performance_level()
1871 mutex_unlock(&smu->mutex); in smu_force_performance_level()
1875 memset(smu->user_dpm_profile.clk_mask, 0, sizeof(smu->user_dpm_profile.clk_mask)); in smu_force_performance_level()
1876 smu->user_dpm_profile.clk_dependency = 0; in smu_force_performance_level()
1884 struct smu_context *smu = handle; in smu_set_display_count() local
1887 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_display_count()
1890 mutex_lock(&smu->mutex); in smu_set_display_count()
1891 ret = smu_init_display_count(smu, count); in smu_set_display_count()
1892 mutex_unlock(&smu->mutex); in smu_set_display_count()
1897 static int smu_force_smuclk_levels(struct smu_context *smu, in smu_force_smuclk_levels() argument
1901 struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); in smu_force_smuclk_levels()
1904 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_force_smuclk_levels()
1908 dev_dbg(smu->adev->dev, "force clock level is for dpm manual mode only.\n"); in smu_force_smuclk_levels()
1912 mutex_lock(&smu->mutex); in smu_force_smuclk_levels()
1914 if (smu->ppt_funcs && smu->ppt_funcs->force_clk_levels) { in smu_force_smuclk_levels()
1915 ret = smu->ppt_funcs->force_clk_levels(smu, clk_type, mask); in smu_force_smuclk_levels()
1916 if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { in smu_force_smuclk_levels()
1917 smu->user_dpm_profile.clk_mask[clk_type] = mask; in smu_force_smuclk_levels()
1918 smu_set_user_clk_dependencies(smu, clk_type); in smu_force_smuclk_levels()
1922 mutex_unlock(&smu->mutex); in smu_force_smuclk_levels()
1931 struct smu_context *smu = handle; in smu_force_ppclk_levels() local
1963 return smu_force_smuclk_levels(smu, clk_type, mask); in smu_force_ppclk_levels()
1968 * flag will be cleared. So that those SMU services which
1976 struct smu_context *smu = handle; in smu_set_mp1_state() local
1979 if (!smu->pm_enabled) in smu_set_mp1_state()
1982 mutex_lock(&smu->mutex); in smu_set_mp1_state()
1984 if (smu->ppt_funcs && in smu_set_mp1_state()
1985 smu->ppt_funcs->set_mp1_state) in smu_set_mp1_state()
1986 ret = smu->ppt_funcs->set_mp1_state(smu, mp1_state); in smu_set_mp1_state()
1988 mutex_unlock(&smu->mutex); in smu_set_mp1_state()
1996 struct smu_context *smu = handle; in smu_set_df_cstate() local
1999 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_df_cstate()
2002 if (!smu->ppt_funcs || !smu->ppt_funcs->set_df_cstate) in smu_set_df_cstate()
2005 mutex_lock(&smu->mutex); in smu_set_df_cstate()
2007 ret = smu->ppt_funcs->set_df_cstate(smu, state); in smu_set_df_cstate()
2009 dev_err(smu->adev->dev, "[SetDfCstate] failed!\n"); in smu_set_df_cstate()
2011 mutex_unlock(&smu->mutex); in smu_set_df_cstate()
2016 int smu_allow_xgmi_power_down(struct smu_context *smu, bool en) in smu_allow_xgmi_power_down() argument
2020 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_allow_xgmi_power_down()
2023 if (!smu->ppt_funcs || !smu->ppt_funcs->allow_xgmi_power_down) in smu_allow_xgmi_power_down()
2026 mutex_lock(&smu->mutex); in smu_allow_xgmi_power_down()
2028 ret = smu->ppt_funcs->allow_xgmi_power_down(smu, en); in smu_allow_xgmi_power_down()
2030 dev_err(smu->adev->dev, "[AllowXgmiPowerDown] failed!\n"); in smu_allow_xgmi_power_down()
2032 mutex_unlock(&smu->mutex); in smu_allow_xgmi_power_down()
2037 int smu_write_watermarks_table(struct smu_context *smu) in smu_write_watermarks_table() argument
2041 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_write_watermarks_table()
2044 mutex_lock(&smu->mutex); in smu_write_watermarks_table()
2046 ret = smu_set_watermarks_table(smu, NULL); in smu_write_watermarks_table()
2048 mutex_unlock(&smu->mutex); in smu_write_watermarks_table()
2056 struct smu_context *smu = handle; in smu_set_watermarks_for_clock_ranges() local
2059 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_watermarks_for_clock_ranges()
2062 if (smu->disable_watermark) in smu_set_watermarks_for_clock_ranges()
2065 mutex_lock(&smu->mutex); in smu_set_watermarks_for_clock_ranges()
2067 ret = smu_set_watermarks_table(smu, clock_ranges); in smu_set_watermarks_for_clock_ranges()
2069 mutex_unlock(&smu->mutex); in smu_set_watermarks_for_clock_ranges()
2074 int smu_set_ac_dc(struct smu_context *smu) in smu_set_ac_dc() argument
2078 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_ac_dc()
2082 if (smu->dc_controlled_by_gpio) in smu_set_ac_dc()
2085 mutex_lock(&smu->mutex); in smu_set_ac_dc()
2086 ret = smu_set_power_source(smu, in smu_set_ac_dc()
2087 smu->adev->pm.ac_power ? SMU_POWER_SOURCE_AC : in smu_set_ac_dc()
2090 dev_err(smu->adev->dev, "Failed to switch to %s mode!\n", in smu_set_ac_dc()
2091 smu->adev->pm.ac_power ? "AC" : "DC"); in smu_set_ac_dc()
2092 mutex_unlock(&smu->mutex); in smu_set_ac_dc()
2098 .name = "smu",
2145 struct smu_context *smu = handle; in smu_load_microcode() local
2146 struct amdgpu_device *adev = smu->adev; in smu_load_microcode()
2149 if (!smu->pm_enabled) in smu_load_microcode()
2156 if (smu->ppt_funcs->load_microcode) { in smu_load_microcode()
2157 ret = smu->ppt_funcs->load_microcode(smu); in smu_load_microcode()
2164 if (smu->ppt_funcs->check_fw_status) { in smu_load_microcode()
2165 ret = smu->ppt_funcs->check_fw_status(smu); in smu_load_microcode()
2175 static int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled) in smu_set_gfx_cgpg() argument
2179 mutex_lock(&smu->mutex); in smu_set_gfx_cgpg()
2181 if (smu->ppt_funcs->set_gfx_cgpg) in smu_set_gfx_cgpg()
2182 ret = smu->ppt_funcs->set_gfx_cgpg(smu, enabled); in smu_set_gfx_cgpg()
2184 mutex_unlock(&smu->mutex); in smu_set_gfx_cgpg()
2191 struct smu_context *smu = handle; in smu_set_fan_speed_rpm() local
2194 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_fan_speed_rpm()
2197 mutex_lock(&smu->mutex); in smu_set_fan_speed_rpm()
2199 if (smu->ppt_funcs->set_fan_speed_rpm) { in smu_set_fan_speed_rpm()
2200 ret = smu->ppt_funcs->set_fan_speed_rpm(smu, speed); in smu_set_fan_speed_rpm()
2201 if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { in smu_set_fan_speed_rpm()
2202 smu->user_dpm_profile.flags |= SMU_CUSTOM_FAN_SPEED_RPM; in smu_set_fan_speed_rpm()
2203 smu->user_dpm_profile.fan_speed_rpm = speed; in smu_set_fan_speed_rpm()
2206 smu->user_dpm_profile.flags &= ~SMU_CUSTOM_FAN_SPEED_PWM; in smu_set_fan_speed_rpm()
2207 smu->user_dpm_profile.fan_speed_pwm = 0; in smu_set_fan_speed_rpm()
2211 mutex_unlock(&smu->mutex); in smu_set_fan_speed_rpm()
2217 * smu_get_power_limit - Request one of the SMU Power Limits
2219 * @handle: pointer to smu context
2231 struct smu_context *smu = handle; in smu_get_power_limit() local
2236 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_power_limit()
2267 mutex_lock(&smu->mutex); in smu_get_power_limit()
2270 if (smu->ppt_funcs->get_ppt_limit) in smu_get_power_limit()
2271 ret = smu->ppt_funcs->get_ppt_limit(smu, limit, limit_type, limit_level); in smu_get_power_limit()
2275 if ((smu->adev->asic_type == CHIP_ALDEBARAN) || in smu_get_power_limit()
2276 (smu->adev->asic_type == CHIP_SIENNA_CICHLID) || in smu_get_power_limit()
2277 (smu->adev->asic_type == CHIP_NAVY_FLOUNDER) || in smu_get_power_limit()
2278 (smu->adev->asic_type == CHIP_DIMGREY_CAVEFISH) || in smu_get_power_limit()
2279 (smu->adev->asic_type == CHIP_BEIGE_GOBY)) in smu_get_power_limit()
2280 ret = smu_get_asic_power_limits(smu, in smu_get_power_limit()
2281 &smu->current_power_limit, in smu_get_power_limit()
2284 *limit = smu->current_power_limit; in smu_get_power_limit()
2287 *limit = smu->default_power_limit; in smu_get_power_limit()
2290 *limit = smu->max_power_limit; in smu_get_power_limit()
2297 mutex_unlock(&smu->mutex); in smu_get_power_limit()
2304 struct smu_context *smu = handle; in smu_set_power_limit() local
2308 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_power_limit()
2311 mutex_lock(&smu->mutex); in smu_set_power_limit()
2314 if (smu->ppt_funcs->set_power_limit) { in smu_set_power_limit()
2315 ret = smu->ppt_funcs->set_power_limit(smu, limit); in smu_set_power_limit()
2319 if (limit > smu->max_power_limit) { in smu_set_power_limit()
2320 dev_err(smu->adev->dev, in smu_set_power_limit()
2322 limit, smu->max_power_limit); in smu_set_power_limit()
2328 limit = smu->current_power_limit; in smu_set_power_limit()
2330 if (smu->ppt_funcs->set_power_limit) { in smu_set_power_limit()
2331 ret = smu->ppt_funcs->set_power_limit(smu, limit); in smu_set_power_limit()
2332 if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) in smu_set_power_limit()
2333 smu->user_dpm_profile.power_limit = limit; in smu_set_power_limit()
2337 mutex_unlock(&smu->mutex); in smu_set_power_limit()
2342 static int smu_print_smuclk_levels(struct smu_context *smu, enum smu_clk_type clk_type, char *buf) in smu_print_smuclk_levels() argument
2346 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_print_smuclk_levels()
2349 mutex_lock(&smu->mutex); in smu_print_smuclk_levels()
2351 if (smu->ppt_funcs->print_clk_levels) in smu_print_smuclk_levels()
2352 ret = smu->ppt_funcs->print_clk_levels(smu, clk_type, buf); in smu_print_smuclk_levels()
2354 mutex_unlock(&smu->mutex); in smu_print_smuclk_levels()
2363 struct smu_context *smu = handle; in smu_print_ppclk_levels() local
2399 return smu_print_smuclk_levels(smu, clk_type, buf); in smu_print_ppclk_levels()
2406 struct smu_context *smu = handle; in smu_od_edit_dpm_table() local
2409 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_od_edit_dpm_table()
2412 mutex_lock(&smu->mutex); in smu_od_edit_dpm_table()
2414 if (smu->ppt_funcs->od_edit_dpm_table) { in smu_od_edit_dpm_table()
2415 ret = smu->ppt_funcs->od_edit_dpm_table(smu, type, input, size); in smu_od_edit_dpm_table()
2418 mutex_unlock(&smu->mutex); in smu_od_edit_dpm_table()
2428 struct smu_context *smu = handle; in smu_read_sensor() local
2430 &smu->pstate_table; in smu_read_sensor()
2434 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_read_sensor()
2443 mutex_lock(&smu->mutex); in smu_read_sensor()
2445 if (smu->ppt_funcs->read_sensor) in smu_read_sensor()
2446 if (!smu->ppt_funcs->read_sensor(smu, sensor, data, size)) in smu_read_sensor()
2459 ret = smu_feature_get_enabled_mask(smu, (uint32_t *)data, 2); in smu_read_sensor()
2463 *(uint32_t *)data = smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UVD_BIT) ? 1 : 0; in smu_read_sensor()
2467 *(uint32_t *)data = smu_feature_is_enabled(smu, SMU_FEATURE_DPM_VCE_BIT) ? 1 : 0; in smu_read_sensor()
2471 *(uint32_t *)data = atomic_read(&smu->smu_power.power_gate.vcn_gated) ? 0: 1; in smu_read_sensor()
2485 mutex_unlock(&smu->mutex); in smu_read_sensor()
2495 struct smu_context *smu = handle; in smu_get_power_profile_mode() local
2498 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_power_profile_mode()
2501 mutex_lock(&smu->mutex); in smu_get_power_profile_mode()
2503 if (smu->ppt_funcs->get_power_profile_mode) in smu_get_power_profile_mode()
2504 ret = smu->ppt_funcs->get_power_profile_mode(smu, buf); in smu_get_power_profile_mode()
2506 mutex_unlock(&smu->mutex); in smu_get_power_profile_mode()
2515 struct smu_context *smu = handle; in smu_set_power_profile_mode() local
2518 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_power_profile_mode()
2521 mutex_lock(&smu->mutex); in smu_set_power_profile_mode()
2523 smu_bump_power_profile_mode(smu, param, param_size); in smu_set_power_profile_mode()
2525 mutex_unlock(&smu->mutex); in smu_set_power_profile_mode()
2533 struct smu_context *smu = handle; in smu_get_fan_control_mode() local
2536 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_fan_control_mode()
2539 mutex_lock(&smu->mutex); in smu_get_fan_control_mode()
2541 if (smu->ppt_funcs->get_fan_control_mode) in smu_get_fan_control_mode()
2542 ret = smu->ppt_funcs->get_fan_control_mode(smu); in smu_get_fan_control_mode()
2544 mutex_unlock(&smu->mutex); in smu_get_fan_control_mode()
2549 static int smu_set_fan_control_mode(struct smu_context *smu, int value) in smu_set_fan_control_mode() argument
2553 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_fan_control_mode()
2556 mutex_lock(&smu->mutex); in smu_set_fan_control_mode()
2558 if (smu->ppt_funcs->set_fan_control_mode) { in smu_set_fan_control_mode()
2559 ret = smu->ppt_funcs->set_fan_control_mode(smu, value); in smu_set_fan_control_mode()
2560 if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) in smu_set_fan_control_mode()
2561 smu->user_dpm_profile.fan_mode = value; in smu_set_fan_control_mode()
2564 mutex_unlock(&smu->mutex); in smu_set_fan_control_mode()
2568 !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { in smu_set_fan_control_mode()
2569 smu->user_dpm_profile.fan_speed_pwm = 0; in smu_set_fan_control_mode()
2570 smu->user_dpm_profile.fan_speed_rpm = 0; in smu_set_fan_control_mode()
2571 smu->user_dpm_profile.flags &= ~(SMU_CUSTOM_FAN_SPEED_RPM | SMU_CUSTOM_FAN_SPEED_PWM); in smu_set_fan_control_mode()
2579 struct smu_context *smu = handle; in smu_pp_set_fan_control_mode() local
2581 smu_set_fan_control_mode(smu, value); in smu_pp_set_fan_control_mode()
2587 struct smu_context *smu = handle; in smu_get_fan_speed_pwm() local
2590 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_fan_speed_pwm()
2593 mutex_lock(&smu->mutex); in smu_get_fan_speed_pwm()
2595 if (smu->ppt_funcs->get_fan_speed_pwm) in smu_get_fan_speed_pwm()
2596 ret = smu->ppt_funcs->get_fan_speed_pwm(smu, speed); in smu_get_fan_speed_pwm()
2598 mutex_unlock(&smu->mutex); in smu_get_fan_speed_pwm()
2605 struct smu_context *smu = handle; in smu_set_fan_speed_pwm() local
2608 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_fan_speed_pwm()
2611 mutex_lock(&smu->mutex); in smu_set_fan_speed_pwm()
2613 if (smu->ppt_funcs->set_fan_speed_pwm) { in smu_set_fan_speed_pwm()
2614 ret = smu->ppt_funcs->set_fan_speed_pwm(smu, speed); in smu_set_fan_speed_pwm()
2615 if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE)) { in smu_set_fan_speed_pwm()
2616 smu->user_dpm_profile.flags |= SMU_CUSTOM_FAN_SPEED_PWM; in smu_set_fan_speed_pwm()
2617 smu->user_dpm_profile.fan_speed_pwm = speed; in smu_set_fan_speed_pwm()
2620 smu->user_dpm_profile.flags &= ~SMU_CUSTOM_FAN_SPEED_RPM; in smu_set_fan_speed_pwm()
2621 smu->user_dpm_profile.fan_speed_rpm = 0; in smu_set_fan_speed_pwm()
2625 mutex_unlock(&smu->mutex); in smu_set_fan_speed_pwm()
2632 struct smu_context *smu = handle; in smu_get_fan_speed_rpm() local
2635 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_fan_speed_rpm()
2638 mutex_lock(&smu->mutex); in smu_get_fan_speed_rpm()
2640 if (smu->ppt_funcs->get_fan_speed_rpm) in smu_get_fan_speed_rpm()
2641 ret = smu->ppt_funcs->get_fan_speed_rpm(smu, speed); in smu_get_fan_speed_rpm()
2643 mutex_unlock(&smu->mutex); in smu_get_fan_speed_rpm()
2650 struct smu_context *smu = handle; in smu_set_deep_sleep_dcefclk() local
2653 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_deep_sleep_dcefclk()
2656 mutex_lock(&smu->mutex); in smu_set_deep_sleep_dcefclk()
2658 ret = smu_set_min_dcef_deep_sleep(smu, clk); in smu_set_deep_sleep_dcefclk()
2660 mutex_unlock(&smu->mutex); in smu_set_deep_sleep_dcefclk()
2669 struct smu_context *smu = handle; in smu_get_clock_by_type_with_latency() local
2673 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_clock_by_type_with_latency()
2676 mutex_lock(&smu->mutex); in smu_get_clock_by_type_with_latency()
2678 if (smu->ppt_funcs->get_clock_by_type_with_latency) { in smu_get_clock_by_type_with_latency()
2693 dev_err(smu->adev->dev, "Invalid clock type!\n"); in smu_get_clock_by_type_with_latency()
2694 mutex_unlock(&smu->mutex); in smu_get_clock_by_type_with_latency()
2698 ret = smu->ppt_funcs->get_clock_by_type_with_latency(smu, clk_type, clocks); in smu_get_clock_by_type_with_latency()
2701 mutex_unlock(&smu->mutex); in smu_get_clock_by_type_with_latency()
2709 struct smu_context *smu = handle; in smu_display_clock_voltage_request() local
2712 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_display_clock_voltage_request()
2715 mutex_lock(&smu->mutex); in smu_display_clock_voltage_request()
2717 if (smu->ppt_funcs->display_clock_voltage_request) in smu_display_clock_voltage_request()
2718 ret = smu->ppt_funcs->display_clock_voltage_request(smu, clock_req); in smu_display_clock_voltage_request()
2720 mutex_unlock(&smu->mutex); in smu_display_clock_voltage_request()
2729 struct smu_context *smu = handle; in smu_display_disable_memory_clock_switch() local
2732 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_display_disable_memory_clock_switch()
2735 mutex_lock(&smu->mutex); in smu_display_disable_memory_clock_switch()
2737 if (smu->ppt_funcs->display_disable_memory_clock_switch) in smu_display_disable_memory_clock_switch()
2738 ret = smu->ppt_funcs->display_disable_memory_clock_switch(smu, disable_memory_clock_switch); in smu_display_disable_memory_clock_switch()
2740 mutex_unlock(&smu->mutex); in smu_display_disable_memory_clock_switch()
2748 struct smu_context *smu = handle; in smu_set_xgmi_pstate() local
2751 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_set_xgmi_pstate()
2754 mutex_lock(&smu->mutex); in smu_set_xgmi_pstate()
2756 if (smu->ppt_funcs->set_xgmi_pstate) in smu_set_xgmi_pstate()
2757 ret = smu->ppt_funcs->set_xgmi_pstate(smu, pstate); in smu_set_xgmi_pstate()
2759 mutex_unlock(&smu->mutex); in smu_set_xgmi_pstate()
2762 dev_err(smu->adev->dev, "Failed to set XGMI pstate!\n"); in smu_set_xgmi_pstate()
2769 struct smu_context *smu = handle; in smu_get_baco_capability() local
2774 if (!smu->pm_enabled) in smu_get_baco_capability()
2777 mutex_lock(&smu->mutex); in smu_get_baco_capability()
2779 if (smu->ppt_funcs && smu->ppt_funcs->baco_is_support) in smu_get_baco_capability()
2780 *cap = smu->ppt_funcs->baco_is_support(smu); in smu_get_baco_capability()
2782 mutex_unlock(&smu->mutex); in smu_get_baco_capability()
2789 struct smu_context *smu = handle; in smu_baco_set_state() local
2792 if (!smu->pm_enabled) in smu_baco_set_state()
2796 mutex_lock(&smu->mutex); in smu_baco_set_state()
2798 if (smu->ppt_funcs->baco_exit) in smu_baco_set_state()
2799 ret = smu->ppt_funcs->baco_exit(smu); in smu_baco_set_state()
2801 mutex_unlock(&smu->mutex); in smu_baco_set_state()
2803 mutex_lock(&smu->mutex); in smu_baco_set_state()
2805 if (smu->ppt_funcs->baco_enter) in smu_baco_set_state()
2806 ret = smu->ppt_funcs->baco_enter(smu); in smu_baco_set_state()
2808 mutex_unlock(&smu->mutex); in smu_baco_set_state()
2815 dev_err(smu->adev->dev, "Failed to %s BACO state!\n", in smu_baco_set_state()
2821 bool smu_mode1_reset_is_support(struct smu_context *smu) in smu_mode1_reset_is_support() argument
2825 if (!smu->pm_enabled) in smu_mode1_reset_is_support()
2828 mutex_lock(&smu->mutex); in smu_mode1_reset_is_support()
2830 if (smu->ppt_funcs && smu->ppt_funcs->mode1_reset_is_support) in smu_mode1_reset_is_support()
2831 ret = smu->ppt_funcs->mode1_reset_is_support(smu); in smu_mode1_reset_is_support()
2833 mutex_unlock(&smu->mutex); in smu_mode1_reset_is_support()
2838 bool smu_mode2_reset_is_support(struct smu_context *smu) in smu_mode2_reset_is_support() argument
2842 if (!smu->pm_enabled) in smu_mode2_reset_is_support()
2845 mutex_lock(&smu->mutex); in smu_mode2_reset_is_support()
2847 if (smu->ppt_funcs && smu->ppt_funcs->mode2_reset_is_support) in smu_mode2_reset_is_support()
2848 ret = smu->ppt_funcs->mode2_reset_is_support(smu); in smu_mode2_reset_is_support()
2850 mutex_unlock(&smu->mutex); in smu_mode2_reset_is_support()
2855 int smu_mode1_reset(struct smu_context *smu) in smu_mode1_reset() argument
2859 if (!smu->pm_enabled) in smu_mode1_reset()
2862 mutex_lock(&smu->mutex); in smu_mode1_reset()
2864 if (smu->ppt_funcs->mode1_reset) in smu_mode1_reset()
2865 ret = smu->ppt_funcs->mode1_reset(smu); in smu_mode1_reset()
2867 mutex_unlock(&smu->mutex); in smu_mode1_reset()
2874 struct smu_context *smu = handle; in smu_mode2_reset() local
2877 if (!smu->pm_enabled) in smu_mode2_reset()
2880 mutex_lock(&smu->mutex); in smu_mode2_reset()
2882 if (smu->ppt_funcs->mode2_reset) in smu_mode2_reset()
2883 ret = smu->ppt_funcs->mode2_reset(smu); in smu_mode2_reset()
2885 mutex_unlock(&smu->mutex); in smu_mode2_reset()
2888 dev_err(smu->adev->dev, "Mode2 reset failed!\n"); in smu_mode2_reset()
2896 struct smu_context *smu = handle; in smu_get_max_sustainable_clocks_by_dc() local
2899 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_max_sustainable_clocks_by_dc()
2902 mutex_lock(&smu->mutex); in smu_get_max_sustainable_clocks_by_dc()
2904 if (smu->ppt_funcs->get_max_sustainable_clocks_by_dc) in smu_get_max_sustainable_clocks_by_dc()
2905 ret = smu->ppt_funcs->get_max_sustainable_clocks_by_dc(smu, max_clocks); in smu_get_max_sustainable_clocks_by_dc()
2907 mutex_unlock(&smu->mutex); in smu_get_max_sustainable_clocks_by_dc()
2916 struct smu_context *smu = handle; in smu_get_uclk_dpm_states() local
2919 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_uclk_dpm_states()
2922 mutex_lock(&smu->mutex); in smu_get_uclk_dpm_states()
2924 if (smu->ppt_funcs->get_uclk_dpm_states) in smu_get_uclk_dpm_states()
2925 ret = smu->ppt_funcs->get_uclk_dpm_states(smu, clock_values_in_khz, num_states); in smu_get_uclk_dpm_states()
2927 mutex_unlock(&smu->mutex); in smu_get_uclk_dpm_states()
2934 struct smu_context *smu = handle; in smu_get_current_power_state() local
2937 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_current_power_state()
2940 mutex_lock(&smu->mutex); in smu_get_current_power_state()
2942 if (smu->ppt_funcs->get_current_power_state) in smu_get_current_power_state()
2943 pm_state = smu->ppt_funcs->get_current_power_state(smu); in smu_get_current_power_state()
2945 mutex_unlock(&smu->mutex); in smu_get_current_power_state()
2953 struct smu_context *smu = handle; in smu_get_dpm_clock_table() local
2956 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_get_dpm_clock_table()
2959 mutex_lock(&smu->mutex); in smu_get_dpm_clock_table()
2961 if (smu->ppt_funcs->get_dpm_clock_table) in smu_get_dpm_clock_table()
2962 ret = smu->ppt_funcs->get_dpm_clock_table(smu, clock_table); in smu_get_dpm_clock_table()
2964 mutex_unlock(&smu->mutex); in smu_get_dpm_clock_table()
2971 struct smu_context *smu = handle; in smu_sys_get_gpu_metrics() local
2974 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_sys_get_gpu_metrics()
2977 if (!smu->ppt_funcs->get_gpu_metrics) in smu_sys_get_gpu_metrics()
2980 mutex_lock(&smu->mutex); in smu_sys_get_gpu_metrics()
2982 size = smu->ppt_funcs->get_gpu_metrics(smu, table); in smu_sys_get_gpu_metrics()
2984 mutex_unlock(&smu->mutex); in smu_sys_get_gpu_metrics()
2991 struct smu_context *smu = handle; in smu_enable_mgpu_fan_boost() local
2994 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) in smu_enable_mgpu_fan_boost()
2997 mutex_lock(&smu->mutex); in smu_enable_mgpu_fan_boost()
2999 if (smu->ppt_funcs->enable_mgpu_fan_boost) in smu_enable_mgpu_fan_boost()
3000 ret = smu->ppt_funcs->enable_mgpu_fan_boost(smu); in smu_enable_mgpu_fan_boost()
3002 mutex_unlock(&smu->mutex); in smu_enable_mgpu_fan_boost()
3010 struct smu_context *smu = handle; in smu_gfx_state_change_set() local
3013 mutex_lock(&smu->mutex); in smu_gfx_state_change_set()
3014 if (smu->ppt_funcs->gfx_state_change_set) in smu_gfx_state_change_set()
3015 ret = smu->ppt_funcs->gfx_state_change_set(smu, state); in smu_gfx_state_change_set()
3016 mutex_unlock(&smu->mutex); in smu_gfx_state_change_set()
3021 int smu_set_light_sbr(struct smu_context *smu, bool enable) in smu_set_light_sbr() argument
3025 mutex_lock(&smu->mutex); in smu_set_light_sbr()
3026 if (smu->ppt_funcs->set_light_sbr) in smu_set_light_sbr()
3027 ret = smu->ppt_funcs->set_light_sbr(smu, enable); in smu_set_light_sbr()
3028 mutex_unlock(&smu->mutex); in smu_set_light_sbr()
3035 struct smu_context *smu = handle; in smu_get_prv_buffer_details() local
3036 struct smu_table_context *smu_table = &smu->smu_table; in smu_get_prv_buffer_details()
3044 mutex_lock(&smu->mutex); in smu_get_prv_buffer_details()
3049 mutex_unlock(&smu->mutex); in smu_get_prv_buffer_details()
3112 struct smu_context *smu = &adev->smu; in smu_wait_for_event() local
3114 if (smu->ppt_funcs->wait_for_event) { in smu_wait_for_event()
3115 mutex_lock(&smu->mutex); in smu_wait_for_event()
3116 ret = smu->ppt_funcs->wait_for_event(smu, event, event_arg); in smu_wait_for_event()
3117 mutex_unlock(&smu->mutex); in smu_wait_for_event()