From: Antony Kurniawan Soemardi <linux@smankusors.com>
To: Rudraksha Gupta <guptarud@gmail.com>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Andy Gross <agross@kernel.org>
Cc: linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/3] ARM: dts: qcom: msm8960: Add CPU frequency scaling support
Date: Fri, 15 May 2026 08:16:37 +0000 (UTC) [thread overview]
Message-ID: <07422376-528e-4824-98e0-35d79dbd4017@smankusors.com> (raw)
In-Reply-To: <20260514-expressatt_cpufreq-v1-3-487fd2d78859@gmail.com>
On 5/14/2026 2:04 PM, Rudraksha Gupta wrote:
> Enable Krait DVFS on MSM8960 by adding the required device tree nodes:
>
> - OPP table with 12 operating points from 384 MHz to 1.512 GHz, with
> per-PVS voltages for slow, nominal, and fast silicon bins.
> - Krait clock controller (krait-cc-v1) driving the CPU muxes from
> PLL9/PLL10, ACC aux outputs, and PXO.
> - PVS efuse nvmem cell in qfprom for the cpufreq-nvmem driver to
> read the speed-bin and process voltage class.
> - CPU idle state for Standalone Power Collapse (SPC).
> - operating-points-v2, clocks, cpu-supply, and cpu-idle-states wired
> into both CPU nodes.
>
> Link: https://github.com/CyanogenMod/android_kernel_samsung_d2/blob/0dbe2b56847b304d30b809dfd08ba3b4a61d9af8/arch/arm/mach-msm/acpuclock-8960.c#L120-L235
> Assisted-by: Claude:claude-opus-4.6
> Signed-off-by: Rudraksha Gupta <guptarud@gmail.com>
> ---
> arch/arm/boot/dts/qcom/qcom-msm8960.dtsi | 133 ++++++++++++++++++++++++++++++-
> 1 file changed, 131 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/boot/dts/qcom/qcom-msm8960.dtsi b/arch/arm/boot/dts/qcom/qcom-msm8960.dtsi
> index a427f0f41cd1..b5b9239c7aa0 100644
> --- a/arch/arm/boot/dts/qcom/qcom-msm8960.dtsi
> +++ b/arch/arm/boot/dts/qcom/qcom-msm8960.dtsi
> @@ -54,6 +54,10 @@ cpu@0 {
> reg = <0>;
> enable-method = "qcom,kpss-acc-v1";
> device_type = "cpu";
> + operating-points-v2 = <&cpu_opp_table>;
> + clocks = <&kraitcc 0>;
> + cpu-supply = <&saw0_vreg>;
> + cpu-idle-states = <&cpu_spc>;
> next-level-cache = <&l2>;
> qcom,acc = <&acc0>;
> qcom,saw = <&saw0>;
> @@ -64,6 +68,10 @@ cpu@1 {
> reg = <1>;
> enable-method = "qcom,kpss-acc-v1";
> device_type = "cpu";
> + operating-points-v2 = <&cpu_opp_table>;
> + clocks = <&kraitcc 1>;
> + cpu-supply = <&saw1_vreg>;
> + cpu-idle-states = <&cpu_spc>;
> next-level-cache = <&l2>;
> qcom,acc = <&acc1>;
> qcom,saw = <&saw1>;
> @@ -74,6 +82,116 @@ l2: l2-cache {
> cache-level = <2>;
> cache-unified;
> };
> +
> + idle-states {
> + cpu_spc: cpu-spc {
> + compatible = "qcom,idle-state-spc", "arm,idle-state";
> + entry-latency-us = <400>;
> + exit-latency-us = <900>;
> + min-residency-us = <3000>;
> + };
> + };
> + };
> +
> + cpu_opp_table: opp-table-cpu {
> + compatible = "operating-points-v2-krait-cpu";
> + nvmem-cells = <&pvs_efuse>;
> +
> + opp-384000000 {
> + opp-hz = /bits/ 64 <384000000>;
> + opp-microvolt-speed0-pvs0-v0 = <950000>;
> + opp-microvolt-speed0-pvs1-v0 = <900000>;
> + opp-microvolt-speed0-pvs3-v0 = <850000>;
The Sashiko bot comment about the binding schema is valid, I encountered
the following warnings:
/mnt/linux/.output/arch/arm/boot/dts/qcom/qcom-msm8960-sony-huashan.dtb:
/ (sony,huashan): opp-table-cpu:opp-384000000:
'opp-microvolt-speed0-pvs0-v0', 'opp-microvolt-speed0-pvs1-v0',
'opp-microvolt-speed0-pvs3-v0' do not match any of the regexes:
'^opp-microvolt-speed[0-9]+-pvs[0-9]+$', '^pinctrl-[0-9]+$'
from schema $id:
http://devicetree.org/schemas/cpufreq/qcom-cpufreq-nvmem.yaml
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-486000000 {
> + opp-hz = /bits/ 64 <486000000>;
> + opp-microvolt-speed0-pvs0-v0 = <975000>;
> + opp-microvolt-speed0-pvs1-v0 = <925000>;
> + opp-microvolt-speed0-pvs3-v0 = <875000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-594000000 {
> + opp-hz = /bits/ 64 <594000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1000000>;
> + opp-microvolt-speed0-pvs1-v0 = <950000>;
> + opp-microvolt-speed0-pvs3-v0 = <900000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-702000000 {
> + opp-hz = /bits/ 64 <702000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1025000>;
> + opp-microvolt-speed0-pvs1-v0 = <975000>;
> + opp-microvolt-speed0-pvs3-v0 = <925000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-810000000 {
> + opp-hz = /bits/ 64 <810000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1075000>;
> + opp-microvolt-speed0-pvs1-v0 = <1025000>;
> + opp-microvolt-speed0-pvs3-v0 = <975000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-918000000 {
> + opp-hz = /bits/ 64 <918000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1100000>;
> + opp-microvolt-speed0-pvs1-v0 = <1050000>;
> + opp-microvolt-speed0-pvs3-v0 = <1000000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-1026000000 {
> + opp-hz = /bits/ 64 <1026000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1125000>;
> + opp-microvolt-speed0-pvs1-v0 = <1075000>;
> + opp-microvolt-speed0-pvs3-v0 = <1025000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-1134000000 {
> + opp-hz = /bits/ 64 <1134000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1175000>;
> + opp-microvolt-speed0-pvs1-v0 = <1125000>;
> + opp-microvolt-speed0-pvs3-v0 = <1075000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-1242000000 {
> + opp-hz = /bits/ 64 <1242000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1200000>;
> + opp-microvolt-speed0-pvs1-v0 = <1150000>;
> + opp-microvolt-speed0-pvs3-v0 = <1100000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-1350000000 {
> + opp-hz = /bits/ 64 <1350000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1225000>;
> + opp-microvolt-speed0-pvs1-v0 = <1175000>;
> + opp-microvolt-speed0-pvs3-v0 = <1125000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-1458000000 {
> + opp-hz = /bits/ 64 <1458000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1237500>;
> + opp-microvolt-speed0-pvs1-v0 = <1187500>;
> + opp-microvolt-speed0-pvs3-v0 = <1137500>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> +
> + opp-1512000000 {
> + opp-hz = /bits/ 64 <1512000000>;
> + opp-microvolt-speed0-pvs0-v0 = <1250000>;
> + opp-microvolt-speed0-pvs1-v0 = <1200000>;
> + opp-microvolt-speed0-pvs3-v0 = <1150000>;
> + opp-supported-hw = <0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF>;
> + };
> };
>
> memory@80000000 {
> @@ -81,6 +199,13 @@ memory@80000000 {
> reg = <0x80000000 0>;
> };
>
> + kraitcc: clock-controller {
> + compatible = "qcom,krait-cc-v1";
> + clocks = <&gcc PLL9>, <&gcc PLL10>, <&acc0>, <&acc1>, <&pxo_board>;
> + clock-names = "hfpll0", "hfpll1", "acpu0_aux", "acpu1_aux", "qsb";
> + #clock-cells = <1>;
> + };
> +
I think the kraitcc node should be placed before the memory node so that
it's sorted alphabetically.
> soc: soc {
> compatible = "simple-bus";
> ranges;
> @@ -112,6 +237,10 @@ qfprom: efuse@700000 {
> #address-cells = <1>;
> #size-cells = <1>;
>
> + pvs_efuse: pvs@c0 {
> + reg = <0xc0 0x04>;
> + };
> +
> tsens_calib: calib@404 {
> reg = <0x404 0x10>;
> };
> @@ -348,7 +477,7 @@ acc0: clock-controller@2088000 {
> };
>
> saw0: power-manager@2089000 {
> - compatible = "qcom,msm8960-saw2-cpu", "qcom,saw2";
> + compatible = "qcom,msm8960-saw2-v1.1-cpu", "qcom,saw2";
> reg = <0x02089000 0x1000>, <0x02009000 0x1000>;
>
> saw0_vreg: regulator {
> @@ -367,7 +496,7 @@ acc1: clock-controller@2098000 {
> };
>
> saw1: power-manager@2099000 {
> - compatible = "qcom,msm8960-saw2-cpu", "qcom,saw2";
> + compatible = "qcom,msm8960-saw2-v1.1-cpu", "qcom,saw2";
> reg = <0x02099000 0x1000>, <0x02009000 0x1000>;
>
> saw1_vreg: regulator {
>
Tested on the Sony Xperia SP (msm8960t), and it works as expected.
# echo performance | tee
/sys/devices/system/cpu/cpufreq/policy*/scaling_governor
# echo 1512000 | tee
/sys/devices/system/cpu/cpufreq/policy*/scaling_max_freq
# 7z b
7-Zip (z) 26.00 (armt) : Copyright (c) 1999-2026 Igor Pavlov : 2026-02-12
32-bit arm_v:7-A thumb:2 locale=C.UTF-8 Threads:2 OPEN_MAX:1024
Compiler: ver:15.2.0 GCC 15.2.0 : FP SIMD32 UNALIGNED
Linux : 7.0.0 : #247 SMP Thu May 14 20:32:48 UTC 2026 : armv7l
PageSize:4KB hwcap:FB8D6:NEON hwcap2:0
armt
1T CPU Freq (MHz): 717 814 815 815 817 799 816
1T CPU Freq (MHz): 100% 815 100% 816
2T CPU Freq (MHz): 196% 800 191% 777
RAM size: 974 MB, # CPU hardware threads: 2
RAM usage: 444 MB, # Benchmark threads: 2
Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS
22: 806 174 451 784 | 24894 193 1102 2126
23: 772 173 456 787 | 24344 194 1084 2107
24: 760 176 464 817 | 23257 194 1051 2042
25: 743 179 475 849 | 22233 193 1025 1979
---------------------------------- | ------------------------------
Avr: 770 175 462 809 | 23682 194 1066 2063
Tot: 184 764 1436
# echo 384000| tee /sys/devices/system/cpu/cpufreq/policy*/scaling_max_freq
# 7z b
7-Zip (z) 26.00 (armt) : Copyright (c) 1999-2026 Igor Pavlov : 2026-02-12
32-bit arm_v:7-A thumb:2 locale=C.UTF-8 Threads:2 OPEN_MAX:1024
Compiler: ver:15.2.0 GCC 15.2.0 : FP SIMD32 UNALIGNED
Linux : 7.0.0 : #247 SMP Thu May 14 20:32:48 UTC 2026 : armv7l
PageSize:4KB hwcap:FB8D6:NEON hwcap2:0
armt
1T CPU Freq (MHz): 210 209 210 210 209 210 210
1T CPU Freq (MHz): 99% 209 100% 210
2T CPU Freq (MHz): 191% 202 190% 200
RAM size: 974 MB, # CPU hardware threads: 2
RAM usage: 444 MB, # Benchmark threads: 2
Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS
22: 295 146 196 287 | 7444 188 337 636
23: 286 148 197 292 | 7302 188 337 632
24: 285 150 205 307 | 7255 191 333 637
25: 282 151 214 322 | 7105 192 330 632
---------------------------------- | ------------------------------
Avr: 287 149 203 302 | 7276 190 334 634
Tot: 169 269 468
Tested-by: Antony Kurniawan Soemardi <linux@smankusors.com>
--
Thanks,
Antony K. S.
next prev parent reply other threads:[~2026-05-15 8:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-14 7:03 [PATCH 0/3] Add cpufreq to MSM8960 Rudraksha Gupta via B4 Relay
2026-05-14 7:04 ` [PATCH 1/3] dt-bindings: soc: qcom: saw2: Rename MSM8960 SAW2 compatible to v1.1 Rudraksha Gupta via B4 Relay
2026-05-14 16:19 ` sashiko-bot
2026-05-15 10:58 ` Krzysztof Kozlowski
2026-05-14 7:04 ` [PATCH 2/3] soc: qcom: spm: Add MSM8960 SAW2 CPU support Rudraksha Gupta via B4 Relay
2026-05-14 17:25 ` sashiko-bot
2026-05-15 9:30 ` Konrad Dybcio
2026-05-14 7:04 ` [PATCH 3/3] ARM: dts: qcom: msm8960: Add CPU frequency scaling support Rudraksha Gupta via B4 Relay
2026-05-14 18:07 ` sashiko-bot
2026-05-15 8:16 ` Antony Kurniawan Soemardi [this message]
2026-05-15 10:59 ` Krzysztof Kozlowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=07422376-528e-4824-98e0-35d79dbd4017@smankusors.com \
--to=linux@smankusors.com \
--cc=agross@kernel.org \
--cc=andersson@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=guptarud@gmail.com \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robh@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox