Hi guys, This series adds support for CPPC's delivered and reference performance counters through the FFH methods by using the AMU equivalent core and constant cycle counters.
This support is added in patch 4/4, while the first 3 patches generalise the existing AMU counter read and validation functionality to be reused for this usecase. The specification that drove this implementation can be found at [1], chapter 3.2. The code was tested on a Armv8-A Base Platform FVP: Architecture Envelope Model [2] with the following _CPC entry for all CPUs: Name(_CPC, Package() { 23, // NumEntries 3, // Revision 100, // Highest Performance - Fixed 100MHz 100, // Nominal Performance - Fixed 100MHz 1, // Lowest Nonlinear Performance 1, // Lowest Performance ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Guaranteed Performance Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Desired Perf Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Minimum Performance Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Maximum Performance Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Performance Red. Tolerance Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Time Window Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Counter Wraparound Time ResourceTemplate(){Register(FFixedHW, 0x40, 0, 1, 0x4)}, // Reference Performance Counter Register ResourceTemplate(){Register(FFixedHW, 0x40, 0, 0, 0x4)}, // Delivered Performance Counter Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Performance Ltd Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // CPPC Enable Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Autonomous Selection Enable ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Autonomous Activity Window Register ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, // Energy Performance Preference Register 100, // Reference Performance - Fixed 100MHz 1, // Lowest Frequency 100, // Nominal Frequency - Fixed 100MHz }) The following configuration is necessary for Activity Monitors use: cluster0.has_arm_v8-4=1 cluster1.has_arm_v8-4=1 cluster0.has_amu=1 cluster1.has_amu=1 To be noted: - The FVP has fixed core and constant frequency of 100MHz - The kernel I used for testing had some extra debug information as you can see below: $ cat /sys/devices/system/cpu/cpufreq/policy*/cpuinfo_cur_freq [ 23.850590] CPPC: Delivered perf (core_cnt*ref_perf/const_cnt): (2402*100)/2402=100. 100000 [ 23.851246] CPPC: Delivered perf (core_cnt*ref_perf/const_cnt): (2402*100)/2402=100. 100000 [ 23.851826] CPPC: Delivered perf (core_cnt*ref_perf/const_cnt): (2873*100)/2872=100. 100000 [ 23.852326] CPPC: Delivered perf (core_cnt*ref_perf/const_cnt): (2402*100)/2402=100. 100000 [ 23.852747] CPPC: Delivered perf (core_cnt*ref_perf/const_cnt): (2309*100)/2309=100. 100000 [ 23.853228] CPPC: Delivered perf (core_cnt*ref_perf/const_cnt): (1333*100)/1333=100. 100000 [ 23.854097] CPPC: Delivered perf (core_cnt*ref_perf/const_cnt): (18762*100)/20003=93. 93000 [ 23.854890] CPPC: Delivered perf (core_cnt*ref_perf/const_cnt): (20047*100)/20051=99. 99000 [1] https://documentation-service.arm.com/static/5f106ad60daa596235e80081 [2] https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms Thanks, Ionela. Ionela Voinescu (4): arm64: cpufeature: restructure AMU feedback function arm64: wrap and generalise counter read functions arm64: split counter validation function arm64: implement CPPC FFH support using AMUs arch/arm64/include/asm/cpufeature.h | 6 +- arch/arm64/kernel/cpufeature.c | 15 ++- arch/arm64/kernel/topology.c | 147 ++++++++++++++++++++++------ 3 files changed, 129 insertions(+), 39 deletions(-) base-commit: 3a00d3dfd4b68b208ecd5405e676d06c8ad6bb63 -- 2.17.1