diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2012-12-13 13:40:13 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2012-12-13 13:40:13 -0500 |
commit | 241738bd51cb0efe58e6c570223153e970afe3ae (patch) | |
tree | 05263e1ec3fbd58cc4ba5ee69163612fbb769a4a /arch/mips/oprofile | |
parent | bdf20507da11a9a5b32ef04fa09f352828189aef (diff) | |
parent | ce8f0d0607bcad3ec0e8599be80353204427093e (diff) |
Merge branch 'mips-next' of http://dev.phrozen.org/githttp/mips-next into mips-for-linux-next
Diffstat (limited to 'arch/mips/oprofile')
-rw-r--r-- | arch/mips/oprofile/Makefile | 1 | ||||
-rw-r--r-- | arch/mips/oprofile/common.c | 1 | ||||
-rw-r--r-- | arch/mips/oprofile/op_model_mipsxx.c | 29 |
3 files changed, 31 insertions, 0 deletions
diff --git a/arch/mips/oprofile/Makefile b/arch/mips/oprofile/Makefile index 8232dbd1228d..9c0a6782c091 100644 --- a/arch/mips/oprofile/Makefile +++ b/arch/mips/oprofile/Makefile | |||
@@ -12,4 +12,5 @@ oprofile-$(CONFIG_CPU_MIPS32) += op_model_mipsxx.o | |||
12 | oprofile-$(CONFIG_CPU_MIPS64) += op_model_mipsxx.o | 12 | oprofile-$(CONFIG_CPU_MIPS64) += op_model_mipsxx.o |
13 | oprofile-$(CONFIG_CPU_R10000) += op_model_mipsxx.o | 13 | oprofile-$(CONFIG_CPU_R10000) += op_model_mipsxx.o |
14 | oprofile-$(CONFIG_CPU_SB1) += op_model_mipsxx.o | 14 | oprofile-$(CONFIG_CPU_SB1) += op_model_mipsxx.o |
15 | oprofile-$(CONFIG_CPU_XLR) += op_model_mipsxx.o | ||
15 | oprofile-$(CONFIG_CPU_LOONGSON2) += op_model_loongson2.o | 16 | oprofile-$(CONFIG_CPU_LOONGSON2) += op_model_loongson2.o |
diff --git a/arch/mips/oprofile/common.c b/arch/mips/oprofile/common.c index be387faef871..e32db1ff02c7 100644 --- a/arch/mips/oprofile/common.c +++ b/arch/mips/oprofile/common.c | |||
@@ -90,6 +90,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
90 | case CPU_R10000: | 90 | case CPU_R10000: |
91 | case CPU_R12000: | 91 | case CPU_R12000: |
92 | case CPU_R14000: | 92 | case CPU_R14000: |
93 | case CPU_XLR: | ||
93 | lmodel = &op_model_mipsxx_ops; | 94 | lmodel = &op_model_mipsxx_ops; |
94 | break; | 95 | break; |
95 | 96 | ||
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c index 28ea1a4cc576..786254630403 100644 --- a/arch/mips/oprofile/op_model_mipsxx.c +++ b/arch/mips/oprofile/op_model_mipsxx.c | |||
@@ -31,8 +31,22 @@ | |||
31 | 31 | ||
32 | #define M_COUNTER_OVERFLOW (1UL << 31) | 32 | #define M_COUNTER_OVERFLOW (1UL << 31) |
33 | 33 | ||
34 | /* Netlogic XLR specific, count events in all threads in a core */ | ||
35 | #define M_PERFCTL_COUNT_ALL_THREADS (1UL << 13) | ||
36 | |||
34 | static int (*save_perf_irq)(void); | 37 | static int (*save_perf_irq)(void); |
35 | 38 | ||
39 | /* | ||
40 | * XLR has only one set of counters per core. Designate the | ||
41 | * first hardware thread in the core for setup and init. | ||
42 | * Skip CPUs with non-zero hardware thread id (4 hwt per core) | ||
43 | */ | ||
44 | #ifdef CONFIG_CPU_XLR | ||
45 | #define oprofile_skip_cpu(c) ((cpu_logical_map(c) & 0x3) != 0) | ||
46 | #else | ||
47 | #define oprofile_skip_cpu(c) 0 | ||
48 | #endif | ||
49 | |||
36 | #ifdef CONFIG_MIPS_MT_SMP | 50 | #ifdef CONFIG_MIPS_MT_SMP |
37 | static int cpu_has_mipsmt_pertccounters; | 51 | static int cpu_has_mipsmt_pertccounters; |
38 | #define WHAT (M_TC_EN_VPE | \ | 52 | #define WHAT (M_TC_EN_VPE | \ |
@@ -152,6 +166,8 @@ static void mipsxx_reg_setup(struct op_counter_config *ctr) | |||
152 | reg.control[i] |= M_PERFCTL_USER; | 166 | reg.control[i] |= M_PERFCTL_USER; |
153 | if (ctr[i].exl) | 167 | if (ctr[i].exl) |
154 | reg.control[i] |= M_PERFCTL_EXL; | 168 | reg.control[i] |= M_PERFCTL_EXL; |
169 | if (current_cpu_type() == CPU_XLR) | ||
170 | reg.control[i] |= M_PERFCTL_COUNT_ALL_THREADS; | ||
155 | reg.counter[i] = 0x80000000 - ctr[i].count; | 171 | reg.counter[i] = 0x80000000 - ctr[i].count; |
156 | } | 172 | } |
157 | } | 173 | } |
@@ -162,6 +178,9 @@ static void mipsxx_cpu_setup(void *args) | |||
162 | { | 178 | { |
163 | unsigned int counters = op_model_mipsxx_ops.num_counters; | 179 | unsigned int counters = op_model_mipsxx_ops.num_counters; |
164 | 180 | ||
181 | if (oprofile_skip_cpu(smp_processor_id())) | ||
182 | return; | ||
183 | |||
165 | switch (counters) { | 184 | switch (counters) { |
166 | case 4: | 185 | case 4: |
167 | w_c0_perfctrl3(0); | 186 | w_c0_perfctrl3(0); |
@@ -183,6 +202,9 @@ static void mipsxx_cpu_start(void *args) | |||
183 | { | 202 | { |
184 | unsigned int counters = op_model_mipsxx_ops.num_counters; | 203 | unsigned int counters = op_model_mipsxx_ops.num_counters; |
185 | 204 | ||
205 | if (oprofile_skip_cpu(smp_processor_id())) | ||
206 | return; | ||
207 | |||
186 | switch (counters) { | 208 | switch (counters) { |
187 | case 4: | 209 | case 4: |
188 | w_c0_perfctrl3(WHAT | reg.control[3]); | 210 | w_c0_perfctrl3(WHAT | reg.control[3]); |
@@ -200,6 +222,9 @@ static void mipsxx_cpu_stop(void *args) | |||
200 | { | 222 | { |
201 | unsigned int counters = op_model_mipsxx_ops.num_counters; | 223 | unsigned int counters = op_model_mipsxx_ops.num_counters; |
202 | 224 | ||
225 | if (oprofile_skip_cpu(smp_processor_id())) | ||
226 | return; | ||
227 | |||
203 | switch (counters) { | 228 | switch (counters) { |
204 | case 4: | 229 | case 4: |
205 | w_c0_perfctrl3(0); | 230 | w_c0_perfctrl3(0); |
@@ -372,6 +397,10 @@ static int __init mipsxx_init(void) | |||
372 | op_model_mipsxx_ops.cpu_type = "mips/loongson1"; | 397 | op_model_mipsxx_ops.cpu_type = "mips/loongson1"; |
373 | break; | 398 | break; |
374 | 399 | ||
400 | case CPU_XLR: | ||
401 | op_model_mipsxx_ops.cpu_type = "mips/xlr"; | ||
402 | break; | ||
403 | |||
375 | default: | 404 | default: |
376 | printk(KERN_ERR "Profiling unsupported for this CPU\n"); | 405 | printk(KERN_ERR "Profiling unsupported for this CPU\n"); |
377 | 406 | ||