[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;
unsigned int Boost[BOOST(SIZE)];
COF_ST Boost[BOOST(SIZE)];
COF_UNION Ratio;
} CORE_RO;

View File

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

View File

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

View File

@@ -342,12 +342,12 @@ static void *Core_Cycle(void *arg)
CFlip->Delta.C1 = RO(Core)->Delta.C1;
/* 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.R /UNIT_KHz(1);
CFlip->Absolute.Ratio.Perf +=(double)RO(Core)->Ratio.COF.R / PRECISION;
/* Compute IPS=Instructions per Hz */
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 */
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.Ratio,
@@ -764,7 +764,7 @@ void Uncore_Update( RO(SHM_STRUCT) *RO(Shm), RO(PROC) *RO(Proc),
/* Copy the Uncore clock ratios. */
memcpy( RO(Shm)->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),
@@ -1160,7 +1160,7 @@ void PerCore_Update( RO(SHM_STRUCT) *RO(Shm), RO(PROC) *RO(Proc),
}
/* Initialize all clock ratios. */
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;
@@ -1774,7 +1774,7 @@ REASON_CODE Core_Manager(REF *Ref)
}
if (Quiet & 0x100) {
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) );
}
/* 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))
{ /* Fix missing ratio. */
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;
}
}
@@ -403,7 +403,7 @@ static long CoreFreqK_Register_ClockSource(unsigned int cpu)
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;
Freq_KHz = Freq_Hz / 1000U;
if (Freq_KHz != 0)
@@ -1965,6 +1965,7 @@ static void Query_DeviceTree(unsigned int cpu)
#endif
volatile CNTFRQ cntfrq;
unsigned int max_freq = 0, min_freq = 0, cur_freq = 0;
COF_ST COF;
__asm__ __volatile__(
"mrs %[cntfrq], cntfrq_el0" "\n\t"
@@ -1985,43 +1986,64 @@ static void Query_DeviceTree(unsigned int cpu)
min_freq = pFreqPolicy->cpuinfo.min_freq;
cur_freq = pFreqPolicy->cur;
#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 (boost < (BOOST(SIZE) - BOOST(18C)))
{
Core->Boost[BOOST(18C) + boost] = table->frequency
/ UNIT_KHz(PRECISION);
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;
if (boost < (BOOST(SIZE) - BOOST(18C)))
{
Core->Boost[BOOST(18C) + boost].Q = COF.Q;
Core->Boost[BOOST(18C) + boost].R = COF.R;
boost++;
}
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);
memmove(&Core->Boost[BOOST(18C) + diff], &Core->Boost[BOOST(18C)],
boost * sizeof(enum RATIO_BOOST));
memset(&Core->Boost[BOOST(18C)], 0, diff * sizeof(enum RATIO_BOOST));
}
}
#endif
}
#endif /* CONFIG_CPU_FREQ */
Core->Boost[BOOST(MAX)] = max_freq > 0 ? max_freq / UNIT_KHz(PRECISION)
: cntfrq.ClockFreq_Hz;
if (max_freq > 0) {
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)
: 4;
if (min_freq > 0) {
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
@@ -2058,7 +2080,7 @@ static void Query_Voltage_From_OPP(void)
for (boost = BOOST(MIN); boost < BOOST(SIZE) - BOOST(18C); boost++)
{
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 = 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);
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;
continue;
}
@@ -2601,7 +2623,7 @@ static void PerCore_GenericMachine(void *arg)
if (PUBLIC(RO(Proc))->Features.Hybrid) {
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;
}
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);
}
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)
{
@@ -2773,7 +2796,7 @@ static void Controller_Init(void)
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
{
@@ -2784,7 +2807,7 @@ static void Controller_Init(void)
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. */
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].TSC \
* PUBLIC(RO(Proc))->Features.Factory.Clock.Q \
* Core->Boost[BOOST(MAX)] \
* Core->Boost[BOOST(MAX)].Q \
) / PUBLIC(RO(Proc))->Features.Factory.Ratio; \
/* Derive C1: */ \
Core->Counter[T].C1 = \
@@ -3030,7 +3053,7 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
REL_BCLK(Core->Clock, \
(PUBLIC(RO(Proc))->Features.Hybrid == 1 ? \
PUBLIC(RO(Proc))->Features.Factory.Ratio\
: Core->Boost[BOOST(MAX)]), \
: Core->Boost[BOOST(MAX)].Q), \
Core->Delta.TSC, \
PUBLIC(RO(Proc))->SleepInterval); \
} \
@@ -3274,31 +3297,22 @@ static void Generic_Core_Counters_Clear(union SAVE_AREA_CORE *Save,
#ifdef CONFIG_CPU_FREQ
inline COF_UNION Compute_COF_From_CPU_Freq(struct cpufreq_policy *pFreqPolicy)
{
register unsigned long long Q = pFreqPolicy->cur,
D = UNIT_KHz(PRECISION);
COF_UNION ratio = {.COF = {
.Q = Q / D,
.R = (Q - (ratio.COF.Q * D)) / PRECISION }
};
COF_UNION ratio;
FREQ2COF(pFreqPolicy->cur, ratio.COF);
return ratio;
}
#endif /* CONFIG_CPU_FREQ */
inline COF_UNION Compute_COF_From_PMU_Counter( unsigned long long cnt,
CLOCK clk,
unsigned int limit )
COF_ST lowest )
{
register unsigned long long \
Q = cnt * clk.Q,
D = UNIT_MHz(10LLU * PUBLIC(RO(Proc))->SleepInterval);
COF_UNION ratio = {.COF = {
.Q = Q / D }
};
if (ratio.COF.Q < limit) {
ratio.Perf = limit;
} else {
ratio.COF.R = (Q - (ratio.COF.Q * D)) / UNIT_MHz(10LLU);
const unsigned long long PMU_freq = (cnt * clk.Q)
/ (PUBLIC(RO(Proc))->SleepInterval * PRECISION);
COF_UNION ratio;
FREQ2COF(PMU_freq, ratio.COF);
if (ratio.COF.Q < lowest.Q) {
ratio.COF = lowest;
}
return ratio;
}
@@ -3366,7 +3380,8 @@ static enum hrtimer_restart Cycle_GenericMachine(struct hrtimer *pTimer)
Core->Clock,
Core->Boost[BOOST(MIN)]);
#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
{
@@ -3868,10 +3883,10 @@ static int CoreFreqK_Policy_Init(struct cpufreq_policy *policy)
{
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;
policy->cpuinfo.max_freq = (Core->Boost[BOOST(MAX)]
policy->cpuinfo.max_freq = (Core->Boost[BOOST(MAX)].Q
* Core->Clock.Hz) / 1000LLU;
/* 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)));
(*limit) = (Core->Boost[BOOST(MAX)] * Core->Clock.Hz) / 1000LLU;
(*limit) = (Core->Boost[BOOST(MAX)].Q * Core->Clock.Hz) / 1000LLU;
}
return 0;
}
@@ -3941,7 +3956,7 @@ static ssize_t CoreFreqK_Show_SetSpeed(struct cpufreq_policy *policy,char *buf)
boost = BOOST(TGT);
}
return sprintf( buf, "%7llu\n",
(Core->Boost[boost] * Core->Clock.Hz) / 1000LLU );
(Core->Boost[boost].Q * Core->Clock.Hz) / 1000LLU );
}
return 0;
}
@@ -5180,7 +5195,7 @@ static int CoreFreqK_HotPlug_CPU_Online(unsigned int cpu)
PUBLIC(RO(Proc))->Features.Factory.Ratio
: PUBLIC(
RO(Core, AT(PUBLIC(RO(Proc))->Service.Core))
)->Boost[BOOST(MAX)],
)->Boost[BOOST(MAX)].Q,
.R = 0, .Hz = 0
}
};

View File

@@ -302,6 +302,13 @@ struct SMBIOS17
u32 extended_conf_speed; /* 0x58 DWORD */
} __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)
#define RHEL_MAJOR 0
#endif