[AArch64] Refactoring the frequency ratios for decimal precision

This commit is contained in:
CyrIng
2024-07-07 01:06:00 +02:00
parent 2ded4e40fb
commit a69dff0048
7 changed files with 191 additions and 166 deletions

View File

@@ -211,7 +211,7 @@ typedef struct
CLOCK Clock; CLOCK Clock;
unsigned int Boost[BOOST(SIZE)]; COF_ST Boost[BOOST(SIZE)];
COF_UNION Ratio; COF_UNION Ratio;
} CORE_RO; } CORE_RO;

View File

@@ -110,7 +110,8 @@ struct RULER_ST Ruler = {
.Count = 0 .Count = 0
}; };
#define GetTopOfRuler() (RO(Shm)->Cpu[Ruler.TopOf.Top].Boost[Ruler.TopOf.Boost]) #define GetTopOfRuler() \
(RO(Shm)->Cpu[Ruler.TopOf.Top].Boost[Ruler.TopOf.Boost].Q)
#define SetTopOfRuler(_cpu, _boost) \ #define SetTopOfRuler(_cpu, _boost) \
( \ ( \
@@ -120,31 +121,31 @@ struct RULER_ST Ruler = {
void SetTopOftheTop( unsigned int cpu, enum RATIO_BOOST rb, void SetTopOftheTop( unsigned int cpu, enum RATIO_BOOST rb,
unsigned int *lowest, unsigned int *highest ) unsigned int *lowest, unsigned int *highest )
{ {
switch (rb) { switch (rb) {
case BOOST(HWP_MIN): case BOOST(HWP_MIN):
case BOOST(MIN): case BOOST(MIN):
if(RO(Shm)->Cpu[cpu].Boost[rb] < RO(Shm)->Cpu[ Ruler.Top[rb] ].Boost[rb]) if (RO(Shm)->Cpu[cpu].Boost[rb].Q < RO(Shm)->Cpu[Ruler.Top[rb]].Boost[rb].Q)
{ {
Ruler.Top[rb] = cpu; Ruler.Top[rb] = cpu;
}
if (RO(Shm)->Cpu[cpu].Boost[rb] < (*lowest))
{
(*lowest) = RO(Shm)->Cpu[cpu].Boost[rb];
SetTopOfRuler(Ruler.Top[rb], rb);
}
break;
default:
if(RO(Shm)->Cpu[cpu].Boost[rb] > RO(Shm)->Cpu[ Ruler.Top[rb] ].Boost[rb])
{
Ruler.Top[rb] = cpu;
}
if (RO(Shm)->Cpu[cpu].Boost[rb] > (*highest))
{
(*highest) = RO(Shm)->Cpu[cpu].Boost[rb];
SetTopOfRuler(Ruler.Top[rb], rb);
}
break;
} }
if (RO(Shm)->Cpu[cpu].Boost[rb].Q < (*lowest))
{
(*lowest) = RO(Shm)->Cpu[cpu].Boost[rb].Q;
SetTopOfRuler(Ruler.Top[rb], rb);
}
break;
default:
if (RO(Shm)->Cpu[cpu].Boost[rb].Q > RO(Shm)->Cpu[Ruler.Top[rb]].Boost[rb].Q)
{
Ruler.Top[rb] = cpu;
}
if (RO(Shm)->Cpu[cpu].Boost[rb].Q > (*highest))
{
(*highest) = RO(Shm)->Cpu[cpu].Boost[rb].Q;
SetTopOfRuler(Ruler.Top[rb], rb);
}
break;
}
} }
void InsertionSortRuler(unsigned int base[], void InsertionSortRuler(unsigned int base[],
@@ -173,15 +174,15 @@ void AggregateRatio(void)
unsigned int, RO(Shm)->Proc.Features.Factory.Clock.Hz unsigned int, RO(Shm)->Proc.Features.Factory.Clock.Hz
); );
enum RATIO_BOOST lt, rt, min_boost = BOOST(MIN); enum RATIO_BOOST lt, rt, min_boost = BOOST(MIN);
if ((RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[BOOST(HWP_MIN)] > 0) if ((RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[BOOST(HWP_MIN)].Q > 0)
&& (RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[BOOST(HWP_MIN)] && (RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[BOOST(HWP_MIN)].Q
< RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[BOOST(MIN)])) < RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[BOOST(MIN)].Q))
{ {
min_boost = BOOST(HWP_MIN); min_boost = BOOST(HWP_MIN);
} }
unsigned int cpu, unsigned int cpu,
lowest = RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[BOOST(MAX)], lowest = RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[BOOST(MAX)].Q,
highest = RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[min_boost]; highest = RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[min_boost].Q;
Ruler.Count = 0; Ruler.Count = 0;
SetTopOfRuler(RO(Shm)->Proc.Service.Core, BOOST(MIN)); SetTopOfRuler(RO(Shm)->Proc.Service.Core, BOOST(MIN));
@@ -197,20 +198,20 @@ void AggregateRatio(void)
&& (Ruler.Count < dimension); && (Ruler.Count < dimension);
cpu++) cpu++)
{ {
if ((RO(Shm)->Cpu[cpu].Boost[lt] > 0) if ((RO(Shm)->Cpu[cpu].Boost[lt].Q > 0)
&& (RO(Shm)->Cpu[cpu].Boost[lt] <= highestFactory) ) && (RO(Shm)->Cpu[cpu].Boost[lt].Q <= highestFactory) )
{ {
SetTopOftheTop(cpu, lt, &lowest, &highest); SetTopOftheTop(cpu, lt, &lowest, &highest);
for (rt = BOOST(MIN); rt < Ruler.Count; rt++) for (rt = BOOST(MIN); rt < Ruler.Count; rt++)
{ {
if (Ruler.Uniq[rt] == RO(Shm)->Cpu[cpu].Boost[lt]) if (Ruler.Uniq[rt] == RO(Shm)->Cpu[cpu].Boost[lt].Q)
{ {
break; break;
} }
} }
if (rt == Ruler.Count) { if (rt == Ruler.Count) {
Ruler.Uniq[Ruler.Count] = RO(Shm)->Cpu[cpu].Boost[lt]; Ruler.Uniq[Ruler.Count] = RO(Shm)->Cpu[cpu].Boost[lt].Q;
Ruler.Count++; Ruler.Count++;
} }
} }
@@ -237,7 +238,7 @@ void AggregateRatio(void)
{ {
const double median = (double) RO(Shm)->Cpu[ const double median = (double) RO(Shm)->Cpu[
Ruler.Top[BOOST(ACT)] Ruler.Top[BOOST(ACT)]
].Boost[BOOST(ACT)]; ].Boost[BOOST(ACT)].Q;
if ((median > Ruler.Minimum) && (median < Ruler.Maximum)) { if ((median > Ruler.Minimum) && (median < Ruler.Maximum)) {
Ruler.Median = median; Ruler.Median = median;
@@ -960,7 +961,7 @@ TGrid *PrintRatioFreq( Window *win,
struct FLIP_FLOP *CFlop, struct FLIP_FLOP *CFlop,
unsigned int zerobase, unsigned int zerobase,
char *pfx, char *pfx,
unsigned int *pRatio, COF_ST *pRatio,
int syc, int syc,
unsigned long long _key, unsigned long long _key,
CUINT width, CUINT width,
@@ -970,9 +971,9 @@ TGrid *PrintRatioFreq( Window *win,
{ {
TGrid *pGrid = NULL; TGrid *pGrid = NULL;
if ((( (*pRatio) > 0) && !zerobase) || (zerobase)) if ((( pRatio->Q > 0 || pRatio->R > 0 ) && !zerobase) || (zerobase))
{ {
double Freq_MHz = ABS_FREQ_MHz(double, (*pRatio), CFlop->Clock); double Freq_MHz=ABS_FREQ_MHz(double,pRatio->Q,CFlop->Clock) + pRatio->R;
if ((Freq_MHz > 0.0) && (Freq_MHz < CLOCK_MHz(double, UNIT_GHz(10.0)))) if ((Freq_MHz > 0.0) && (Freq_MHz < CLOCK_MHz(double, UNIT_GHz(10.0))))
{ {
@@ -982,7 +983,7 @@ TGrid *PrintRatioFreq( Window *win,
Freq_MHz, Freq_MHz,
20, hSpace, 20, hSpace,
SymbUnlock[syc][0], SymbUnlock[syc][0],
(*pRatio), pRatio->Q,
SymbUnlock[syc][1]); SymbUnlock[syc][1]);
} else { } else {
pGrid = PUT(_key, attrib, width, 0, pGrid = PUT(_key, attrib, width, 0,
@@ -991,7 +992,7 @@ TGrid *PrintRatioFreq( Window *win,
RSC(AUTOMATIC).CODE(), RSC(AUTOMATIC).CODE(),
20, hSpace, 20, hSpace,
SymbUnlock[syc][0], SymbUnlock[syc][0],
(*pRatio), pRatio->Q,
SymbUnlock[syc][1]); SymbUnlock[syc][1]);
} }
} }
@@ -1064,20 +1065,19 @@ void RefreshTopFreq(TGrid *grid, DATA_TYPE data[])
{ {
enum RATIO_BOOST boost = data[0].uint[0]; enum RATIO_BOOST boost = data[0].uint[0];
unsigned int top = Ruler.Top[boost]; unsigned int top = Ruler.Top[boost];
unsigned int ratio = RO(Shm)->Cpu[top].Boost[boost]; COF_ST COF = RO(Shm)->Cpu[top].Boost[boost];
struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[top].FlipFlop[ struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[top].FlipFlop[
!RO(Shm)->Cpu[top].Toggle !RO(Shm)->Cpu[top].Toggle
]; ];
RefreshItemFreq(grid, ratio, ABS_FREQ_MHz(double, ratio, CFlop->Clock)); RefreshItemFreq(grid, COF.Q,
ABS_FREQ_MHz(double, COF.Q, CFlop->Clock) + COF.R);
} }
void RefreshPrimaryFreq(TGrid *grid, DATA_TYPE data[]) void RefreshPrimaryFreq(TGrid *grid, DATA_TYPE data[])
{ {
enum RATIO_BOOST boost = data[0].uint[0]; enum RATIO_BOOST boost = data[0].uint[0];
unsigned int ratio = RO(Shm)->Cpu[ COF_ST COF = RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[boost];
RO(Shm)->Proc.Service.Core
].Boost[boost];
struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[ struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[
RO(Shm)->Proc.Service.Core RO(Shm)->Proc.Service.Core
@@ -1086,15 +1086,14 @@ void RefreshPrimaryFreq(TGrid *grid, DATA_TYPE data[])
RO(Shm)->Proc.Service.Core RO(Shm)->Proc.Service.Core
].Toggle ].Toggle
]; ];
RefreshItemFreq(grid, ratio, ABS_FREQ_MHz(double, ratio, CFlop->Clock)); RefreshItemFreq(grid, COF.Q,
ABS_FREQ_MHz(double, COF.Q, CFlop->Clock) + COF.R);
} }
void RefreshHybridFreq(TGrid *grid, DATA_TYPE data[]) void RefreshHybridFreq(TGrid *grid, DATA_TYPE data[])
{ {
enum RATIO_BOOST boost = data[0].uint[0]; enum RATIO_BOOST boost = data[0].uint[0];
unsigned int ratio = RO(Shm)->Cpu[ COF_ST COF = RO(Shm)->Cpu[RO(Shm)->Proc.Service.Hybrid].Boost[boost];
RO(Shm)->Proc.Service.Hybrid
].Boost[boost];
struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[ struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[
RO(Shm)->Proc.Service.Hybrid RO(Shm)->Proc.Service.Hybrid
@@ -1103,7 +1102,8 @@ void RefreshHybridFreq(TGrid *grid, DATA_TYPE data[])
RO(Shm)->Proc.Service.Hybrid RO(Shm)->Proc.Service.Hybrid
].Toggle ].Toggle
]; ];
RefreshItemFreq(grid, ratio, ABS_FREQ_MHz(double, ratio, CFlop->Clock)); RefreshItemFreq(grid, COF.Q,
ABS_FREQ_MHz(double, COF.Q, CFlop->Clock) + COF.R);
} }
void RefreshConfigTDP(TGrid *grid, DATA_TYPE data[]) void RefreshConfigTDP(TGrid *grid, DATA_TYPE data[])
@@ -7911,7 +7911,7 @@ unsigned int MultiplierIsRatio(unsigned int cpu, unsigned int multiplier)
case BOOST(TBH): case BOOST(TBH):
fallthrough; fallthrough;
default: default:
if (RO(Shm)->Cpu[cpu].Boost[boost] == multiplier) if (RO(Shm)->Cpu[cpu].Boost[boost].Q == multiplier)
{ {
return 1; return 1;
} }
@@ -8194,18 +8194,18 @@ void Pkg_Fmt_Turbo(ASCII *item, CLOCK *clock, unsigned int ratio, char *NC)
} }
void Pkg_Fmt_Freq( ASCII *item, ASCII *code, CLOCK *clock, void Pkg_Fmt_Freq( ASCII *item, ASCII *code, CLOCK *clock,
unsigned int ratio, unsigned char unlock ) COF_ST ratio, unsigned char unlock )
{ {
if (ratio == 0) { if (ratio.Q == 0) {
StrFormat(item, RSZ(CREATE_SELECT_FREQ_OFFLINE)+10+1, StrFormat(item, RSZ(CREATE_SELECT_FREQ_OFFLINE)+10+1,
"%s" " %s %c%4u %c ", "%s" " %s %c%4u %c ",
code, RSC(AUTOMATIC).CODE(), code, RSC(AUTOMATIC).CODE(),
unlock ? '<' : '[', ratio, unlock ? '>' : ']'); unlock ? '<' : '[', ratio.Q, unlock ? '>' : ']');
} else { } else {
StrFormat(item, RSZ(CREATE_SELECT_FREQ_OFFLINE)+9+10+1, StrFormat(item, RSZ(CREATE_SELECT_FREQ_OFFLINE)+9+10+1,
"%s" "%7.2f MHz %c%4u %c ", "%s" "%7.2f MHz %c%4u %c ",
code, ABS_FREQ_MHz(double, ratio, (*clock)), code, ABS_FREQ_MHz(double, ratio.Q, (*clock)),
unlock ? '<' : '[', ratio, unlock ? '>' : ']'); unlock ? '<' : '[', ratio.Q, unlock ? '>' : ']');
} }
} }
@@ -8233,7 +8233,7 @@ void Pkg_Item_Turbo_##_NC(ASCII *item) \
&RO(Shm)->Cpu[top].FlipFlop[ \ &RO(Shm)->Cpu[top].FlipFlop[ \
!RO(Shm)->Cpu[top].Toggle \ !RO(Shm)->Cpu[top].Toggle \
].Clock, \ ].Clock, \
RO(Shm)->Cpu[top].Boost[BOOST(_NC)], \ RO(Shm)->Cpu[top].Boost[BOOST(_NC)].Q, \
COREFREQ_STRINGIFY(_NC) ); \ COREFREQ_STRINGIFY(_NC) ); \
} }
DECLARE_Pkg_Item_Turbo( 1C) DECLARE_Pkg_Item_Turbo( 1C)
@@ -8267,7 +8267,7 @@ void Pkg_Update_Turbo_##_NC(TGrid *grid, DATA_TYPE data[]) \
&RO(Shm)->Cpu[top].FlipFlop[ \ &RO(Shm)->Cpu[top].FlipFlop[ \
!RO(Shm)->Cpu[top].Toggle \ !RO(Shm)->Cpu[top].Toggle \
].Clock, \ ].Clock, \
RO(Shm)->Cpu[top].Boost[BOOST(_NC)], \ RO(Shm)->Cpu[top].Boost[BOOST(_NC)].Q, \
COREFREQ_STRINGIFY(_NC) ); \ COREFREQ_STRINGIFY(_NC) ); \
\ \
memcpy(grid->cell.item, item, grid->cell.length); \ memcpy(grid->cell.item, item, grid->cell.length); \
@@ -8296,8 +8296,8 @@ DECLARE_Pkg_Update_Turbo(18C)
#define DECLARE_CPU_Item_Turbo(_NC) \ #define DECLARE_CPU_Item_Turbo(_NC) \
void CPU_Item_Turbo_##_NC(unsigned int cpu, ASCII *item) \ void CPU_Item_Turbo_##_NC(unsigned int cpu, ASCII *item) \
{ \ { \
if (RO(Shm)->Cpu[cpu].Boost[BOOST(_NC)] == 0) { \ if (RO(Shm)->Cpu[cpu].Boost[BOOST(_NC)].Q == 0) { \
CPU_Item_Auto_Freq(cpu, RO(Shm)->Cpu[cpu].Boost[BOOST(_NC)], \ CPU_Item_Auto_Freq(cpu, RO(Shm)->Cpu[cpu].Boost[BOOST(_NC)].Q, \
RO(Shm)->Proc.Features.Turbo_Unlock, item); \ RO(Shm)->Proc.Features.Turbo_Unlock, item); \
} else { \ } else { \
struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[ \ struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[ \
@@ -8310,10 +8310,10 @@ void CPU_Item_Turbo_##_NC(unsigned int cpu, ASCII *item) \
RO(Shm)->Cpu[cpu].Topology.PackageID, \ RO(Shm)->Cpu[cpu].Topology.PackageID, \
RO(Shm)->Cpu[cpu].Topology.CoreID, \ RO(Shm)->Cpu[cpu].Topology.CoreID, \
RO(Shm)->Cpu[cpu].Topology.ThreadID, \ RO(Shm)->Cpu[cpu].Topology.ThreadID, \
ABS_FREQ_MHz(double, RO(Shm)->Cpu[cpu].Boost[BOOST(_NC)],\ ABS_FREQ_MHz(double, RO(Shm)->Cpu[cpu].Boost[BOOST(_NC)].Q,\
CFlop->Clock), \ CFlop->Clock), \
RO(Shm)->Proc.Features.Turbo_Unlock ? '<' : '[', \ RO(Shm)->Proc.Features.Turbo_Unlock ? '<' : '[', \
RO(Shm)->Cpu[cpu].Boost[BOOST(_NC)], \ RO(Shm)->Cpu[cpu].Boost[BOOST(_NC)].Q, \
RO(Shm)->Proc.Features.Turbo_Unlock ? '>' : ']'); \ RO(Shm)->Proc.Features.Turbo_Unlock ? '>' : ']'); \
} \ } \
} }
@@ -8427,8 +8427,8 @@ void CPU_Item_Target_Freq(unsigned int cpu, ASCII *item)
struct FLIP_FLOP *CFlop; struct FLIP_FLOP *CFlop;
CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[ !RO(Shm)->Cpu[cpu].Toggle ]; CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[ !RO(Shm)->Cpu[cpu].Toggle ];
if (RO(Shm)->Cpu[cpu].Boost[BOOST(TGT)] == 0) { if (RO(Shm)->Cpu[cpu].Boost[BOOST(TGT)].Q == 0) {
CPU_Item_Auto_Freq( cpu, RO(Shm)->Cpu[cpu].Boost[BOOST(TGT)], CPU_Item_Auto_Freq( cpu, RO(Shm)->Cpu[cpu].Boost[BOOST(TGT)].Q,
RO(Shm)->Proc.Features.TgtRatio_Unlock, item ); RO(Shm)->Proc.Features.TgtRatio_Unlock, item );
} else { } else {
StrFormat(item, StrFormat(item,
@@ -8441,7 +8441,7 @@ void CPU_Item_Target_Freq(unsigned int cpu, ASCII *item)
CFlop->Absolute.Ratio.Perf, CFlop->Absolute.Ratio.Perf,
CFlop->Absolute.Freq, CFlop->Absolute.Freq,
RO(Shm)->Proc.Features.TgtRatio_Unlock ? '<' : '[', RO(Shm)->Proc.Features.TgtRatio_Unlock ? '<' : '[',
RO(Shm)->Cpu[cpu].Boost[BOOST(TGT)], RO(Shm)->Cpu[cpu].Boost[BOOST(TGT)].Q,
RO(Shm)->Proc.Features.TgtRatio_Unlock ? '>' : ']'); RO(Shm)->Proc.Features.TgtRatio_Unlock ? '>' : ']');
} }
} }
@@ -8822,8 +8822,8 @@ void CPU_Item_Max_Freq(unsigned int cpu, ASCII *item)
struct FLIP_FLOP *CFlop; struct FLIP_FLOP *CFlop;
CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[ !RO(Shm)->Cpu[cpu].Toggle ]; CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[ !RO(Shm)->Cpu[cpu].Toggle ];
if (RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)] == 0) { if (RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)].Q == 0) {
CPU_Item_Auto_Freq( cpu, RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)], CPU_Item_Auto_Freq( cpu, RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)].Q,
(RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b10) == 0b10, (RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b10) == 0b10,
item ); item );
} else { } else {
@@ -8834,11 +8834,11 @@ void CPU_Item_Max_Freq(unsigned int cpu, ASCII *item)
RO(Shm)->Cpu[cpu].Topology.PackageID, RO(Shm)->Cpu[cpu].Topology.PackageID,
RO(Shm)->Cpu[cpu].Topology.CoreID, RO(Shm)->Cpu[cpu].Topology.CoreID,
RO(Shm)->Cpu[cpu].Topology.ThreadID, RO(Shm)->Cpu[cpu].Topology.ThreadID,
ABS_FREQ_MHz( double, RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)], ABS_FREQ_MHz( double, RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)].Q,
CFlop->Clock ), CFlop->Clock ),
(RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b10) == 0b10 ? (RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b10) == 0b10 ?
'<' : '[', '<' : '[',
RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)], RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)].Q,
(RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b10) == 0b10 ? (RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b10) == 0b10 ?
'>' : ']'); '>' : ']');
} }
@@ -8917,8 +8917,8 @@ void CPU_Item_Min_Freq(unsigned int cpu, ASCII *item)
struct FLIP_FLOP *CFlop; struct FLIP_FLOP *CFlop;
CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[ !RO(Shm)->Cpu[cpu].Toggle ]; CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[ !RO(Shm)->Cpu[cpu].Toggle ];
if (RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)] == 0) { if (RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)].Q == 0) {
CPU_Item_Auto_Freq( cpu, RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)], CPU_Item_Auto_Freq( cpu, RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)].Q,
(RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b01) == 0b01, (RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b01) == 0b01,
item ); item );
} else { } else {
@@ -8929,11 +8929,11 @@ void CPU_Item_Min_Freq(unsigned int cpu, ASCII *item)
RO(Shm)->Cpu[cpu].Topology.PackageID, RO(Shm)->Cpu[cpu].Topology.PackageID,
RO(Shm)->Cpu[cpu].Topology.CoreID, RO(Shm)->Cpu[cpu].Topology.CoreID,
RO(Shm)->Cpu[cpu].Topology.ThreadID, RO(Shm)->Cpu[cpu].Topology.ThreadID,
ABS_FREQ_MHz( double, RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)], ABS_FREQ_MHz( double, RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)].Q,
CFlop->Clock ), CFlop->Clock ),
(RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b01) == 0b01 ? (RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b01) == 0b01 ?
'<' : '[', '<' : '[',
RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)], RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)].Q,
(RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b01) == 0b01 ? (RO(Shm)->Proc.Features.ClkRatio_Unlock & 0b01) == 0b01 ?
'>' : ']'); '>' : ']');
} }
@@ -12094,20 +12094,20 @@ int Shortcut(SCANKEY *scan)
const unsigned int NC = clockMod.NC & CLOCKMOD_RATIO_MASK; const unsigned int NC = clockMod.NC & CLOCKMOD_RATIO_MASK;
signed int lowestShift, highestShift; signed int lowestShift, highestShift;
ComputeRatioShifts( SProc->Boost[BOOST(ACT)], ComputeRatioShifts( SProc->Boost[BOOST(ACT)].Q,
0, 0,
MAXCLOCK_TO_RATIO(unsigned int,CFlop->Clock.Hz), MAXCLOCK_TO_RATIO(unsigned int,CFlop->Clock.Hz),
&lowestShift, &lowestShift,
&highestShift ); &highestShift );
AppendWindow( AppendWindow(
CreateRatioClock(scan->key, CreateRatioClock(scan->key,
SProc->Boost[BOOST(ACT)], SProc->Boost[BOOST(ACT)].Q,
-1, -1,
NC, NC,
lowestShift, lowestShift,
highestShift, highestShift,
(int) ((SProc->Boost[BOOST(MIN)] (int) ((SProc->Boost[BOOST(MIN)].Q
+ RO(Shm)->Proc.Features.Factory.Ratio) >> 1), + RO(Shm)->Proc.Features.Factory.Ratio) >> 1),
(int) (RO(Shm)->Proc.Features.Factory.Ratio (int) (RO(Shm)->Proc.Features.Factory.Ratio
@@ -12137,20 +12137,20 @@ int Shortcut(SCANKEY *scan)
const unsigned int NC = clockMod.NC & CLOCKMOD_RATIO_MASK; const unsigned int NC = clockMod.NC & CLOCKMOD_RATIO_MASK;
signed int lowestShift, highestShift; signed int lowestShift, highestShift;
ComputeRatioShifts( RO(Shm)->Uncore.Boost[BOOST(MAX)], ComputeRatioShifts( RO(Shm)->Uncore.Boost[BOOST(MAX)].Q,
RO(Shm)->Uncore.Boost[BOOST(MIN)], RO(Shm)->Uncore.Boost[BOOST(MIN)].Q,
MAXCLOCK_TO_RATIO(unsigned int,CFlop->Clock.Hz), MAXCLOCK_TO_RATIO(unsigned int,CFlop->Clock.Hz),
&lowestShift, &lowestShift,
&highestShift ); &highestShift );
AppendWindow( AppendWindow(
CreateRatioClock(scan->key, CreateRatioClock(scan->key,
RO(Shm)->Uncore.Boost[BOOST(MAX)], RO(Shm)->Uncore.Boost[BOOST(MAX)].Q,
-1, -1,
NC, NC,
lowestShift, lowestShift,
highestShift, highestShift,
(int) ((RO(Shm)->Uncore.Boost[BOOST(MIN)] (int) ((RO(Shm)->Uncore.Boost[BOOST(MIN)].Q
+ RO(Shm)->Proc.Features.Factory.Ratio ) >> 1), + RO(Shm)->Proc.Features.Factory.Ratio ) >> 1),
(int) (RO(Shm)->Proc.Features.Factory.Ratio (int) (RO(Shm)->Proc.Features.Factory.Ratio
@@ -12174,17 +12174,17 @@ int Shortcut(SCANKEY *scan)
CLOCK_ARG clockMod = {.ullong = scan->key}; CLOCK_ARG clockMod = {.ullong = scan->key};
const unsigned int NC = clockMod.NC & CLOCKMOD_RATIO_MASK, const unsigned int NC = clockMod.NC & CLOCKMOD_RATIO_MASK,
highestOperating = KMAX(RO(Shm)->Proc.Features.Factory.Ratio, highestOperating = KMAX(RO(Shm)->Proc.Features.Factory.Ratio,
RO(Shm)->Uncore.Boost[BOOST(MAX)]); RO(Shm)->Uncore.Boost[BOOST(MAX)].Q);
signed int lowestShift, highestShift; signed int lowestShift, highestShift;
ComputeRatioShifts( RO(Shm)->Uncore.Boost[BOOST(MIN)], ComputeRatioShifts( RO(Shm)->Uncore.Boost[BOOST(MIN)].Q,
1, 1,
highestOperating, highestOperating,
&lowestShift, &lowestShift,
&highestShift ); &highestShift );
AppendWindow( AppendWindow(
CreateRatioClock(scan->key, CreateRatioClock(scan->key,
RO(Shm)->Uncore.Boost[BOOST(MIN)], RO(Shm)->Uncore.Boost[BOOST(MIN)].Q,
-1, -1,
NC, NC,
lowestShift, lowestShift,
@@ -12548,12 +12548,12 @@ int Shortcut(SCANKEY *scan)
(scan->key & RATIO_MASK) ^ CORE_COUNT (scan->key & RATIO_MASK) ^ CORE_COUNT
); );
if (cpu == -1) { if (cpu == -1) {
COF = RO(Shm)->Cpu[ Ruler.Top[boost] ].Boost[boost]; COF = RO(Shm)->Cpu[ Ruler.Top[boost] ].Boost[boost].Q;
CFlop = &RO(Shm)->Cpu[ Ruler.Top[boost] ].FlipFlop[ CFlop = &RO(Shm)->Cpu[ Ruler.Top[boost] ].FlipFlop[
!RO(Shm)->Cpu[ Ruler.Top[boost] ].Toggle !RO(Shm)->Cpu[ Ruler.Top[boost] ].Toggle
]; ];
} else { } else {
COF = RO(Shm)->Cpu[cpu].Boost[boost]; COF = RO(Shm)->Cpu[cpu].Boost[boost].Q;
CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[!RO(Shm)->Cpu[cpu].Toggle]; CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[!RO(Shm)->Cpu[cpu].Toggle];
} }
ComputeRatioShifts(COF, ComputeRatioShifts(COF,
@@ -12602,17 +12602,17 @@ int Shortcut(SCANKEY *scan)
(scan->key & RATIO_MASK) ^ CORE_COUNT (scan->key & RATIO_MASK) ^ CORE_COUNT
); );
if (cpu == -1) { if (cpu == -1) {
COF = RO(Shm)->Cpu[ Ruler.Top[BOOST(TGT)] ].Boost[BOOST(TGT)]; COF = RO(Shm)->Cpu[ Ruler.Top[BOOST(TGT)] ].Boost[BOOST(TGT)].Q;
lowestOperating = RO(Shm)->Cpu[ lowestOperating = RO(Shm)->Cpu[
Ruler.Top[ BOOST(TGT) ] Ruler.Top[ BOOST(TGT) ]
].Boost[ BOOST(MIN) ]; ].Boost[ BOOST(MIN) ].Q;
highestOperating = RO(Shm)->Cpu[ highestOperating = RO(Shm)->Cpu[
Ruler.Top[ BOOST(TGT) ] Ruler.Top[ BOOST(TGT) ]
].Boost[ BOOST(MAX) ]; ].Boost[ BOOST(MAX) ].Q;
} else { } else {
COF = RO(Shm)->Cpu[cpu].Boost[BOOST(TGT)]; COF = RO(Shm)->Cpu[cpu].Boost[BOOST(TGT)].Q;
lowestOperating = RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)]; lowestOperating = RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)].Q;
highestOperating = RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)]; highestOperating = RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)].Q;
} }
ComputeRatioShifts( COF, ComputeRatioShifts( COF,
0, /* AUTO Frequency */ 0, /* AUTO Frequency */
@@ -12840,19 +12840,19 @@ int Shortcut(SCANKEY *scan)
(scan->key & RATIO_MASK) ^ CORE_COUNT (scan->key & RATIO_MASK) ^ CORE_COUNT
); );
if (cpu == -1) { if (cpu == -1) {
COF = RO(Shm)->Cpu[ Ruler.Top[BOOST(MAX)] ].Boost[BOOST(MAX)]; COF = RO(Shm)->Cpu[ Ruler.Top[BOOST(MAX)] ].Boost[BOOST(MAX)].Q;
lowestOperating = KMIN( RO(Shm)->Cpu[ lowestOperating = KMIN( RO(Shm)->Cpu[
Ruler.Top[BOOST(MAX)] Ruler.Top[BOOST(MAX)]
].Boost[BOOST(MIN)], ].Boost[BOOST(MIN)].Q,
RO(Shm)->Proc.Features.Factory.Ratio ); RO(Shm)->Proc.Features.Factory.Ratio );
CFlop = &RO(Shm)->Cpu[Ruler.Top[ BOOST(MAX)] ].FlipFlop[ CFlop = &RO(Shm)->Cpu[Ruler.Top[ BOOST(MAX)] ].FlipFlop[
!RO(Shm)->Cpu[Ruler.Top[BOOST(MAX)] !RO(Shm)->Cpu[Ruler.Top[BOOST(MAX)]
].Toggle]; ].Toggle];
} else { } else {
COF = RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)]; COF = RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)].Q;
lowestOperating = KMIN( RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)], lowestOperating = KMIN( RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)].Q,
RO(Shm)->Proc.Features.Factory.Ratio ); RO(Shm)->Proc.Features.Factory.Ratio );
CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[!RO(Shm)->Cpu[cpu].Toggle]; CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[!RO(Shm)->Cpu[cpu].Toggle];
} }
@@ -12901,14 +12901,14 @@ int Shortcut(SCANKEY *scan)
(scan->key & RATIO_MASK) ^ CORE_COUNT (scan->key & RATIO_MASK) ^ CORE_COUNT
); );
if (cpu == -1) { if (cpu == -1) {
COF = RO(Shm)->Cpu[ Ruler.Top[BOOST(MIN)] ].Boost[BOOST(MIN)]; COF = RO(Shm)->Cpu[ Ruler.Top[BOOST(MIN)] ].Boost[BOOST(MIN)].Q;
lowestOperating = KMIN( RO(Shm)->Cpu[ lowestOperating = KMIN( RO(Shm)->Cpu[
Ruler.Top[BOOST(MIN)] Ruler.Top[BOOST(MIN)]
].Boost[BOOST(MIN)], ].Boost[BOOST(MIN)].Q,
RO(Shm)->Proc.Features.Factory.Ratio ); RO(Shm)->Proc.Features.Factory.Ratio );
} else { } else {
COF = RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)]; COF = RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)].Q;
lowestOperating = KMIN( RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)], lowestOperating = KMIN( RO(Shm)->Cpu[cpu].Boost[BOOST(MIN)].Q,
RO(Shm)->Proc.Features.Factory.Ratio ); RO(Shm)->Proc.Features.Factory.Ratio );
} }
ComputeRatioShifts(COF, ComputeRatioShifts(COF,
@@ -16456,7 +16456,7 @@ void Layout_Card_Uncore(Layer *layer, Card *card)
hUncore); hUncore);
StrFormat(Buffer, 10+1, "x%2u", StrFormat(Buffer, 10+1, "x%2u",
RO(Shm)->Uncore.Boost[UNCORE_BOOST(MAX)]); RO(Shm)->Uncore.Boost[UNCORE_BOOST(MAX)].Q);
hUncore.code[ 8] = (ASCII) Buffer[0]; hUncore.code[ 8] = (ASCII) Buffer[0];
hUncore.code[ 9] = (ASCII) Buffer[1]; hUncore.code[ 9] = (ASCII) Buffer[1];

View File

@@ -446,7 +446,10 @@ extern void Set_SINT(TGrid*, signed int _SINT, unsigned int) ;
__builtin_choose_expr(__builtin_types_compatible_p ( \ __builtin_choose_expr(__builtin_types_compatible_p ( \
__typeof__(_data), __typeof__(signed int)) , \ __typeof__(_data), __typeof__(signed int)) , \
Set_SINT, \ Set_SINT, \
(void)0))))))))))))))(_pGrid, _data, _order) __builtin_choose_expr(__builtin_types_compatible_p ( \
__typeof__(_data), __typeof__(COF_ST *)) , \
Set_pVOID, \
(void)0)))))))))))))))(_pGrid, _data, _order)
typedef struct _Stock { typedef struct _Stock {
struct _Stock *next; struct _Stock *next;

View File

@@ -29,7 +29,7 @@ typedef struct
Bit64 OffLine __attribute__ ((aligned (8))); Bit64 OffLine __attribute__ ((aligned (8)));
unsigned int Boost[BOOST(SIZE)]; COF_ST Boost[BOOST(SIZE)];
struct struct
{ {
@@ -458,7 +458,7 @@ typedef struct
} App; } App;
struct { struct {
unsigned int Boost[UNCORE_BOOST(SIZE)]; COF_ST Boost[UNCORE_BOOST(SIZE)];
struct struct
{ {
unsigned long long Speed; unsigned long long Speed;

View File

@@ -342,12 +342,12 @@ static void *Core_Cycle(void *arg)
CFlip->Delta.C1 = RO(Core)->Delta.C1; CFlip->Delta.C1 = RO(Core)->Delta.C1;
/* Update all clock ratios. */ /* Update all clock ratios. */
memcpy(Cpu->Boost, RO(Core)->Boost, (BOOST(SIZE))*sizeof(unsigned int)); memcpy(Cpu->Boost, RO(Core)->Boost, (BOOST(SIZE)) * sizeof(COF_ST));
const double FRQ = Cpu->Boost[BOOST(MAX)] * CFlip->Clock.Hz; const double FRQ = Cpu->Boost[BOOST(MAX)].Q * CFlip->Clock.Hz;
CFlip->Absolute.Ratio.Perf = (double)RO(Core)->Ratio.COF.Q; CFlip->Absolute.Ratio.Perf = (double)RO(Core)->Ratio.COF.Q;
CFlip->Absolute.Ratio.Perf +=(double)RO(Core)->Ratio.COF.R /UNIT_KHz(1); CFlip->Absolute.Ratio.Perf +=(double)RO(Core)->Ratio.COF.R / PRECISION;
/* Compute IPS=Instructions per Hz */ /* Compute IPS=Instructions per Hz */
CFlip->State.IPS = (double)CFlip->Delta.INST / FRQ; CFlip->State.IPS = (double)CFlip->Delta.INST / FRQ;
@@ -384,7 +384,7 @@ static void *Core_Cycle(void *arg)
/* Relative Frequency = Relative Ratio x Bus Clock Frequency */ /* Relative Frequency = Relative Ratio x Bus Clock Frequency */
CFlip->Relative.Ratio = (double)(CFlip->Delta.C0.URC CFlip->Relative.Ratio = (double)(CFlip->Delta.C0.URC
* Cpu->Boost[BOOST(MAX)]) / FRQ; * Cpu->Boost[BOOST(MAX)].Q) / FRQ;
CFlip->Relative.Freq = REL_FREQ_MHz( double, CFlip->Relative.Freq = REL_FREQ_MHz( double,
CFlip->Relative.Ratio, CFlip->Relative.Ratio,
@@ -764,7 +764,7 @@ void Uncore_Update( RO(SHM_STRUCT) *RO(Shm), RO(PROC) *RO(Proc),
/* Copy the Uncore clock ratios. */ /* Copy the Uncore clock ratios. */
memcpy( RO(Shm)->Uncore.Boost, memcpy( RO(Shm)->Uncore.Boost,
RO(Proc)->Uncore.Boost, RO(Proc)->Uncore.Boost,
(UNCORE_BOOST(SIZE)) * sizeof(unsigned int) ); (UNCORE_BOOST(SIZE)) * sizeof(COF_ST) );
} }
void Topology(RO(SHM_STRUCT) *RO(Shm), RO(PROC) *RO(Proc), RO(CORE) **RO(Core), void Topology(RO(SHM_STRUCT) *RO(Shm), RO(PROC) *RO(Proc), RO(CORE) **RO(Core),
@@ -1160,7 +1160,7 @@ void PerCore_Update( RO(SHM_STRUCT) *RO(Shm), RO(PROC) *RO(Proc),
} }
/* Initialize all clock ratios. */ /* Initialize all clock ratios. */
memcpy( RO(Shm)->Cpu[cpu].Boost, RO(Core, AT(cpu))->Boost, memcpy( RO(Shm)->Cpu[cpu].Boost, RO(Core, AT(cpu))->Boost,
(BOOST(SIZE)) * sizeof(unsigned int) ); (BOOST(SIZE)) * sizeof(COF_ST) );
RO(Shm)->Cpu[cpu].Query.Revision = RO(Core, AT(cpu))->Query.Revision; RO(Shm)->Cpu[cpu].Query.Revision = RO(Core, AT(cpu))->Query.Revision;
@@ -1774,7 +1774,7 @@ REASON_CODE Core_Manager(REF *Ref)
} }
if (Quiet & 0x100) { if (Quiet & 0x100) {
printf( " CPU #%03u @ %.2f MHz\n", cpu, printf( " CPU #%03u @ %.2f MHz\n", cpu,
ABS_FREQ_MHz(double , RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)], ABS_FREQ_MHz(double , RO(Shm)->Cpu[cpu].Boost[BOOST(MAX)].Q,
RO(Core, AT(cpu))->Clock) ); RO(Core, AT(cpu))->Clock) );
} }
/* Notify a CPU has been brought up */ /* Notify a CPU has been brought up */

View File

@@ -334,7 +334,7 @@ static unsigned int FixMissingRatioAndFrequency(unsigned int r32, CLOCK *pClock)
if ((r32 == 0) && (pClock->Q > 0)) if ((r32 == 0) && (pClock->Q > 0))
{ /* Fix missing ratio. */ { /* Fix missing ratio. */
r64=DIV_ROUND_CLOSEST(PUBLIC(RO(Proc))->Features.Factory.Freq, pClock->Q); r64=DIV_ROUND_CLOSEST(PUBLIC(RO(Proc))->Features.Factory.Freq, pClock->Q);
PUBLIC(RO(Core,AT(PUBLIC(RO(Proc))->Service.Core)))->Boost[BOOST(MAX)]=\ PUBLIC(RO(Core,AT(PUBLIC(RO(Proc))->Service.Core)))->Boost[BOOST(MAX)].Q=\
(unsigned int) r64; (unsigned int) r64;
} }
} }
@@ -403,7 +403,7 @@ static long CoreFreqK_Register_ClockSource(unsigned int cpu)
CoreFreqK_CS.read = CoreFreqK_Read_CS_From_TSC; CoreFreqK_CS.read = CoreFreqK_Read_CS_From_TSC;
Freq_Hz = PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(MAX)] Freq_Hz = PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(MAX)].Q
* PUBLIC(RO(Core, AT(cpu)))->Clock.Hz; * PUBLIC(RO(Core, AT(cpu)))->Clock.Hz;
Freq_KHz = Freq_Hz / 1000U; Freq_KHz = Freq_Hz / 1000U;
if (Freq_KHz != 0) if (Freq_KHz != 0)
@@ -1965,6 +1965,7 @@ static void Query_DeviceTree(unsigned int cpu)
#endif #endif
volatile CNTFRQ cntfrq; volatile CNTFRQ cntfrq;
unsigned int max_freq = 0, min_freq = 0, cur_freq = 0; unsigned int max_freq = 0, min_freq = 0, cur_freq = 0;
COF_ST COF;
__asm__ __volatile__( __asm__ __volatile__(
"mrs %[cntfrq], cntfrq_el0" "\n\t" "mrs %[cntfrq], cntfrq_el0" "\n\t"
@@ -1985,43 +1986,64 @@ static void Query_DeviceTree(unsigned int cpu)
min_freq = pFreqPolicy->cpuinfo.min_freq; min_freq = pFreqPolicy->cpuinfo.min_freq;
cur_freq = pFreqPolicy->cur; cur_freq = pFreqPolicy->cur;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0)
cpufreq_for_each_valid_entry(table, pFreqPolicy->freq_table) cpufreq_for_each_valid_entry(table, pFreqPolicy->freq_table)
{ {
FREQ2COF(table->frequency, COF);
if (table->frequency != min_freq) { if (table->frequency != min_freq) {
if (boost < (BOOST(SIZE) - BOOST(18C))) if (boost < (BOOST(SIZE) - BOOST(18C)))
{ {
Core->Boost[BOOST(18C) + boost] = table->frequency Core->Boost[BOOST(18C) + boost].Q = COF.Q;
/ UNIT_KHz(PRECISION); Core->Boost[BOOST(18C) + boost].R = COF.R;
boost++;
} boost++;
}
if ((table->flags & CPUFREQ_BOOST_FREQ) == CPUFREQ_BOOST_FREQ) {
const unsigned int COF = table->frequency / UNIT_KHz(PRECISION);
if (COF > Core->Boost[BOOST(TBH)]) {
Core->Boost[BOOST(TBO)] = Core->Boost[BOOST(TBH)];
Core->Boost[BOOST(TBH)] = COF;
} }
PUBLIC(RO(Proc))->Features.Turbo_OPP = 1;
} }
if ((table->flags & CPUFREQ_BOOST_FREQ) == CPUFREQ_BOOST_FREQ) {
if(((COF.Q * PRECISION) + COF.R) > ((Core->Boost[BOOST(TBH)].Q * PRECISION)
+ Core->Boost[BOOST(TBH)].R))
{
Core->Boost[BOOST(TBO)].Q = Core->Boost[BOOST(TBH)].Q;
Core->Boost[BOOST(TBO)].R = Core->Boost[BOOST(TBH)].R;
Core->Boost[BOOST(TBH)].Q = COF.Q;
Core->Boost[BOOST(TBH)].R = COF.R;
}
PUBLIC(RO(Proc))->Features.Turbo_OPP = 1;
} }
if (boost > BOOST(MIN)) { }
if (boost > BOOST(MIN)) {
const enum RATIO_BOOST diff = BOOST(SIZE) - (BOOST(18C) + boost); const enum RATIO_BOOST diff = BOOST(SIZE) - (BOOST(18C) + boost);
memmove(&Core->Boost[BOOST(18C) + diff], &Core->Boost[BOOST(18C)], memmove(&Core->Boost[BOOST(18C) + diff], &Core->Boost[BOOST(18C)],
boost * sizeof(enum RATIO_BOOST)); boost * sizeof(enum RATIO_BOOST));
memset(&Core->Boost[BOOST(18C)], 0, diff * sizeof(enum RATIO_BOOST)); memset(&Core->Boost[BOOST(18C)], 0, diff * sizeof(enum RATIO_BOOST));
} }
#endif #endif
} }
#endif /* CONFIG_CPU_FREQ */ #endif /* CONFIG_CPU_FREQ */
Core->Boost[BOOST(MAX)] = max_freq > 0 ? max_freq / UNIT_KHz(PRECISION) if (max_freq > 0) {
: cntfrq.ClockFreq_Hz; FREQ2COF(max_freq, COF);
} else {
FREQ2COF(cntfrq.ClockFreq_Hz, COF);
}
Core->Boost[BOOST(MAX)].Q = COF.Q;
Core->Boost[BOOST(MAX)].R = COF.R;
Core->Boost[BOOST(MIN)] = min_freq > 0 ? min_freq / UNIT_KHz(PRECISION) if (min_freq > 0) {
: 4; FREQ2COF(min_freq, COF);
} else {
COF.Q = 4;
COF.R = 0;
}
Core->Boost[BOOST(MIN)].Q = COF.Q;
Core->Boost[BOOST(MIN)].R = COF.R;
Core->Boost[BOOST(TGT)] = cur_freq / UNIT_KHz(PRECISION); if (cur_freq > 0) {
FREQ2COF(cur_freq, COF);
}
Core->Boost[BOOST(TGT)].Q = COF.Q;
Core->Boost[BOOST(TGT)].R = COF.R;
} }
#ifdef CONFIG_PM_OPP #ifdef CONFIG_PM_OPP
@@ -2058,7 +2080,7 @@ static void Query_Voltage_From_OPP(void)
for (boost = BOOST(MIN); boost < BOOST(SIZE) - BOOST(18C); boost++) for (boost = BOOST(MIN); boost < BOOST(SIZE) - BOOST(18C); boost++)
{ {
unsigned long freq_hz = PUBLIC(RO(Proc))->Features.Factory.Clock.Hz unsigned long freq_hz = PUBLIC(RO(Proc))->Features.Factory.Clock.Hz
* PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(18C) + boost], * PUBLIC(RO(Core,AT(cpu)))->Boost[BOOST(18C) + boost].Q,
u_volt = GetVoltage_From_OPP(cpu, freq_hz); u_volt = GetVoltage_From_OPP(cpu, freq_hz);
u_volt = u_volt >> 5; u_volt = u_volt >> 5;
@@ -2072,7 +2094,7 @@ inline enum RATIO_BOOST Find_OPP_From_Ratio(CORE_RO *Core, unsigned int ratio)
{ {
enum RATIO_BOOST boost, last = BOOST(MIN); enum RATIO_BOOST boost, last = BOOST(MIN);
for (boost = BOOST(MIN); boost < BOOST(SIZE) - BOOST(18C); boost++) { for (boost = BOOST(MIN); boost < BOOST(SIZE) - BOOST(18C); boost++) {
if (Core->Boost[BOOST(18C) + boost] <= ratio) { if (Core->Boost[BOOST(18C) + boost].Q <= ratio) {
last = boost; last = boost;
continue; continue;
} }
@@ -2601,7 +2623,7 @@ static void PerCore_GenericMachine(void *arg)
if (PUBLIC(RO(Proc))->Features.Hybrid) { if (PUBLIC(RO(Proc))->Features.Hybrid) {
Core->T.Cluster.Hybrid_ID = \ Core->T.Cluster.Hybrid_ID = \
Core->Boost[BOOST(MAX)] < PUBLIC(RO(Proc))->Features.Factory.Ratio ? Core->Boost[BOOST(MAX)].Q < PUBLIC(RO(Proc))->Features.Factory.Ratio ?
Hybrid_Secondary : Hybrid_Primary; Hybrid_Secondary : Hybrid_Primary;
} }
if (Experimental && (PUBLIC(RO(Proc))->HypervisorID == BARE_METAL)) { if (Experimental && (PUBLIC(RO(Proc))->HypervisorID == BARE_METAL)) {
@@ -2730,7 +2752,8 @@ static void Controller_Init(void)
Arch[PUBLIC(RO(Proc))->ArchID].Query(PUBLIC(RO(Proc))->Service.Core); Arch[PUBLIC(RO(Proc))->ArchID].Query(PUBLIC(RO(Proc))->Service.Core);
} }
ratio=PUBLIC(RO(Core,AT(PUBLIC(RO(Proc))->Service.Core)))->Boost[BOOST(MAX)]; ratio = PUBLIC(RO(Core, AT(PUBLIC(RO(Proc))->Service.Core)))\
->Boost[BOOST(MAX)].Q;
if (Arch[PUBLIC(RO(Proc))->ArchID].BaseClock != NULL) if (Arch[PUBLIC(RO(Proc))->ArchID].BaseClock != NULL)
{ {
@@ -2773,7 +2796,7 @@ static void Controller_Init(void)
PUBLIC(RO(Core, AT(cpu)))->Clock = Compute_Clock(cpu,&Compute); PUBLIC(RO(Core, AT(cpu)))->Clock = Compute_Clock(cpu,&Compute);
PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(MAX)] = ratio; PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(MAX)].Q = ratio;
} }
else else
{ {
@@ -2784,7 +2807,7 @@ static void Controller_Init(void)
vClock = Compute_Clock(cpu, &Compute); vClock = Compute_Clock(cpu, &Compute);
PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(MAX)] = vClock.Q; PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(MAX)].Q = vClock.Q;
} }
/* Release memory resources. */ /* Release memory resources. */
kmem_cache_free(hwCache, Compute.TSC[1]); kmem_cache_free(hwCache, Compute.TSC[1]);
@@ -2997,7 +3020,7 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
Core->Counter[T].C1 = ( \ Core->Counter[T].C1 = ( \
Core->Counter[T].TSC \ Core->Counter[T].TSC \
* PUBLIC(RO(Proc))->Features.Factory.Clock.Q \ * PUBLIC(RO(Proc))->Features.Factory.Clock.Q \
* Core->Boost[BOOST(MAX)] \ * Core->Boost[BOOST(MAX)].Q \
) / PUBLIC(RO(Proc))->Features.Factory.Ratio; \ ) / PUBLIC(RO(Proc))->Features.Factory.Ratio; \
/* Derive C1: */ \ /* Derive C1: */ \
Core->Counter[T].C1 = \ Core->Counter[T].C1 = \
@@ -3030,7 +3053,7 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
REL_BCLK(Core->Clock, \ REL_BCLK(Core->Clock, \
(PUBLIC(RO(Proc))->Features.Hybrid == 1 ? \ (PUBLIC(RO(Proc))->Features.Hybrid == 1 ? \
PUBLIC(RO(Proc))->Features.Factory.Ratio\ PUBLIC(RO(Proc))->Features.Factory.Ratio\
: Core->Boost[BOOST(MAX)]), \ : Core->Boost[BOOST(MAX)].Q), \
Core->Delta.TSC, \ Core->Delta.TSC, \
PUBLIC(RO(Proc))->SleepInterval); \ PUBLIC(RO(Proc))->SleepInterval); \
} \ } \
@@ -3274,31 +3297,22 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
inline COF_UNION Compute_COF_From_CPU_Freq(struct cpufreq_policy *pFreqPolicy) inline COF_UNION Compute_COF_From_CPU_Freq(struct cpufreq_policy *pFreqPolicy)
{ {
register unsigned long long Q = pFreqPolicy->cur, COF_UNION ratio;
D = UNIT_KHz(PRECISION); FREQ2COF(pFreqPolicy->cur, ratio.COF);
COF_UNION ratio = {.COF = {
.Q = Q / D,
.R = (Q - (ratio.COF.Q * D)) / PRECISION }
};
return ratio; return ratio;
} }
#endif /* CONFIG_CPU_FREQ */ #endif /* CONFIG_CPU_FREQ */
inline COF_UNION Compute_COF_From_PMU_Counter( unsigned long long cnt, inline COF_UNION Compute_COF_From_PMU_Counter( unsigned long long cnt,
CLOCK clk, CLOCK clk,
unsigned int limit ) COF_ST lowest )
{ {
register unsigned long long \ const unsigned long long PMU_freq = (cnt * clk.Q)
Q = cnt * clk.Q, / (PUBLIC(RO(Proc))->SleepInterval * PRECISION);
D = UNIT_MHz(10LLU * PUBLIC(RO(Proc))->SleepInterval); COF_UNION ratio;
FREQ2COF(PMU_freq, ratio.COF);
COF_UNION ratio = {.COF = { if (ratio.COF.Q < lowest.Q) {
.Q = Q / D } ratio.COF = lowest;
};
if (ratio.COF.Q < limit) {
ratio.Perf = limit;
} else {
ratio.COF.R = (Q - (ratio.COF.Q * D)) / UNIT_MHz(10LLU);
} }
return ratio; return ratio;
} }
@@ -3366,7 +3380,8 @@ static enum hrtimer_restart Cycle_GenericMachine(struct hrtimer *pTimer)
Core->Clock, Core->Clock,
Core->Boost[BOOST(MIN)]); Core->Boost[BOOST(MIN)]);
#endif #endif
PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(TGT)] = Core->Ratio.COF.Q; PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(TGT)].Q = Core->Ratio.COF.Q;
PUBLIC(RO(Core, AT(cpu)))->Boost[BOOST(TGT)].R = Core->Ratio.COF.R;
#ifdef CONFIG_PM_OPP #ifdef CONFIG_PM_OPP
{ {
@@ -3868,10 +3883,10 @@ static int CoreFreqK_Policy_Init(struct cpufreq_policy *policy)
{ {
CORE_RO *Core = (CORE_RO *) PUBLIC(RO(Core, AT(policy->cpu))); CORE_RO *Core = (CORE_RO *) PUBLIC(RO(Core, AT(policy->cpu)));
policy->cpuinfo.min_freq = (Core->Boost[BOOST(MIN)] policy->cpuinfo.min_freq = (Core->Boost[BOOST(MIN)].Q
* Core->Clock.Hz) / 1000LLU; * Core->Clock.Hz) / 1000LLU;
policy->cpuinfo.max_freq = (Core->Boost[BOOST(MAX)] policy->cpuinfo.max_freq = (Core->Boost[BOOST(MAX)].Q
* Core->Clock.Hz) / 1000LLU; * Core->Clock.Hz) / 1000LLU;
/* MANDATORY Per-CPU Initialization */ /* MANDATORY Per-CPU Initialization */
@@ -3917,7 +3932,7 @@ static int CoreFreqK_Bios_Limit(int cpu, unsigned int *limit)
{ {
CORE_RO *Core = (CORE_RO *) PUBLIC(RO(Core, AT(cpu))); CORE_RO *Core = (CORE_RO *) PUBLIC(RO(Core, AT(cpu)));
(*limit) = (Core->Boost[BOOST(MAX)] * Core->Clock.Hz) / 1000LLU; (*limit) = (Core->Boost[BOOST(MAX)].Q * Core->Clock.Hz) / 1000LLU;
} }
return 0; return 0;
} }
@@ -3941,7 +3956,7 @@ static ssize_t CoreFreqK_Show_SetSpeed(struct cpufreq_policy *policy,char *buf)
boost = BOOST(TGT); boost = BOOST(TGT);
} }
return sprintf( buf, "%7llu\n", return sprintf( buf, "%7llu\n",
(Core->Boost[boost] * Core->Clock.Hz) / 1000LLU ); (Core->Boost[boost].Q * Core->Clock.Hz) / 1000LLU );
} }
return 0; return 0;
} }
@@ -5180,7 +5195,7 @@ static int CoreFreqK_HotPlug_CPU_Online(unsigned int cpu)
PUBLIC(RO(Proc))->Features.Factory.Ratio PUBLIC(RO(Proc))->Features.Factory.Ratio
: PUBLIC( : PUBLIC(
RO(Core, AT(PUBLIC(RO(Proc))->Service.Core)) RO(Core, AT(PUBLIC(RO(Proc))->Service.Core))
)->Boost[BOOST(MAX)], )->Boost[BOOST(MAX)].Q,
.R = 0, .Hz = 0 .R = 0, .Hz = 0
} }
}; };

View File

@@ -302,6 +302,13 @@ struct SMBIOS17
u32 extended_conf_speed; /* 0x58 DWORD */ u32 extended_conf_speed; /* 0x58 DWORD */
} __attribute__((__packed__)); } __attribute__((__packed__));
#define FREQ2COF(_frequency, _COF) \
({ \
_COF.Q = (_frequency) / UNIT_KHz(PRECISION), \
_COF.R = CLOCK_KHz(unsigned short, \
(_frequency) - (_COF.Q * UNIT_KHz(PRECISION))); \
})
#if !defined(RHEL_MAJOR) #if !defined(RHEL_MAJOR)
#define RHEL_MAJOR 0 #define RHEL_MAJOR 0
#endif #endif