mirror of
https://github.com/cyring/CoreFreq.git
synced 2025-07-23 20:20:40 +02:00
[AArch64] Refactoring the frequency ratios for decimal precision
This commit is contained in:
@@ -211,7 +211,7 @@ typedef struct
|
||||
|
||||
CLOCK Clock;
|
||||
|
||||
unsigned int Boost[BOOST(SIZE)];
|
||||
COF_ST Boost[BOOST(SIZE)];
|
||||
|
||||
COF_UNION Ratio;
|
||||
} CORE_RO;
|
||||
|
@@ -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];
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
@@ -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
|
||||
}
|
||||
};
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user