diff options
Diffstat (limited to 'kernel/power')
-rw-r--r-- | kernel/power/energy_model.c | 57 | ||||
-rw-r--r-- | kernel/power/qos.c | 8 |
2 files changed, 59 insertions, 6 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: |
diff --git a/kernel/power/qos.c b/kernel/power/qos.c index b7a82502857a..9d22131afc1e 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c | |||
@@ -582,10 +582,8 @@ static int register_pm_qos_misc(struct pm_qos_object *qos, struct dentry *d) | |||
582 | qos->pm_qos_power_miscdev.name = qos->name; | 582 | qos->pm_qos_power_miscdev.name = qos->name; |
583 | qos->pm_qos_power_miscdev.fops = &pm_qos_power_fops; | 583 | qos->pm_qos_power_miscdev.fops = &pm_qos_power_fops; |
584 | 584 | ||
585 | if (d) { | 585 | debugfs_create_file(qos->name, S_IRUGO, d, (void *)qos, |
586 | (void)debugfs_create_file(qos->name, S_IRUGO, d, | 586 | &pm_qos_debug_fops); |
587 | (void *)qos, &pm_qos_debug_fops); | ||
588 | } | ||
589 | 587 | ||
590 | return misc_register(&qos->pm_qos_power_miscdev); | 588 | return misc_register(&qos->pm_qos_power_miscdev); |
591 | } | 589 | } |
@@ -685,8 +683,6 @@ static int __init pm_qos_power_init(void) | |||
685 | BUILD_BUG_ON(ARRAY_SIZE(pm_qos_array) != PM_QOS_NUM_CLASSES); | 683 | BUILD_BUG_ON(ARRAY_SIZE(pm_qos_array) != PM_QOS_NUM_CLASSES); |
686 | 684 | ||
687 | d = debugfs_create_dir("pm_qos", NULL); | 685 | d = debugfs_create_dir("pm_qos", NULL); |
688 | if (IS_ERR_OR_NULL(d)) | ||
689 | d = NULL; | ||
690 | 686 | ||
691 | for (i = PM_QOS_CPU_DMA_LATENCY; i < PM_QOS_NUM_CLASSES; i++) { | 687 | for (i = PM_QOS_CPU_DMA_LATENCY; i < PM_QOS_NUM_CLASSES; i++) { |
692 | ret = register_pm_qos_misc(pm_qos_array[i], d); | 688 | ret = register_pm_qos_misc(pm_qos_array[i], d); |