diff options
-rw-r--r-- | kernel/power/energy_model.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c index d9dc2c38764a..7d66ee68aaaf 100644 --- a/kernel/power/energy_model.c +++ b/kernel/power/energy_model.c | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | #include <linux/cpu.h> | 11 | #include <linux/cpu.h> |
12 | #include <linux/cpumask.h> | 12 | #include <linux/cpumask.h> |
13 | #include <linux/debugfs.h> | ||
13 | #include <linux/energy_model.h> | 14 | #include <linux/energy_model.h> |
14 | #include <linux/sched/topology.h> | 15 | #include <linux/sched/topology.h> |
15 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
@@ -23,6 +24,60 @@ static DEFINE_PER_CPU(struct em_perf_domain *, em_data); | |||
23 | */ | 24 | */ |
24 | static DEFINE_MUTEX(em_pd_mutex); | 25 | static DEFINE_MUTEX(em_pd_mutex); |
25 | 26 | ||
27 | #ifdef CONFIG_DEBUG_FS | ||
28 | static struct dentry *rootdir; | ||
29 | |||
30 | static void em_debug_create_cs(struct em_cap_state *cs, struct dentry *pd) | ||
31 | { | ||
32 | struct dentry *d; | ||
33 | char name[24]; | ||
34 | |||
35 | snprintf(name, sizeof(name), "cs:%lu", cs->frequency); | ||
36 | |||
37 | /* Create per-cs directory */ | ||
38 | d = debugfs_create_dir(name, pd); | ||
39 | debugfs_create_ulong("frequency", 0444, d, &cs->frequency); | ||
40 | debugfs_create_ulong("power", 0444, d, &cs->power); | ||
41 | debugfs_create_ulong("cost", 0444, d, &cs->cost); | ||
42 | } | ||
43 | |||
44 | static int em_debug_cpus_show(struct seq_file *s, void *unused) | ||
45 | { | ||
46 | seq_printf(s, "%*pbl\n", cpumask_pr_args(to_cpumask(s->private))); | ||
47 | |||
48 | return 0; | ||
49 | } | ||
50 | DEFINE_SHOW_ATTRIBUTE(em_debug_cpus); | ||
51 | |||
52 | static void em_debug_create_pd(struct em_perf_domain *pd, int cpu) | ||
53 | { | ||
54 | struct dentry *d; | ||
55 | char name[8]; | ||
56 | int i; | ||
57 | |||
58 | snprintf(name, sizeof(name), "pd%d", cpu); | ||
59 | |||
60 | /* Create the directory of the performance domain */ | ||
61 | d = debugfs_create_dir(name, rootdir); | ||
62 | |||
63 | debugfs_create_file("cpus", 0444, d, pd->cpus, &em_debug_cpus_fops); | ||
64 | |||
65 | /* Create a sub-directory for each capacity state */ | ||
66 | for (i = 0; i < pd->nr_cap_states; i++) | ||
67 | em_debug_create_cs(&pd->table[i], d); | ||
68 | } | ||
69 | |||
70 | static int __init em_debug_init(void) | ||
71 | { | ||
72 | /* Create /sys/kernel/debug/energy_model directory */ | ||
73 | rootdir = debugfs_create_dir("energy_model", NULL); | ||
74 | |||
75 | return 0; | ||
76 | } | ||
77 | core_initcall(em_debug_init); | ||
78 | #else /* CONFIG_DEBUG_FS */ | ||
79 | static void em_debug_create_pd(struct em_perf_domain *pd, int cpu) {} | ||
80 | #endif | ||
26 | static struct em_perf_domain *em_create_pd(cpumask_t *span, int nr_states, | 81 | static struct em_perf_domain *em_create_pd(cpumask_t *span, int nr_states, |
27 | struct em_data_callback *cb) | 82 | struct em_data_callback *cb) |
28 | { | 83 | { |
@@ -102,6 +157,8 @@ static struct em_perf_domain *em_create_pd(cpumask_t *span, int nr_states, | |||
102 | pd->nr_cap_states = nr_states; | 157 | pd->nr_cap_states = nr_states; |
103 | cpumask_copy(to_cpumask(pd->cpus), span); | 158 | cpumask_copy(to_cpumask(pd->cpus), span); |
104 | 159 | ||
160 | em_debug_create_pd(pd, cpu); | ||
161 | |||
105 | return pd; | 162 | return pd; |
106 | 163 | ||
107 | free_cs_table: | 164 | free_cs_table: |