diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 5f09d9349322658508f9db79f7855afc4a96a1ae..a394957ddaf4922c737b0e49394fba38e9d47fcf 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig @@ -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 ############################################################################# diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S index 4a2ec7a9675a95698638d6b942c59c6de6fc6cfc..2604b532897cf745378d227a95c1f8b78ce2cc2b 100644 --- a/arch/blackfin/mach-common/interrupt.S +++ b/arch/blackfin/mach-common/interrupt.S @@ -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; diff --git a/arch/blackfin/mach-common/irqpanic.c b/arch/blackfin/mach-common/irqpanic.c index 606ded9ff4e1963babcdec88999ef5767628451a..7b69413c15560f41e296ec968d831ece051f0c2a 100644 --- a/arch/blackfin/mach-common/irqpanic.c +++ b/arch/blackfin/mach-common/irqpanic.c @@ -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 diff --git a/arch/blackfin/oprofile/common.c b/arch/blackfin/oprofile/common.c index f34795a2e4812a6416aab08686d3f59c1fb6605a..cf8f48848d1b11f273839e421f50cd92787d1d00 100644 --- a/arch/blackfin/oprofile/common.c +++ b/arch/blackfin/oprofile/common.c @@ -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; diff --git a/arch/blackfin/oprofile/op_blackfin.h b/arch/blackfin/oprofile/op_blackfin.h index 05dd08c9d1549e3c498c561f5ede90c453d6d823..37aec0eb00d01a91ebcb562b7a82f6b112da6c72 100644 --- a/arch/blackfin/oprofile/op_blackfin.h +++ b/arch/blackfin/oprofile/op_blackfin.h @@ -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 diff --git a/arch/blackfin/oprofile/op_model_bf533.c b/arch/blackfin/oprofile/op_model_bf533.c index d1c698bb9ee5f037e0db9e0bbcadc97717b513a4..0e34df169b2d79b89bcb21eff53b607ad386aa24 100644 --- a/arch/blackfin/oprofile/op_model_bf533.c +++ b/arch/blackfin/oprofile/op_model_bf533.c @@ -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;