]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
pmdomain: core: Extend statistics for domain idle states with s2idle data
authorUlf Hansson <ulf.hansson@linaro.org>
Mon, 19 Jan 2026 14:31:15 +0000 (15:31 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 1 Apr 2026 11:07:31 +0000 (13:07 +0200)
To allow user space to monitor the selection of the domain idle state
during s2idle for a CPU PM domain, let's extend the debugfs support in
genpd with this information.

Suggested-by: Dhruva Gole <d-gole@ti.com>
Reviewed-by: Dhruva Gole <d-gole@ti.com>
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/pmdomain/core.c
include/linux/pm_domain.h

index 4e9088ce3a2551b015e97cbb10a4f6aa3edf2429..4d32fc676aaf53cf610967ce1c0cd95dba75e0f6 100644 (file)
@@ -1438,6 +1438,13 @@ static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock,
                return;
        } else {
                genpd->states[genpd->state_idx].usage++;
+
+               /*
+                * The ->system_power_down_ok() callback is currently used only
+                * for s2idle. Use it to know when to update the usage counter.
+                */
+               if (genpd->gov && genpd->gov->system_power_down_ok)
+                       genpd->states[genpd->state_idx].usage_s2idle++;
        }
 
        genpd->status = GENPD_STATE_OFF;
@@ -3772,7 +3779,7 @@ static int idle_states_show(struct seq_file *s, void *data)
        if (ret)
                return -ERESTARTSYS;
 
-       seq_puts(s, "State  Time(ms)       Usage      Rejected   Above      Below\n");
+       seq_puts(s, "State  Time(ms)       Usage      Rejected   Above      Below      S2idle\n");
 
        for (i = 0; i < genpd->state_count; i++) {
                struct genpd_power_state *state = &genpd->states[i];
@@ -3790,9 +3797,9 @@ static int idle_states_show(struct seq_file *s, void *data)
 
                snprintf(state_name, ARRAY_SIZE(state_name), "S%-5d", i);
                do_div(idle_time, NSEC_PER_MSEC);
-               seq_printf(s, "%-6s %-14llu %-10llu %-10llu %-10llu %llu\n",
+               seq_printf(s, "%-6s %-14llu %-10llu %-10llu %-10llu %-10llu %llu\n",
                           state_name, idle_time, state->usage, state->rejected,
-                          state->above, state->below);
+                          state->above, state->below, state->usage_s2idle);
        }
 
        genpd_unlock(genpd);
index 93ba0143ca476afc8c801cd5c911084394718f10..f6f6d494f728d2e20aa4b5d5c5329a4fdad95907 100644 (file)
@@ -183,6 +183,7 @@ struct genpd_power_state {
        u64 rejected;
        u64 above;
        u64 below;
+       u64 usage_s2idle;
        struct fwnode_handle *fwnode;
        u64 idle_time;
        void *data;