[PATCH v8 12/13] powercap: arm_scmi: Add get_power_uw to synthetic node
Philip Radford <[email protected]> Wed, 1 Jul 2026 12:57:46 +0000
| Newsgroups | org.kernel.vger.arm-scmi,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm |
|---|---|
| Message-ID | <[email protected]> |
Exposes the current power usage from the immediate children of the synthetic (root) powercap node. Iterates over pr->spzones and sums per-zone power. Signed-off-by: Philip Radford <[email protected]> --- drivers/powercap/arm_scmi_powercap.c | 35 ++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/drivers/powercap/arm_scmi_powercap.c b/drivers/powercap/arm_scmi_powercap.c index d45e4af0cdc7..e1bad4b19990 100644 --- a/drivers/powercap/arm_scmi_powercap.c +++ b/drivers/powercap/arm_scmi_powercap.c @@ -17,6 +17,9 @@ #define to_scmi_powercap_zone(z) \ container_of(z, struct scmi_powercap_zone, zone) +#define to_scmi_powercap_root(z) \ + container_of(z, struct scmi_powercap_root, instance_root.zone) + static const struct scmi_powercap_proto_ops *powercap_ops; struct scmi_powercap_zone { @@ -411,9 +414,37 @@ static int instance_root_release(struct powercap_zone *pz) return 0; } -static int instance_root_get_power_uw(struct powercap_zone *pz, u64 *v) +static int instance_root_get_power_uw(struct powercap_zone *pz, u64 *power_uw) { - *v = 0; + struct scmi_powercap_root *pr = to_scmi_powercap_root(pz); + struct scmi_powercap_zone *child; + + u64 p, acc = 0; + int i, ret; + + if (!pz || !power_uw) + return -EINVAL; + + if (!pr) + return -ENODEV; + + for (i = 0; i < pr->num_zones; i++) { + child = &pr->spzones[i]; + + if (!child->registered || child->invalid) + continue; + + if (child->info->parent_id != SCMI_POWERCAP_ROOT_ZONE_ID) + continue; + + ret = scmi_powercap_get_power_uw(&child->zone, &p); + if (!ret) + acc += p; + else + dev_dbg(child->dev, "Failed to read child power: %u\n", ret); + } + + *power_uw = acc; return 0; } -- 2.25.1