[PATCH] arm64: dts: qcom: hamoa/x1: Fix TODO in system power domain node

Daniel J Blueman posted 1 patch 1 month, 3 weeks ago
arch/arm64/boot/dts/qcom/hamoa.dtsi | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
[PATCH] arm64: dts: qcom: hamoa/x1: Fix TODO in system power domain node
Posted by Daniel J Blueman 1 month, 3 weeks ago
At present, designs based on the Qualcomm X1 Hamoa reference platform have an always-on system power domain since the OF node values aren't implement.

Fix this by using the CPU C4, cluster CL5 and system DRIPS parameters from the ACPI DSDT Windows uses, together with the Low Power Idle _LPI minimum residency of 9000us and wake latency of 5000us as exit latency. Finally, assume the entry latency is the difference of these two values.

Tested on a Lenovo Yoga Slim 7x with Qualcomm X1E-80-100.

Fixes: f33767e3cfa5 ("arm64: dts: qcom: x1e80100: Add missing system-wide PSCI power domain")
Signed-off-by: Daniel J Blueman <daniel@quora.org>
---
 arch/arm64/boot/dts/qcom/hamoa.dtsi | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/qcom/hamoa.dtsi b/arch/arm64/boot/dts/qcom/hamoa.dtsi
index a17900eacb20..64338769bc85 100644
--- a/arch/arm64/boot/dts/qcom/hamoa.dtsi
+++ b/arch/arm64/boot/dts/qcom/hamoa.dtsi
@@ -290,6 +290,14 @@ cluster_cl5: cluster-sleep-1 {
 				exit-latency-us = <4000>;
 				min-residency-us = <7000>;
 			};
+
+			domain_ss3: domain-sleep-0 {
+				compatible = "domain-idle-state";
+				arm,psci-suspend-param = <0x0200c354>;
+				entry-latency-us = <4000>;
+				exit-latency-us = <5000>;
+				min-residency-us = <9000>;
+			};
 		};
 	};
 
@@ -448,7 +456,7 @@ cluster_pd2: power-domain-cpu-cluster2 {
 
 		system_pd: power-domain-system {
 			#power-domain-cells = <0>;
-			/* TODO: system-wide idle states */
+			domain-idle-states = <&domain_ss3>;
 		};
 	};
 
-- 
2.51.0
Re: [PATCH] arm64: dts: qcom: hamoa/x1: Fix TODO in system power domain node
Posted by Bjorn Andersson 1 month, 3 weeks ago
On Sat, Feb 21, 2026 at 06:51:56PM +0800, Daniel J Blueman wrote:
> At present, designs based on the Qualcomm X1 Hamoa reference platform have an always-on system power domain since the OF node values aren't implement.
> 
> Fix this by using the CPU C4, cluster CL5 and system DRIPS parameters from the ACPI DSDT Windows uses, together with the Low Power Idle _LPI minimum residency of 9000us and wake latency of 5000us as exit latency. Finally, assume the entry latency is the difference of these two values.

Please wrap your lines to 72 characters.

Regards,
Bjorn

> 
> Tested on a Lenovo Yoga Slim 7x with Qualcomm X1E-80-100.
> 
> Fixes: f33767e3cfa5 ("arm64: dts: qcom: x1e80100: Add missing system-wide PSCI power domain")
> Signed-off-by: Daniel J Blueman <daniel@quora.org>
> ---
>  arch/arm64/boot/dts/qcom/hamoa.dtsi | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/boot/dts/qcom/hamoa.dtsi b/arch/arm64/boot/dts/qcom/hamoa.dtsi
> index a17900eacb20..64338769bc85 100644
> --- a/arch/arm64/boot/dts/qcom/hamoa.dtsi
> +++ b/arch/arm64/boot/dts/qcom/hamoa.dtsi
> @@ -290,6 +290,14 @@ cluster_cl5: cluster-sleep-1 {
>  				exit-latency-us = <4000>;
>  				min-residency-us = <7000>;
>  			};
> +
> +			domain_ss3: domain-sleep-0 {
> +				compatible = "domain-idle-state";
> +				arm,psci-suspend-param = <0x0200c354>;
> +				entry-latency-us = <4000>;
> +				exit-latency-us = <5000>;
> +				min-residency-us = <9000>;
> +			};
>  		};
>  	};
>  
> @@ -448,7 +456,7 @@ cluster_pd2: power-domain-cpu-cluster2 {
>  
>  		system_pd: power-domain-system {
>  			#power-domain-cells = <0>;
> -			/* TODO: system-wide idle states */
> +			domain-idle-states = <&domain_ss3>;
>  		};
>  	};
>  
> -- 
> 2.51.0
>
Re: [PATCH] arm64: dts: qcom: hamoa/x1: Fix TODO in system power domain node
Posted by Maulik Shah (mkshah) 1 month, 3 weeks ago
On 2/21/2026 4:21 PM, Daniel J Blueman wrote:
> At present, designs based on the Qualcomm X1 Hamoa reference platform have an always-on system power domain since the OF node values aren't implement.

Implemented.

> 
> Fix this by using the CPU C4, cluster CL5 and system DRIPS parameters from the ACPI DSDT Windows uses, together with the Low Power Idle _LPI minimum residency of 9000us and wake latency of 5000us as exit latency. Finally, assume the entry latency is the difference of these two values.

ACPI used 5000usec as total exit latency, with this change total exit latency will be 9000usec (sum of entry + exit).

> 
> Tested on a Lenovo Yoga Slim 7x with Qualcomm X1E-80-100.
> 
> Fixes: f33767e3cfa5 ("arm64: dts: qcom: x1e80100: Add missing system-wide PSCI power domain")

Using this fixes tag, can make the change back ported to stable kernels without dependencies and may break the GPIO IRQs.

Background:

PDC monitors the wakeup capable IRQs during system wide low power state, hitting the system low power mode can break to wake via GPIO IRQs. 
The system-wide idle state was not added since the wakeup capable GPIO IRQs were not configured at PDC with 602cb14e310a
("pinctrl: qcom: x1e80100: Bypass PDC wakeup parent for now").

So IMO this fixes tag should be used instead of above with the changes to configure PDC to monitor GPIO wake ups.
I have these changes to configure GPIO IRQs at PDC and enable back domain_ss3 idle state in my local tree, which i plan to
post this week or next.

Thanks,
Maulik

> Signed-off-by: Daniel J Blueman <daniel@quora.org>
> ---
>  arch/arm64/boot/dts/qcom/hamoa.dtsi | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/boot/dts/qcom/hamoa.dtsi b/arch/arm64/boot/dts/qcom/hamoa.dtsi
> index a17900eacb20..64338769bc85 100644
> --- a/arch/arm64/boot/dts/qcom/hamoa.dtsi
> +++ b/arch/arm64/boot/dts/qcom/hamoa.dtsi
> @@ -290,6 +290,14 @@ cluster_cl5: cluster-sleep-1 {
>  				exit-latency-us = <4000>;
>  				min-residency-us = <7000>;
>  			};
> +
> +			domain_ss3: domain-sleep-0 {
> +				compatible = "domain-idle-state";
> +				arm,psci-suspend-param = <0x0200c354>;
> +				entry-latency-us = <4000>;
> +				exit-latency-us = <5000>;
> +				min-residency-us = <9000>;
> +			};
>  		};
>  	};
>  
> @@ -448,7 +456,7 @@ cluster_pd2: power-domain-cpu-cluster2 {
>  
>  		system_pd: power-domain-system {
>  			#power-domain-cells = <0>;
> -			/* TODO: system-wide idle states */
> +			domain-idle-states = <&domain_ss3>;
>  		};
>  	};
>
Re: [PATCH] arm64: dts: qcom: hamoa/x1: Fix TODO in system power domain node
Posted by Bjorn Andersson 1 month, 3 weeks ago
On Mon, Feb 23, 2026 at 09:41:04AM +0530, Maulik Shah (mkshah) wrote:
> 
> On 2/21/2026 4:21 PM, Daniel J Blueman wrote:
> > At present, designs based on the Qualcomm X1 Hamoa reference platform have an always-on system power domain since the OF node values aren't implement.
> 
> Implemented.
> 
> > 
> > Fix this by using the CPU C4, cluster CL5 and system DRIPS parameters from the ACPI DSDT Windows uses, together with the Low Power Idle _LPI minimum residency of 9000us and wake latency of 5000us as exit latency. Finally, assume the entry latency is the difference of these two values.
> 
> ACPI used 5000usec as total exit latency, with this change total exit latency will be 9000usec (sum of entry + exit).
> 
> > 
> > Tested on a Lenovo Yoga Slim 7x with Qualcomm X1E-80-100.
> > 
> > Fixes: f33767e3cfa5 ("arm64: dts: qcom: x1e80100: Add missing system-wide PSCI power domain")
> 
> Using this fixes tag, can make the change back ported to stable kernels without dependencies and may break the GPIO IRQs.
> 
> Background:
> 
> PDC monitors the wakeup capable IRQs during system wide low power state, hitting the system low power mode can break to wake via GPIO IRQs. 
> The system-wide idle state was not added since the wakeup capable GPIO IRQs were not configured at PDC with 602cb14e310a
> ("pinctrl: qcom: x1e80100: Bypass PDC wakeup parent for now").
> 
> So IMO this fixes tag should be used instead of above with the changes to configure PDC to monitor GPIO wake ups.
> I have these changes to configure GPIO IRQs at PDC and enable back domain_ss3 idle state in my local tree, which i plan to
> post this week or next.
> 

No, this patch does not fix 602cb14e310a ("pinctrl: qcom: x1e80100:
Bypass PDC wakeup parent for now"), please see
Documentation/process/stable-kernel-rules.rst on how to document
dependencies for fixes.

It could however be argued that this doesn't fix a bug with f33767e3cfa5
("arm64: dts: qcom: x1e80100: Add missing system-wide PSCI power
domain"), but instead just implements the missing domain-idle-state
(i.e. drop the Fixes).


PS. What I do expect is that 602cb14e310a ("pinctrl: qcom: x1e80100:
Bypass PDC wakeup parent for now") should have been reverted once the
PDC driver gained the necessary workarounds!

Regards,
Bjorn

> Thanks,
> Maulik
> 
> > Signed-off-by: Daniel J Blueman <daniel@quora.org>
> > ---
> >  arch/arm64/boot/dts/qcom/hamoa.dtsi | 10 +++++++++-
> >  1 file changed, 9 insertions(+), 1 deletion(-)
> > 
> > diff --git a/arch/arm64/boot/dts/qcom/hamoa.dtsi b/arch/arm64/boot/dts/qcom/hamoa.dtsi
> > index a17900eacb20..64338769bc85 100644
> > --- a/arch/arm64/boot/dts/qcom/hamoa.dtsi
> > +++ b/arch/arm64/boot/dts/qcom/hamoa.dtsi
> > @@ -290,6 +290,14 @@ cluster_cl5: cluster-sleep-1 {
> >  				exit-latency-us = <4000>;
> >  				min-residency-us = <7000>;
> >  			};
> > +
> > +			domain_ss3: domain-sleep-0 {
> > +				compatible = "domain-idle-state";
> > +				arm,psci-suspend-param = <0x0200c354>;
> > +				entry-latency-us = <4000>;
> > +				exit-latency-us = <5000>;
> > +				min-residency-us = <9000>;
> > +			};
> >  		};
> >  	};
> >  
> > @@ -448,7 +456,7 @@ cluster_pd2: power-domain-cpu-cluster2 {
> >  
> >  		system_pd: power-domain-system {
> >  			#power-domain-cells = <0>;
> > -			/* TODO: system-wide idle states */
> > +			domain-idle-states = <&domain_ss3>;
> >  		};
> >  	};
> >  
>
Re: [PATCH] arm64: dts: qcom: hamoa/x1: Fix TODO in system power domain node
Posted by Val Packett 1 month, 3 weeks ago
On 2/23/26 1:11 AM, Maulik Shah (mkshah) wrote:
> On 2/21/2026 4:21 PM, Daniel J Blueman wrote:
[..]
>> Fix this by using the CPU C4, cluster CL5 and system DRIPS parameters from the ACPI DSDT Windows uses, together with the Low Power Idle _LPI minimum residency of 9000us and wake latency of 5000us as exit latency. Finally, assume the entry latency is the difference of these two values.
[..]
>> Fixes: f33767e3cfa5 ("arm64: dts: qcom: x1e80100: Add missing system-wide PSCI power domain")
> Using this fixes tag, can make the change back ported to stable kernels without dependencies and may break the GPIO IRQs.
>
> Background:
>
> PDC monitors the wakeup capable IRQs during system wide low power state, hitting the system low power mode can break to wake via GPIO IRQs.
> The system-wide idle state was not added since the wakeup capable GPIO IRQs were not configured at PDC with 602cb14e310a
> ("pinctrl: qcom: x1e80100: Bypass PDC wakeup parent for now").
>
> So IMO this fixes tag should be used instead of above with the changes to configure PDC to monitor GPIO wake ups.
> I have these changes to configure GPIO IRQs at PDC and enable back domain_ss3 idle state in my local tree, which i plan to
> post this week or next.

On a previous episode of L-K-M-L… :)

https://lore.kernel.org/all/0c8735f9-eac0-449c-aa95-b82cec0e6cb2@oss.qualcomm.com/

FWIW I have just tested Konrad's patch from there that adds all three 
states (0x02000154, 0x02000254, and 0x0200c354):

❯ doas cat /sys/kernel/debug/pm_genpd/power-domain-system/idle_states
State  Time(ms)       Usage      Rejected   Above      Below S2idle
S0     367            330        9          315        9 0
S1     2719           2057       553        2520       71  0
S2     0              0          1          1          0 0

As of right now I don't see any improvement in idle power consumption 
from just this S1 thing, compared to not adding anything and having the 
implicitly-added-by-code S0 state only.

It still only goes as low as 2.5W in screen-off idle, and that's with 
runtime PM enabled for 3 USB controllers out of 4 (enabling it on all 4 
makes the system shut down), without doing that it's more like 2.75W.

---

Maulik, since you seem to be the oss.qualcomm person familiar with power 
management — could you please shine some light onto the mystery of how 
Windows achieves ~0.5W battery consumption in screen-off idle (and only 
slightly higher in screen-on idle) i.e. what exactly could be wasting 
those extra 2W under Linux? Ever since people started daily driving X 
series based laptops this has been an eternal topic/question in 
aarch64-laptops…

Is it just Windows doing something "extraordinary" like opportunistic 
full-system sleep (as deep as CX collapse), even with display on and in PSR?

Or are we still missing something big in Linux?

That issue with runtime-suspending all four USB controllers shutting the 
system down, does that mean there's some rail where USB ends up being 
the last load-bearing thing holding it up and we'd like to let it go 
down properly?


Thanks
~val

Re: [PATCH] arm64: dts: qcom: hamoa/x1: Fix TODO in system power domain node
Posted by Bjorn Andersson 1 month, 3 weeks ago
On Mon, Feb 23, 2026 at 02:51:44AM -0300, Val Packett wrote:
> On 2/23/26 1:11 AM, Maulik Shah (mkshah) wrote:
> > On 2/21/2026 4:21 PM, Daniel J Blueman wrote:
[..]
> That issue with runtime-suspending all four USB controllers shutting the
> system down, does that mean there's some rail where USB ends up being the
> last load-bearing thing holding it up and we'd like to let it go down
> properly?
> 

The three USB nodes have power-domains = <&gcc GCC_USB30_*_GDSC> and
required-opps = <&opp_nom>. &gcc has power-domains = < &rpmhpd CX>.
This means that as long as the USB controllers are active, CX is kept at
at least nominal corner.

The reason why the USB node has &opp_nom is because it's required by the
200MHz MASTER_CLK, which iirc relates to the possibility that you might
have something SuperSpeed connected. (But as we flatten dwc3, we should
be able to scale this based on what is actually connected)

I don't know why there's multiple pm_runtime_forbid() in the USB stack,
this needs to be revisited.


Then to your actual question, yes, if you suspend the USB controllers
and the result is that the system dies, then we have other resources
piggybacking on the USB controllers' votes for CX.

I did some experiments on SC8280XP earlier and was able to drop the
pm_runtime_forbid() - and see CX drop below NOM. Iirc more work was
needed to get reasonable behavior in terms of plug-detect, so the
patches got stuck in their topic branch...

Regards,
Bjorn

> 
> Thanks
> ~val
>