mirror of
https://github.com/cyring/CoreFreq.git
synced 2025-07-24 04:30:35 +02:00
[AArch64] Adjust frequency division in CNTFRQ
and PMU
counters
This commit is contained in:
@@ -1963,18 +1963,8 @@ static void Query_DeviceTree(unsigned int cpu)
|
|||||||
struct cpufreq_policy *pFreqPolicy = \
|
struct cpufreq_policy *pFreqPolicy = \
|
||||||
&PRIVATE(OF(Core, AT(cpu)))->FreqPolicy;
|
&PRIVATE(OF(Core, AT(cpu)))->FreqPolicy;
|
||||||
#endif
|
#endif
|
||||||
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;
|
COF_ST COF;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"mrs %[cntfrq], cntfrq_el0" "\n\t"
|
|
||||||
"isb"
|
|
||||||
: [cntfrq] "=r" (cntfrq)
|
|
||||||
:
|
|
||||||
: "memory"
|
|
||||||
);
|
|
||||||
cntfrq.value = cntfrq.value / 1000000U;
|
|
||||||
#ifdef CONFIG_CPU_FREQ
|
#ifdef CONFIG_CPU_FREQ
|
||||||
if (cpufreq_get_policy(pFreqPolicy,cpu) == 0)
|
if (cpufreq_get_policy(pFreqPolicy,cpu) == 0)
|
||||||
{
|
{
|
||||||
@@ -2025,6 +2015,16 @@ static void Query_DeviceTree(unsigned int cpu)
|
|||||||
if (max_freq > 0) {
|
if (max_freq > 0) {
|
||||||
FREQ2COF(max_freq, COF);
|
FREQ2COF(max_freq, COF);
|
||||||
} else {
|
} else {
|
||||||
|
volatile CNTFRQ cntfrq;
|
||||||
|
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"mrs %[cntfrq], cntfrq_el0" "\n\t"
|
||||||
|
"isb"
|
||||||
|
: [cntfrq] "=r" (cntfrq)
|
||||||
|
:
|
||||||
|
: "memory"
|
||||||
|
);
|
||||||
|
cntfrq.ClockFreq_Hz = cntfrq.ClockFreq_Hz / 10U;
|
||||||
FREQ2COF(cntfrq.ClockFreq_Hz, COF);
|
FREQ2COF(cntfrq.ClockFreq_Hz, COF);
|
||||||
}
|
}
|
||||||
Core->Boost[BOOST(MAX)].Q = COF.Q;
|
Core->Boost[BOOST(MAX)].Q = COF.Q;
|
||||||
@@ -3303,16 +3303,15 @@ inline COF_UNION Compute_COF_From_CPU_Freq(struct cpufreq_policy *pFreqPolicy)
|
|||||||
}
|
}
|
||||||
#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 deltaCounter,
|
||||||
CLOCK clk,
|
CLOCK clk,
|
||||||
COF_ST lowest )
|
COF_ST lowestRatio )
|
||||||
{
|
{
|
||||||
const unsigned long long PMU_freq = (cnt * clk.Q)
|
|
||||||
/ (PUBLIC(RO(Proc))->SleepInterval * PRECISION);
|
|
||||||
COF_UNION ratio;
|
COF_UNION ratio;
|
||||||
FREQ2COF(PMU_freq, ratio.COF);
|
deltaCounter /= PUBLIC(RO(Proc))->SleepInterval;
|
||||||
if (ratio.COF.Q < lowest.Q) {
|
FREQ2COF(deltaCounter, ratio.COF);
|
||||||
ratio.COF = lowest;
|
if (ratio.COF.Q < lowestRatio.Q) {
|
||||||
|
ratio.COF = lowestRatio;
|
||||||
}
|
}
|
||||||
return ratio;
|
return ratio;
|
||||||
}
|
}
|
||||||
@@ -3407,7 +3406,7 @@ static enum hrtimer_restart Cycle_GenericMachine(struct hrtimer *pTimer)
|
|||||||
case FORMULA_SCOPE_NONE:
|
case FORMULA_SCOPE_NONE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (((PUBLIC(RO(Proc))->Features.Hybrid)
|
if (((PUBLIC(RO(Proc))->Features.Hybrid)
|
||||||
&& (Core->Bind == PUBLIC(RO(Proc))->Service.Hybrid))
|
&& (Core->Bind == PUBLIC(RO(Proc))->Service.Hybrid))
|
||||||
|| (Core->Bind == PUBLIC(RO(Proc))->Service.Core))
|
|| (Core->Bind == PUBLIC(RO(Proc))->Service.Core))
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user