From: Lukasz Luba <lukasz.luba@xxxxxxx> Add dynamic power coefficient into CPU nodes which let CPUFreq subsystem register the Energy Model (EM) for the CPUs. The 'dynamic-power-coefficient' is used for calculating the dynamic power according to the equation in documentation [1]. The Energy Model (EM) framework relies on calculated power and cost for each OPP. The OPP power values come from CPUFreq driver, which registered required callback function. The simple implementation of a CPUFREQ driver, like cpufreq-dt, uses 'dev_pm_opp_of_register_em()' which relay on 'dynamic-power-coefficient' to calculate the power of requested OPP for the EM [2]. The calculated values might be checked in /sys/kernel/debug/energy_model/pd*/ $ grep . /sys/kernel/debug/energy_model/pd1/cs*/* /sys/kernel/debug/energy_model/pd1/cs:1000000/cost:558 /sys/kernel/debug/energy_model/pd1/cs:1000000/frequency:1000000 /sys/kernel/debug/energy_model/pd1/cs:1000000/power:310 /sys/kernel/debug/energy_model/pd1/cs:1100000/cost:558 /sys/kernel/debug/energy_model/pd1/cs:1100000/frequency:1100000 /sys/kernel/debug/energy_model/pd1/cs:1100000/power:341 /sys/kernel/debug/energy_model/pd1/cs:1200000/cost:558 /sys/kernel/debug/energy_model/pd1/cs:1200000/frequency:1200000 /sys/kernel/debug/energy_model/pd1/cs:1200000/power:372 /sys/kernel/debug/energy_model/pd1/cs:1300000/cost:674 /sys/kernel/debug/energy_model/pd1/cs:1300000/frequency:1300000 /sys/kernel/debug/energy_model/pd1/cs:1300000/power:487 /sys/kernel/debug/energy_model/pd1/cs:1400000/cost:675 ... $ grep . /sys/kernel/debug/energy_model/pd0/cs*/* /sys/kernel/debug/energy_model/pd0/cs:1000000/cost:200 /sys/kernel/debug/energy_model/pd0/cs:1000000/frequency:1000000 /sys/kernel/debug/energy_model/pd0/cs:1000000/power:154 /sys/kernel/debug/energy_model/pd0/cs:1100000/cost:260 /sys/kernel/debug/energy_model/pd0/cs:1100000/frequency:1100000 /sys/kernel/debug/energy_model/pd0/cs:1100000/power:220 /sys/kernel/debug/energy_model/pd0/cs:1200000/cost:260 /sys/kernel/debug/energy_model/pd0/cs:1200000/frequency:1200000 /sys/kernel/debug/energy_model/pd0/cs:1200000/power:240 /sys/kernel/debug/energy_model/pd0/cs:1300000/cost:260 /sys/kernel/debug/energy_model/pd0/cs:1300000/frequency:1300000 /sys/kernel/debug/energy_model/pd0/cs:1300000/power:260 /sys/kernel/debug/energy_model/pd0/cs:200000/cost:130 ... To provide a proper value of the 'dynamic-power-coefficient' the real power can be measured using a dedicated hardware, i.e. INA2xx. The Odroid-XU3 hwmon sensors have been used to capture the power value during a sysbench test running on single core and at each possible OPP. The measured values were divided by 2, since the dynamic power is typically half of the consumed power (the second half is static power). Next, the approximation was made and the power model derived, showing the 'C' value of routhly X. Check the example equations in drivers/opp/of.c [2]. Thus, i.e. the power = 1.0Watt at 1GHz => 0.5W dynamic power => dynamic-power-coefficient = 400 Using this simple technique we can provide and needed coefficient. The approximation does not have to be super precised. The proportion is important and the difference between power consumed by different CPUs running at the same frequency, which is then used in Energy Aware Scheduler algorithms. An example power values on Odroid-XU3: (LITTLE CPU) /sys/kernel/debug/energy_model/pd0/cs:1000000/frequency:1000000 /sys/kernel/debug/energy_model/pd0/cs:1000000/power:154 (big CPU) /sys/kernel/debug/energy_model/pd1/cs:1000000/frequency:1000000 /sys/kernel/debug/energy_model/pd1/cs:1000000/power:310 In Odroid-XU3 case the derived coefficient value for 'big' CPU has: dynamic-power-coefficient = <310>; while the 'LITTLE': dynamic-power-coefficient = <128>; [1] Documentation/devicetree/bindings/arm/cpus.yaml [2] https://elixir.bootlin.com/linux/v5.4/source/drivers/opp/of.c#L1044 Signed-off-by: Lukasz Luba <lukasz.luba@xxxxxxx> --- arch/arm/boot/dts/exynos5422-cpus.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/arm/boot/dts/exynos5422-cpus.dtsi b/arch/arm/boot/dts/exynos5422-cpus.dtsi index 1b8605cf2407..c9a0dc99d2fb 100644 --- a/arch/arm/boot/dts/exynos5422-cpus.dtsi +++ b/arch/arm/boot/dts/exynos5422-cpus.dtsi @@ -31,6 +31,7 @@ operating-points-v2 = <&cluster_a7_opp_table>; #cooling-cells = <2>; /* min followed by max */ capacity-dmips-mhz = <539>; + dynamic-power-coefficient = <128>; }; cpu1: cpu@101 { @@ -43,6 +44,7 @@ operating-points-v2 = <&cluster_a7_opp_table>; #cooling-cells = <2>; /* min followed by max */ capacity-dmips-mhz = <539>; + dynamic-power-coefficient = <128>; }; cpu2: cpu@102 { @@ -55,6 +57,7 @@ operating-points-v2 = <&cluster_a7_opp_table>; #cooling-cells = <2>; /* min followed by max */ capacity-dmips-mhz = <539>; + dynamic-power-coefficient = <128>; }; cpu3: cpu@103 { @@ -67,6 +70,7 @@ operating-points-v2 = <&cluster_a7_opp_table>; #cooling-cells = <2>; /* min followed by max */ capacity-dmips-mhz = <539>; + dynamic-power-coefficient = <128>; }; cpu4: cpu@0 { @@ -79,6 +83,7 @@ operating-points-v2 = <&cluster_a15_opp_table>; #cooling-cells = <2>; /* min followed by max */ capacity-dmips-mhz = <1024>; + dynamic-power-coefficient = <310>; }; cpu5: cpu@1 { @@ -91,6 +96,7 @@ operating-points-v2 = <&cluster_a15_opp_table>; #cooling-cells = <2>; /* min followed by max */ capacity-dmips-mhz = <1024>; + dynamic-power-coefficient = <310>; }; cpu6: cpu@2 { @@ -103,6 +109,7 @@ operating-points-v2 = <&cluster_a15_opp_table>; #cooling-cells = <2>; /* min followed by max */ capacity-dmips-mhz = <1024>; + dynamic-power-coefficient = <310>; }; cpu7: cpu@3 { @@ -115,6 +122,7 @@ operating-points-v2 = <&cluster_a15_opp_table>; #cooling-cells = <2>; /* min followed by max */ capacity-dmips-mhz = <1024>; + dynamic-power-coefficient = <310>; }; }; }; -- 2.17.1