Blackfin arch: get oprofile work for user space
authorGraf Yang <graf.yang@analog.com>
Wed, 7 Jan 2009 15:14:39 +0000 (23:14 +0800)
committerBryan Wu <cooloney@kernel.org>
Wed, 7 Jan 2009 15:14:39 +0000 (23:14 +0800)
Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
arch/blackfin/Kconfig
arch/blackfin/mach-common/interrupt.S
arch/blackfin/mach-common/irqpanic.c
arch/blackfin/oprofile/common.c
arch/blackfin/oprofile/op_blackfin.h
arch/blackfin/oprofile/op_model_bf533.c

index 5f09d9349322658508f9db79f7855afc4a96a1ae..a394957ddaf4922c737b0e49394fba38e9d47fcf 100644 (file)
@@ -60,10 +60,6 @@ config GENERIC_CALIBRATE_DELAY
        bool
        default y
 
-config HARDWARE_PM
-       def_bool y
-       depends on OPROFILE
-
 source "init/Kconfig"
 
 source "kernel/Kconfig.preempt"
@@ -1019,6 +1015,12 @@ config EBIU_FCTLVAL
        hex "Flash Memory Bank Control Register"
        depends on BF54x
        default 6
+
+config HARDWARE_PM
+       bool "OProfile use hardware porformance monitor"
+       depends on OPROFILE
+       default n
+
 endmenu
 
 #############################################################################
index 4a2ec7a9675a95698638d6b942c59c6de6fc6cfc..2604b532897cf745378d227a95c1f8b78ce2cc2b 100644 (file)
@@ -152,6 +152,12 @@ ENTRY(_evt_ivhw)
 1:
 #endif
 
+       # We are going to dump something out, so make sure we print IPEND properly
+       p2.l = lo(IPEND);
+       p2.h = hi(IPEND);
+       r0 = [p2];
+       [sp + PT_IPEND] = r0;
+
 #ifdef CONFIG_HARDWARE_PM
        r7 = [sp + PT_SEQSTAT];
        r7 = r7 >>> 0xe;
@@ -161,11 +167,6 @@ ENTRY(_evt_ivhw)
        cc = r7 == r5;
        if cc jump .Lcall_do_ovf; /* deal with performance counter overflow */
 #endif
-       # We are going to dump something out, so make sure we print IPEND properly
-       p2.l = lo(IPEND);
-       p2.h = hi(IPEND);
-       r0 = [p2];
-       [sp + PT_IPEND] = r0;
 
        /* set the EXCAUSE to HWERR for trap_c */
        r0 = [sp + PT_SEQSTAT];
@@ -196,6 +197,7 @@ ENTRY(_evt_ivhw)
 #ifdef CONFIG_HARDWARE_PM
 .Lcall_do_ovf:
 
+       R0 = SP;
        SP += -12;
        call _pm_overflow;
        SP += 12;
index 606ded9ff4e1963babcdec88999ef5767628451a..7b69413c15560f41e296ec968d831ece051f0c2a 100644 (file)
@@ -139,8 +139,8 @@ asmlinkage void irq_panic(int reason, struct pt_regs *regs)
 /*
  * call the handler of Performance overflow
  */
-asmlinkage void pm_overflow(int irq, struct pt_regs *regs)
+asmlinkage void pm_overflow(struct pt_regs *regs)
 {
-       pm_overflow_handler(irq, regs);
+       pm_overflow_handler(regs);
 }
 #endif
index f34795a2e4812a6416aab08686d3f59c1fb6605a..cf8f48848d1b11f273839e421f50cd92787d1d00 100644 (file)
@@ -126,20 +126,12 @@ static int op_bfin_create_files(struct super_block *sb, struct dentry *root)
 int __init oprofile_arch_init(struct oprofile_operations *ops)
 {
 #ifdef CONFIG_HARDWARE_PM
-       unsigned int dspid;
-
        mutex_init(&pfmon_lock);
 
-       dspid = bfin_dspid();
-
-       printk(KERN_INFO "Oprofile got the cpu id is 0x%x. \n", dspid);
 
-       switch (dspid) {
-       case BFIN_533_ID:
-               model = &op_model_bfin533;
-               model->num_counters = 2;
-               break;
-       case BFIN_537_ID:
+       switch (bfin_read_CHIPID() & CHIPID_MANUFACTURE) {
+       case 0xca:
+               printk(KERN_INFO "Oprofile: cpu vendor is Analog Devices.\n");
                model = &op_model_bfin533;
                model->num_counters = 2;
                break;
index 05dd08c9d1549e3c498c561f5ede90c453d6d823..37aec0eb00d01a91ebcb562b7a82f6b112da6c72 100644 (file)
@@ -93,6 +93,6 @@ static inline void count_write(unsigned int *count)
        CSYNC();
 }
 
-extern int pm_overflow_handler(int irq, struct pt_regs *regs);
+extern int pm_overflow_handler(struct pt_regs *regs);
 
 #endif
index d1c698bb9ee5f037e0db9e0bbcadc97717b513a4..0e34df169b2d79b89bcb21eff53b607ad386aa24 100644 (file)
@@ -52,7 +52,7 @@ static unsigned curr_pfctl, curr_count[2];
 
 static int bfin533_reg_setup(struct op_counter_config *ctr)
 {
-       unsigned int pfctl = ctr_read();
+       unsigned int pfctl = 0;
        unsigned int count[2];
 
        /* set Blackfin perf monitor regs with ctr */
@@ -118,7 +118,7 @@ static int get_kernel(void)
        return is_kernel;
 }
 
-int pm_overflow_handler(int irq, struct pt_regs *regs)
+int pm_overflow_handler(struct pt_regs *regs)
 {
        int is_kernel;
        int i, cpu;