diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-07-22 18:09:07 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-07-22 18:09:07 -0400 |
commit | 3ad55155b222f2a901405dea20ff7c68828ecd92 (patch) | |
tree | 53b24c981387b037084a333dc5ae23be8e82ef4a /arch/arm/kernel/perf_event_v7.c | |
parent | 06f365acef5ca54fd5708a0d853c4a89609536f1 (diff) | |
parent | 6645cb61f3a1186a71475385d33f875dd8fb38bf (diff) |
Merge branch 'devel-stable' into for-next
Conflicts:
arch/arm/kernel/entry-armv.S
Diffstat (limited to 'arch/arm/kernel/perf_event_v7.c')
-rw-r--r-- | arch/arm/kernel/perf_event_v7.c | 344 |
1 files changed, 324 insertions, 20 deletions
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 4960686afb5..963317896c8 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c | |||
@@ -17,17 +17,23 @@ | |||
17 | */ | 17 | */ |
18 | 18 | ||
19 | #ifdef CONFIG_CPU_V7 | 19 | #ifdef CONFIG_CPU_V7 |
20 | /* Common ARMv7 event types */ | 20 | /* |
21 | * Common ARMv7 event types | ||
22 | * | ||
23 | * Note: An implementation may not be able to count all of these events | ||
24 | * but the encodings are considered to be `reserved' in the case that | ||
25 | * they are not available. | ||
26 | */ | ||
21 | enum armv7_perf_types { | 27 | enum armv7_perf_types { |
22 | ARMV7_PERFCTR_PMNC_SW_INCR = 0x00, | 28 | ARMV7_PERFCTR_PMNC_SW_INCR = 0x00, |
23 | ARMV7_PERFCTR_IFETCH_MISS = 0x01, | 29 | ARMV7_PERFCTR_IFETCH_MISS = 0x01, |
24 | ARMV7_PERFCTR_ITLB_MISS = 0x02, | 30 | ARMV7_PERFCTR_ITLB_MISS = 0x02, |
25 | ARMV7_PERFCTR_DCACHE_REFILL = 0x03, | 31 | ARMV7_PERFCTR_DCACHE_REFILL = 0x03, /* L1 */ |
26 | ARMV7_PERFCTR_DCACHE_ACCESS = 0x04, | 32 | ARMV7_PERFCTR_DCACHE_ACCESS = 0x04, /* L1 */ |
27 | ARMV7_PERFCTR_DTLB_REFILL = 0x05, | 33 | ARMV7_PERFCTR_DTLB_REFILL = 0x05, |
28 | ARMV7_PERFCTR_DREAD = 0x06, | 34 | ARMV7_PERFCTR_DREAD = 0x06, |
29 | ARMV7_PERFCTR_DWRITE = 0x07, | 35 | ARMV7_PERFCTR_DWRITE = 0x07, |
30 | 36 | ARMV7_PERFCTR_INSTR_EXECUTED = 0x08, | |
31 | ARMV7_PERFCTR_EXC_TAKEN = 0x09, | 37 | ARMV7_PERFCTR_EXC_TAKEN = 0x09, |
32 | ARMV7_PERFCTR_EXC_EXECUTED = 0x0A, | 38 | ARMV7_PERFCTR_EXC_EXECUTED = 0x0A, |
33 | ARMV7_PERFCTR_CID_WRITE = 0x0B, | 39 | ARMV7_PERFCTR_CID_WRITE = 0x0B, |
@@ -39,21 +45,30 @@ enum armv7_perf_types { | |||
39 | */ | 45 | */ |
40 | ARMV7_PERFCTR_PC_WRITE = 0x0C, | 46 | ARMV7_PERFCTR_PC_WRITE = 0x0C, |
41 | ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D, | 47 | ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D, |
48 | ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E, | ||
42 | ARMV7_PERFCTR_UNALIGNED_ACCESS = 0x0F, | 49 | ARMV7_PERFCTR_UNALIGNED_ACCESS = 0x0F, |
50 | |||
51 | /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */ | ||
43 | ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10, | 52 | ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10, |
44 | ARMV7_PERFCTR_CLOCK_CYCLES = 0x11, | 53 | ARMV7_PERFCTR_CLOCK_CYCLES = 0x11, |
45 | 54 | ARMV7_PERFCTR_PC_BRANCH_PRED = 0x12, | |
46 | ARMV7_PERFCTR_PC_BRANCH_MIS_USED = 0x12, | 55 | ARMV7_PERFCTR_MEM_ACCESS = 0x13, |
56 | ARMV7_PERFCTR_L1_ICACHE_ACCESS = 0x14, | ||
57 | ARMV7_PERFCTR_L1_DCACHE_WB = 0x15, | ||
58 | ARMV7_PERFCTR_L2_DCACHE_ACCESS = 0x16, | ||
59 | ARMV7_PERFCTR_L2_DCACHE_REFILL = 0x17, | ||
60 | ARMV7_PERFCTR_L2_DCACHE_WB = 0x18, | ||
61 | ARMV7_PERFCTR_BUS_ACCESS = 0x19, | ||
62 | ARMV7_PERFCTR_MEMORY_ERROR = 0x1A, | ||
63 | ARMV7_PERFCTR_INSTR_SPEC = 0x1B, | ||
64 | ARMV7_PERFCTR_TTBR_WRITE = 0x1C, | ||
65 | ARMV7_PERFCTR_BUS_CYCLES = 0x1D, | ||
47 | 66 | ||
48 | ARMV7_PERFCTR_CPU_CYCLES = 0xFF | 67 | ARMV7_PERFCTR_CPU_CYCLES = 0xFF |
49 | }; | 68 | }; |
50 | 69 | ||
51 | /* ARMv7 Cortex-A8 specific event types */ | 70 | /* ARMv7 Cortex-A8 specific event types */ |
52 | enum armv7_a8_perf_types { | 71 | enum armv7_a8_perf_types { |
53 | ARMV7_PERFCTR_INSTR_EXECUTED = 0x08, | ||
54 | |||
55 | ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E, | ||
56 | |||
57 | ARMV7_PERFCTR_WRITE_BUFFER_FULL = 0x40, | 72 | ARMV7_PERFCTR_WRITE_BUFFER_FULL = 0x40, |
58 | ARMV7_PERFCTR_L2_STORE_MERGED = 0x41, | 73 | ARMV7_PERFCTR_L2_STORE_MERGED = 0x41, |
59 | ARMV7_PERFCTR_L2_STORE_BUFF = 0x42, | 74 | ARMV7_PERFCTR_L2_STORE_BUFF = 0x42, |
@@ -138,6 +153,39 @@ enum armv7_a9_perf_types { | |||
138 | ARMV7_PERFCTR_PLE_RQST_PROG = 0xA5 | 153 | ARMV7_PERFCTR_PLE_RQST_PROG = 0xA5 |
139 | }; | 154 | }; |
140 | 155 | ||
156 | /* ARMv7 Cortex-A5 specific event types */ | ||
157 | enum armv7_a5_perf_types { | ||
158 | ARMV7_PERFCTR_IRQ_TAKEN = 0x86, | ||
159 | ARMV7_PERFCTR_FIQ_TAKEN = 0x87, | ||
160 | |||
161 | ARMV7_PERFCTR_EXT_MEM_RQST = 0xc0, | ||
162 | ARMV7_PERFCTR_NC_EXT_MEM_RQST = 0xc1, | ||
163 | ARMV7_PERFCTR_PREFETCH_LINEFILL = 0xc2, | ||
164 | ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP = 0xc3, | ||
165 | ARMV7_PERFCTR_ENTER_READ_ALLOC = 0xc4, | ||
166 | ARMV7_PERFCTR_READ_ALLOC = 0xc5, | ||
167 | |||
168 | ARMV7_PERFCTR_STALL_SB_FULL = 0xc9, | ||
169 | }; | ||
170 | |||
171 | /* ARMv7 Cortex-A15 specific event types */ | ||
172 | enum armv7_a15_perf_types { | ||
173 | ARMV7_PERFCTR_L1_DCACHE_READ_ACCESS = 0x40, | ||
174 | ARMV7_PERFCTR_L1_DCACHE_WRITE_ACCESS = 0x41, | ||
175 | ARMV7_PERFCTR_L1_DCACHE_READ_REFILL = 0x42, | ||
176 | ARMV7_PERFCTR_L1_DCACHE_WRITE_REFILL = 0x43, | ||
177 | |||
178 | ARMV7_PERFCTR_L1_DTLB_READ_REFILL = 0x4C, | ||
179 | ARMV7_PERFCTR_L1_DTLB_WRITE_REFILL = 0x4D, | ||
180 | |||
181 | ARMV7_PERFCTR_L2_DCACHE_READ_ACCESS = 0x50, | ||
182 | ARMV7_PERFCTR_L2_DCACHE_WRITE_ACCESS = 0x51, | ||
183 | ARMV7_PERFCTR_L2_DCACHE_READ_REFILL = 0x52, | ||
184 | ARMV7_PERFCTR_L2_DCACHE_WRITE_REFILL = 0x53, | ||
185 | |||
186 | ARMV7_PERFCTR_SPEC_PC_WRITE = 0x76, | ||
187 | }; | ||
188 | |||
141 | /* | 189 | /* |
142 | * Cortex-A8 HW events mapping | 190 | * Cortex-A8 HW events mapping |
143 | * | 191 | * |
@@ -207,11 +255,6 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
207 | }, | 255 | }, |
208 | }, | 256 | }, |
209 | [C(DTLB)] = { | 257 | [C(DTLB)] = { |
210 | /* | ||
211 | * Only ITLB misses and DTLB refills are supported. | ||
212 | * If users want the DTLB refills misses a raw counter | ||
213 | * must be used. | ||
214 | */ | ||
215 | [C(OP_READ)] = { | 258 | [C(OP_READ)] = { |
216 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 259 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
217 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, | 260 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, |
@@ -323,11 +366,6 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
323 | }, | 366 | }, |
324 | }, | 367 | }, |
325 | [C(DTLB)] = { | 368 | [C(DTLB)] = { |
326 | /* | ||
327 | * Only ITLB misses and DTLB refills are supported. | ||
328 | * If users want the DTLB refills misses a raw counter | ||
329 | * must be used. | ||
330 | */ | ||
331 | [C(OP_READ)] = { | 369 | [C(OP_READ)] = { |
332 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 370 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
333 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, | 371 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, |
@@ -374,6 +412,242 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
374 | }; | 412 | }; |
375 | 413 | ||
376 | /* | 414 | /* |
415 | * Cortex-A5 HW events mapping | ||
416 | */ | ||
417 | static const unsigned armv7_a5_perf_map[PERF_COUNT_HW_MAX] = { | ||
418 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | ||
419 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | ||
420 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | ||
421 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | ||
422 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, | ||
423 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
424 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | ||
425 | }; | ||
426 | |||
427 | static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | ||
428 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
429 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | ||
430 | [C(L1D)] = { | ||
431 | [C(OP_READ)] = { | ||
432 | [C(RESULT_ACCESS)] | ||
433 | = ARMV7_PERFCTR_DCACHE_ACCESS, | ||
434 | [C(RESULT_MISS)] | ||
435 | = ARMV7_PERFCTR_DCACHE_REFILL, | ||
436 | }, | ||
437 | [C(OP_WRITE)] = { | ||
438 | [C(RESULT_ACCESS)] | ||
439 | = ARMV7_PERFCTR_DCACHE_ACCESS, | ||
440 | [C(RESULT_MISS)] | ||
441 | = ARMV7_PERFCTR_DCACHE_REFILL, | ||
442 | }, | ||
443 | [C(OP_PREFETCH)] = { | ||
444 | [C(RESULT_ACCESS)] | ||
445 | = ARMV7_PERFCTR_PREFETCH_LINEFILL, | ||
446 | [C(RESULT_MISS)] | ||
447 | = ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP, | ||
448 | }, | ||
449 | }, | ||
450 | [C(L1I)] = { | ||
451 | [C(OP_READ)] = { | ||
452 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | ||
453 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | ||
454 | }, | ||
455 | [C(OP_WRITE)] = { | ||
456 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | ||
457 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | ||
458 | }, | ||
459 | /* | ||
460 | * The prefetch counters don't differentiate between the I | ||
461 | * side and the D side. | ||
462 | */ | ||
463 | [C(OP_PREFETCH)] = { | ||
464 | [C(RESULT_ACCESS)] | ||
465 | = ARMV7_PERFCTR_PREFETCH_LINEFILL, | ||
466 | [C(RESULT_MISS)] | ||
467 | = ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP, | ||
468 | }, | ||
469 | }, | ||
470 | [C(LL)] = { | ||
471 | [C(OP_READ)] = { | ||
472 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
473 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
474 | }, | ||
475 | [C(OP_WRITE)] = { | ||
476 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
477 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
478 | }, | ||
479 | [C(OP_PREFETCH)] = { | ||
480 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
481 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
482 | }, | ||
483 | }, | ||
484 | [C(DTLB)] = { | ||
485 | [C(OP_READ)] = { | ||
486 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
487 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, | ||
488 | }, | ||
489 | [C(OP_WRITE)] = { | ||
490 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
491 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, | ||
492 | }, | ||
493 | [C(OP_PREFETCH)] = { | ||
494 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
495 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
496 | }, | ||
497 | }, | ||
498 | [C(ITLB)] = { | ||
499 | [C(OP_READ)] = { | ||
500 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
501 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | ||
502 | }, | ||
503 | [C(OP_WRITE)] = { | ||
504 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
505 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | ||
506 | }, | ||
507 | [C(OP_PREFETCH)] = { | ||
508 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
509 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
510 | }, | ||
511 | }, | ||
512 | [C(BPU)] = { | ||
513 | [C(OP_READ)] = { | ||
514 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | ||
515 | [C(RESULT_MISS)] | ||
516 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
517 | }, | ||
518 | [C(OP_WRITE)] = { | ||
519 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | ||
520 | [C(RESULT_MISS)] | ||
521 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
522 | }, | ||
523 | [C(OP_PREFETCH)] = { | ||
524 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
525 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
526 | }, | ||
527 | }, | ||
528 | }; | ||
529 | |||
530 | /* | ||
531 | * Cortex-A15 HW events mapping | ||
532 | */ | ||
533 | static const unsigned armv7_a15_perf_map[PERF_COUNT_HW_MAX] = { | ||
534 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | ||
535 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | ||
536 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | ||
537 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | ||
538 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_SPEC_PC_WRITE, | ||
539 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
540 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES, | ||
541 | }; | ||
542 | |||
543 | static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | ||
544 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
545 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | ||
546 | [C(L1D)] = { | ||
547 | [C(OP_READ)] = { | ||
548 | [C(RESULT_ACCESS)] | ||
549 | = ARMV7_PERFCTR_L1_DCACHE_READ_ACCESS, | ||
550 | [C(RESULT_MISS)] | ||
551 | = ARMV7_PERFCTR_L1_DCACHE_READ_REFILL, | ||
552 | }, | ||
553 | [C(OP_WRITE)] = { | ||
554 | [C(RESULT_ACCESS)] | ||
555 | = ARMV7_PERFCTR_L1_DCACHE_WRITE_ACCESS, | ||
556 | [C(RESULT_MISS)] | ||
557 | = ARMV7_PERFCTR_L1_DCACHE_WRITE_REFILL, | ||
558 | }, | ||
559 | [C(OP_PREFETCH)] = { | ||
560 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
561 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
562 | }, | ||
563 | }, | ||
564 | [C(L1I)] = { | ||
565 | /* | ||
566 | * Not all performance counters differentiate between read | ||
567 | * and write accesses/misses so we're not always strictly | ||
568 | * correct, but it's the best we can do. Writes and reads get | ||
569 | * combined in these cases. | ||
570 | */ | ||
571 | [C(OP_READ)] = { | ||
572 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | ||
573 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | ||
574 | }, | ||
575 | [C(OP_WRITE)] = { | ||
576 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | ||
577 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | ||
578 | }, | ||
579 | [C(OP_PREFETCH)] = { | ||
580 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
581 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
582 | }, | ||
583 | }, | ||
584 | [C(LL)] = { | ||
585 | [C(OP_READ)] = { | ||
586 | [C(RESULT_ACCESS)] | ||
587 | = ARMV7_PERFCTR_L2_DCACHE_READ_ACCESS, | ||
588 | [C(RESULT_MISS)] | ||
589 | = ARMV7_PERFCTR_L2_DCACHE_READ_REFILL, | ||
590 | }, | ||
591 | [C(OP_WRITE)] = { | ||
592 | [C(RESULT_ACCESS)] | ||
593 | = ARMV7_PERFCTR_L2_DCACHE_WRITE_ACCESS, | ||
594 | [C(RESULT_MISS)] | ||
595 | = ARMV7_PERFCTR_L2_DCACHE_WRITE_REFILL, | ||
596 | }, | ||
597 | [C(OP_PREFETCH)] = { | ||
598 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
599 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
600 | }, | ||
601 | }, | ||
602 | [C(DTLB)] = { | ||
603 | [C(OP_READ)] = { | ||
604 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
605 | [C(RESULT_MISS)] | ||
606 | = ARMV7_PERFCTR_L1_DTLB_READ_REFILL, | ||
607 | }, | ||
608 | [C(OP_WRITE)] = { | ||
609 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
610 | [C(RESULT_MISS)] | ||
611 | = ARMV7_PERFCTR_L1_DTLB_WRITE_REFILL, | ||
612 | }, | ||
613 | [C(OP_PREFETCH)] = { | ||
614 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
615 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
616 | }, | ||
617 | }, | ||
618 | [C(ITLB)] = { | ||
619 | [C(OP_READ)] = { | ||
620 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
621 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | ||
622 | }, | ||
623 | [C(OP_WRITE)] = { | ||
624 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
625 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | ||
626 | }, | ||
627 | [C(OP_PREFETCH)] = { | ||
628 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
629 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
630 | }, | ||
631 | }, | ||
632 | [C(BPU)] = { | ||
633 | [C(OP_READ)] = { | ||
634 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | ||
635 | [C(RESULT_MISS)] | ||
636 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
637 | }, | ||
638 | [C(OP_WRITE)] = { | ||
639 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | ||
640 | [C(RESULT_MISS)] | ||
641 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
642 | }, | ||
643 | [C(OP_PREFETCH)] = { | ||
644 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | ||
645 | [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | ||
646 | }, | ||
647 | }, | ||
648 | }; | ||
649 | |||
650 | /* | ||
377 | * Perf Events counters | 651 | * Perf Events counters |
378 | */ | 652 | */ |
379 | enum armv7_counters { | 653 | enum armv7_counters { |
@@ -905,6 +1179,26 @@ static const struct arm_pmu *__init armv7_a9_pmu_init(void) | |||
905 | armv7pmu.num_events = armv7_read_num_pmnc_events(); | 1179 | armv7pmu.num_events = armv7_read_num_pmnc_events(); |
906 | return &armv7pmu; | 1180 | return &armv7pmu; |
907 | } | 1181 | } |
1182 | |||
1183 | static const struct arm_pmu *__init armv7_a5_pmu_init(void) | ||
1184 | { | ||
1185 | armv7pmu.id = ARM_PERF_PMU_ID_CA5; | ||
1186 | armv7pmu.name = "ARMv7 Cortex-A5"; | ||
1187 | armv7pmu.cache_map = &armv7_a5_perf_cache_map; | ||
1188 | armv7pmu.event_map = &armv7_a5_perf_map; | ||
1189 | armv7pmu.num_events = armv7_read_num_pmnc_events(); | ||
1190 | return &armv7pmu; | ||
1191 | } | ||
1192 | |||
1193 | static const struct arm_pmu *__init armv7_a15_pmu_init(void) | ||
1194 | { | ||
1195 | armv7pmu.id = ARM_PERF_PMU_ID_CA15; | ||
1196 | armv7pmu.name = "ARMv7 Cortex-A15"; | ||
1197 | armv7pmu.cache_map = &armv7_a15_perf_cache_map; | ||
1198 | armv7pmu.event_map = &armv7_a15_perf_map; | ||
1199 | armv7pmu.num_events = armv7_read_num_pmnc_events(); | ||
1200 | return &armv7pmu; | ||
1201 | } | ||
908 | #else | 1202 | #else |
909 | static const struct arm_pmu *__init armv7_a8_pmu_init(void) | 1203 | static const struct arm_pmu *__init armv7_a8_pmu_init(void) |
910 | { | 1204 | { |
@@ -915,4 +1209,14 @@ static const struct arm_pmu *__init armv7_a9_pmu_init(void) | |||
915 | { | 1209 | { |
916 | return NULL; | 1210 | return NULL; |
917 | } | 1211 | } |
1212 | |||
1213 | static const struct arm_pmu *__init armv7_a5_pmu_init(void) | ||
1214 | { | ||
1215 | return NULL; | ||
1216 | } | ||
1217 | |||
1218 | static const struct arm_pmu *__init armv7_a15_pmu_init(void) | ||
1219 | { | ||
1220 | return NULL; | ||
1221 | } | ||
918 | #endif /* CONFIG_CPU_V7 */ | 1222 | #endif /* CONFIG_CPU_V7 */ |