Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 344134
b: refs/heads/master
c: c783390
h: refs/heads/master
v: v3
  • Loading branch information
Madhusudan Bhat authored and John Crispin committed Nov 9, 2012
1 parent 53d7ade commit bea24fa
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e7e333cb22e5e34e7a0792f262df52026815662e
refs/heads/master: c783390a0ecef08df5c804f8c5f647431a04f502
1 change: 1 addition & 0 deletions trunk/arch/mips/oprofile/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ oprofile-$(CONFIG_CPU_MIPS32) += op_model_mipsxx.o
oprofile-$(CONFIG_CPU_MIPS64) += op_model_mipsxx.o
oprofile-$(CONFIG_CPU_R10000) += op_model_mipsxx.o
oprofile-$(CONFIG_CPU_SB1) += op_model_mipsxx.o
oprofile-$(CONFIG_CPU_XLR) += op_model_mipsxx.o
oprofile-$(CONFIG_CPU_RM9000) += op_model_rm9000.o
oprofile-$(CONFIG_CPU_LOONGSON2) += op_model_loongson2.o
1 change: 1 addition & 0 deletions trunk/arch/mips/oprofile/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
case CPU_R10000:
case CPU_R12000:
case CPU_R14000:
case CPU_XLR:
lmodel = &op_model_mipsxx_ops;
break;

Expand Down
29 changes: 29 additions & 0 deletions trunk/arch/mips/oprofile/op_model_mipsxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,22 @@

#define M_COUNTER_OVERFLOW (1UL << 31)

/* Netlogic XLR specific, count events in all threads in a core */
#define M_PERFCTL_COUNT_ALL_THREADS (1UL << 13)

static int (*save_perf_irq)(void);

/*
* XLR has only one set of counters per core. Designate the
* first hardware thread in the core for setup and init.
* Skip CPUs with non-zero hardware thread id (4 hwt per core)
*/
#ifdef CONFIG_CPU_XLR
#define oprofile_skip_cpu(c) ((cpu_logical_map(c) & 0x3) != 0)
#else
#define oprofile_skip_cpu(c) 0
#endif

#ifdef CONFIG_MIPS_MT_SMP
static int cpu_has_mipsmt_pertccounters;
#define WHAT (M_TC_EN_VPE | \
Expand Down Expand Up @@ -152,6 +166,8 @@ static void mipsxx_reg_setup(struct op_counter_config *ctr)
reg.control[i] |= M_PERFCTL_USER;
if (ctr[i].exl)
reg.control[i] |= M_PERFCTL_EXL;
if (current_cpu_type() == CPU_XLR)
reg.control[i] |= M_PERFCTL_COUNT_ALL_THREADS;
reg.counter[i] = 0x80000000 - ctr[i].count;
}
}
Expand All @@ -162,6 +178,9 @@ static void mipsxx_cpu_setup(void *args)
{
unsigned int counters = op_model_mipsxx_ops.num_counters;

if (oprofile_skip_cpu(smp_processor_id()))
return;

switch (counters) {
case 4:
w_c0_perfctrl3(0);
Expand All @@ -183,6 +202,9 @@ static void mipsxx_cpu_start(void *args)
{
unsigned int counters = op_model_mipsxx_ops.num_counters;

if (oprofile_skip_cpu(smp_processor_id()))
return;

switch (counters) {
case 4:
w_c0_perfctrl3(WHAT | reg.control[3]);
Expand All @@ -200,6 +222,9 @@ static void mipsxx_cpu_stop(void *args)
{
unsigned int counters = op_model_mipsxx_ops.num_counters;

if (oprofile_skip_cpu(smp_processor_id()))
return;

switch (counters) {
case 4:
w_c0_perfctrl3(0);
Expand Down Expand Up @@ -372,6 +397,10 @@ static int __init mipsxx_init(void)
op_model_mipsxx_ops.cpu_type = "mips/loongson1";
break;

case CPU_XLR:
op_model_mipsxx_ops.cpu_type = "mips/xlr";
break;

default:
printk(KERN_ERR "Profiling unsupported for this CPU\n");

Expand Down

0 comments on commit bea24fa

Please sign in to comment.