[PATCH] firmware: psci: handle unsupported SET_SUSPEND_MODE in PC mode
Patrick Delaunay
patrick.delaunay at foss.st.com
Thu Oct 29 11:16:25 PDT 2026
The PSCI specification makes PSCI_SET_SUSPEND_MODE optional. If it
returns NOT_SUPPORTED when Linux requests platform-coordinated (PC)
mode, Linux can assume that PC mode is in effect. Treat this response
as success so PSCI power-domain providers can initialize when firmware
does not support OS-initiated (OSI) mode.
Continue to report an error when OSI mode is requested but
SET_SUSPEND_MODE is not supported.
Fixes: 49fdcd7577ef ("firmware: psci: Export functions to manage the OSI mode")
Signed-off-by: Patrick Delaunay <patrick.delaunay at foss.st.com>
---
This patch allows to Start Linux kernel with
- device tree using PSCI power domains
- with TF-A BL31 compiled without PSCI OSI support (PSCI_OS_INIT_MODE=0)
For example, since commit
9c8d852dabbd ("arm64: dts: st: add power domain on stm32mp25")
we have errors on STM32MP25 boards with latest TF-A (v2.15.0):
[ 0.041800] psci: [Firmware Bug]: failed to set PC mode: -1
[ 0.041814] PM: power-domain-retention: unable to remove subdomain power-domain-cluster
[ 0.042130] PM: genpd_remove: unable to remove power-domain-cluster
[ 0.042313] PM: genpd_remove: unable to remove power-domain-retention
[ 0.042455] CPUidle PSCI: failed to create CPU PM domains ret=-95
[ 0.042465] psci-cpuidle-domain psci: probe with driver psci-cpuidle-domain failed with error -95
and the associated devices are deferred, for example:
[ 10.974374] platform 40130000.i2c: deferred probe pending: platform: wait for supplier /psci/power-domain-cluster
drivers/firmware/psci/psci.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c
index e73bae6cb23a..610756e81363 100644
--- a/drivers/firmware/psci/psci.c
+++ b/drivers/firmware/psci/psci.c
@@ -167,6 +167,11 @@ int psci_set_osi_mode(bool enable)
PSCI_1_0_SUSPEND_MODE_PC;
err = invoke_psci_fn(PSCI_1_0_FN_SET_SUSPEND_MODE, suspend_mode, 0, 0);
+
+ /* when optional PSCI_SET_SUSPEND_MODE is not supported, assume PC mode */
+ if (err == PSCI_RET_NOT_SUPPORTED && !enable)
+ err = 0;
+
if (err < 0)
pr_info(FW_BUG "failed to set %s mode: %d\n",
enable ? "OSI" : "PC", err);
---
base-commit: c339f4010dea8b0d754f84ace70cd1b089878ef8
branch: master
--
2.43.0
More information about the linux-arm-kernel
mailing list