[PATCH v9 09/13] powercap: arm_scmi: Enable multiple constraints support

From: Philip Radford

Date: Wed Sep 09 2026 - 18:20:19 EST


From: Cristian Marussi <cristian.marussi@xxxxxxx>

Initialize the domains with all the discovered available constraints,
making available multiple per-domain constraints when the platform has
advertised support for multiple concurrent power limits.

CC: "Rafael J. Wysocki" <rafael@xxxxxxxxxx>
CC: linux-pm@xxxxxxxxxxxxxxx
Signed-off-by: Cristian Marussi <cristian.marussi@xxxxxxx>
[Philip: Amended Copyright]
Signed-off-by: Philip Radford <philip.radford@xxxxxxx>
---
V8->V9
- Added validation check to make sure powercap domain doesn't have too
many constraints
---
drivers/powercap/arm_scmi_powercap.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/powercap/arm_scmi_powercap.c b/drivers/powercap/arm_scmi_powercap.c
index 2d9370aaaf5d..bcd1ba0bde8c 100644
--- a/drivers/powercap/arm_scmi_powercap.c
+++ b/drivers/powercap/arm_scmi_powercap.c
@@ -2,7 +2,7 @@
/*
* SCMI Powercap support.
*
- * Copyright (C) 2022 ARM Ltd.
+ * Copyright (C) 2022-2026 ARM Ltd.
*/

#include <linux/device.h>
@@ -491,7 +491,7 @@ static int scmi_powercap_register_zone(struct scmi_powercap_root *pr,

z = powercap_register_zone(&spz->zone, scmi_top_pcntrl, spz->info->name,
parent ? &parent->zone : NULL,
- &zone_ops, 1, &constraint_ops);
+ &zone_ops, spz->info->num_cpli, &constraint_ops);
if (!IS_ERR(z)) {
spz->height = scmi_powercap_get_zone_height(spz);
spz->registered = true;
@@ -649,6 +649,13 @@ static int scmi_powercap_probe(struct scmi_device *sdev)
*/
spz->info = powercap_ops->info_get(ph, i);

+ if (spz->info->num_cpli > MAX_CONSTRAINTS_PER_ZONE) {
+ dev_err(dev, "Powercap domain %s has too many constraints: %u > %u\n",
+ spz->info->name, spz->info->num_cpli,
+ MAX_CONSTRAINTS_PER_ZONE);
+ return -EINVAL;
+ }
+
spz->dev = dev;
spz->ph = ph;
spz->spzones = pr->spzones;
--
2.25.1