Browse Source

Blackfin arch: get oprofile work for user space

Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
Graf Yang 16 years ago
parent
commit
f994607a2e

+ 6 - 4
arch/blackfin/Kconfig

@@ -60,10 +60,6 @@ config GENERIC_CALIBRATE_DELAY
 	bool
 	bool
 	default y
 	default y
 
 
-config HARDWARE_PM
-	def_bool y
-	depends on OPROFILE
-
 source "init/Kconfig"
 source "init/Kconfig"
 
 
 source "kernel/Kconfig.preempt"
 source "kernel/Kconfig.preempt"
@@ -1019,6 +1015,12 @@ config EBIU_FCTLVAL
 	hex "Flash Memory Bank Control Register"
 	hex "Flash Memory Bank Control Register"
 	depends on BF54x
 	depends on BF54x
 	default 6
 	default 6
+
+config HARDWARE_PM
+	bool "OProfile use hardware porformance monitor"
+	depends on OPROFILE
+	default n
+
 endmenu
 endmenu
 
 
 #############################################################################
 #############################################################################

+ 7 - 5
arch/blackfin/mach-common/interrupt.S

@@ -152,6 +152,12 @@ ENTRY(_evt_ivhw)
 1:
 1:
 #endif
 #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
 #ifdef CONFIG_HARDWARE_PM
 	r7 = [sp + PT_SEQSTAT];
 	r7 = [sp + PT_SEQSTAT];
 	r7 = r7 >>> 0xe;
 	r7 = r7 >>> 0xe;
@@ -161,11 +167,6 @@ ENTRY(_evt_ivhw)
 	cc = r7 == r5;
 	cc = r7 == r5;
 	if cc jump .Lcall_do_ovf; /* deal with performance counter overflow */
 	if cc jump .Lcall_do_ovf; /* deal with performance counter overflow */
 #endif
 #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 */
 	/* set the EXCAUSE to HWERR for trap_c */
 	r0 = [sp + PT_SEQSTAT];
 	r0 = [sp + PT_SEQSTAT];
@@ -196,6 +197,7 @@ ENTRY(_evt_ivhw)
 #ifdef CONFIG_HARDWARE_PM
 #ifdef CONFIG_HARDWARE_PM
 .Lcall_do_ovf:
 .Lcall_do_ovf:
 
 
+	R0 = SP;
 	SP += -12;
 	SP += -12;
 	call _pm_overflow;
 	call _pm_overflow;
 	SP += 12;
 	SP += 12;

+ 2 - 2
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
  * 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
 #endif

+ 3 - 11
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)
 int __init oprofile_arch_init(struct oprofile_operations *ops)
 {
 {
 #ifdef CONFIG_HARDWARE_PM
 #ifdef CONFIG_HARDWARE_PM
-	unsigned int dspid;
-
 	mutex_init(&pfmon_lock);
 	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 = &op_model_bfin533;
 		model->num_counters = 2;
 		model->num_counters = 2;
 		break;
 		break;

+ 1 - 1
arch/blackfin/oprofile/op_blackfin.h

@@ -93,6 +93,6 @@ static inline void count_write(unsigned int *count)
 	CSYNC();
 	CSYNC();
 }
 }
 
 
-extern int pm_overflow_handler(int irq, struct pt_regs *regs);
+extern int pm_overflow_handler(struct pt_regs *regs);
 
 
 #endif
 #endif

+ 2 - 2
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)
 static int bfin533_reg_setup(struct op_counter_config *ctr)
 {
 {
-	unsigned int pfctl = ctr_read();
+	unsigned int pfctl = 0;
 	unsigned int count[2];
 	unsigned int count[2];
 
 
 	/* set Blackfin perf monitor regs with ctr */
 	/* set Blackfin perf monitor regs with ctr */
@@ -118,7 +118,7 @@ static int get_kernel(void)
 	return is_kernel;
 	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 is_kernel;
 	int i, cpu;
 	int i, cpu;