@@ -620,11 +620,12 @@ static uint32_t sienna_cichlid_get_throttler_status_locked(struct smu_context *s
620620static int sienna_cichlid_get_power_limit (struct smu_context * smu ,
621621 uint32_t * current_power_limit ,
622622 uint32_t * default_power_limit ,
623- uint32_t * max_power_limit )
623+ uint32_t * max_power_limit ,
624+ uint32_t * min_power_limit )
624625{
625626 struct smu_11_0_7_powerplay_table * powerplay_table =
626627 (struct smu_11_0_7_powerplay_table * )smu -> smu_table .power_play_table ;
627- uint32_t power_limit , od_percent ;
628+ uint32_t power_limit , od_percent_upper , od_percent_lower ;
628629 uint16_t * table_member ;
629630
630631 GET_PPTABLE_MEMBER (SocketPowerLimitAc , & table_member );
@@ -639,21 +640,26 @@ static int sienna_cichlid_get_power_limit(struct smu_context *smu,
639640 if (default_power_limit )
640641 * default_power_limit = power_limit ;
641642
642- if (max_power_limit ) {
643- if (smu -> od_enabled ) {
644- od_percent =
645- le32_to_cpu (powerplay_table -> overdrive_table .max [
646- SMU_11_0_7_ODSETTING_POWERPERCENTAGE ]);
643+ if (smu -> od_enabled ) {
644+ od_percent_upper = le32_to_cpu (powerplay_table -> overdrive_table .max [SMU_11_0_7_ODSETTING_POWERPERCENTAGE ]);
645+ od_percent_lower = le32_to_cpu (powerplay_table -> overdrive_table .min [SMU_11_0_7_ODSETTING_POWERPERCENTAGE ]);
646+ } else {
647+ od_percent_upper = 0 ;
648+ od_percent_lower = 100 ;
649+ }
647650
648- dev_dbg (smu -> adev -> dev , "ODSETTING_POWERPERCENTAGE: %d (default: %d)\n" ,
649- od_percent , power_limit );
651+ dev_dbg (smu -> adev -> dev , "od percent upper:%d, od percent lower: %d (default power : %d)\n" ,
652+ od_percent_upper , od_percent_lower , power_limit );
650653
651- power_limit *= (100 + od_percent );
652- power_limit /= 100 ;
653- }
654- * max_power_limit = power_limit ;
654+ if (max_power_limit ) {
655+ * max_power_limit = power_limit * (100 + od_percent_upper );
656+ * max_power_limit /= 100 ;
655657 }
656658
659+ if (min_power_limit ) {
660+ * min_power_limit = power_limit * (100 - od_percent_lower );
661+ * min_power_limit /= 100 ;
662+ }
657663 return 0 ;
658664}
659665
@@ -672,7 +678,7 @@ static void sienna_cichlid_get_smartshift_power_percentage(struct smu_context *s
672678 uint32_t cur_power_limit ;
673679
674680 if (metrics_v4 -> ApuSTAPMSmartShiftLimit != 0 ) {
675- sienna_cichlid_get_power_limit (smu , & cur_power_limit , NULL , NULL );
681+ sienna_cichlid_get_power_limit (smu , & cur_power_limit , NULL , NULL , NULL );
676682 apu_power_limit = metrics_v4 -> ApuSTAPMLimit ;
677683 dgpu_power_limit = cur_power_limit ;
678684 powerRatio = (((apu_power_limit +
0 commit comments