PM / EM: Expose the Energy Model in debugfs
[sfrench/cifs-2.6.git] / kernel / power / energy_model.c
index d9dc2c38764a3c3100f3708ce5b39ddfab072a91..7d66ee68aaaf6f1b821d6fa148f56e1420ccb91a 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/cpu.h>
 #include <linux/cpumask.h>
+#include <linux/debugfs.h>
 #include <linux/energy_model.h>
 #include <linux/sched/topology.h>
 #include <linux/slab.h>
@@ -23,6 +24,60 @@ static DEFINE_PER_CPU(struct em_perf_domain *, em_data);
  */
 static DEFINE_MUTEX(em_pd_mutex);
 
+#ifdef CONFIG_DEBUG_FS
+static struct dentry *rootdir;
+
+static void em_debug_create_cs(struct em_cap_state *cs, struct dentry *pd)
+{
+       struct dentry *d;
+       char name[24];
+
+       snprintf(name, sizeof(name), "cs:%lu", cs->frequency);
+
+       /* Create per-cs directory */
+       d = debugfs_create_dir(name, pd);
+       debugfs_create_ulong("frequency", 0444, d, &cs->frequency);
+       debugfs_create_ulong("power", 0444, d, &cs->power);
+       debugfs_create_ulong("cost", 0444, d, &cs->cost);
+}
+
+static int em_debug_cpus_show(struct seq_file *s, void *unused)
+{
+       seq_printf(s, "%*pbl\n", cpumask_pr_args(to_cpumask(s->private)));
+
+       return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(em_debug_cpus);
+
+static void em_debug_create_pd(struct em_perf_domain *pd, int cpu)
+{
+       struct dentry *d;
+       char name[8];
+       int i;
+
+       snprintf(name, sizeof(name), "pd%d", cpu);
+
+       /* Create the directory of the performance domain */
+       d = debugfs_create_dir(name, rootdir);
+
+       debugfs_create_file("cpus", 0444, d, pd->cpus, &em_debug_cpus_fops);
+
+       /* Create a sub-directory for each capacity state */
+       for (i = 0; i < pd->nr_cap_states; i++)
+               em_debug_create_cs(&pd->table[i], d);
+}
+
+static int __init em_debug_init(void)
+{
+       /* Create /sys/kernel/debug/energy_model directory */
+       rootdir = debugfs_create_dir("energy_model", NULL);
+
+       return 0;
+}
+core_initcall(em_debug_init);
+#else /* CONFIG_DEBUG_FS */
+static void em_debug_create_pd(struct em_perf_domain *pd, int cpu) {}
+#endif
 static struct em_perf_domain *em_create_pd(cpumask_t *span, int nr_states,
                                                struct em_data_callback *cb)
 {
@@ -102,6 +157,8 @@ static struct em_perf_domain *em_create_pd(cpumask_t *span, int nr_states,
        pd->nr_cap_states = nr_states;
        cpumask_copy(to_cpumask(pd->cpus), span);
 
+       em_debug_create_pd(pd, cpu);
+
        return pd;
 
 free_cs_table: