From: Ulf Hansson <ulf.hansson@oss.qualcomm.com>
To: Sudeep Holla <sudeep.holla@kernel.org>,
"Rafael J . Wysocki" <rafael@kernel.org>,
Daniel Lezcano <daniel.lezcano@kernel.org>,
linux-pm@vger.kernel.org
Cc: Lorenzo Pieralisi <lpieralisi@kernel.org>,
Christian Loehle <christian.loehle@arm.com>,
Maulik Shah <maulik.shah@oss.qualcomm.com>,
Yuanfang Zhang <yuanfang.zhang@oss.qualcomm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Ulf Hansson <ulf.hansson@oss.qualcomm.com>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Ulf Hansson <ulfh@kernel.org>
Subject: [RFC PATCH 3/3] cpuidle: psci: Initialize the PM domains in powered off state for OSI
Date: Wed, 19 Aug 2026 17:14:53 +0200 [thread overview]
Message-ID: <20260819151457.256959-4-ulf.hansson@oss.qualcomm.com> (raw)
In-Reply-To: <20260819151457.256959-1-ulf.hansson@oss.qualcomm.com>
From: Ulf Hansson <ulfh@kernel.org>
At the point when the PM domain and the topology are registered through the
genpd subsystem, it's not really known whether corresponding CPUs are
online and thus if the PM domain should be initialized as powered on or
not. Instead this information becomes available when the CPU devices gets
attached to their respective PM domain through dt_idle_attach_cpu().
This is a problem when using PSCI OS-initiated mode, as we may end up with
a PM domain that has the genpd's status indicating it to be powered on,
while it in fact may not be the case. In the less severe scenario, this
leads to selecting a shallower domain idle state for the PM domain than
necessary. A more critical problem is when a non-CPU device shares the PM
domain, leading to their corresponding drivers not being able to trust the
status of it.
Let's fix these problems by initializing the state for the genpd's to be
powered off and in the deepest possible domain idle state, when using
OS-initiated mode. The support for ->sync_state() is maintained by setting
the GENPD_FLAG_OFF_STAY_ON for the genpds in question.
Reported-by: Maulik Shah <maulik.shah@oss.qualcomm.com>
Link: https://lore.kernel.org/all/20260811-domain_off_ss3-v1-0-6a0a0fc023f5@oss.qualcomm.com/
Signed-off-by: Ulf Hansson <ulfh@kernel.org>
---
drivers/cpuidle/cpuidle-psci-domain.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/cpuidle/cpuidle-psci-domain.c b/drivers/cpuidle/cpuidle-psci-domain.c
index b9e4ad7d43a3..29caf3114185 100644
--- a/drivers/cpuidle/cpuidle-psci-domain.c
+++ b/drivers/cpuidle/cpuidle-psci-domain.c
@@ -68,7 +68,8 @@ static int psci_pd_init(struct device_node *np, bool use_osi)
*/
if (use_osi) {
pd->power_off = psci_pd_power_off;
- pd->flags |= GENPD_FLAG_ACTIVE_WAKEUP;
+ pd->flags |= GENPD_FLAG_ACTIVE_WAKEUP | GENPD_FLAG_OFF_STAY_ON;
+ pd->state_idx = pd->state_count ? pd->state_count - 1 : 0;
if (IS_ENABLED(CONFIG_PREEMPT_RT))
pd->flags |= GENPD_FLAG_RPM_ALWAYS_ON;
} else {
@@ -78,7 +79,7 @@ static int psci_pd_init(struct device_node *np, bool use_osi)
/* Use governor for CPU PM domains if it has some states to manage. */
pd_gov = pd->states ? &pm_domain_cpu_gov : NULL;
- ret = pm_genpd_init(pd, pd_gov, false);
+ ret = pm_genpd_init(pd, pd_gov, !use_osi);
if (ret)
goto free_pd_prov;
--
2.43.0
next prev parent reply other threads:[~2026-08-19 15:15 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-19 15:14 [RFC PATCH 0/3] pmdomain/cpuidle-psci: Fix behaviours for CPU PM domains Ulf Hansson
2026-08-19 15:14 ` [RFC PATCH 1/3] pmdomain: core: Allow a non-CPU device in a CPU PM domain to do power on Ulf Hansson
2026-08-19 17:51 ` Abel Vesa
2026-08-20 9:59 ` Ulf Hansson
2026-08-19 15:14 ` [RFC PATCH 2/3] pmdomain: core: Add a genpd config to support unknown initial status Ulf Hansson
2026-08-19 17:40 ` Abel Vesa
2026-08-20 9:56 ` Ulf Hansson
2026-08-20 20:31 ` Abel Vesa
2026-08-19 15:14 ` Ulf Hansson [this message]
2026-08-21 3:24 ` [RFC PATCH 3/3] cpuidle: psci: Initialize the PM domains in powered off state for OSI Abel Vesa
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=20260819151457.256959-4-ulf.hansson@oss.qualcomm.com \
--to=ulf.hansson@oss.qualcomm.com \
--cc=christian.loehle@arm.com \
--cc=daniel.lezcano@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=maulik.shah@oss.qualcomm.com \
--cc=rafael@kernel.org \
--cc=sudeep.holla@kernel.org \
--cc=suzuki.poulose@arm.com \
--cc=ulfh@kernel.org \
--cc=yuanfang.zhang@oss.qualcomm.com \
/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