]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86/intel/pmc: Enable substate residencies for multiple PMCs
authorXi Pardee <xi.pardee@linux.intel.com>
Thu, 8 Jan 2026 22:31:41 +0000 (14:31 -0800)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 13 Jan 2026 14:31:39 +0000 (16:31 +0200)
Enable substate residencies support for multiple PMCs. Previously
substate residencies were shown only for the primary PMC. This
change enables substate residencies for all available PMCs.

The output of substate_residencies with this patch will be similar
to this:
pmc0   Substate       Residency
         S0i2.0               0
         S0i2.1               0
         S0i2.2               0
pmc1   Substate       Residency
         S0i2.0               0
         S0i2.1               0
         S0i2.2               0
pmc2   Substate       Residency
         S0i2.0               0

Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
Link: https://patch.msgid.link/20260108223144.504267-4-xi.pardee@linux.intel.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/pmc/core.c

index c76934ad7bf1d2804895b36af437b25eceabace2..e16f9630b908c970b0a468af407a1b67a8175e70 100644 (file)
@@ -776,16 +776,26 @@ static inline u64 adjust_lpm_residency(struct pmc *pmc, u32 offset,
 static int pmc_core_substate_res_show(struct seq_file *s, void *unused)
 {
        struct pmc_dev *pmcdev = s->private;
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       const int lpm_adj_x2 = pmc->map->lpm_res_counter_step_x2;
-       u32 offset = pmc->map->lpm_residency_offset;
-       u8 mode;
+       unsigned int pmc_idx;
+
+       for (pmc_idx = 0; pmc_idx < ARRAY_SIZE(pmcdev->pmcs); ++pmc_idx) {
+               int lpm_adj_x2;
+               struct pmc *pmc;
+               u32 offset;
+               u8 mode;
 
-       seq_printf(s, "%-10s %-15s\n", "Substate", "Residency");
+               pmc = pmcdev->pmcs[pmc_idx];
+               if (!pmc)
+                       continue;
 
-       pmc_for_each_mode(mode, pmc) {
-               seq_printf(s, "%-10s %-15llu\n", pmc_lpm_modes[mode],
-                          adjust_lpm_residency(pmc, offset + (4 * mode), lpm_adj_x2));
+               lpm_adj_x2 = pmc->map->lpm_res_counter_step_x2;
+               offset = pmc->map->lpm_residency_offset;
+
+               seq_printf(s, "pmc%u %10s %15s\n", pmc_idx, "Substate", "Residency");
+               pmc_for_each_mode(mode, pmc) {
+                       seq_printf(s, "%15s %15llu\n", pmc_lpm_modes[mode],
+                                  adjust_lpm_residency(pmc, offset + (4 * mode), lpm_adj_x2));
+               }
        }
 
        return 0;