[AArch64] Adjust frequency division in CNTFRQ and PMU counters

This commit is contained in:
CyrIng
2024-07-08 18:37:14 +02:00
parent 6dce6262ee
commit c0367b9325

View File

@@ -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))
{ {