diff options
author | Graf Yang <graf.yang@analog.com> | 2009-01-07 10:14:39 -0500 |
---|---|---|
committer | Bryan Wu <cooloney@kernel.org> | 2009-01-07 10:14:39 -0500 |
commit | f994607a2e118aedf1116a58ecd16126dbb83d28 (patch) | |
tree | 2b1764e2a037c904aa1358a54852eeb6e349cf6f | |
parent | 6f985294f7df30c0caa80a795ca10fb6f8466702 (diff) |
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>
-rw-r--r-- | arch/blackfin/Kconfig | 10 | ||||
-rw-r--r-- | arch/blackfin/mach-common/interrupt.S | 12 | ||||
-rw-r--r-- | arch/blackfin/mach-common/irqpanic.c | 4 | ||||
-rw-r--r-- | arch/blackfin/oprofile/common.c | 14 | ||||
-rw-r--r-- | arch/blackfin/oprofile/op_blackfin.h | 2 | ||||
-rw-r--r-- | arch/blackfin/oprofile/op_model_bf533.c | 4 |
6 files changed, 21 insertions, 25 deletions
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 5f09d9349322..a394957ddaf4 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
@@ -60,10 +60,6 @@ config GENERIC_CALIBRATE_DELAY | |||
60 | bool | 60 | bool |
61 | default y | 61 | default y |
62 | 62 | ||
63 | config HARDWARE_PM | ||
64 | def_bool y | ||
65 | depends on OPROFILE | ||
66 | |||
67 | source "init/Kconfig" | 63 | source "init/Kconfig" |
68 | 64 | ||
69 | source "kernel/Kconfig.preempt" | 65 | source "kernel/Kconfig.preempt" |
@@ -1019,6 +1015,12 @@ config EBIU_FCTLVAL | |||
1019 | hex "Flash Memory Bank Control Register" | 1015 | hex "Flash Memory Bank Control Register" |
1020 | depends on BF54x | 1016 | depends on BF54x |
1021 | default 6 | 1017 | default 6 |
1018 | |||
1019 | config HARDWARE_PM | ||
1020 | bool "OProfile use hardware porformance monitor" | ||
1021 | depends on OPROFILE | ||
1022 | default n | ||
1023 | |||
1022 | endmenu | 1024 | endmenu |
1023 | 1025 | ||
1024 | ############################################################################# | 1026 | ############################################################################# |
diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S index 4a2ec7a9675a..2604b532897c 100644 --- a/arch/blackfin/mach-common/interrupt.S +++ b/arch/blackfin/mach-common/interrupt.S | |||
@@ -152,6 +152,12 @@ ENTRY(_evt_ivhw) | |||
152 | 1: | 152 | 1: |
153 | #endif | 153 | #endif |
154 | 154 | ||
155 | # We are going to dump something out, so make sure we print IPEND properly | ||
156 | p2.l = lo(IPEND); | ||
157 | p2.h = hi(IPEND); | ||
158 | r0 = [p2]; | ||
159 | [sp + PT_IPEND] = r0; | ||
160 | |||
155 | #ifdef CONFIG_HARDWARE_PM | 161 | #ifdef CONFIG_HARDWARE_PM |
156 | r7 = [sp + PT_SEQSTAT]; | 162 | r7 = [sp + PT_SEQSTAT]; |
157 | r7 = r7 >>> 0xe; | 163 | r7 = r7 >>> 0xe; |
@@ -161,11 +167,6 @@ ENTRY(_evt_ivhw) | |||
161 | cc = r7 == r5; | 167 | cc = r7 == r5; |
162 | if cc jump .Lcall_do_ovf; /* deal with performance counter overflow */ | 168 | if cc jump .Lcall_do_ovf; /* deal with performance counter overflow */ |
163 | #endif | 169 | #endif |
164 | # We are going to dump something out, so make sure we print IPEND properly | ||
165 | p2.l = lo(IPEND); | ||
166 | p2.h = hi(IPEND); | ||
167 | r0 = [p2]; | ||
168 | [sp + PT_IPEND] = r0; | ||
169 | 170 | ||
170 | /* set the EXCAUSE to HWERR for trap_c */ | 171 | /* set the EXCAUSE to HWERR for trap_c */ |
171 | r0 = [sp + PT_SEQSTAT]; | 172 | r0 = [sp + PT_SEQSTAT]; |
@@ -196,6 +197,7 @@ ENTRY(_evt_ivhw) | |||
196 | #ifdef CONFIG_HARDWARE_PM | 197 | #ifdef CONFIG_HARDWARE_PM |
197 | .Lcall_do_ovf: | 198 | .Lcall_do_ovf: |
198 | 199 | ||
200 | R0 = SP; | ||
199 | SP += -12; | 201 | SP += -12; |
200 | call _pm_overflow; | 202 | call _pm_overflow; |
201 | SP += 12; | 203 | SP += 12; |
diff --git a/arch/blackfin/mach-common/irqpanic.c b/arch/blackfin/mach-common/irqpanic.c index 606ded9ff4e1..7b69413c1556 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) | |||
139 | /* | 139 | /* |
140 | * call the handler of Performance overflow | 140 | * call the handler of Performance overflow |
141 | */ | 141 | */ |
142 | asmlinkage void pm_overflow(int irq, struct pt_regs *regs) | 142 | asmlinkage void pm_overflow(struct pt_regs *regs) |
143 | { | 143 | { |
144 | pm_overflow_handler(irq, regs); | 144 | pm_overflow_handler(regs); |
145 | } | 145 | } |
146 | #endif | 146 | #endif |
diff --git a/arch/blackfin/oprofile/common.c b/arch/blackfin/oprofile/common.c index f34795a2e481..cf8f48848d1b 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) | |||
126 | int __init oprofile_arch_init(struct oprofile_operations *ops) | 126 | int __init oprofile_arch_init(struct oprofile_operations *ops) |
127 | { | 127 | { |
128 | #ifdef CONFIG_HARDWARE_PM | 128 | #ifdef CONFIG_HARDWARE_PM |
129 | unsigned int dspid; | ||
130 | |||
131 | mutex_init(&pfmon_lock); | 129 | mutex_init(&pfmon_lock); |
132 | 130 | ||
133 | dspid = bfin_dspid(); | ||
134 | |||
135 | printk(KERN_INFO "Oprofile got the cpu id is 0x%x. \n", dspid); | ||
136 | 131 | ||
137 | switch (dspid) { | 132 | switch (bfin_read_CHIPID() & CHIPID_MANUFACTURE) { |
138 | case BFIN_533_ID: | 133 | case 0xca: |
139 | model = &op_model_bfin533; | 134 | printk(KERN_INFO "Oprofile: cpu vendor is Analog Devices.\n"); |
140 | model->num_counters = 2; | ||
141 | break; | ||
142 | case BFIN_537_ID: | ||
143 | model = &op_model_bfin533; | 135 | model = &op_model_bfin533; |
144 | model->num_counters = 2; | 136 | model->num_counters = 2; |
145 | break; | 137 | break; |
diff --git a/arch/blackfin/oprofile/op_blackfin.h b/arch/blackfin/oprofile/op_blackfin.h index 05dd08c9d154..37aec0eb00d0 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) | |||
93 | CSYNC(); | 93 | CSYNC(); |
94 | } | 94 | } |
95 | 95 | ||
96 | extern int pm_overflow_handler(int irq, struct pt_regs *regs); | 96 | extern int pm_overflow_handler(struct pt_regs *regs); |
97 | 97 | ||
98 | #endif | 98 | #endif |
diff --git a/arch/blackfin/oprofile/op_model_bf533.c b/arch/blackfin/oprofile/op_model_bf533.c index d1c698bb9ee5..0e34df169b2d 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]; | |||
52 | 52 | ||
53 | static int bfin533_reg_setup(struct op_counter_config *ctr) | 53 | static int bfin533_reg_setup(struct op_counter_config *ctr) |
54 | { | 54 | { |
55 | unsigned int pfctl = ctr_read(); | 55 | unsigned int pfctl = 0; |
56 | unsigned int count[2]; | 56 | unsigned int count[2]; |
57 | 57 | ||
58 | /* set Blackfin perf monitor regs with ctr */ | 58 | /* set Blackfin perf monitor regs with ctr */ |
@@ -118,7 +118,7 @@ static int get_kernel(void) | |||
118 | return is_kernel; | 118 | return is_kernel; |
119 | } | 119 | } |
120 | 120 | ||
121 | int pm_overflow_handler(int irq, struct pt_regs *regs) | 121 | int pm_overflow_handler(struct pt_regs *regs) |
122 | { | 122 | { |
123 | int is_kernel; | 123 | int is_kernel; |
124 | int i, cpu; | 124 | int i, cpu; |