* [PATCH 1/2] arm64: dts: qcom: sdm630: Drop the cluster idle states
2026-10-12 2:18 [PATCH 0/2] arm64: dts: qcom: sdm630: Fix the CPU idle states Fabricio Akio via B4 Relay
@ 2026-10-12 2:18 ` Fabricio Akio via B4 Relay
2026-10-15 13:51 ` Konrad Dybcio
2026-10-12 2:18 ` [PATCH 2/2] arm64: dts: qcom: sdm630: Fix the CPU retention idle state parameter Fabricio Akio via B4 Relay
1 sibling, 1 reply; 5+ messages in thread
From: Fabricio Akio via B4 Relay @ 2026-10-12 2:18 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Abel Vesa, Alexey Minnekhanov, Dmitry Baryshkov, Martin Botka,
linux-arm-msm, devicetree, linux-kernel, Fabricio Akio
From: Fabricio Akio <fabricioakio@gmail.com>
The cluster idle states use PSCI parameters 0x400000f2-0x400000f4. The
vendor kernel encodes a cluster state differently: it puts the cluster
mode in StateID bits 7:4 and sets an affinity-level field, bits 25:24,
to 1, so cluster power collapse is 0x41000043, and only the last
running CPU of a cluster requests one. A flat cpu-idle-states list
cannot express that condition.
cpuidle records no successful entry into any of these states, and every
request for one fails. Because they are the deepest, an idle CPU keeps
choosing one, each attempt returns at once, and the CPU spends its idle
time retrying instead of sleeping. On a Motorola Moto X4 (SDM630) with
the screen off, the CPUs made about 133,000 failed idle entries per
second and spent about 10% of the time in an idle state, and the
battery supplied 277 mA. Without these states they spend nearly all of
it in one, and the battery supplies 115 mA.
Fixes: b190fb010664 ("arm64: dts: qcom: sdm630: Add sdm630 dts file")
Signed-off-by: Fabricio Akio <fabricioakio@gmail.com>
---
arch/arm64/boot/dts/qcom/sdm630.dtsi | 108 +++--------------------------------
1 file changed, 8 insertions(+), 100 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/sdm630.dtsi b/arch/arm64/boot/dts/qcom/sdm630.dtsi
index 3a1014804fb0..222ec5886818 100644
--- a/arch/arm64/boot/dts/qcom/sdm630.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm630.dtsi
@@ -55,11 +55,7 @@ cpu0: cpu@100 {
compatible = "arm,cortex-a53";
reg = <0x0 0x100>;
enable-method = "psci";
- cpu-idle-states = <&perf_cpu_sleep_0
- &perf_cpu_sleep_1
- &perf_cluster_sleep_0
- &perf_cluster_sleep_1
- &perf_cluster_sleep_2>;
+ cpu-idle-states = <&perf_cpu_sleep_0 &perf_cpu_sleep_1>;
capacity-dmips-mhz = <1126>;
#cooling-cells = <2>;
next-level-cache = <&l2_1>;
@@ -75,11 +71,7 @@ cpu1: cpu@101 {
compatible = "arm,cortex-a53";
reg = <0x0 0x101>;
enable-method = "psci";
- cpu-idle-states = <&perf_cpu_sleep_0
- &perf_cpu_sleep_1
- &perf_cluster_sleep_0
- &perf_cluster_sleep_1
- &perf_cluster_sleep_2>;
+ cpu-idle-states = <&perf_cpu_sleep_0 &perf_cpu_sleep_1>;
capacity-dmips-mhz = <1126>;
#cooling-cells = <2>;
next-level-cache = <&l2_1>;
@@ -90,11 +82,7 @@ cpu2: cpu@102 {
compatible = "arm,cortex-a53";
reg = <0x0 0x102>;
enable-method = "psci";
- cpu-idle-states = <&perf_cpu_sleep_0
- &perf_cpu_sleep_1
- &perf_cluster_sleep_0
- &perf_cluster_sleep_1
- &perf_cluster_sleep_2>;
+ cpu-idle-states = <&perf_cpu_sleep_0 &perf_cpu_sleep_1>;
capacity-dmips-mhz = <1126>;
#cooling-cells = <2>;
next-level-cache = <&l2_1>;
@@ -105,11 +93,7 @@ cpu3: cpu@103 {
compatible = "arm,cortex-a53";
reg = <0x0 0x103>;
enable-method = "psci";
- cpu-idle-states = <&perf_cpu_sleep_0
- &perf_cpu_sleep_1
- &perf_cluster_sleep_0
- &perf_cluster_sleep_1
- &perf_cluster_sleep_2>;
+ cpu-idle-states = <&perf_cpu_sleep_0 &perf_cpu_sleep_1>;
capacity-dmips-mhz = <1126>;
#cooling-cells = <2>;
next-level-cache = <&l2_1>;
@@ -120,11 +104,7 @@ cpu4: cpu@0 {
compatible = "arm,cortex-a53";
reg = <0x0 0x0>;
enable-method = "psci";
- cpu-idle-states = <&pwr_cpu_sleep_0
- &pwr_cpu_sleep_1
- &pwr_cluster_sleep_0
- &pwr_cluster_sleep_1
- &pwr_cluster_sleep_2>;
+ cpu-idle-states = <&pwr_cpu_sleep_0 &pwr_cpu_sleep_1>;
capacity-dmips-mhz = <1024>;
#cooling-cells = <2>;
next-level-cache = <&l2_0>;
@@ -140,11 +120,7 @@ cpu5: cpu@1 {
compatible = "arm,cortex-a53";
reg = <0x0 0x1>;
enable-method = "psci";
- cpu-idle-states = <&pwr_cpu_sleep_0
- &pwr_cpu_sleep_1
- &pwr_cluster_sleep_0
- &pwr_cluster_sleep_1
- &pwr_cluster_sleep_2>;
+ cpu-idle-states = <&pwr_cpu_sleep_0 &pwr_cpu_sleep_1>;
capacity-dmips-mhz = <1024>;
#cooling-cells = <2>;
next-level-cache = <&l2_0>;
@@ -155,11 +131,7 @@ cpu6: cpu@2 {
compatible = "arm,cortex-a53";
reg = <0x0 0x2>;
enable-method = "psci";
- cpu-idle-states = <&pwr_cpu_sleep_0
- &pwr_cpu_sleep_1
- &pwr_cluster_sleep_0
- &pwr_cluster_sleep_1
- &pwr_cluster_sleep_2>;
+ cpu-idle-states = <&pwr_cpu_sleep_0 &pwr_cpu_sleep_1>;
capacity-dmips-mhz = <1024>;
#cooling-cells = <2>;
next-level-cache = <&l2_0>;
@@ -170,11 +142,7 @@ cpu7: cpu@3 {
compatible = "arm,cortex-a53";
reg = <0x0 0x3>;
enable-method = "psci";
- cpu-idle-states = <&pwr_cpu_sleep_0
- &pwr_cpu_sleep_1
- &pwr_cluster_sleep_0
- &pwr_cluster_sleep_1
- &pwr_cluster_sleep_2>;
+ cpu-idle-states = <&pwr_cpu_sleep_0 &pwr_cpu_sleep_1>;
capacity-dmips-mhz = <1024>;
#cooling-cells = <2>;
next-level-cache = <&l2_0>;
@@ -258,66 +226,6 @@ perf_cpu_sleep_1: cpu-sleep-1-1 {
min-residency-us = <1000>;
local-timer-stop;
};
-
- pwr_cluster_sleep_0: cluster-sleep-0-0 {
- compatible = "arm,idle-state";
- idle-state-name = "pwr-cluster-dynamic-retention";
- arm,psci-suspend-param = <0x400000f2>;
- entry-latency-us = <284>;
- exit-latency-us = <384>;
- min-residency-us = <9987>;
- local-timer-stop;
- };
-
- pwr_cluster_sleep_1: cluster-sleep-0-1 {
- compatible = "arm,idle-state";
- idle-state-name = "pwr-cluster-retention";
- arm,psci-suspend-param = <0x400000f3>;
- entry-latency-us = <338>;
- exit-latency-us = <423>;
- min-residency-us = <9987>;
- local-timer-stop;
- };
-
- pwr_cluster_sleep_2: cluster-sleep-0-2 {
- compatible = "arm,idle-state";
- idle-state-name = "pwr-cluster-retention";
- arm,psci-suspend-param = <0x400000f4>;
- entry-latency-us = <515>;
- exit-latency-us = <1821>;
- min-residency-us = <9987>;
- local-timer-stop;
- };
-
- perf_cluster_sleep_0: cluster-sleep-1-0 {
- compatible = "arm,idle-state";
- idle-state-name = "perf-cluster-dynamic-retention";
- arm,psci-suspend-param = <0x400000f2>;
- entry-latency-us = <272>;
- exit-latency-us = <329>;
- min-residency-us = <9987>;
- local-timer-stop;
- };
-
- perf_cluster_sleep_1: cluster-sleep-1-1 {
- compatible = "arm,idle-state";
- idle-state-name = "perf-cluster-retention";
- arm,psci-suspend-param = <0x400000f3>;
- entry-latency-us = <332>;
- exit-latency-us = <368>;
- min-residency-us = <9987>;
- local-timer-stop;
- };
-
- perf_cluster_sleep_2: cluster-sleep-1-2 {
- compatible = "arm,idle-state";
- idle-state-name = "perf-cluster-retention";
- arm,psci-suspend-param = <0x400000f4>;
- entry-latency-us = <545>;
- exit-latency-us = <1609>;
- min-residency-us = <9987>;
- local-timer-stop;
- };
};
};
--
2.56.0
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 2/2] arm64: dts: qcom: sdm630: Fix the CPU retention idle state parameter
2026-10-12 2:18 [PATCH 0/2] arm64: dts: qcom: sdm630: Fix the CPU idle states Fabricio Akio via B4 Relay
2026-10-12 2:18 ` [PATCH 1/2] arm64: dts: qcom: sdm630: Drop the cluster " Fabricio Akio via B4 Relay
@ 2026-10-12 2:18 ` Fabricio Akio via B4 Relay
2026-10-15 13:41 ` Konrad Dybcio
1 sibling, 1 reply; 5+ messages in thread
From: Fabricio Akio via B4 Relay @ 2026-10-12 2:18 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Abel Vesa, Alexey Minnekhanov, Dmitry Baryshkov, Martin Botka,
linux-arm-msm, devicetree, linux-kernel, Fabricio Akio
From: Fabricio Akio <fabricioakio@gmail.com>
The CPU retention states set bit 30 of their PSCI power_state, which
marks a state that loses context. Retention keeps it, and the vendor
kernel requests it as 0x00000002.
With bit 30 set, no entry into these states succeeds on a Motorola Moto
X4 (SDM630). With it clear they are entered about 50 times per second
across the CPUs, and the failed idle entries across all states drop
from about 30 to about 9 per second.
Fixes: b190fb010664 ("arm64: dts: qcom: sdm630: Add sdm630 dts file")
Signed-off-by: Fabricio Akio <fabricioakio@gmail.com>
---
arch/arm64/boot/dts/qcom/sdm630.dtsi | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/sdm630.dtsi b/arch/arm64/boot/dts/qcom/sdm630.dtsi
index 222ec5886818..a58bad0fb638 100644
--- a/arch/arm64/boot/dts/qcom/sdm630.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm630.dtsi
@@ -192,7 +192,7 @@ idle-states {
pwr_cpu_sleep_0: cpu-sleep-0-0 {
compatible = "arm,idle-state";
idle-state-name = "pwr-retention";
- arm,psci-suspend-param = <0x40000002>;
+ arm,psci-suspend-param = <0x00000002>;
entry-latency-us = <338>;
exit-latency-us = <423>;
min-residency-us = <200>;
@@ -211,7 +211,7 @@ pwr_cpu_sleep_1: cpu-sleep-0-1 {
perf_cpu_sleep_0: cpu-sleep-1-0 {
compatible = "arm,idle-state";
idle-state-name = "perf-retention";
- arm,psci-suspend-param = <0x40000002>;
+ arm,psci-suspend-param = <0x00000002>;
entry-latency-us = <154>;
exit-latency-us = <87>;
min-residency-us = <200>;
--
2.56.0
^ permalink raw reply [flat|nested] 5+ messages in thread