On Netlogic XLR chip two pairs of performance counter registers,
perf_ctrl0: c0 reg 25 sel 0, perf_cntr0: c0 reg 25 sel 1
perf_ctrl1: c0 reg 25 sel 2, perf_cntr0: c0 reg 25 sel 3
provide a means for software to count processor events.
At most 64 events can be counted, such as,
Instruction fetched and retired, branch instructions
Instruction and Data Cache Unit statistics
Instruction and Data TLB statistics
Instruction Fetch Unit statistics
Instruction Execution Unit statistics
Load/store Unit statistics
Cycle Count
They are activated based on the model of mips/74k, and
any comment is appreciated.
Thanks
Signed-off-by: Hillf Danton <dhillf@gmail.com>
---
--- a/arch/mips/oprofile/Makefile Tue Jul 12 21:50:26 2011
+++ b/arch/mips/oprofile/Makefile Sat Oct 1 13:44:28 2011
@@ -16,3 +16,4 @@ oprofile-$(CONFIG_CPU_R10000) += op_mod
oprofile-$(CONFIG_CPU_SB1) += op_model_mipsxx.o
oprofile-$(CONFIG_CPU_RM9000) += op_model_rm9000.o
oprofile-$(CONFIG_CPU_LOONGSON2) += op_model_loongson2.o
+oprofile-$(CONFIG_CPU_XLR) += op_model_mipsxx.o
--- a/arch/mips/oprofile/common.c Tue Jul 12 21:50:26 2011
+++ b/arch/mips/oprofile/common.c Sat Oct 1 13:45:23 2011
@@ -89,6 +89,7 @@ int __init oprofile_arch_init(struct opr
case CPU_R10000:
case CPU_R12000:
case CPU_R14000:
+ case CPU_XLR:
lmodel = &op_model_mipsxx_ops;
break;
--- a/arch/mips/oprofile/op_model_mipsxx.c Sat May 14 15:21:02 2011
+++ b/arch/mips/oprofile/op_model_mipsxx.c Sat Oct 1 13:50:26 2011
@@ -19,7 +19,11 @@
#define M_PERFCTL_SUPERVISOR (1UL << 2)
#define M_PERFCTL_USER (1UL << 3)
#define M_PERFCTL_INTERRUPT_ENABLE (1UL << 4)
+#ifdef CONFIG_CPU_XLR
+#define M_PERFCTL_EVENT(event) ((((event) & 0x3f) << 5) | 0x2001)
+#else
#define M_PERFCTL_EVENT(event) (((event) & 0x3ff) << 5)
+#endif
#define M_PERFCTL_VPEID(vpe) ((vpe) << 16)
#define M_PERFCTL_MT_EN(filter) ((filter) << 20)
#define M_TC_EN_ALL M_PERFCTL_MT_EN(0)
@@ -264,6 +268,7 @@ static inline int n_counters(void)
switch (current_cpu_type()) {
case CPU_R10000:
+ case CPU_XLR:
counters = 2;
break;
@@ -365,6 +370,9 @@ static int __init mipsxx_init(void)
op_model_mipsxx_ops.cpu_type = "mips/sb1";
break;
+ case CPU_XLR:
+ op_model_mipsxx_ops.cpu_type = "mips/xlr";
+ break;
default:
printk(KERN_ERR "Profiling unsupported for this CPU\n");
|