@@ -114,34 +114,70 @@ struct RULER_ST Ruler = {
114114 Ruler.TopOf = (struct TOPOF) { .Top = _cpu , .Boost = _boost} \
115115)
116116
117+ void LowestOfRuler (unsigned int cpu , enum RATIO_BOOST rb , unsigned int * lowest )
118+ {
119+ if (RO (Shm )-> Cpu [cpu ].Boost [rb ] < RO (Shm )-> Cpu [Ruler .Top [rb ]].Boost [rb ])
120+ {
121+ Ruler .Top [rb ] = cpu ;
122+ }
123+ if (RO (Shm )-> Cpu [cpu ].Boost [rb ] < (* lowest ))
124+ {
125+ (* lowest ) = RO (Shm )-> Cpu [cpu ].Boost [rb ];
126+ SetTopOfRuler (Ruler .Top [rb ], rb );
127+ }
128+ }
129+
130+ void HighestOfRuler (unsigned int cpu , enum RATIO_BOOST rb ,unsigned int * highest )
131+ {
132+ if (RO (Shm )-> Cpu [cpu ].Boost [rb ] > RO (Shm )-> Cpu [Ruler .Top [rb ]].Boost [rb ])
133+ {
134+ Ruler .Top [rb ] = cpu ;
135+ }
136+ if (RO (Shm )-> Cpu [cpu ].Boost [rb ] > (* highest ))
137+ {
138+ (* highest ) = RO (Shm )-> Cpu [cpu ].Boost [rb ];
139+ SetTopOfRuler (Ruler .Top [rb ], rb );
140+ }
141+ }
142+
117143void SetTopOftheTop ( unsigned int cpu , enum RATIO_BOOST rb ,
118144 unsigned int * lowest , unsigned int * highest )
119145{
120- switch (rb ) {
121- case BOOST (HWP_MIN ):
122- case BOOST (MIN ):
123- if (RO (Shm )-> Cpu [cpu ].Boost [rb ] < RO (Shm )-> Cpu [ Ruler .Top [rb ] ].Boost [rb ])
124- {
125- Ruler .Top [rb ] = cpu ;
126- }
127- if (RO (Shm )-> Cpu [cpu ].Boost [rb ] < (* lowest ))
128- {
129- (* lowest ) = RO (Shm )-> Cpu [cpu ].Boost [rb ];
130- SetTopOfRuler (Ruler .Top [rb ], rb );
131- }
132- break ;
133- default :
134- if (RO (Shm )-> Cpu [cpu ].Boost [rb ] > RO (Shm )-> Cpu [ Ruler .Top [rb ] ].Boost [rb ])
135- {
136- Ruler .Top [rb ] = cpu ;
137- }
138- if (RO (Shm )-> Cpu [cpu ].Boost [rb ] > (* highest ))
139- {
140- (* highest ) = RO (Shm )-> Cpu [cpu ].Boost [rb ];
141- SetTopOfRuler (Ruler .Top [rb ], rb );
142- }
143- break ;
144- }
146+ switch (rb ) {
147+ case BOOST (HWP_MIN ):
148+ if ((RO (Shm )-> Proc .Features .HWP_Enable == 1 )
149+ || (RO (Shm )-> Proc .Features .ACPI_CPPC == 1 ))
150+ {
151+ LowestOfRuler (cpu , rb , lowest );
152+ }
153+ break ;
154+ case BOOST (MIN ):
155+ LowestOfRuler (cpu , rb , lowest );
156+ break ;
157+ case BOOST (TGT ):
158+ if ((RO (Shm )-> Proc .Features .HWP_Enable == 0 )
159+ && (RO (Shm )-> Proc .Features .ACPI_CPPC == 0 ))
160+ {
161+ HighestOfRuler (cpu , rb , highest );
162+ }
163+ break ;
164+ case BOOST (HWP_MAX ) ... BOOST (HWP_TGT ):
165+ if ((RO (Shm )-> Proc .Features .HWP_Enable == 1 )
166+ || (RO (Shm )-> Proc .Features .ACPI_CPPC == 1 ))
167+ {
168+ HighestOfRuler (cpu , rb , highest );
169+ }
170+ break ;
171+ case BOOST (18 C ) ... BOOST (1 C ):
172+ if (RO (Shm )-> Proc .Features .Turbo_OPP == 1 )
173+ {
174+ HighestOfRuler (cpu , rb , highest );
175+ }
176+ break ;
177+ default :
178+ HighestOfRuler (cpu , rb , highest );
179+ break ;
180+ }
145181}
146182
147183void InsertionSortRuler (unsigned int base [],
@@ -170,11 +206,15 @@ void AggregateRatio(void)
170206 unsigned int , RO (Shm )-> Proc .Features .Factory .Clock .Hz
171207 );
172208 enum RATIO_BOOST lt , rt , min_boost = BOOST (MIN );
173- if ((RO (Shm )-> Cpu [RO (Shm )-> Proc .Service .Core ].Boost [BOOST (HWP_MIN )] > 0 )
174- && (RO (Shm )-> Cpu [RO (Shm )-> Proc .Service .Core ].Boost [BOOST (HWP_MIN )]
175- < RO (Shm )-> Cpu [RO (Shm )-> Proc .Service .Core ].Boost [BOOST (MIN )]))
176- {
177- min_boost = BOOST (HWP_MIN );
209+
210+ if ((RO (Shm )-> Proc .Features .HWP_Enable == 1 )
211+ || (RO (Shm )-> Proc .Features .ACPI_CPPC == 1 )) {
212+ if ((RO (Shm )-> Cpu [RO (Shm )-> Proc .Service .Core ].Boost [BOOST (HWP_MIN )] > 0 )
213+ && (RO (Shm )-> Cpu [RO (Shm )-> Proc .Service .Core ].Boost [BOOST (HWP_MIN )]
214+ < RO (Shm )-> Cpu [RO (Shm )-> Proc .Service .Core ].Boost [BOOST (MIN )]))
215+ {
216+ min_boost = BOOST (HWP_MIN );
217+ }
178218 }
179219 unsigned int cpu ,
180220 lowest = RO (Shm )-> Cpu [RO (Shm )-> Proc .Service .Core ].Boost [BOOST (MAX )],
0 commit comments