Merge tag 'trace-fixes-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[deliverable/linux.git] / arch / arm / kernel / perf_event_v7.c
1 /*
2 * ARMv7 Cortex-A8 and Cortex-A9 Performance Events handling code.
3 *
4 * ARMv7 support: Jean Pihet <jpihet@mvista.com>
5 * 2010 (c) MontaVista Software, LLC.
6 *
7 * Copied from ARMv6 code, with the low level code inspired
8 * by the ARMv7 Oprofile code.
9 *
10 * Cortex-A8 has up to 4 configurable performance counters and
11 * a single cycle counter.
12 * Cortex-A9 has up to 31 configurable performance counters and
13 * a single cycle counter.
14 *
15 * All counters can be enabled/disabled and IRQ masked separately. The cycle
16 * counter and all 4 performance counters together can be reset separately.
17 */
18
19 #ifdef CONFIG_CPU_V7
20
21 #include <asm/cp15.h>
22 #include <asm/vfp.h>
23 #include "../vfp/vfpinstr.h"
24
25 /*
26 * Common ARMv7 event types
27 *
28 * Note: An implementation may not be able to count all of these events
29 * but the encodings are considered to be `reserved' in the case that
30 * they are not available.
31 */
32 enum armv7_perf_types {
33 ARMV7_PERFCTR_PMNC_SW_INCR = 0x00,
34 ARMV7_PERFCTR_L1_ICACHE_REFILL = 0x01,
35 ARMV7_PERFCTR_ITLB_REFILL = 0x02,
36 ARMV7_PERFCTR_L1_DCACHE_REFILL = 0x03,
37 ARMV7_PERFCTR_L1_DCACHE_ACCESS = 0x04,
38 ARMV7_PERFCTR_DTLB_REFILL = 0x05,
39 ARMV7_PERFCTR_MEM_READ = 0x06,
40 ARMV7_PERFCTR_MEM_WRITE = 0x07,
41 ARMV7_PERFCTR_INSTR_EXECUTED = 0x08,
42 ARMV7_PERFCTR_EXC_TAKEN = 0x09,
43 ARMV7_PERFCTR_EXC_EXECUTED = 0x0A,
44 ARMV7_PERFCTR_CID_WRITE = 0x0B,
45
46 /*
47 * ARMV7_PERFCTR_PC_WRITE is equivalent to HW_BRANCH_INSTRUCTIONS.
48 * It counts:
49 * - all (taken) branch instructions,
50 * - instructions that explicitly write the PC,
51 * - exception generating instructions.
52 */
53 ARMV7_PERFCTR_PC_WRITE = 0x0C,
54 ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D,
55 ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E,
56 ARMV7_PERFCTR_MEM_UNALIGNED_ACCESS = 0x0F,
57 ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10,
58 ARMV7_PERFCTR_CLOCK_CYCLES = 0x11,
59 ARMV7_PERFCTR_PC_BRANCH_PRED = 0x12,
60
61 /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */
62 ARMV7_PERFCTR_MEM_ACCESS = 0x13,
63 ARMV7_PERFCTR_L1_ICACHE_ACCESS = 0x14,
64 ARMV7_PERFCTR_L1_DCACHE_WB = 0x15,
65 ARMV7_PERFCTR_L2_CACHE_ACCESS = 0x16,
66 ARMV7_PERFCTR_L2_CACHE_REFILL = 0x17,
67 ARMV7_PERFCTR_L2_CACHE_WB = 0x18,
68 ARMV7_PERFCTR_BUS_ACCESS = 0x19,
69 ARMV7_PERFCTR_MEM_ERROR = 0x1A,
70 ARMV7_PERFCTR_INSTR_SPEC = 0x1B,
71 ARMV7_PERFCTR_TTBR_WRITE = 0x1C,
72 ARMV7_PERFCTR_BUS_CYCLES = 0x1D,
73
74 ARMV7_PERFCTR_CPU_CYCLES = 0xFF
75 };
76
77 /* ARMv7 Cortex-A8 specific event types */
78 enum armv7_a8_perf_types {
79 ARMV7_A8_PERFCTR_L2_CACHE_ACCESS = 0x43,
80 ARMV7_A8_PERFCTR_L2_CACHE_REFILL = 0x44,
81 ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS = 0x50,
82 ARMV7_A8_PERFCTR_STALL_ISIDE = 0x56,
83 };
84
85 /* ARMv7 Cortex-A9 specific event types */
86 enum armv7_a9_perf_types {
87 ARMV7_A9_PERFCTR_INSTR_CORE_RENAME = 0x68,
88 ARMV7_A9_PERFCTR_STALL_ICACHE = 0x60,
89 ARMV7_A9_PERFCTR_STALL_DISPATCH = 0x66,
90 };
91
92 /* ARMv7 Cortex-A5 specific event types */
93 enum armv7_a5_perf_types {
94 ARMV7_A5_PERFCTR_PREFETCH_LINEFILL = 0xc2,
95 ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP = 0xc3,
96 };
97
98 /* ARMv7 Cortex-A15 specific event types */
99 enum armv7_a15_perf_types {
100 ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ = 0x40,
101 ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE = 0x41,
102 ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ = 0x42,
103 ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE = 0x43,
104
105 ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ = 0x4C,
106 ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE = 0x4D,
107
108 ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ = 0x50,
109 ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE = 0x51,
110 ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ = 0x52,
111 ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE = 0x53,
112
113 ARMV7_A15_PERFCTR_PC_WRITE_SPEC = 0x76,
114 };
115
116 /* ARMv7 Cortex-A12 specific event types */
117 enum armv7_a12_perf_types {
118 ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_READ = 0x40,
119 ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_WRITE = 0x41,
120
121 ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_READ = 0x50,
122 ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_WRITE = 0x51,
123
124 ARMV7_A12_PERFCTR_PC_WRITE_SPEC = 0x76,
125
126 ARMV7_A12_PERFCTR_PF_TLB_REFILL = 0xe7,
127 };
128
129 /* ARMv7 Krait specific event types */
130 enum krait_perf_types {
131 KRAIT_PMRESR0_GROUP0 = 0xcc,
132 KRAIT_PMRESR1_GROUP0 = 0xd0,
133 KRAIT_PMRESR2_GROUP0 = 0xd4,
134 KRAIT_VPMRESR0_GROUP0 = 0xd8,
135
136 KRAIT_PERFCTR_L1_ICACHE_ACCESS = 0x10011,
137 KRAIT_PERFCTR_L1_ICACHE_MISS = 0x10010,
138
139 KRAIT_PERFCTR_L1_ITLB_ACCESS = 0x12222,
140 KRAIT_PERFCTR_L1_DTLB_ACCESS = 0x12210,
141 };
142
143 /*
144 * Cortex-A8 HW events mapping
145 *
146 * The hardware events that we support. We do support cache operations but
147 * we have harvard caches and no way to combine instruction and data
148 * accesses/misses in hardware.
149 */
150 static const unsigned armv7_a8_perf_map[PERF_COUNT_HW_MAX] = {
151 PERF_MAP_ALL_UNSUPPORTED,
152 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
153 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
154 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
155 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
156 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE,
157 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
158 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV7_A8_PERFCTR_STALL_ISIDE,
159 };
160
161 static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
162 [PERF_COUNT_HW_CACHE_OP_MAX]
163 [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
164 PERF_CACHE_MAP_ALL_UNSUPPORTED,
165
166 /*
167 * The performance counters don't differentiate between read and write
168 * accesses/misses so this isn't strictly correct, but it's the best we
169 * can do. Writes and reads get combined.
170 */
171 [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
172 [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
173 [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
174 [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
175
176 [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS,
177 [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
178
179 [C(LL)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS,
180 [C(LL)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL,
181 [C(LL)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS,
182 [C(LL)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL,
183
184 [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
185 [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
186
187 [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
188 [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
189
190 [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
191 [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
192 [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
193 [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
194 };
195
196 /*
197 * Cortex-A9 HW events mapping
198 */
199 static const unsigned armv7_a9_perf_map[PERF_COUNT_HW_MAX] = {
200 PERF_MAP_ALL_UNSUPPORTED,
201 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
202 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_A9_PERFCTR_INSTR_CORE_RENAME,
203 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
204 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
205 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE,
206 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
207 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV7_A9_PERFCTR_STALL_ICACHE,
208 [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV7_A9_PERFCTR_STALL_DISPATCH,
209 };
210
211 static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
212 [PERF_COUNT_HW_CACHE_OP_MAX]
213 [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
214 PERF_CACHE_MAP_ALL_UNSUPPORTED,
215
216 /*
217 * The performance counters don't differentiate between read and write
218 * accesses/misses so this isn't strictly correct, but it's the best we
219 * can do. Writes and reads get combined.
220 */
221 [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
222 [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
223 [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
224 [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
225
226 [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
227
228 [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
229 [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
230
231 [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
232 [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
233
234 [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
235 [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
236 [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
237 [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
238 };
239
240 /*
241 * Cortex-A5 HW events mapping
242 */
243 static const unsigned armv7_a5_perf_map[PERF_COUNT_HW_MAX] = {
244 PERF_MAP_ALL_UNSUPPORTED,
245 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
246 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
247 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
248 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
249 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE,
250 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
251 };
252
253 static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
254 [PERF_COUNT_HW_CACHE_OP_MAX]
255 [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
256 PERF_CACHE_MAP_ALL_UNSUPPORTED,
257
258 [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
259 [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
260 [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
261 [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
262 [C(L1D)][C(OP_PREFETCH)][C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL,
263 [C(L1D)][C(OP_PREFETCH)][C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP,
264
265 [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
266 [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
267 /*
268 * The prefetch counters don't differentiate between the I side and the
269 * D side.
270 */
271 [C(L1I)][C(OP_PREFETCH)][C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL,
272 [C(L1I)][C(OP_PREFETCH)][C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP,
273
274 [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
275 [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
276
277 [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
278 [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
279
280 [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
281 [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
282 [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
283 [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
284 };
285
286 /*
287 * Cortex-A15 HW events mapping
288 */
289 static const unsigned armv7_a15_perf_map[PERF_COUNT_HW_MAX] = {
290 PERF_MAP_ALL_UNSUPPORTED,
291 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
292 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
293 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
294 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
295 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_A15_PERFCTR_PC_WRITE_SPEC,
296 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
297 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES,
298 };
299
300 static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
301 [PERF_COUNT_HW_CACHE_OP_MAX]
302 [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
303 PERF_CACHE_MAP_ALL_UNSUPPORTED,
304
305 [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ,
306 [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ,
307 [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE,
308 [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE,
309
310 /*
311 * Not all performance counters differentiate between read and write
312 * accesses/misses so we're not always strictly correct, but it's the
313 * best we can do. Writes and reads get combined in these cases.
314 */
315 [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
316 [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
317
318 [C(LL)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ,
319 [C(LL)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ,
320 [C(LL)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE,
321 [C(LL)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE,
322
323 [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ,
324 [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE,
325
326 [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
327 [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
328
329 [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
330 [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
331 [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
332 [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
333 };
334
335 /*
336 * Cortex-A7 HW events mapping
337 */
338 static const unsigned armv7_a7_perf_map[PERF_COUNT_HW_MAX] = {
339 PERF_MAP_ALL_UNSUPPORTED,
340 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
341 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
342 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
343 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
344 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE,
345 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
346 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES,
347 };
348
349 static const unsigned armv7_a7_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
350 [PERF_COUNT_HW_CACHE_OP_MAX]
351 [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
352 PERF_CACHE_MAP_ALL_UNSUPPORTED,
353
354 /*
355 * The performance counters don't differentiate between read and write
356 * accesses/misses so this isn't strictly correct, but it's the best we
357 * can do. Writes and reads get combined.
358 */
359 [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
360 [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
361 [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
362 [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
363
364 [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
365 [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
366
367 [C(LL)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_CACHE_ACCESS,
368 [C(LL)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL,
369 [C(LL)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_CACHE_ACCESS,
370 [C(LL)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL,
371
372 [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
373 [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
374
375 [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
376 [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
377
378 [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
379 [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
380 [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
381 [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
382 };
383
384 /*
385 * Cortex-A12 HW events mapping
386 */
387 static const unsigned armv7_a12_perf_map[PERF_COUNT_HW_MAX] = {
388 PERF_MAP_ALL_UNSUPPORTED,
389 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
390 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
391 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
392 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
393 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_A12_PERFCTR_PC_WRITE_SPEC,
394 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
395 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES,
396 };
397
398 static const unsigned armv7_a12_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
399 [PERF_COUNT_HW_CACHE_OP_MAX]
400 [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
401 PERF_CACHE_MAP_ALL_UNSUPPORTED,
402
403 [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_READ,
404 [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
405 [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_WRITE,
406 [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
407
408 /*
409 * Not all performance counters differentiate between read and write
410 * accesses/misses so we're not always strictly correct, but it's the
411 * best we can do. Writes and reads get combined in these cases.
412 */
413 [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
414 [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
415
416 [C(LL)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_READ,
417 [C(LL)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL,
418 [C(LL)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_WRITE,
419 [C(LL)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL,
420
421 [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
422 [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
423 [C(DTLB)][C(OP_PREFETCH)][C(RESULT_MISS)] = ARMV7_A12_PERFCTR_PF_TLB_REFILL,
424
425 [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
426 [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
427
428 [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
429 [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
430 [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
431 [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
432 };
433
434 /*
435 * Krait HW events mapping
436 */
437 static const unsigned krait_perf_map[PERF_COUNT_HW_MAX] = {
438 PERF_MAP_ALL_UNSUPPORTED,
439 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
440 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
441 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE,
442 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
443 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES,
444 };
445
446 static const unsigned krait_perf_map_no_branch[PERF_COUNT_HW_MAX] = {
447 PERF_MAP_ALL_UNSUPPORTED,
448 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES,
449 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED,
450 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
451 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES,
452 };
453
454 static const unsigned krait_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
455 [PERF_COUNT_HW_CACHE_OP_MAX]
456 [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
457 PERF_CACHE_MAP_ALL_UNSUPPORTED,
458
459 /*
460 * The performance counters don't differentiate between read and write
461 * accesses/misses so this isn't strictly correct, but it's the best we
462 * can do. Writes and reads get combined.
463 */
464 [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
465 [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
466 [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
467 [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
468
469 [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ICACHE_ACCESS,
470 [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = KRAIT_PERFCTR_L1_ICACHE_MISS,
471
472 [C(DTLB)][C(OP_READ)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_DTLB_ACCESS,
473 [C(DTLB)][C(OP_WRITE)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_DTLB_ACCESS,
474
475 [C(ITLB)][C(OP_READ)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ITLB_ACCESS,
476 [C(ITLB)][C(OP_WRITE)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ITLB_ACCESS,
477
478 [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
479 [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
480 [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
481 [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
482 };
483
484 /*
485 * Perf Events' indices
486 */
487 #define ARMV7_IDX_CYCLE_COUNTER 0
488 #define ARMV7_IDX_COUNTER0 1
489 #define ARMV7_IDX_COUNTER_LAST(cpu_pmu) \
490 (ARMV7_IDX_CYCLE_COUNTER + cpu_pmu->num_events - 1)
491
492 #define ARMV7_MAX_COUNTERS 32
493 #define ARMV7_COUNTER_MASK (ARMV7_MAX_COUNTERS - 1)
494
495 /*
496 * ARMv7 low level PMNC access
497 */
498
499 /*
500 * Perf Event to low level counters mapping
501 */
502 #define ARMV7_IDX_TO_COUNTER(x) \
503 (((x) - ARMV7_IDX_COUNTER0) & ARMV7_COUNTER_MASK)
504
505 /*
506 * Per-CPU PMNC: config reg
507 */
508 #define ARMV7_PMNC_E (1 << 0) /* Enable all counters */
509 #define ARMV7_PMNC_P (1 << 1) /* Reset all counters */
510 #define ARMV7_PMNC_C (1 << 2) /* Cycle counter reset */
511 #define ARMV7_PMNC_D (1 << 3) /* CCNT counts every 64th cpu cycle */
512 #define ARMV7_PMNC_X (1 << 4) /* Export to ETM */
513 #define ARMV7_PMNC_DP (1 << 5) /* Disable CCNT if non-invasive debug*/
514 #define ARMV7_PMNC_N_SHIFT 11 /* Number of counters supported */
515 #define ARMV7_PMNC_N_MASK 0x1f
516 #define ARMV7_PMNC_MASK 0x3f /* Mask for writable bits */
517
518 /*
519 * FLAG: counters overflow flag status reg
520 */
521 #define ARMV7_FLAG_MASK 0xffffffff /* Mask for writable bits */
522 #define ARMV7_OVERFLOWED_MASK ARMV7_FLAG_MASK
523
524 /*
525 * PMXEVTYPER: Event selection reg
526 */
527 #define ARMV7_EVTYPE_MASK 0xc80000ff /* Mask for writable bits */
528 #define ARMV7_EVTYPE_EVENT 0xff /* Mask for EVENT bits */
529
530 /*
531 * Event filters for PMUv2
532 */
533 #define ARMV7_EXCLUDE_PL1 (1 << 31)
534 #define ARMV7_EXCLUDE_USER (1 << 30)
535 #define ARMV7_INCLUDE_HYP (1 << 27)
536
537 static inline u32 armv7_pmnc_read(void)
538 {
539 u32 val;
540 asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(val));
541 return val;
542 }
543
544 static inline void armv7_pmnc_write(u32 val)
545 {
546 val &= ARMV7_PMNC_MASK;
547 isb();
548 asm volatile("mcr p15, 0, %0, c9, c12, 0" : : "r"(val));
549 }
550
551 static inline int armv7_pmnc_has_overflowed(u32 pmnc)
552 {
553 return pmnc & ARMV7_OVERFLOWED_MASK;
554 }
555
556 static inline int armv7_pmnc_counter_valid(struct arm_pmu *cpu_pmu, int idx)
557 {
558 return idx >= ARMV7_IDX_CYCLE_COUNTER &&
559 idx <= ARMV7_IDX_COUNTER_LAST(cpu_pmu);
560 }
561
562 static inline int armv7_pmnc_counter_has_overflowed(u32 pmnc, int idx)
563 {
564 return pmnc & BIT(ARMV7_IDX_TO_COUNTER(idx));
565 }
566
567 static inline int armv7_pmnc_select_counter(int idx)
568 {
569 u32 counter = ARMV7_IDX_TO_COUNTER(idx);
570 asm volatile("mcr p15, 0, %0, c9, c12, 5" : : "r" (counter));
571 isb();
572
573 return idx;
574 }
575
576 static inline u32 armv7pmu_read_counter(struct perf_event *event)
577 {
578 struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
579 struct hw_perf_event *hwc = &event->hw;
580 int idx = hwc->idx;
581 u32 value = 0;
582
583 if (!armv7_pmnc_counter_valid(cpu_pmu, idx))
584 pr_err("CPU%u reading wrong counter %d\n",
585 smp_processor_id(), idx);
586 else if (idx == ARMV7_IDX_CYCLE_COUNTER)
587 asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (value));
588 else if (armv7_pmnc_select_counter(idx) == idx)
589 asm volatile("mrc p15, 0, %0, c9, c13, 2" : "=r" (value));
590
591 return value;
592 }
593
594 static inline void armv7pmu_write_counter(struct perf_event *event, u32 value)
595 {
596 struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
597 struct hw_perf_event *hwc = &event->hw;
598 int idx = hwc->idx;
599
600 if (!armv7_pmnc_counter_valid(cpu_pmu, idx))
601 pr_err("CPU%u writing wrong counter %d\n",
602 smp_processor_id(), idx);
603 else if (idx == ARMV7_IDX_CYCLE_COUNTER)
604 asm volatile("mcr p15, 0, %0, c9, c13, 0" : : "r" (value));
605 else if (armv7_pmnc_select_counter(idx) == idx)
606 asm volatile("mcr p15, 0, %0, c9, c13, 2" : : "r" (value));
607 }
608
609 static inline void armv7_pmnc_write_evtsel(int idx, u32 val)
610 {
611 if (armv7_pmnc_select_counter(idx) == idx) {
612 val &= ARMV7_EVTYPE_MASK;
613 asm volatile("mcr p15, 0, %0, c9, c13, 1" : : "r" (val));
614 }
615 }
616
617 static inline int armv7_pmnc_enable_counter(int idx)
618 {
619 u32 counter = ARMV7_IDX_TO_COUNTER(idx);
620 asm volatile("mcr p15, 0, %0, c9, c12, 1" : : "r" (BIT(counter)));
621 return idx;
622 }
623
624 static inline int armv7_pmnc_disable_counter(int idx)
625 {
626 u32 counter = ARMV7_IDX_TO_COUNTER(idx);
627 asm volatile("mcr p15, 0, %0, c9, c12, 2" : : "r" (BIT(counter)));
628 return idx;
629 }
630
631 static inline int armv7_pmnc_enable_intens(int idx)
632 {
633 u32 counter = ARMV7_IDX_TO_COUNTER(idx);
634 asm volatile("mcr p15, 0, %0, c9, c14, 1" : : "r" (BIT(counter)));
635 return idx;
636 }
637
638 static inline int armv7_pmnc_disable_intens(int idx)
639 {
640 u32 counter = ARMV7_IDX_TO_COUNTER(idx);
641 asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter)));
642 isb();
643 /* Clear the overflow flag in case an interrupt is pending. */
644 asm volatile("mcr p15, 0, %0, c9, c12, 3" : : "r" (BIT(counter)));
645 isb();
646
647 return idx;
648 }
649
650 static inline u32 armv7_pmnc_getreset_flags(void)
651 {
652 u32 val;
653
654 /* Read */
655 asm volatile("mrc p15, 0, %0, c9, c12, 3" : "=r" (val));
656
657 /* Write to clear flags */
658 val &= ARMV7_FLAG_MASK;
659 asm volatile("mcr p15, 0, %0, c9, c12, 3" : : "r" (val));
660
661 return val;
662 }
663
664 #ifdef DEBUG
665 static void armv7_pmnc_dump_regs(struct arm_pmu *cpu_pmu)
666 {
667 u32 val;
668 unsigned int cnt;
669
670 printk(KERN_INFO "PMNC registers dump:\n");
671
672 asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r" (val));
673 printk(KERN_INFO "PMNC =0x%08x\n", val);
674
675 asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r" (val));
676 printk(KERN_INFO "CNTENS=0x%08x\n", val);
677
678 asm volatile("mrc p15, 0, %0, c9, c14, 1" : "=r" (val));
679 printk(KERN_INFO "INTENS=0x%08x\n", val);
680
681 asm volatile("mrc p15, 0, %0, c9, c12, 3" : "=r" (val));
682 printk(KERN_INFO "FLAGS =0x%08x\n", val);
683
684 asm volatile("mrc p15, 0, %0, c9, c12, 5" : "=r" (val));
685 printk(KERN_INFO "SELECT=0x%08x\n", val);
686
687 asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (val));
688 printk(KERN_INFO "CCNT =0x%08x\n", val);
689
690 for (cnt = ARMV7_IDX_COUNTER0;
691 cnt <= ARMV7_IDX_COUNTER_LAST(cpu_pmu); cnt++) {
692 armv7_pmnc_select_counter(cnt);
693 asm volatile("mrc p15, 0, %0, c9, c13, 2" : "=r" (val));
694 printk(KERN_INFO "CNT[%d] count =0x%08x\n",
695 ARMV7_IDX_TO_COUNTER(cnt), val);
696 asm volatile("mrc p15, 0, %0, c9, c13, 1" : "=r" (val));
697 printk(KERN_INFO "CNT[%d] evtsel=0x%08x\n",
698 ARMV7_IDX_TO_COUNTER(cnt), val);
699 }
700 }
701 #endif
702
703 static void armv7pmu_enable_event(struct perf_event *event)
704 {
705 unsigned long flags;
706 struct hw_perf_event *hwc = &event->hw;
707 struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
708 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
709 int idx = hwc->idx;
710
711 if (!armv7_pmnc_counter_valid(cpu_pmu, idx)) {
712 pr_err("CPU%u enabling wrong PMNC counter IRQ enable %d\n",
713 smp_processor_id(), idx);
714 return;
715 }
716
717 /*
718 * Enable counter and interrupt, and set the counter to count
719 * the event that we're interested in.
720 */
721 raw_spin_lock_irqsave(&events->pmu_lock, flags);
722
723 /*
724 * Disable counter
725 */
726 armv7_pmnc_disable_counter(idx);
727
728 /*
729 * Set event (if destined for PMNx counters)
730 * We only need to set the event for the cycle counter if we
731 * have the ability to perform event filtering.
732 */
733 if (cpu_pmu->set_event_filter || idx != ARMV7_IDX_CYCLE_COUNTER)
734 armv7_pmnc_write_evtsel(idx, hwc->config_base);
735
736 /*
737 * Enable interrupt for this counter
738 */
739 armv7_pmnc_enable_intens(idx);
740
741 /*
742 * Enable counter
743 */
744 armv7_pmnc_enable_counter(idx);
745
746 raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
747 }
748
749 static void armv7pmu_disable_event(struct perf_event *event)
750 {
751 unsigned long flags;
752 struct hw_perf_event *hwc = &event->hw;
753 struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
754 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
755 int idx = hwc->idx;
756
757 if (!armv7_pmnc_counter_valid(cpu_pmu, idx)) {
758 pr_err("CPU%u disabling wrong PMNC counter IRQ enable %d\n",
759 smp_processor_id(), idx);
760 return;
761 }
762
763 /*
764 * Disable counter and interrupt
765 */
766 raw_spin_lock_irqsave(&events->pmu_lock, flags);
767
768 /*
769 * Disable counter
770 */
771 armv7_pmnc_disable_counter(idx);
772
773 /*
774 * Disable interrupt for this counter
775 */
776 armv7_pmnc_disable_intens(idx);
777
778 raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
779 }
780
781 static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)
782 {
783 u32 pmnc;
784 struct perf_sample_data data;
785 struct arm_pmu *cpu_pmu = (struct arm_pmu *)dev;
786 struct pmu_hw_events *cpuc = cpu_pmu->get_hw_events();
787 struct pt_regs *regs;
788 int idx;
789
790 /*
791 * Get and reset the IRQ flags
792 */
793 pmnc = armv7_pmnc_getreset_flags();
794
795 /*
796 * Did an overflow occur?
797 */
798 if (!armv7_pmnc_has_overflowed(pmnc))
799 return IRQ_NONE;
800
801 /*
802 * Handle the counter(s) overflow(s)
803 */
804 regs = get_irq_regs();
805
806 for (idx = 0; idx < cpu_pmu->num_events; ++idx) {
807 struct perf_event *event = cpuc->events[idx];
808 struct hw_perf_event *hwc;
809
810 /* Ignore if we don't have an event. */
811 if (!event)
812 continue;
813
814 /*
815 * We have a single interrupt for all counters. Check that
816 * each counter has overflowed before we process it.
817 */
818 if (!armv7_pmnc_counter_has_overflowed(pmnc, idx))
819 continue;
820
821 hwc = &event->hw;
822 armpmu_event_update(event);
823 perf_sample_data_init(&data, 0, hwc->last_period);
824 if (!armpmu_event_set_period(event))
825 continue;
826
827 if (perf_event_overflow(event, &data, regs))
828 cpu_pmu->disable(event);
829 }
830
831 /*
832 * Handle the pending perf events.
833 *
834 * Note: this call *must* be run with interrupts disabled. For
835 * platforms that can have the PMU interrupts raised as an NMI, this
836 * will not work.
837 */
838 irq_work_run();
839
840 return IRQ_HANDLED;
841 }
842
843 static void armv7pmu_start(struct arm_pmu *cpu_pmu)
844 {
845 unsigned long flags;
846 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
847
848 raw_spin_lock_irqsave(&events->pmu_lock, flags);
849 /* Enable all counters */
850 armv7_pmnc_write(armv7_pmnc_read() | ARMV7_PMNC_E);
851 raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
852 }
853
854 static void armv7pmu_stop(struct arm_pmu *cpu_pmu)
855 {
856 unsigned long flags;
857 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
858
859 raw_spin_lock_irqsave(&events->pmu_lock, flags);
860 /* Disable all counters */
861 armv7_pmnc_write(armv7_pmnc_read() & ~ARMV7_PMNC_E);
862 raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
863 }
864
865 static int armv7pmu_get_event_idx(struct pmu_hw_events *cpuc,
866 struct perf_event *event)
867 {
868 int idx;
869 struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
870 struct hw_perf_event *hwc = &event->hw;
871 unsigned long evtype = hwc->config_base & ARMV7_EVTYPE_EVENT;
872
873 /* Always place a cycle counter into the cycle counter. */
874 if (evtype == ARMV7_PERFCTR_CPU_CYCLES) {
875 if (test_and_set_bit(ARMV7_IDX_CYCLE_COUNTER, cpuc->used_mask))
876 return -EAGAIN;
877
878 return ARMV7_IDX_CYCLE_COUNTER;
879 }
880
881 /*
882 * For anything other than a cycle counter, try and use
883 * the events counters
884 */
885 for (idx = ARMV7_IDX_COUNTER0; idx < cpu_pmu->num_events; ++idx) {
886 if (!test_and_set_bit(idx, cpuc->used_mask))
887 return idx;
888 }
889
890 /* The counters are all in use. */
891 return -EAGAIN;
892 }
893
894 /*
895 * Add an event filter to a given event. This will only work for PMUv2 PMUs.
896 */
897 static int armv7pmu_set_event_filter(struct hw_perf_event *event,
898 struct perf_event_attr *attr)
899 {
900 unsigned long config_base = 0;
901
902 if (attr->exclude_idle)
903 return -EPERM;
904 if (attr->exclude_user)
905 config_base |= ARMV7_EXCLUDE_USER;
906 if (attr->exclude_kernel)
907 config_base |= ARMV7_EXCLUDE_PL1;
908 if (!attr->exclude_hv)
909 config_base |= ARMV7_INCLUDE_HYP;
910
911 /*
912 * Install the filter into config_base as this is used to
913 * construct the event type.
914 */
915 event->config_base = config_base;
916
917 return 0;
918 }
919
920 static void armv7pmu_reset(void *info)
921 {
922 struct arm_pmu *cpu_pmu = (struct arm_pmu *)info;
923 u32 idx, nb_cnt = cpu_pmu->num_events;
924
925 /* The counter and interrupt enable registers are unknown at reset. */
926 for (idx = ARMV7_IDX_CYCLE_COUNTER; idx < nb_cnt; ++idx) {
927 armv7_pmnc_disable_counter(idx);
928 armv7_pmnc_disable_intens(idx);
929 }
930
931 /* Initialize & Reset PMNC: C and P bits */
932 armv7_pmnc_write(ARMV7_PMNC_P | ARMV7_PMNC_C);
933 }
934
935 static int armv7_a8_map_event(struct perf_event *event)
936 {
937 return armpmu_map_event(event, &armv7_a8_perf_map,
938 &armv7_a8_perf_cache_map, 0xFF);
939 }
940
941 static int armv7_a9_map_event(struct perf_event *event)
942 {
943 return armpmu_map_event(event, &armv7_a9_perf_map,
944 &armv7_a9_perf_cache_map, 0xFF);
945 }
946
947 static int armv7_a5_map_event(struct perf_event *event)
948 {
949 return armpmu_map_event(event, &armv7_a5_perf_map,
950 &armv7_a5_perf_cache_map, 0xFF);
951 }
952
953 static int armv7_a15_map_event(struct perf_event *event)
954 {
955 return armpmu_map_event(event, &armv7_a15_perf_map,
956 &armv7_a15_perf_cache_map, 0xFF);
957 }
958
959 static int armv7_a7_map_event(struct perf_event *event)
960 {
961 return armpmu_map_event(event, &armv7_a7_perf_map,
962 &armv7_a7_perf_cache_map, 0xFF);
963 }
964
965 static int armv7_a12_map_event(struct perf_event *event)
966 {
967 return armpmu_map_event(event, &armv7_a12_perf_map,
968 &armv7_a12_perf_cache_map, 0xFF);
969 }
970
971 static int krait_map_event(struct perf_event *event)
972 {
973 return armpmu_map_event(event, &krait_perf_map,
974 &krait_perf_cache_map, 0xFFFFF);
975 }
976
977 static int krait_map_event_no_branch(struct perf_event *event)
978 {
979 return armpmu_map_event(event, &krait_perf_map_no_branch,
980 &krait_perf_cache_map, 0xFFFFF);
981 }
982
983 static void armv7pmu_init(struct arm_pmu *cpu_pmu)
984 {
985 cpu_pmu->handle_irq = armv7pmu_handle_irq;
986 cpu_pmu->enable = armv7pmu_enable_event;
987 cpu_pmu->disable = armv7pmu_disable_event;
988 cpu_pmu->read_counter = armv7pmu_read_counter;
989 cpu_pmu->write_counter = armv7pmu_write_counter;
990 cpu_pmu->get_event_idx = armv7pmu_get_event_idx;
991 cpu_pmu->start = armv7pmu_start;
992 cpu_pmu->stop = armv7pmu_stop;
993 cpu_pmu->reset = armv7pmu_reset;
994 cpu_pmu->max_period = (1LLU << 32) - 1;
995 };
996
997 static u32 armv7_read_num_pmnc_events(void)
998 {
999 u32 nb_cnt;
1000
1001 /* Read the nb of CNTx counters supported from PMNC */
1002 nb_cnt = (armv7_pmnc_read() >> ARMV7_PMNC_N_SHIFT) & ARMV7_PMNC_N_MASK;
1003
1004 /* Add the CPU cycles counter and return */
1005 return nb_cnt + 1;
1006 }
1007
1008 static int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)
1009 {
1010 armv7pmu_init(cpu_pmu);
1011 cpu_pmu->name = "armv7_cortex_a8";
1012 cpu_pmu->map_event = armv7_a8_map_event;
1013 cpu_pmu->num_events = armv7_read_num_pmnc_events();
1014 return 0;
1015 }
1016
1017 static int armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)
1018 {
1019 armv7pmu_init(cpu_pmu);
1020 cpu_pmu->name = "armv7_cortex_a9";
1021 cpu_pmu->map_event = armv7_a9_map_event;
1022 cpu_pmu->num_events = armv7_read_num_pmnc_events();
1023 return 0;
1024 }
1025
1026 static int armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)
1027 {
1028 armv7pmu_init(cpu_pmu);
1029 cpu_pmu->name = "armv7_cortex_a5";
1030 cpu_pmu->map_event = armv7_a5_map_event;
1031 cpu_pmu->num_events = armv7_read_num_pmnc_events();
1032 return 0;
1033 }
1034
1035 static int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)
1036 {
1037 armv7pmu_init(cpu_pmu);
1038 cpu_pmu->name = "armv7_cortex_a15";
1039 cpu_pmu->map_event = armv7_a15_map_event;
1040 cpu_pmu->num_events = armv7_read_num_pmnc_events();
1041 cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
1042 return 0;
1043 }
1044
1045 static int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu)
1046 {
1047 armv7pmu_init(cpu_pmu);
1048 cpu_pmu->name = "armv7_cortex_a7";
1049 cpu_pmu->map_event = armv7_a7_map_event;
1050 cpu_pmu->num_events = armv7_read_num_pmnc_events();
1051 cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
1052 return 0;
1053 }
1054
1055 static int armv7_a12_pmu_init(struct arm_pmu *cpu_pmu)
1056 {
1057 armv7pmu_init(cpu_pmu);
1058 cpu_pmu->name = "armv7_cortex_a12";
1059 cpu_pmu->map_event = armv7_a12_map_event;
1060 cpu_pmu->num_events = armv7_read_num_pmnc_events();
1061 cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
1062 return 0;
1063 }
1064
1065 static int armv7_a17_pmu_init(struct arm_pmu *cpu_pmu)
1066 {
1067 armv7_a12_pmu_init(cpu_pmu);
1068 cpu_pmu->name = "armv7_cortex_a17";
1069 return 0;
1070 }
1071
1072 /*
1073 * Krait Performance Monitor Region Event Selection Register (PMRESRn)
1074 *
1075 * 31 30 24 16 8 0
1076 * +--------------------------------+
1077 * PMRESR0 | EN | CC | CC | CC | CC | N = 1, R = 0
1078 * +--------------------------------+
1079 * PMRESR1 | EN | CC | CC | CC | CC | N = 1, R = 1
1080 * +--------------------------------+
1081 * PMRESR2 | EN | CC | CC | CC | CC | N = 1, R = 2
1082 * +--------------------------------+
1083 * VPMRESR0 | EN | CC | CC | CC | CC | N = 2, R = ?
1084 * +--------------------------------+
1085 * EN | G=3 | G=2 | G=1 | G=0
1086 *
1087 * Event Encoding:
1088 *
1089 * hwc->config_base = 0xNRCCG
1090 *
1091 * N = prefix, 1 for Krait CPU (PMRESRn), 2 for Venum VFP (VPMRESR)
1092 * R = region register
1093 * CC = class of events the group G is choosing from
1094 * G = group or particular event
1095 *
1096 * Example: 0x12021 is a Krait CPU event in PMRESR2's group 1 with code 2
1097 *
1098 * A region (R) corresponds to a piece of the CPU (execution unit, instruction
1099 * unit, etc.) while the event code (CC) corresponds to a particular class of
1100 * events (interrupts for example). An event code is broken down into
1101 * groups (G) that can be mapped into the PMU (irq, fiqs, and irq+fiqs for
1102 * example).
1103 */
1104
1105 #define KRAIT_EVENT (1 << 16)
1106 #define VENUM_EVENT (2 << 16)
1107 #define KRAIT_EVENT_MASK (KRAIT_EVENT | VENUM_EVENT)
1108 #define PMRESRn_EN BIT(31)
1109
1110 static u32 krait_read_pmresrn(int n)
1111 {
1112 u32 val;
1113
1114 switch (n) {
1115 case 0:
1116 asm volatile("mrc p15, 1, %0, c9, c15, 0" : "=r" (val));
1117 break;
1118 case 1:
1119 asm volatile("mrc p15, 1, %0, c9, c15, 1" : "=r" (val));
1120 break;
1121 case 2:
1122 asm volatile("mrc p15, 1, %0, c9, c15, 2" : "=r" (val));
1123 break;
1124 default:
1125 BUG(); /* Should be validated in krait_pmu_get_event_idx() */
1126 }
1127
1128 return val;
1129 }
1130
1131 static void krait_write_pmresrn(int n, u32 val)
1132 {
1133 switch (n) {
1134 case 0:
1135 asm volatile("mcr p15, 1, %0, c9, c15, 0" : : "r" (val));
1136 break;
1137 case 1:
1138 asm volatile("mcr p15, 1, %0, c9, c15, 1" : : "r" (val));
1139 break;
1140 case 2:
1141 asm volatile("mcr p15, 1, %0, c9, c15, 2" : : "r" (val));
1142 break;
1143 default:
1144 BUG(); /* Should be validated in krait_pmu_get_event_idx() */
1145 }
1146 }
1147
1148 static u32 krait_read_vpmresr0(void)
1149 {
1150 u32 val;
1151 asm volatile("mrc p10, 7, %0, c11, c0, 0" : "=r" (val));
1152 return val;
1153 }
1154
1155 static void krait_write_vpmresr0(u32 val)
1156 {
1157 asm volatile("mcr p10, 7, %0, c11, c0, 0" : : "r" (val));
1158 }
1159
1160 static void krait_pre_vpmresr0(u32 *venum_orig_val, u32 *fp_orig_val)
1161 {
1162 u32 venum_new_val;
1163 u32 fp_new_val;
1164
1165 BUG_ON(preemptible());
1166 /* CPACR Enable CP10 and CP11 access */
1167 *venum_orig_val = get_copro_access();
1168 venum_new_val = *venum_orig_val | CPACC_SVC(10) | CPACC_SVC(11);
1169 set_copro_access(venum_new_val);
1170
1171 /* Enable FPEXC */
1172 *fp_orig_val = fmrx(FPEXC);
1173 fp_new_val = *fp_orig_val | FPEXC_EN;
1174 fmxr(FPEXC, fp_new_val);
1175 }
1176
1177 static void krait_post_vpmresr0(u32 venum_orig_val, u32 fp_orig_val)
1178 {
1179 BUG_ON(preemptible());
1180 /* Restore FPEXC */
1181 fmxr(FPEXC, fp_orig_val);
1182 isb();
1183 /* Restore CPACR */
1184 set_copro_access(venum_orig_val);
1185 }
1186
1187 static u32 krait_get_pmresrn_event(unsigned int region)
1188 {
1189 static const u32 pmresrn_table[] = { KRAIT_PMRESR0_GROUP0,
1190 KRAIT_PMRESR1_GROUP0,
1191 KRAIT_PMRESR2_GROUP0 };
1192 return pmresrn_table[region];
1193 }
1194
1195 static void krait_evt_setup(int idx, u32 config_base)
1196 {
1197 u32 val;
1198 u32 mask;
1199 u32 vval, fval;
1200 unsigned int region;
1201 unsigned int group;
1202 unsigned int code;
1203 unsigned int group_shift;
1204 bool venum_event;
1205
1206 venum_event = !!(config_base & VENUM_EVENT);
1207 region = (config_base >> 12) & 0xf;
1208 code = (config_base >> 4) & 0xff;
1209 group = (config_base >> 0) & 0xf;
1210
1211 group_shift = group * 8;
1212 mask = 0xff << group_shift;
1213
1214 /* Configure evtsel for the region and group */
1215 if (venum_event)
1216 val = KRAIT_VPMRESR0_GROUP0;
1217 else
1218 val = krait_get_pmresrn_event(region);
1219 val += group;
1220 /* Mix in mode-exclusion bits */
1221 val |= config_base & (ARMV7_EXCLUDE_USER | ARMV7_EXCLUDE_PL1);
1222 armv7_pmnc_write_evtsel(idx, val);
1223
1224 asm volatile("mcr p15, 0, %0, c9, c15, 0" : : "r" (0));
1225
1226 if (venum_event) {
1227 krait_pre_vpmresr0(&vval, &fval);
1228 val = krait_read_vpmresr0();
1229 val &= ~mask;
1230 val |= code << group_shift;
1231 val |= PMRESRn_EN;
1232 krait_write_vpmresr0(val);
1233 krait_post_vpmresr0(vval, fval);
1234 } else {
1235 val = krait_read_pmresrn(region);
1236 val &= ~mask;
1237 val |= code << group_shift;
1238 val |= PMRESRn_EN;
1239 krait_write_pmresrn(region, val);
1240 }
1241 }
1242
1243 static u32 krait_clear_pmresrn_group(u32 val, int group)
1244 {
1245 u32 mask;
1246 int group_shift;
1247
1248 group_shift = group * 8;
1249 mask = 0xff << group_shift;
1250 val &= ~mask;
1251
1252 /* Don't clear enable bit if entire region isn't disabled */
1253 if (val & ~PMRESRn_EN)
1254 return val |= PMRESRn_EN;
1255
1256 return 0;
1257 }
1258
1259 static void krait_clearpmu(u32 config_base)
1260 {
1261 u32 val;
1262 u32 vval, fval;
1263 unsigned int region;
1264 unsigned int group;
1265 bool venum_event;
1266
1267 venum_event = !!(config_base & VENUM_EVENT);
1268 region = (config_base >> 12) & 0xf;
1269 group = (config_base >> 0) & 0xf;
1270
1271 if (venum_event) {
1272 krait_pre_vpmresr0(&vval, &fval);
1273 val = krait_read_vpmresr0();
1274 val = krait_clear_pmresrn_group(val, group);
1275 krait_write_vpmresr0(val);
1276 krait_post_vpmresr0(vval, fval);
1277 } else {
1278 val = krait_read_pmresrn(region);
1279 val = krait_clear_pmresrn_group(val, group);
1280 krait_write_pmresrn(region, val);
1281 }
1282 }
1283
1284 static void krait_pmu_disable_event(struct perf_event *event)
1285 {
1286 unsigned long flags;
1287 struct hw_perf_event *hwc = &event->hw;
1288 int idx = hwc->idx;
1289 struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
1290 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
1291
1292 /* Disable counter and interrupt */
1293 raw_spin_lock_irqsave(&events->pmu_lock, flags);
1294
1295 /* Disable counter */
1296 armv7_pmnc_disable_counter(idx);
1297
1298 /*
1299 * Clear pmresr code (if destined for PMNx counters)
1300 */
1301 if (hwc->config_base & KRAIT_EVENT_MASK)
1302 krait_clearpmu(hwc->config_base);
1303
1304 /* Disable interrupt for this counter */
1305 armv7_pmnc_disable_intens(idx);
1306
1307 raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
1308 }
1309
1310 static void krait_pmu_enable_event(struct perf_event *event)
1311 {
1312 unsigned long flags;
1313 struct hw_perf_event *hwc = &event->hw;
1314 int idx = hwc->idx;
1315 struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
1316 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
1317
1318 /*
1319 * Enable counter and interrupt, and set the counter to count
1320 * the event that we're interested in.
1321 */
1322 raw_spin_lock_irqsave(&events->pmu_lock, flags);
1323
1324 /* Disable counter */
1325 armv7_pmnc_disable_counter(idx);
1326
1327 /*
1328 * Set event (if destined for PMNx counters)
1329 * We set the event for the cycle counter because we
1330 * have the ability to perform event filtering.
1331 */
1332 if (hwc->config_base & KRAIT_EVENT_MASK)
1333 krait_evt_setup(idx, hwc->config_base);
1334 else
1335 armv7_pmnc_write_evtsel(idx, hwc->config_base);
1336
1337 /* Enable interrupt for this counter */
1338 armv7_pmnc_enable_intens(idx);
1339
1340 /* Enable counter */
1341 armv7_pmnc_enable_counter(idx);
1342
1343 raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
1344 }
1345
1346 static void krait_pmu_reset(void *info)
1347 {
1348 u32 vval, fval;
1349
1350 armv7pmu_reset(info);
1351
1352 /* Clear all pmresrs */
1353 krait_write_pmresrn(0, 0);
1354 krait_write_pmresrn(1, 0);
1355 krait_write_pmresrn(2, 0);
1356
1357 krait_pre_vpmresr0(&vval, &fval);
1358 krait_write_vpmresr0(0);
1359 krait_post_vpmresr0(vval, fval);
1360 }
1361
1362 static int krait_event_to_bit(struct perf_event *event, unsigned int region,
1363 unsigned int group)
1364 {
1365 int bit;
1366 struct hw_perf_event *hwc = &event->hw;
1367 struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
1368
1369 if (hwc->config_base & VENUM_EVENT)
1370 bit = KRAIT_VPMRESR0_GROUP0;
1371 else
1372 bit = krait_get_pmresrn_event(region);
1373 bit -= krait_get_pmresrn_event(0);
1374 bit += group;
1375 /*
1376 * Lower bits are reserved for use by the counters (see
1377 * armv7pmu_get_event_idx() for more info)
1378 */
1379 bit += ARMV7_IDX_COUNTER_LAST(cpu_pmu) + 1;
1380
1381 return bit;
1382 }
1383
1384 /*
1385 * We check for column exclusion constraints here.
1386 * Two events cant use the same group within a pmresr register.
1387 */
1388 static int krait_pmu_get_event_idx(struct pmu_hw_events *cpuc,
1389 struct perf_event *event)
1390 {
1391 int idx;
1392 int bit = -1;
1393 unsigned int prefix;
1394 unsigned int region;
1395 unsigned int code;
1396 unsigned int group;
1397 bool krait_event;
1398 struct hw_perf_event *hwc = &event->hw;
1399
1400 region = (hwc->config_base >> 12) & 0xf;
1401 code = (hwc->config_base >> 4) & 0xff;
1402 group = (hwc->config_base >> 0) & 0xf;
1403 krait_event = !!(hwc->config_base & KRAIT_EVENT_MASK);
1404
1405 if (krait_event) {
1406 /* Ignore invalid events */
1407 if (group > 3 || region > 2)
1408 return -EINVAL;
1409 prefix = hwc->config_base & KRAIT_EVENT_MASK;
1410 if (prefix != KRAIT_EVENT && prefix != VENUM_EVENT)
1411 return -EINVAL;
1412 if (prefix == VENUM_EVENT && (code & 0xe0))
1413 return -EINVAL;
1414
1415 bit = krait_event_to_bit(event, region, group);
1416 if (test_and_set_bit(bit, cpuc->used_mask))
1417 return -EAGAIN;
1418 }
1419
1420 idx = armv7pmu_get_event_idx(cpuc, event);
1421 if (idx < 0 && bit >= 0)
1422 clear_bit(bit, cpuc->used_mask);
1423
1424 return idx;
1425 }
1426
1427 static void krait_pmu_clear_event_idx(struct pmu_hw_events *cpuc,
1428 struct perf_event *event)
1429 {
1430 int bit;
1431 struct hw_perf_event *hwc = &event->hw;
1432 unsigned int region;
1433 unsigned int group;
1434 bool krait_event;
1435
1436 region = (hwc->config_base >> 12) & 0xf;
1437 group = (hwc->config_base >> 0) & 0xf;
1438 krait_event = !!(hwc->config_base & KRAIT_EVENT_MASK);
1439
1440 if (krait_event) {
1441 bit = krait_event_to_bit(event, region, group);
1442 clear_bit(bit, cpuc->used_mask);
1443 }
1444 }
1445
1446 static int krait_pmu_init(struct arm_pmu *cpu_pmu)
1447 {
1448 armv7pmu_init(cpu_pmu);
1449 cpu_pmu->name = "armv7_krait";
1450 /* Some early versions of Krait don't support PC write events */
1451 if (of_property_read_bool(cpu_pmu->plat_device->dev.of_node,
1452 "qcom,no-pc-write"))
1453 cpu_pmu->map_event = krait_map_event_no_branch;
1454 else
1455 cpu_pmu->map_event = krait_map_event;
1456 cpu_pmu->num_events = armv7_read_num_pmnc_events();
1457 cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
1458 cpu_pmu->reset = krait_pmu_reset;
1459 cpu_pmu->enable = krait_pmu_enable_event;
1460 cpu_pmu->disable = krait_pmu_disable_event;
1461 cpu_pmu->get_event_idx = krait_pmu_get_event_idx;
1462 cpu_pmu->clear_event_idx = krait_pmu_clear_event_idx;
1463 return 0;
1464 }
1465 #else
1466 static inline int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)
1467 {
1468 return -ENODEV;
1469 }
1470
1471 static inline int armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)
1472 {
1473 return -ENODEV;
1474 }
1475
1476 static inline int armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)
1477 {
1478 return -ENODEV;
1479 }
1480
1481 static inline int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)
1482 {
1483 return -ENODEV;
1484 }
1485
1486 static inline int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu)
1487 {
1488 return -ENODEV;
1489 }
1490
1491 static inline int armv7_a12_pmu_init(struct arm_pmu *cpu_pmu)
1492 {
1493 return -ENODEV;
1494 }
1495
1496 static inline int armv7_a17_pmu_init(struct arm_pmu *cpu_pmu)
1497 {
1498 return -ENODEV;
1499 }
1500
1501 static inline int krait_pmu_init(struct arm_pmu *cpu_pmu)
1502 {
1503 return -ENODEV;
1504 }
1505 #endif /* CONFIG_CPU_V7 */
This page took 0.066549 seconds and 5 git commands to generate.