[PATCH v6 11/12] powercap: arm_scmi: Add get_power_uw to synthetic node
Philip Radford
philip.radford at arm.com
Mon May 18 06:52:33 PDT 2026
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 <philip.radford at arm.com>
---
V5->V6
- Moved multiple u64 values to the same line
- Reworked logic to walk SCMI zones and filter by parent
- Added to_scmi_powercap_root macro
---
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 5e7b7a3b79f2..f1cb25a408bb 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 {
@@ -273,9 +276,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.47.3
More information about the linux-arm-kernel
mailing list