21 static struct arm_pmu armv7pmu;
30 enum armv7_perf_types {
31 ARMV7_PERFCTR_PMNC_SW_INCR = 0x00,
32 ARMV7_PERFCTR_L1_ICACHE_REFILL = 0x01,
33 ARMV7_PERFCTR_ITLB_REFILL = 0x02,
34 ARMV7_PERFCTR_L1_DCACHE_REFILL = 0x03,
35 ARMV7_PERFCTR_L1_DCACHE_ACCESS = 0x04,
36 ARMV7_PERFCTR_DTLB_REFILL = 0x05,
37 ARMV7_PERFCTR_MEM_READ = 0x06,
38 ARMV7_PERFCTR_MEM_WRITE = 0x07,
39 ARMV7_PERFCTR_INSTR_EXECUTED = 0x08,
40 ARMV7_PERFCTR_EXC_TAKEN = 0x09,
41 ARMV7_PERFCTR_EXC_EXECUTED = 0x0A,
42 ARMV7_PERFCTR_CID_WRITE = 0x0B,
51 ARMV7_PERFCTR_PC_WRITE = 0x0C,
52 ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D,
53 ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E,
54 ARMV7_PERFCTR_MEM_UNALIGNED_ACCESS = 0x0F,
55 ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10,
56 ARMV7_PERFCTR_CLOCK_CYCLES = 0x11,
57 ARMV7_PERFCTR_PC_BRANCH_PRED = 0x12,
60 ARMV7_PERFCTR_MEM_ACCESS = 0x13,
61 ARMV7_PERFCTR_L1_ICACHE_ACCESS = 0x14,
62 ARMV7_PERFCTR_L1_DCACHE_WB = 0x15,
63 ARMV7_PERFCTR_L2_CACHE_ACCESS = 0x16,
64 ARMV7_PERFCTR_L2_CACHE_REFILL = 0x17,
65 ARMV7_PERFCTR_L2_CACHE_WB = 0x18,
66 ARMV7_PERFCTR_BUS_ACCESS = 0x19,
67 ARMV7_PERFCTR_MEM_ERROR = 0x1A,
68 ARMV7_PERFCTR_INSTR_SPEC = 0x1B,
69 ARMV7_PERFCTR_TTBR_WRITE = 0x1C,
70 ARMV7_PERFCTR_BUS_CYCLES = 0x1D,
72 ARMV7_PERFCTR_CPU_CYCLES = 0xFF
76 enum armv7_a8_perf_types {
77 ARMV7_A8_PERFCTR_L2_CACHE_ACCESS = 0x43,
78 ARMV7_A8_PERFCTR_L2_CACHE_REFILL = 0x44,
79 ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS = 0x50,
80 ARMV7_A8_PERFCTR_STALL_ISIDE = 0x56,
84 enum armv7_a9_perf_types {
85 ARMV7_A9_PERFCTR_INSTR_CORE_RENAME = 0x68,
86 ARMV7_A9_PERFCTR_STALL_ICACHE = 0x60,
87 ARMV7_A9_PERFCTR_STALL_DISPATCH = 0x66,
91 enum armv7_a5_perf_types {
92 ARMV7_A5_PERFCTR_PREFETCH_LINEFILL = 0xc2,
93 ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP = 0xc3,
97 enum armv7_a15_perf_types {
98 ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ = 0x40,
99 ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE = 0x41,
100 ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ = 0x42,
101 ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE = 0x43,
103 ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ = 0x4C,
104 ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE = 0x4D,
106 ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ = 0x50,
107 ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE = 0x51,
108 ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ = 0x52,
109 ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE = 0x53,
111 ARMV7_A15_PERFCTR_PC_WRITE_SPEC = 0x76,
144 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
145 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
148 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
149 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
158 [
C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS,
159 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
162 [
C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS,
163 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
172 [
C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS,
173 [
C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL,
176 [
C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS,
177 [
C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL,
187 [
C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
191 [
C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
201 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
205 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
214 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
215 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
218 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
219 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
268 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
269 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
272 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
273 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
283 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
287 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
311 [
C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
315 [
C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
325 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
329 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
338 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
339 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
342 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
343 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
386 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
387 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
390 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
391 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
394 [
C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL,
395 [
C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP,
400 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
401 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
404 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
405 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
412 [
C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL,
413 [
C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP,
433 [
C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
437 [
C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
447 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
451 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
460 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
461 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
464 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
465 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
508 [
C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ,
509 [
C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ,
512 [
C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE,
513 [
C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE,
528 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
529 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
532 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
533 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
542 [
C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ,
543 [
C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ,
546 [
C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE,
547 [
C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE,
557 [
C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ,
561 [
C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE,
571 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
575 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
584 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
585 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
588 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
589 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
638 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
639 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
642 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS,
643 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL,
652 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
653 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
656 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
657 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL,
666 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_CACHE_ACCESS,
667 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL,
670 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_CACHE_ACCESS,
671 [
C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL,
681 [
C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
685 [
C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL,
695 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
699 [
C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL,
708 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
709 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
712 [
C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED,
713 [
C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
739 #define ARMV7_IDX_CYCLE_COUNTER 0
740 #define ARMV7_IDX_COUNTER0 1
741 #define ARMV7_IDX_COUNTER_LAST (ARMV7_IDX_CYCLE_COUNTER + cpu_pmu->num_events - 1)
743 #define ARMV7_MAX_COUNTERS 32
744 #define ARMV7_COUNTER_MASK (ARMV7_MAX_COUNTERS - 1)
753 #define ARMV7_IDX_TO_COUNTER(x) \
754 (((x) - ARMV7_IDX_COUNTER0) & ARMV7_COUNTER_MASK)
759 #define ARMV7_PMNC_E (1 << 0)
760 #define ARMV7_PMNC_P (1 << 1)
761 #define ARMV7_PMNC_C (1 << 2)
762 #define ARMV7_PMNC_D (1 << 3)
763 #define ARMV7_PMNC_X (1 << 4)
764 #define ARMV7_PMNC_DP (1 << 5)
765 #define ARMV7_PMNC_N_SHIFT 11
766 #define ARMV7_PMNC_N_MASK 0x1f
767 #define ARMV7_PMNC_MASK 0x3f
772 #define ARMV7_FLAG_MASK 0xffffffff
773 #define ARMV7_OVERFLOWED_MASK ARMV7_FLAG_MASK
778 #define ARMV7_EVTYPE_MASK 0xc00000ff
779 #define ARMV7_EVTYPE_EVENT 0xff
784 #define ARMV7_EXCLUDE_PL1 (1 << 31)
785 #define ARMV7_EXCLUDE_USER (1 << 30)
786 #define ARMV7_INCLUDE_HYP (1 << 27)
788 static inline u32 armv7_pmnc_read(
void)
791 asm volatile(
"mrc p15, 0, %0, c9, c12, 0" :
"=r"(
val));
795 static inline void armv7_pmnc_write(
u32 val)
797 val &= ARMV7_PMNC_MASK;
799 asm volatile(
"mcr p15, 0, %0, c9, c12, 0" : :
"r"(
val));
802 static inline int armv7_pmnc_has_overflowed(
u32 pmnc)
804 return pmnc & ARMV7_OVERFLOWED_MASK;
807 static inline int armv7_pmnc_counter_valid(
int idx)
809 return idx >= ARMV7_IDX_CYCLE_COUNTER && idx <= ARMV7_IDX_COUNTER_LAST;
812 static inline int armv7_pmnc_counter_has_overflowed(
u32 pmnc,
int idx)
817 if (!armv7_pmnc_counter_valid(idx)) {
818 pr_err(
"CPU%u checking wrong counter %d overflow status\n",
821 counter = ARMV7_IDX_TO_COUNTER(idx);
822 ret = pmnc &
BIT(counter);
828 static inline int armv7_pmnc_select_counter(
int idx)
832 if (!armv7_pmnc_counter_valid(idx)) {
833 pr_err(
"CPU%u selecting wrong PMNC counter %d\n",
838 counter = ARMV7_IDX_TO_COUNTER(idx);
839 asm volatile(
"mcr p15, 0, %0, c9, c12, 5" : :
"r" (
counter));
845 static inline u32 armv7pmu_read_counter(
int idx)
849 if (!armv7_pmnc_counter_valid(idx))
850 pr_err(
"CPU%u reading wrong counter %d\n",
852 else if (idx == ARMV7_IDX_CYCLE_COUNTER)
853 asm volatile(
"mrc p15, 0, %0, c9, c13, 0" :
"=r" (
value));
854 else if (armv7_pmnc_select_counter(idx) ==
idx)
855 asm volatile(
"mrc p15, 0, %0, c9, c13, 2" :
"=r" (value));
860 static inline void armv7pmu_write_counter(
int idx,
u32 value)
862 if (!armv7_pmnc_counter_valid(idx))
863 pr_err(
"CPU%u writing wrong counter %d\n",
865 else if (idx == ARMV7_IDX_CYCLE_COUNTER)
866 asm volatile(
"mcr p15, 0, %0, c9, c13, 0" : :
"r" (
value));
867 else if (armv7_pmnc_select_counter(idx) ==
idx)
868 asm volatile(
"mcr p15, 0, %0, c9, c13, 2" : :
"r" (value));
871 static inline void armv7_pmnc_write_evtsel(
int idx,
u32 val)
873 if (armv7_pmnc_select_counter(idx) == idx) {
874 val &= ARMV7_EVTYPE_MASK;
875 asm volatile(
"mcr p15, 0, %0, c9, c13, 1" : :
"r" (
val));
879 static inline int armv7_pmnc_enable_counter(
int idx)
883 if (!armv7_pmnc_counter_valid(idx)) {
884 pr_err(
"CPU%u enabling wrong PMNC counter %d\n",
889 counter = ARMV7_IDX_TO_COUNTER(idx);
890 asm volatile(
"mcr p15, 0, %0, c9, c12, 1" : :
"r" (
BIT(counter)));
894 static inline int armv7_pmnc_disable_counter(
int idx)
898 if (!armv7_pmnc_counter_valid(idx)) {
899 pr_err(
"CPU%u disabling wrong PMNC counter %d\n",
904 counter = ARMV7_IDX_TO_COUNTER(idx);
905 asm volatile(
"mcr p15, 0, %0, c9, c12, 2" : :
"r" (
BIT(counter)));
909 static inline int armv7_pmnc_enable_intens(
int idx)
913 if (!armv7_pmnc_counter_valid(idx)) {
914 pr_err(
"CPU%u enabling wrong PMNC counter IRQ enable %d\n",
919 counter = ARMV7_IDX_TO_COUNTER(idx);
920 asm volatile(
"mcr p15, 0, %0, c9, c14, 1" : :
"r" (
BIT(counter)));
924 static inline int armv7_pmnc_disable_intens(
int idx)
928 if (!armv7_pmnc_counter_valid(idx)) {
929 pr_err(
"CPU%u disabling wrong PMNC counter IRQ enable %d\n",
934 counter = ARMV7_IDX_TO_COUNTER(idx);
935 asm volatile(
"mcr p15, 0, %0, c9, c14, 2" : :
"r" (
BIT(counter)));
938 asm volatile(
"mcr p15, 0, %0, c9, c12, 3" : :
"r" (
BIT(counter)));
944 static inline u32 armv7_pmnc_getreset_flags(
void)
949 asm volatile(
"mrc p15, 0, %0, c9, c12, 3" :
"=r" (
val));
952 val &= ARMV7_FLAG_MASK;
953 asm volatile(
"mcr p15, 0, %0, c9, c12, 3" : :
"r" (
val));
959 static void armv7_pmnc_dump_regs(
void)
966 asm volatile(
"mrc p15, 0, %0, c9, c12, 0" :
"=r" (
val));
969 asm volatile(
"mrc p15, 0, %0, c9, c12, 1" :
"=r" (
val));
972 asm volatile(
"mrc p15, 0, %0, c9, c14, 1" :
"=r" (
val));
975 asm volatile(
"mrc p15, 0, %0, c9, c12, 3" :
"=r" (
val));
978 asm volatile(
"mrc p15, 0, %0, c9, c12, 5" :
"=r" (
val));
981 asm volatile(
"mrc p15, 0, %0, c9, c13, 0" :
"=r" (
val));
984 for (cnt = ARMV7_IDX_COUNTER0; cnt <= ARMV7_IDX_COUNTER_LAST; cnt++) {
985 armv7_pmnc_select_counter(cnt);
986 asm volatile(
"mrc p15, 0, %0, c9, c13, 2" :
"=r" (
val));
988 ARMV7_IDX_TO_COUNTER(cnt), val);
989 asm volatile(
"mrc p15, 0, %0, c9, c13, 1" :
"=r" (
val));
991 ARMV7_IDX_TO_COUNTER(cnt), val);
996 static void armv7pmu_enable_event(
struct hw_perf_event *hwc,
int idx)
999 struct pmu_hw_events *
events = cpu_pmu->get_hw_events();
1010 armv7_pmnc_disable_counter(idx);
1017 if (armv7pmu.set_event_filter || idx != ARMV7_IDX_CYCLE_COUNTER)
1018 armv7_pmnc_write_evtsel(idx, hwc->config_base);
1023 armv7_pmnc_enable_intens(idx);
1028 armv7_pmnc_enable_counter(idx);
1033 static void armv7pmu_disable_event(
struct hw_perf_event *hwc,
int idx)
1035 unsigned long flags;
1036 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
1046 armv7_pmnc_disable_counter(idx);
1051 armv7_pmnc_disable_intens(idx);
1059 struct perf_sample_data
data;
1060 struct pmu_hw_events *cpuc;
1067 pmnc = armv7_pmnc_getreset_flags();
1072 if (!armv7_pmnc_has_overflowed(pmnc))
1081 for (idx = 0; idx < cpu_pmu->num_events; ++
idx) {
1093 if (!armv7_pmnc_counter_has_overflowed(pmnc, idx))
1098 perf_sample_data_init(&
data, 0, hwc->last_period);
1103 cpu_pmu->disable(hwc, idx);
1118 static void armv7pmu_start(
void)
1120 unsigned long flags;
1121 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
1125 armv7_pmnc_write(armv7_pmnc_read() | ARMV7_PMNC_E);
1129 static void armv7pmu_stop(
void)
1131 unsigned long flags;
1132 struct pmu_hw_events *events = cpu_pmu->get_hw_events();
1136 armv7_pmnc_write(armv7_pmnc_read() & ~ARMV7_PMNC_E);
1140 static int armv7pmu_get_event_idx(
struct pmu_hw_events *cpuc,
1144 unsigned long evtype =
event->config_base & ARMV7_EVTYPE_EVENT;
1147 if (evtype == ARMV7_PERFCTR_CPU_CYCLES) {
1151 return ARMV7_IDX_CYCLE_COUNTER;
1158 for (idx = ARMV7_IDX_COUNTER0; idx < cpu_pmu->num_events; ++
idx) {
1170 static int armv7pmu_set_event_filter(
struct hw_perf_event *event,
1173 unsigned long config_base = 0;
1178 config_base |= ARMV7_EXCLUDE_USER;
1180 config_base |= ARMV7_EXCLUDE_PL1;
1182 config_base |= ARMV7_INCLUDE_HYP;
1188 event->config_base = config_base;
1193 static void armv7pmu_reset(
void *
info)
1195 u32 idx, nb_cnt = cpu_pmu->num_events;
1198 for (idx = ARMV7_IDX_CYCLE_COUNTER; idx < nb_cnt; ++
idx)
1199 armv7pmu_disable_event(
NULL, idx);
1202 armv7_pmnc_write(ARMV7_PMNC_P | ARMV7_PMNC_C);
1205 static int armv7_a8_map_event(
struct perf_event *event)
1208 &armv7_a8_perf_cache_map, 0xFF);
1211 static int armv7_a9_map_event(
struct perf_event *event)
1214 &armv7_a9_perf_cache_map, 0xFF);
1217 static int armv7_a5_map_event(
struct perf_event *event)
1220 &armv7_a5_perf_cache_map, 0xFF);
1223 static int armv7_a15_map_event(
struct perf_event *event)
1226 &armv7_a15_perf_cache_map, 0xFF);
1229 static int armv7_a7_map_event(
struct perf_event *event)
1232 &armv7_a7_perf_cache_map, 0xFF);
1235 static struct arm_pmu armv7pmu = {
1236 .handle_irq = armv7pmu_handle_irq,
1237 .enable = armv7pmu_enable_event,
1238 .disable = armv7pmu_disable_event,
1239 .read_counter = armv7pmu_read_counter,
1240 .write_counter = armv7pmu_write_counter,
1241 .get_event_idx = armv7pmu_get_event_idx,
1242 .start = armv7pmu_start,
1243 .stop = armv7pmu_stop,
1244 .reset = armv7pmu_reset,
1245 .max_period = (1LLU << 32) - 1,
1253 nb_cnt = (armv7_pmnc_read() >> ARMV7_PMNC_N_SHIFT) & ARMV7_PMNC_N_MASK;
1259 static struct arm_pmu *
__devinit armv7_a8_pmu_init(
void)
1261 armv7pmu.name =
"ARMv7 Cortex-A8";
1262 armv7pmu.map_event = armv7_a8_map_event;
1263 armv7pmu.num_events = armv7_read_num_pmnc_events();
1267 static struct arm_pmu *
__devinit armv7_a9_pmu_init(
void)
1269 armv7pmu.name =
"ARMv7 Cortex-A9";
1270 armv7pmu.map_event = armv7_a9_map_event;
1271 armv7pmu.num_events = armv7_read_num_pmnc_events();
1275 static struct arm_pmu *
__devinit armv7_a5_pmu_init(
void)
1277 armv7pmu.name =
"ARMv7 Cortex-A5";
1278 armv7pmu.map_event = armv7_a5_map_event;
1279 armv7pmu.num_events = armv7_read_num_pmnc_events();
1283 static struct arm_pmu *
__devinit armv7_a15_pmu_init(
void)
1285 armv7pmu.name =
"ARMv7 Cortex-A15";
1286 armv7pmu.map_event = armv7_a15_map_event;
1287 armv7pmu.num_events = armv7_read_num_pmnc_events();
1288 armv7pmu.set_event_filter = armv7pmu_set_event_filter;
1292 static struct arm_pmu *
__devinit armv7_a7_pmu_init(
void)
1294 armv7pmu.name =
"ARMv7 Cortex-A7";
1295 armv7pmu.map_event = armv7_a7_map_event;
1296 armv7pmu.num_events = armv7_read_num_pmnc_events();
1297 armv7pmu.set_event_filter = armv7pmu_set_event_filter;
1301 static struct arm_pmu *
__devinit armv7_a8_pmu_init(
void)
1306 static struct arm_pmu *
__devinit armv7_a9_pmu_init(
void)
1311 static struct arm_pmu *
__devinit armv7_a5_pmu_init(
void)
1316 static struct arm_pmu *
__devinit armv7_a15_pmu_init(
void)
1321 static struct arm_pmu *
__devinit armv7_a7_pmu_init(
void)