@@ -26,6 +26,13 @@ static int battery_current_limit_mA;
26
26
static int slider_stt_table ;
27
27
static int thermal_stt_table ;
28
28
static int safety_stt ;
29
+ static uint8_t events ;
30
+
31
+ enum clear_reasons {
32
+ PROCHOT_CLEAR_REASON_SUCCESS ,
33
+ PROCHOT_CLEAR_REASON_NOT_POWER ,
34
+ PROCHOT_CLEAR_REASON_FORCE ,
35
+ };
29
36
30
37
/* Update PL for thermal table pmf sheet : slider default */
31
38
static void update_os_power_slider (int mode , bool with_dc , int active_mpower )
@@ -889,13 +896,34 @@ static void update_safety_power_limit(int active_mpower)
889
896
}
890
897
}
891
898
892
- void clear_prochot ( void )
899
+ void update_pmf_events ( uint8_t pd_event , int enable )
893
900
{
894
- bool wait_pmf_update = !!(get_pd_progress_flags () & BIT (PD_PROGRESS_DISCONNECTED ));
901
+ static uint8_t pre_events ;
902
+
903
+ /* We should not need to assert the prochot before apu ready to update pmf */
904
+ if (!get_apu_ready ())
905
+ return ;
906
+
907
+ if (enable )
908
+ events |= pd_event ;
909
+ else
910
+ events &= ~pd_event ;
911
+
912
+ if (pre_events != events ) {
913
+ if (events )
914
+ throttle_ap (THROTTLE_ON , THROTTLE_HARD , THROTTLE_SRC_UPDATE_PMF );
915
+ else
916
+ throttle_ap (THROTTLE_OFF , THROTTLE_HARD , THROTTLE_SRC_UPDATE_PMF );
917
+
918
+ pre_events = events ;
919
+ }
920
+ }
895
921
896
- if (wait_pmf_update ) {
897
- throttle_ap (THROTTLE_OFF , THROTTLE_HARD , THROTTLE_SRC_UPDATE_PMF );
898
- update_pd_progress_flags (PD_PROGRESS_DISCONNECTED , 1 );
922
+ void clear_prochot (enum clear_reasons reason )
923
+ {
924
+ if (events ) {
925
+ CPRINTS ("release pmf prochot reason:%d" , reason );
926
+ update_pmf_events (events , 0 );
899
927
}
900
928
}
901
929
@@ -911,14 +939,15 @@ void update_soc_power_limit(bool force_update, bool force_no_adapter)
911
939
static int old_stt_table ;
912
940
int mode = * host_get_memmap (EC_MEMMAP_POWER_SLIDE );
913
941
int active_mpower = cypd_get_ac_power ();
914
- bool with_dc = ((battery_is_present () == BP_YES ) ? true : false);
942
+ bool with_dc = (((battery_is_present () == BP_YES ) &&
943
+ !battery_cutoff_in_progress () && !battery_is_cut_off ()) ? true : false);
915
944
int battery_percent = get_system_percentage () / 10 ;
916
945
917
946
if ((* host_get_memmap (EC_MEMMAP_STT_TABLE_NUMBER )) == 0 )
918
947
old_stt_table = 0 ;
919
948
920
949
if (!chipset_in_state (CHIPSET_STATE_ON ) || !get_apu_ready ()) {
921
- clear_prochot ();
950
+ clear_prochot (PROCHOT_CLEAR_REASON_NOT_POWER );
922
951
return ;
923
952
}
924
953
@@ -978,26 +1007,31 @@ void update_soc_power_limit(bool force_update, bool force_no_adapter)
978
1007
|| power_limit [target_func [TYPE_P3T ]].mwatt [TYPE_P3T ] != old_p3t_limit
979
1008
|| (power_limit [target_func [TYPE_APU_ONLY_SPPT ]].mwatt [TYPE_APU_ONLY_SPPT ]
980
1009
!= old_ao_sppt )
981
- || set_pl_limit || force_update ) {
1010
+ || set_pl_limit || force_update || events ) {
982
1011
/* only set PL when it is changed */
983
1012
old_sustain_power_limit = power_limit [target_func [TYPE_SPL ]].mwatt [TYPE_SPL ];
984
1013
old_slow_ppt_limit = power_limit [target_func [TYPE_SPPT ]].mwatt [TYPE_SPPT ];
985
1014
old_fast_ppt_limit = power_limit [target_func [TYPE_FPPT ]].mwatt [TYPE_FPPT ];
986
1015
old_p3t_limit = power_limit [target_func [TYPE_P3T ]].mwatt [TYPE_P3T ];
987
1016
988
- CPRINTF ("Change SOC Power Limit: SPL %dmW, sPPT %dmW, fPPT %dmW, p3T %dmW, " ,
989
- old_sustain_power_limit , old_slow_ppt_limit ,
990
- old_fast_ppt_limit , old_p3t_limit );
991
1017
set_pl_limit = set_pl_limits (old_sustain_power_limit , old_fast_ppt_limit ,
992
1018
old_slow_ppt_limit , old_p3t_limit );
993
- old_ao_sppt =
1019
+
1020
+ if (!set_pl_limit ) {
1021
+ old_ao_sppt =
994
1022
power_limit [target_func [TYPE_APU_ONLY_SPPT ]].mwatt [TYPE_APU_ONLY_SPPT ];
995
- CPRINTF ("ao_sppt %dmW\n" , old_ao_sppt );
996
- if (!set_pl_limit )
997
1023
set_pl_limit = update_apu_only_sppt_limit (old_ao_sppt );
998
- }
1024
+ }
999
1025
1000
- clear_prochot ();
1026
+ if (!set_pl_limit ) {
1027
+ /* Update PMF success, print the setting and de-asssert the prochot */
1028
+ CPRINTS ("PMF: SPL %dmW, sPPT %dmW, fPPT %dmW, p3T %dmW, ao_sppt %dmW" ,
1029
+ old_sustain_power_limit , old_slow_ppt_limit ,
1030
+ old_fast_ppt_limit , old_p3t_limit , old_ao_sppt );
1031
+
1032
+ clear_prochot (PROCHOT_CLEAR_REASON_SUCCESS );
1033
+ }
1034
+ }
1001
1035
}
1002
1036
1003
1037
static void initial_soc_power_limit (void )
0 commit comments