[MIPS] Oprofile: kernel support for the R10000.
authorRalf Baechle <ralf@linux-mips.org>
Sun, 22 Oct 2006 23:44:02 +0000 (00:44 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Thu, 30 Nov 2006 01:14:45 +0000 (01:14 +0000)
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/oprofile/Makefile
arch/mips/oprofile/common.c
arch/mips/oprofile/op_model_mipsxx.c

index 0a50aad5bbe47f54fdc578020a9cfc84b08e6b0c..bf3be6fcf7ff38343e3ed157c4722ed8a938b145 100644 (file)
@@ -12,5 +12,6 @@ oprofile-y                            := $(DRIVER_OBJS) common.o
 
 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_RM9000)          += op_model_rm9000.o
index 65eb55400d772f091a0fbbc4f55b18903c0c7955..4e0a90b3916b4536c75787a4aa30f6b376e03879 100644 (file)
@@ -83,6 +83,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
        case CPU_74K:
        case CPU_SB1:
        case CPU_SB1A:
+       case CPU_R10000:
+       case CPU_R12000:
+       case CPU_R14000:
                lmodel = &op_model_mipsxx_ops;
                break;
 
index 1fb240c57bac356463346f45b5971fd7826b09ab..455d76ad06d83cf1eb3045c3ca6691cb088584c3 100644 (file)
@@ -18,7 +18,7 @@
 #define M_PERFCTL_SUPERVISOR           (1UL      <<  2)
 #define M_PERFCTL_USER                 (1UL      <<  3)
 #define M_PERFCTL_INTERRUPT_ENABLE     (1UL      <<  4)
-#define M_PERFCTL_EVENT(event)         ((event)  << 5)
+#define M_PERFCTL_EVENT(event)         (((event) & 0x3f)  << 5)
 #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)
@@ -218,13 +218,23 @@ static inline int __n_counters(void)
 
 static inline int n_counters(void)
 {
-       int counters = __n_counters();
+       int counters;
+
+       switch (current_cpu_data.cputype) {
+       case CPU_R10000:
+               counters = 2;
+
+       case CPU_R12000:
+       case CPU_R14000:
+               counters = 4;
+
+       default:
+               counters = __n_counters();
+       }
 
 #ifdef CONFIG_MIPS_MT_SMP
-       if (current_cpu_data.cputype == CPU_34K)
-               return counters >> 1;
+       counters >> 1;
 #endif
-
        return counters;
 }
 
@@ -284,6 +294,18 @@ static int __init mipsxx_init(void)
                op_model_mipsxx_ops.cpu_type = "mips/5K";
                break;
 
+       case CPU_R10000:
+               if ((current_cpu_data.processor_id & 0xff) == 0x20)
+                       op_model_mipsxx_ops.cpu_type = "mips/r10000-v2.x";
+               else
+                       op_model_mipsxx_ops.cpu_type = "mips/r10000";
+               break;
+
+       case CPU_R12000:
+       case CPU_R14000:
+               op_model_mipsxx_ops.cpu_type = "mips/r12000";
+               break;
+
        case CPU_SB1:
        case CPU_SB1A:
                op_model_mipsxx_ops.cpu_type = "mips/sb1";