Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'devel-stable' into for-next

Conflicts:
arch/arm/kernel/perf_event_cpu.c

+362 -1107
+1 -3
arch/arm/include/asm/memory.h
··· 91 91 * of this define that was meant to. 92 92 * Fortunately, there is no reference for this in noMMU mode, for now. 93 93 */ 94 - #ifndef TASK_SIZE 95 - #define TASK_SIZE (CONFIG_DRAM_SIZE) 96 - #endif 94 + #define TASK_SIZE UL(0xffffffff) 97 95 98 96 #ifndef TASK_UNMAPPED_BASE 99 97 #define TASK_UNMAPPED_BASE UL(0x00000000)
-9
arch/arm/include/asm/perf_event.h
··· 12 12 #ifndef __ARM_PERF_EVENT_H__ 13 13 #define __ARM_PERF_EVENT_H__ 14 14 15 - /* 16 - * The ARMv7 CPU PMU supports up to 32 event counters. 17 - */ 18 - #define ARMPMU_MAX_HWEVENTS 32 19 - 20 - #define HW_OP_UNSUPPORTED 0xFFFF 21 - #define C(_x) PERF_COUNT_HW_CACHE_##_x 22 - #define CACHE_OP_UNSUPPORTED 0xFFFF 23 - 24 15 #ifdef CONFIG_HW_PERF_EVENTS 25 16 struct pt_regs; 26 17 extern unsigned long perf_instruction_pointer(struct pt_regs *regs);
+19
arch/arm/include/asm/pmu.h
··· 42 42 43 43 #ifdef CONFIG_HW_PERF_EVENTS 44 44 45 + /* 46 + * The ARMv7 CPU PMU supports up to 32 event counters. 47 + */ 48 + #define ARMPMU_MAX_HWEVENTS 32 49 + 50 + #define HW_OP_UNSUPPORTED 0xFFFF 51 + #define C(_x) PERF_COUNT_HW_CACHE_##_x 52 + #define CACHE_OP_UNSUPPORTED 0xFFFF 53 + 54 + #define PERF_MAP_ALL_UNSUPPORTED \ 55 + [0 ... PERF_COUNT_HW_MAX - 1] = HW_OP_UNSUPPORTED 56 + 57 + #define PERF_CACHE_MAP_ALL_UNSUPPORTED \ 58 + [0 ... C(MAX) - 1] = { \ 59 + [0 ... C(OP_MAX) - 1] = { \ 60 + [0 ... C(RESULT_MAX) - 1] = CACHE_OP_UNSUPPORTED, \ 61 + }, \ 62 + } 63 + 45 64 /* The events for a given PMU register set. */ 46 65 struct pmu_hw_events { 47 66 /*
+1 -1
arch/arm/include/asm/uaccess.h
··· 242 242 #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) 243 243 244 244 #define user_addr_max() \ 245 - (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL) 245 + (segment_eq(get_fs(), KERNEL_DS) ? ~0UL : get_fs()) 246 246 247 247 /* 248 248 * The "__xxx" versions of the user access functions do not verify the
+11 -2
arch/arm/kernel/perf_event.c
··· 560 560 struct perf_callchain_entry *entry) 561 561 { 562 562 struct frame_tail buftail; 563 + unsigned long err; 563 564 564 - /* Also check accessibility of one struct frame_tail beyond */ 565 565 if (!access_ok(VERIFY_READ, tail, sizeof(buftail))) 566 566 return NULL; 567 - if (__copy_from_user_inatomic(&buftail, tail, sizeof(buftail))) 567 + 568 + pagefault_disable(); 569 + err = __copy_from_user_inatomic(&buftail, tail, sizeof(buftail)); 570 + pagefault_enable(); 571 + 572 + if (err) 568 573 return NULL; 569 574 570 575 perf_callchain_store(entry, buftail.lr); ··· 595 590 } 596 591 597 592 perf_callchain_store(entry, regs->ARM_pc); 593 + 594 + if (!current->mm) 595 + return; 596 + 598 597 tail = (struct frame_tail __user *)regs->ARM_fp - 1; 599 598 600 599 while ((entry->nr < PERF_MAX_STACK_DEPTH) &&
+10 -3
arch/arm/kernel/perf_event_cpu.c
··· 233 233 {.compatible = "arm,cortex-a7-pmu", .data = armv7_a7_pmu_init}, 234 234 {.compatible = "arm,cortex-a5-pmu", .data = armv7_a5_pmu_init}, 235 235 {.compatible = "arm,arm11mpcore-pmu", .data = armv6mpcore_pmu_init}, 236 - {.compatible = "arm,arm1176-pmu", .data = armv6pmu_init}, 237 - {.compatible = "arm,arm1136-pmu", .data = armv6pmu_init}, 236 + {.compatible = "arm,arm1176-pmu", .data = armv6_1176_pmu_init}, 237 + {.compatible = "arm,arm1136-pmu", .data = armv6_1136_pmu_init}, 238 238 {.compatible = "qcom,krait-pmu", .data = krait_pmu_init}, 239 239 {}, 240 240 }; 241 241 242 242 static struct platform_device_id cpu_pmu_plat_device_ids[] = { 243 243 {.name = "arm-pmu"}, 244 + {.name = "armv6-pmu"}, 245 + {.name = "armv7-pmu"}, 246 + {.name = "xscale-pmu"}, 244 247 {}, 245 248 }; 246 249 ··· 260 257 switch (read_cpuid_part()) { 261 258 /* ARM Ltd CPUs. */ 262 259 case ARM_CPU_PART_ARM1136: 260 + ret = armv6_1136_pmu_init(pmu); 261 + break; 263 262 case ARM_CPU_PART_ARM1156: 263 + ret = armv6_1156_pmu_init(pmu); 264 + break; 264 265 case ARM_CPU_PART_ARM1176: 265 - ret = armv6pmu_init(pmu); 266 + ret = armv6_1176_pmu_init(pmu); 266 267 break; 267 268 case ARM_CPU_PART_ARM11MPCORE: 268 269 ret = armv6mpcore_pmu_init(pmu);
+79 -228
arch/arm/kernel/perf_event_v6.c
··· 65 65 * accesses/misses in hardware. 66 66 */ 67 67 static const unsigned armv6_perf_map[PERF_COUNT_HW_MAX] = { 68 + PERF_MAP_ALL_UNSUPPORTED, 68 69 [PERF_COUNT_HW_CPU_CYCLES] = ARMV6_PERFCTR_CPU_CYCLES, 69 70 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6_PERFCTR_INSTR_EXEC, 70 - [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, 71 - [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, 72 71 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6_PERFCTR_BR_EXEC, 73 72 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6_PERFCTR_BR_MISPREDICT, 74 - [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, 75 73 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV6_PERFCTR_IBUF_STALL, 76 74 [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV6_PERFCTR_LSU_FULL_STALL, 77 75 }; ··· 77 79 static const unsigned armv6_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 78 80 [PERF_COUNT_HW_CACHE_OP_MAX] 79 81 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 80 - [C(L1D)] = { 81 - /* 82 - * The performance counters don't differentiate between read 83 - * and write accesses/misses so this isn't strictly correct, 84 - * but it's the best we can do. Writes and reads get 85 - * combined. 86 - */ 87 - [C(OP_READ)] = { 88 - [C(RESULT_ACCESS)] = ARMV6_PERFCTR_DCACHE_ACCESS, 89 - [C(RESULT_MISS)] = ARMV6_PERFCTR_DCACHE_MISS, 90 - }, 91 - [C(OP_WRITE)] = { 92 - [C(RESULT_ACCESS)] = ARMV6_PERFCTR_DCACHE_ACCESS, 93 - [C(RESULT_MISS)] = ARMV6_PERFCTR_DCACHE_MISS, 94 - }, 95 - [C(OP_PREFETCH)] = { 96 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 97 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 98 - }, 99 - }, 100 - [C(L1I)] = { 101 - [C(OP_READ)] = { 102 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 103 - [C(RESULT_MISS)] = ARMV6_PERFCTR_ICACHE_MISS, 104 - }, 105 - [C(OP_WRITE)] = { 106 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 107 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 108 - }, 109 - [C(OP_PREFETCH)] = { 110 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 111 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 112 - }, 113 - }, 114 - [C(LL)] = { 115 - [C(OP_READ)] = { 116 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 117 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 118 - }, 119 - [C(OP_WRITE)] = { 120 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 121 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 122 - }, 123 - [C(OP_PREFETCH)] = { 124 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 125 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 126 - }, 127 - }, 128 - [C(DTLB)] = { 129 - /* 130 - * The ARM performance counters can count micro DTLB misses, 131 - * micro ITLB misses and main TLB misses. There isn't an event 132 - * for TLB misses, so use the micro misses here and if users 133 - * want the main TLB misses they can use a raw counter. 134 - */ 135 - [C(OP_READ)] = { 136 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 137 - [C(RESULT_MISS)] = ARMV6_PERFCTR_DTLB_MISS, 138 - }, 139 - [C(OP_WRITE)] = { 140 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 141 - [C(RESULT_MISS)] = ARMV6_PERFCTR_DTLB_MISS, 142 - }, 143 - [C(OP_PREFETCH)] = { 144 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 145 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 146 - }, 147 - }, 148 - [C(ITLB)] = { 149 - [C(OP_READ)] = { 150 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 151 - [C(RESULT_MISS)] = ARMV6_PERFCTR_ITLB_MISS, 152 - }, 153 - [C(OP_WRITE)] = { 154 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 155 - [C(RESULT_MISS)] = ARMV6_PERFCTR_ITLB_MISS, 156 - }, 157 - [C(OP_PREFETCH)] = { 158 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 159 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 160 - }, 161 - }, 162 - [C(BPU)] = { 163 - [C(OP_READ)] = { 164 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 165 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 166 - }, 167 - [C(OP_WRITE)] = { 168 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 169 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 170 - }, 171 - [C(OP_PREFETCH)] = { 172 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 173 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 174 - }, 175 - }, 176 - [C(NODE)] = { 177 - [C(OP_READ)] = { 178 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 179 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 180 - }, 181 - [C(OP_WRITE)] = { 182 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 183 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 184 - }, 185 - [C(OP_PREFETCH)] = { 186 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 187 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 188 - }, 189 - }, 82 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 83 + 84 + /* 85 + * The performance counters don't differentiate between read and write 86 + * accesses/misses so this isn't strictly correct, but it's the best we 87 + * can do. Writes and reads get combined. 88 + */ 89 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV6_PERFCTR_DCACHE_ACCESS, 90 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV6_PERFCTR_DCACHE_MISS, 91 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV6_PERFCTR_DCACHE_ACCESS, 92 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV6_PERFCTR_DCACHE_MISS, 93 + 94 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV6_PERFCTR_ICACHE_MISS, 95 + 96 + /* 97 + * The ARM performance counters can count micro DTLB misses, micro ITLB 98 + * misses and main TLB misses. There isn't an event for TLB misses, so 99 + * use the micro misses here and if users want the main TLB misses they 100 + * can use a raw counter. 101 + */ 102 + [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV6_PERFCTR_DTLB_MISS, 103 + [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV6_PERFCTR_DTLB_MISS, 104 + 105 + [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV6_PERFCTR_ITLB_MISS, 106 + [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV6_PERFCTR_ITLB_MISS, 190 107 }; 191 108 192 109 enum armv6mpcore_perf_types { ··· 133 220 * accesses/misses in hardware. 134 221 */ 135 222 static const unsigned armv6mpcore_perf_map[PERF_COUNT_HW_MAX] = { 223 + PERF_MAP_ALL_UNSUPPORTED, 136 224 [PERF_COUNT_HW_CPU_CYCLES] = ARMV6MPCORE_PERFCTR_CPU_CYCLES, 137 225 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_INSTR_EXEC, 138 - [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, 139 - [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, 140 226 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_BR_EXEC, 141 227 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6MPCORE_PERFCTR_BR_MISPREDICT, 142 - [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, 143 228 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV6MPCORE_PERFCTR_IBUF_STALL, 144 229 [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV6MPCORE_PERFCTR_LSU_FULL_STALL, 145 230 }; ··· 145 234 static const unsigned armv6mpcore_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 146 235 [PERF_COUNT_HW_CACHE_OP_MAX] 147 236 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 148 - [C(L1D)] = { 149 - [C(OP_READ)] = { 150 - [C(RESULT_ACCESS)] = 151 - ARMV6MPCORE_PERFCTR_DCACHE_RDACCESS, 152 - [C(RESULT_MISS)] = 153 - ARMV6MPCORE_PERFCTR_DCACHE_RDMISS, 154 - }, 155 - [C(OP_WRITE)] = { 156 - [C(RESULT_ACCESS)] = 157 - ARMV6MPCORE_PERFCTR_DCACHE_WRACCESS, 158 - [C(RESULT_MISS)] = 159 - ARMV6MPCORE_PERFCTR_DCACHE_WRMISS, 160 - }, 161 - [C(OP_PREFETCH)] = { 162 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 163 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 164 - }, 165 - }, 166 - [C(L1I)] = { 167 - [C(OP_READ)] = { 168 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 169 - [C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_ICACHE_MISS, 170 - }, 171 - [C(OP_WRITE)] = { 172 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 173 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 174 - }, 175 - [C(OP_PREFETCH)] = { 176 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 177 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 178 - }, 179 - }, 180 - [C(LL)] = { 181 - [C(OP_READ)] = { 182 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 183 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 184 - }, 185 - [C(OP_WRITE)] = { 186 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 187 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 188 - }, 189 - [C(OP_PREFETCH)] = { 190 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 191 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 192 - }, 193 - }, 194 - [C(DTLB)] = { 195 - /* 196 - * The ARM performance counters can count micro DTLB misses, 197 - * micro ITLB misses and main TLB misses. There isn't an event 198 - * for TLB misses, so use the micro misses here and if users 199 - * want the main TLB misses they can use a raw counter. 200 - */ 201 - [C(OP_READ)] = { 202 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 203 - [C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_DTLB_MISS, 204 - }, 205 - [C(OP_WRITE)] = { 206 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 207 - [C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_DTLB_MISS, 208 - }, 209 - [C(OP_PREFETCH)] = { 210 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 211 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 212 - }, 213 - }, 214 - [C(ITLB)] = { 215 - [C(OP_READ)] = { 216 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 217 - [C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_ITLB_MISS, 218 - }, 219 - [C(OP_WRITE)] = { 220 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 221 - [C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_ITLB_MISS, 222 - }, 223 - [C(OP_PREFETCH)] = { 224 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 225 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 226 - }, 227 - }, 228 - [C(BPU)] = { 229 - [C(OP_READ)] = { 230 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 231 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 232 - }, 233 - [C(OP_WRITE)] = { 234 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 235 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 236 - }, 237 - [C(OP_PREFETCH)] = { 238 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 239 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 240 - }, 241 - }, 242 - [C(NODE)] = { 243 - [C(OP_READ)] = { 244 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 245 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 246 - }, 247 - [C(OP_WRITE)] = { 248 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 249 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 250 - }, 251 - [C(OP_PREFETCH)] = { 252 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 253 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 254 - }, 255 - }, 237 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 238 + 239 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV6MPCORE_PERFCTR_DCACHE_RDACCESS, 240 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_DCACHE_RDMISS, 241 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV6MPCORE_PERFCTR_DCACHE_WRACCESS, 242 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_DCACHE_WRMISS, 243 + 244 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_ICACHE_MISS, 245 + 246 + /* 247 + * The ARM performance counters can count micro DTLB misses, micro ITLB 248 + * misses and main TLB misses. There isn't an event for TLB misses, so 249 + * use the micro misses here and if users want the main TLB misses they 250 + * can use a raw counter. 251 + */ 252 + [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_DTLB_MISS, 253 + [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_DTLB_MISS, 254 + 255 + [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_ITLB_MISS, 256 + [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_ITLB_MISS, 256 257 }; 257 258 258 259 static inline unsigned long ··· 476 653 &armv6_perf_cache_map, 0xFF); 477 654 } 478 655 479 - static int armv6pmu_init(struct arm_pmu *cpu_pmu) 656 + static void armv6pmu_init(struct arm_pmu *cpu_pmu) 480 657 { 481 - cpu_pmu->name = "v6"; 482 658 cpu_pmu->handle_irq = armv6pmu_handle_irq; 483 659 cpu_pmu->enable = armv6pmu_enable_event; 484 660 cpu_pmu->disable = armv6pmu_disable_event; ··· 489 667 cpu_pmu->map_event = armv6_map_event; 490 668 cpu_pmu->num_events = 3; 491 669 cpu_pmu->max_period = (1LLU << 32) - 1; 670 + } 492 671 672 + static int armv6_1136_pmu_init(struct arm_pmu *cpu_pmu) 673 + { 674 + armv6pmu_init(cpu_pmu); 675 + cpu_pmu->name = "armv6_1136"; 676 + return 0; 677 + } 678 + 679 + static int armv6_1156_pmu_init(struct arm_pmu *cpu_pmu) 680 + { 681 + armv6pmu_init(cpu_pmu); 682 + cpu_pmu->name = "armv6_1156"; 683 + return 0; 684 + } 685 + 686 + static int armv6_1176_pmu_init(struct arm_pmu *cpu_pmu) 687 + { 688 + armv6pmu_init(cpu_pmu); 689 + cpu_pmu->name = "armv6_1176"; 493 690 return 0; 494 691 } 495 692 ··· 528 687 529 688 static int armv6mpcore_pmu_init(struct arm_pmu *cpu_pmu) 530 689 { 531 - cpu_pmu->name = "v6mpcore"; 690 + cpu_pmu->name = "armv6_11mpcore"; 532 691 cpu_pmu->handle_irq = armv6pmu_handle_irq; 533 692 cpu_pmu->enable = armv6pmu_enable_event; 534 693 cpu_pmu->disable = armv6mpcore_pmu_disable_event; ··· 544 703 return 0; 545 704 } 546 705 #else 547 - static int armv6pmu_init(struct arm_pmu *cpu_pmu) 706 + static int armv6_1136_pmu_init(struct arm_pmu *cpu_pmu) 707 + { 708 + return -ENODEV; 709 + } 710 + 711 + static int armv6_1156_pmu_init(struct arm_pmu *cpu_pmu) 712 + { 713 + return -ENODEV; 714 + } 715 + 716 + static int armv6_1176_pmu_init(struct arm_pmu *cpu_pmu) 548 717 { 549 718 return -ENODEV; 550 719 }
+216 -751
arch/arm/kernel/perf_event_v7.c
··· 148 148 * accesses/misses in hardware. 149 149 */ 150 150 static const unsigned armv7_a8_perf_map[PERF_COUNT_HW_MAX] = { 151 + PERF_MAP_ALL_UNSUPPORTED, 151 152 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, 152 153 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, 153 154 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 154 155 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 155 156 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, 156 157 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 157 - [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, 158 158 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV7_A8_PERFCTR_STALL_ISIDE, 159 - [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, 160 159 }; 161 160 162 161 static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 163 162 [PERF_COUNT_HW_CACHE_OP_MAX] 164 163 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 165 - [C(L1D)] = { 166 - /* 167 - * The performance counters don't differentiate between read 168 - * and write accesses/misses so this isn't strictly correct, 169 - * but it's the best we can do. Writes and reads get 170 - * combined. 171 - */ 172 - [C(OP_READ)] = { 173 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 174 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 175 - }, 176 - [C(OP_WRITE)] = { 177 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 178 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 179 - }, 180 - [C(OP_PREFETCH)] = { 181 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 182 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 183 - }, 184 - }, 185 - [C(L1I)] = { 186 - [C(OP_READ)] = { 187 - [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS, 188 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 189 - }, 190 - [C(OP_WRITE)] = { 191 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 192 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 193 - }, 194 - [C(OP_PREFETCH)] = { 195 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 196 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 197 - }, 198 - }, 199 - [C(LL)] = { 200 - [C(OP_READ)] = { 201 - [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS, 202 - [C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL, 203 - }, 204 - [C(OP_WRITE)] = { 205 - [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS, 206 - [C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL, 207 - }, 208 - [C(OP_PREFETCH)] = { 209 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 210 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 211 - }, 212 - }, 213 - [C(DTLB)] = { 214 - [C(OP_READ)] = { 215 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 216 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 217 - }, 218 - [C(OP_WRITE)] = { 219 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 220 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 221 - }, 222 - [C(OP_PREFETCH)] = { 223 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 224 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 225 - }, 226 - }, 227 - [C(ITLB)] = { 228 - [C(OP_READ)] = { 229 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 230 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 231 - }, 232 - [C(OP_WRITE)] = { 233 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 234 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 235 - }, 236 - [C(OP_PREFETCH)] = { 237 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 238 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 239 - }, 240 - }, 241 - [C(BPU)] = { 242 - [C(OP_READ)] = { 243 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 244 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 245 - }, 246 - [C(OP_WRITE)] = { 247 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 248 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 249 - }, 250 - [C(OP_PREFETCH)] = { 251 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 252 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 253 - }, 254 - }, 255 - [C(NODE)] = { 256 - [C(OP_READ)] = { 257 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 258 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 259 - }, 260 - [C(OP_WRITE)] = { 261 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 262 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 263 - }, 264 - [C(OP_PREFETCH)] = { 265 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 266 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 267 - }, 268 - }, 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, 269 194 }; 270 195 271 196 /* 272 197 * Cortex-A9 HW events mapping 273 198 */ 274 199 static const unsigned armv7_a9_perf_map[PERF_COUNT_HW_MAX] = { 200 + PERF_MAP_ALL_UNSUPPORTED, 275 201 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, 276 202 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_A9_PERFCTR_INSTR_CORE_RENAME, 277 203 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 278 204 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 279 205 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, 280 206 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 281 - [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, 282 207 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV7_A9_PERFCTR_STALL_ICACHE, 283 208 [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV7_A9_PERFCTR_STALL_DISPATCH, 284 209 }; ··· 211 286 static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 212 287 [PERF_COUNT_HW_CACHE_OP_MAX] 213 288 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 214 - [C(L1D)] = { 215 - /* 216 - * The performance counters don't differentiate between read 217 - * and write accesses/misses so this isn't strictly correct, 218 - * but it's the best we can do. Writes and reads get 219 - * combined. 220 - */ 221 - [C(OP_READ)] = { 222 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 223 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 224 - }, 225 - [C(OP_WRITE)] = { 226 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 227 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 228 - }, 229 - [C(OP_PREFETCH)] = { 230 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 231 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 232 - }, 233 - }, 234 - [C(L1I)] = { 235 - [C(OP_READ)] = { 236 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 237 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 238 - }, 239 - [C(OP_WRITE)] = { 240 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 241 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 242 - }, 243 - [C(OP_PREFETCH)] = { 244 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 245 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 246 - }, 247 - }, 248 - [C(LL)] = { 249 - [C(OP_READ)] = { 250 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 251 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 252 - }, 253 - [C(OP_WRITE)] = { 254 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 255 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 256 - }, 257 - [C(OP_PREFETCH)] = { 258 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 259 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 260 - }, 261 - }, 262 - [C(DTLB)] = { 263 - [C(OP_READ)] = { 264 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 265 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 266 - }, 267 - [C(OP_WRITE)] = { 268 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 269 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 270 - }, 271 - [C(OP_PREFETCH)] = { 272 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 273 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 274 - }, 275 - }, 276 - [C(ITLB)] = { 277 - [C(OP_READ)] = { 278 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 279 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 280 - }, 281 - [C(OP_WRITE)] = { 282 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 283 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 284 - }, 285 - [C(OP_PREFETCH)] = { 286 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 287 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 288 - }, 289 - }, 290 - [C(BPU)] = { 291 - [C(OP_READ)] = { 292 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 293 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 294 - }, 295 - [C(OP_WRITE)] = { 296 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 297 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 298 - }, 299 - [C(OP_PREFETCH)] = { 300 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 301 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 302 - }, 303 - }, 304 - [C(NODE)] = { 305 - [C(OP_READ)] = { 306 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 307 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 308 - }, 309 - [C(OP_WRITE)] = { 310 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 311 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 312 - }, 313 - [C(OP_PREFETCH)] = { 314 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 315 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 316 - }, 317 - }, 289 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 290 + 291 + /* 292 + * The performance counters don't differentiate between read and write 293 + * accesses/misses so this isn't strictly correct, but it's the best we 294 + * can do. Writes and reads get combined. 295 + */ 296 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 297 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 298 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 299 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 300 + 301 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 302 + 303 + [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 304 + [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 305 + 306 + [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 307 + [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 308 + 309 + [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 310 + [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 311 + [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 312 + [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 318 313 }; 319 314 320 315 /* 321 316 * Cortex-A5 HW events mapping 322 317 */ 323 318 static const unsigned armv7_a5_perf_map[PERF_COUNT_HW_MAX] = { 319 + PERF_MAP_ALL_UNSUPPORTED, 324 320 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, 325 321 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, 326 322 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 327 323 [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 328 324 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, 329 325 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 330 - [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, 331 - [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = HW_OP_UNSUPPORTED, 332 - [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, 333 326 }; 334 327 335 328 static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 336 329 [PERF_COUNT_HW_CACHE_OP_MAX] 337 330 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 338 - [C(L1D)] = { 339 - [C(OP_READ)] = { 340 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 341 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 342 - }, 343 - [C(OP_WRITE)] = { 344 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 345 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 346 - }, 347 - [C(OP_PREFETCH)] = { 348 - [C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL, 349 - [C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP, 350 - }, 351 - }, 352 - [C(L1I)] = { 353 - [C(OP_READ)] = { 354 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, 355 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 356 - }, 357 - [C(OP_WRITE)] = { 358 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 359 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 360 - }, 361 - /* 362 - * The prefetch counters don't differentiate between the I 363 - * side and the D side. 364 - */ 365 - [C(OP_PREFETCH)] = { 366 - [C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL, 367 - [C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP, 368 - }, 369 - }, 370 - [C(LL)] = { 371 - [C(OP_READ)] = { 372 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 373 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 374 - }, 375 - [C(OP_WRITE)] = { 376 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 377 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 378 - }, 379 - [C(OP_PREFETCH)] = { 380 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 381 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 382 - }, 383 - }, 384 - [C(DTLB)] = { 385 - [C(OP_READ)] = { 386 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 387 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 388 - }, 389 - [C(OP_WRITE)] = { 390 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 391 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 392 - }, 393 - [C(OP_PREFETCH)] = { 394 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 395 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 396 - }, 397 - }, 398 - [C(ITLB)] = { 399 - [C(OP_READ)] = { 400 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 401 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 402 - }, 403 - [C(OP_WRITE)] = { 404 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 405 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 406 - }, 407 - [C(OP_PREFETCH)] = { 408 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 409 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 410 - }, 411 - }, 412 - [C(BPU)] = { 413 - [C(OP_READ)] = { 414 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 415 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 416 - }, 417 - [C(OP_WRITE)] = { 418 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 419 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 420 - }, 421 - [C(OP_PREFETCH)] = { 422 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 423 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 424 - }, 425 - }, 426 - [C(NODE)] = { 427 - [C(OP_READ)] = { 428 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 429 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 430 - }, 431 - [C(OP_WRITE)] = { 432 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 433 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 434 - }, 435 - [C(OP_PREFETCH)] = { 436 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 437 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 438 - }, 439 - }, 331 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 332 + 333 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 334 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 335 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 336 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 337 + [C(L1D)][C(OP_PREFETCH)][C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL, 338 + [C(L1D)][C(OP_PREFETCH)][C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP, 339 + 340 + [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, 341 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 342 + /* 343 + * The prefetch counters don't differentiate between the I side and the 344 + * D side. 345 + */ 346 + [C(L1I)][C(OP_PREFETCH)][C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL, 347 + [C(L1I)][C(OP_PREFETCH)][C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP, 348 + 349 + [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 350 + [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 351 + 352 + [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 353 + [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 354 + 355 + [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 356 + [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 357 + [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 358 + [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 440 359 }; 441 360 442 361 /* 443 362 * Cortex-A15 HW events mapping 444 363 */ 445 364 static const unsigned armv7_a15_perf_map[PERF_COUNT_HW_MAX] = { 365 + PERF_MAP_ALL_UNSUPPORTED, 446 366 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, 447 367 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, 448 368 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, ··· 295 525 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_A15_PERFCTR_PC_WRITE_SPEC, 296 526 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 297 527 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES, 298 - [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = HW_OP_UNSUPPORTED, 299 - [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, 300 528 }; 301 529 302 530 static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 303 531 [PERF_COUNT_HW_CACHE_OP_MAX] 304 532 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 305 - [C(L1D)] = { 306 - [C(OP_READ)] = { 307 - [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ, 308 - [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ, 309 - }, 310 - [C(OP_WRITE)] = { 311 - [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE, 312 - [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE, 313 - }, 314 - [C(OP_PREFETCH)] = { 315 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 316 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 317 - }, 318 - }, 319 - [C(L1I)] = { 320 - /* 321 - * Not all performance counters differentiate between read 322 - * and write accesses/misses so we're not always strictly 323 - * correct, but it's the best we can do. Writes and reads get 324 - * combined in these cases. 325 - */ 326 - [C(OP_READ)] = { 327 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, 328 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 329 - }, 330 - [C(OP_WRITE)] = { 331 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 332 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 333 - }, 334 - [C(OP_PREFETCH)] = { 335 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 336 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 337 - }, 338 - }, 339 - [C(LL)] = { 340 - [C(OP_READ)] = { 341 - [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ, 342 - [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ, 343 - }, 344 - [C(OP_WRITE)] = { 345 - [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE, 346 - [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE, 347 - }, 348 - [C(OP_PREFETCH)] = { 349 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 350 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 351 - }, 352 - }, 353 - [C(DTLB)] = { 354 - [C(OP_READ)] = { 355 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 356 - [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ, 357 - }, 358 - [C(OP_WRITE)] = { 359 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 360 - [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE, 361 - }, 362 - [C(OP_PREFETCH)] = { 363 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 364 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 365 - }, 366 - }, 367 - [C(ITLB)] = { 368 - [C(OP_READ)] = { 369 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 370 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 371 - }, 372 - [C(OP_WRITE)] = { 373 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 374 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 375 - }, 376 - [C(OP_PREFETCH)] = { 377 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 378 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 379 - }, 380 - }, 381 - [C(BPU)] = { 382 - [C(OP_READ)] = { 383 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 384 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 385 - }, 386 - [C(OP_WRITE)] = { 387 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 388 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 389 - }, 390 - [C(OP_PREFETCH)] = { 391 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 392 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 393 - }, 394 - }, 395 - [C(NODE)] = { 396 - [C(OP_READ)] = { 397 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 398 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 399 - }, 400 - [C(OP_WRITE)] = { 401 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 402 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 403 - }, 404 - [C(OP_PREFETCH)] = { 405 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 406 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 407 - }, 408 - }, 533 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 534 + 535 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ, 536 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ, 537 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE, 538 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE, 539 + 540 + /* 541 + * Not all performance counters differentiate between read and write 542 + * accesses/misses so we're not always strictly correct, but it's the 543 + * best we can do. Writes and reads get combined in these cases. 544 + */ 545 + [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, 546 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 547 + 548 + [C(LL)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ, 549 + [C(LL)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ, 550 + [C(LL)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE, 551 + [C(LL)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE, 552 + 553 + [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ, 554 + [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE, 555 + 556 + [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 557 + [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 558 + 559 + [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 560 + [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 561 + [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 562 + [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 409 563 }; 410 564 411 565 /* 412 566 * Cortex-A7 HW events mapping 413 567 */ 414 568 static const unsigned armv7_a7_perf_map[PERF_COUNT_HW_MAX] = { 569 + PERF_MAP_ALL_UNSUPPORTED, 415 570 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, 416 571 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, 417 572 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, ··· 344 649 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, 345 650 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 346 651 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES, 347 - [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = HW_OP_UNSUPPORTED, 348 - [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, 349 652 }; 350 653 351 654 static const unsigned armv7_a7_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 352 655 [PERF_COUNT_HW_CACHE_OP_MAX] 353 656 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 354 - [C(L1D)] = { 355 - /* 356 - * The performance counters don't differentiate between read 357 - * and write accesses/misses so this isn't strictly correct, 358 - * but it's the best we can do. Writes and reads get 359 - * combined. 360 - */ 361 - [C(OP_READ)] = { 362 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 363 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 364 - }, 365 - [C(OP_WRITE)] = { 366 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 367 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 368 - }, 369 - [C(OP_PREFETCH)] = { 370 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 371 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 372 - }, 373 - }, 374 - [C(L1I)] = { 375 - [C(OP_READ)] = { 376 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, 377 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 378 - }, 379 - [C(OP_WRITE)] = { 380 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 381 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 382 - }, 383 - [C(OP_PREFETCH)] = { 384 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 385 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 386 - }, 387 - }, 388 - [C(LL)] = { 389 - [C(OP_READ)] = { 390 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_CACHE_ACCESS, 391 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL, 392 - }, 393 - [C(OP_WRITE)] = { 394 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_CACHE_ACCESS, 395 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL, 396 - }, 397 - [C(OP_PREFETCH)] = { 398 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 399 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 400 - }, 401 - }, 402 - [C(DTLB)] = { 403 - [C(OP_READ)] = { 404 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 405 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 406 - }, 407 - [C(OP_WRITE)] = { 408 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 409 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 410 - }, 411 - [C(OP_PREFETCH)] = { 412 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 413 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 414 - }, 415 - }, 416 - [C(ITLB)] = { 417 - [C(OP_READ)] = { 418 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 419 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 420 - }, 421 - [C(OP_WRITE)] = { 422 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 423 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 424 - }, 425 - [C(OP_PREFETCH)] = { 426 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 427 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 428 - }, 429 - }, 430 - [C(BPU)] = { 431 - [C(OP_READ)] = { 432 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 433 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 434 - }, 435 - [C(OP_WRITE)] = { 436 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 437 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 438 - }, 439 - [C(OP_PREFETCH)] = { 440 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 441 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 442 - }, 443 - }, 444 - [C(NODE)] = { 445 - [C(OP_READ)] = { 446 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 447 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 448 - }, 449 - [C(OP_WRITE)] = { 450 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 451 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 452 - }, 453 - [C(OP_PREFETCH)] = { 454 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 455 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 456 - }, 457 - }, 657 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 658 + 659 + /* 660 + * The performance counters don't differentiate between read and write 661 + * accesses/misses so this isn't strictly correct, but it's the best we 662 + * can do. Writes and reads get combined. 663 + */ 664 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 665 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 666 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 667 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 668 + 669 + [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, 670 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 671 + 672 + [C(LL)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_CACHE_ACCESS, 673 + [C(LL)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL, 674 + [C(LL)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_CACHE_ACCESS, 675 + [C(LL)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL, 676 + 677 + [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 678 + [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 679 + 680 + [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 681 + [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 682 + 683 + [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 684 + [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 685 + [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 686 + [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 458 687 }; 459 688 460 689 /* 461 690 * Cortex-A12 HW events mapping 462 691 */ 463 692 static const unsigned armv7_a12_perf_map[PERF_COUNT_HW_MAX] = { 693 + PERF_MAP_ALL_UNSUPPORTED, 464 694 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, 465 695 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, 466 696 [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, ··· 393 773 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_A12_PERFCTR_PC_WRITE_SPEC, 394 774 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 395 775 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES, 396 - [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = HW_OP_UNSUPPORTED, 397 - [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, 398 776 }; 399 777 400 778 static const unsigned armv7_a12_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 401 779 [PERF_COUNT_HW_CACHE_OP_MAX] 402 780 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 403 - [C(L1D)] = { 404 - [C(OP_READ)] = { 405 - [C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_READ, 406 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 407 - }, 408 - [C(OP_WRITE)] = { 409 - [C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_WRITE, 410 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 411 - }, 412 - [C(OP_PREFETCH)] = { 413 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 414 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 415 - }, 416 - }, 417 - [C(L1I)] = { 418 - /* 419 - * Not all performance counters differentiate between read 420 - * and write accesses/misses so we're not always strictly 421 - * correct, but it's the best we can do. Writes and reads get 422 - * combined in these cases. 423 - */ 424 - [C(OP_READ)] = { 425 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, 426 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 427 - }, 428 - [C(OP_WRITE)] = { 429 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 430 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 431 - }, 432 - [C(OP_PREFETCH)] = { 433 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 434 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 435 - }, 436 - }, 437 - [C(LL)] = { 438 - [C(OP_READ)] = { 439 - [C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_READ, 440 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL, 441 - }, 442 - [C(OP_WRITE)] = { 443 - [C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_WRITE, 444 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL, 445 - }, 446 - [C(OP_PREFETCH)] = { 447 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 448 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 449 - }, 450 - }, 451 - [C(DTLB)] = { 452 - [C(OP_READ)] = { 453 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 454 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 455 - }, 456 - [C(OP_WRITE)] = { 457 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 458 - [C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 459 - }, 460 - [C(OP_PREFETCH)] = { 461 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 462 - [C(RESULT_MISS)] = ARMV7_A12_PERFCTR_PF_TLB_REFILL, 463 - }, 464 - }, 465 - [C(ITLB)] = { 466 - [C(OP_READ)] = { 467 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 468 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 469 - }, 470 - [C(OP_WRITE)] = { 471 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 472 - [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 473 - }, 474 - [C(OP_PREFETCH)] = { 475 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 476 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 477 - }, 478 - }, 479 - [C(BPU)] = { 480 - [C(OP_READ)] = { 481 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 482 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 483 - }, 484 - [C(OP_WRITE)] = { 485 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 486 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 487 - }, 488 - [C(OP_PREFETCH)] = { 489 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 490 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 491 - }, 492 - }, 493 - [C(NODE)] = { 494 - [C(OP_READ)] = { 495 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 496 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 497 - }, 498 - [C(OP_WRITE)] = { 499 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 500 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 501 - }, 502 - [C(OP_PREFETCH)] = { 503 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 504 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 505 - }, 506 - }, 781 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 782 + 783 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_READ, 784 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 785 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_WRITE, 786 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 787 + 788 + /* 789 + * Not all performance counters differentiate between read and write 790 + * accesses/misses so we're not always strictly correct, but it's the 791 + * best we can do. Writes and reads get combined in these cases. 792 + */ 793 + [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, 794 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, 795 + 796 + [C(LL)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_READ, 797 + [C(LL)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL, 798 + [C(LL)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_WRITE, 799 + [C(LL)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACHE_REFILL, 800 + 801 + [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 802 + [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_DTLB_REFILL, 803 + [C(DTLB)][C(OP_PREFETCH)][C(RESULT_MISS)] = ARMV7_A12_PERFCTR_PF_TLB_REFILL, 804 + 805 + [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 806 + [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, 807 + 808 + [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 809 + [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 810 + [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 811 + [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 507 812 }; 508 813 509 814 /* 510 815 * Krait HW events mapping 511 816 */ 512 817 static const unsigned krait_perf_map[PERF_COUNT_HW_MAX] = { 818 + PERF_MAP_ALL_UNSUPPORTED, 513 819 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, 514 820 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, 515 - [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, 516 - [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, 517 821 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, 518 822 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 519 823 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES, 520 824 }; 521 825 522 826 static const unsigned krait_perf_map_no_branch[PERF_COUNT_HW_MAX] = { 827 + PERF_MAP_ALL_UNSUPPORTED, 523 828 [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, 524 829 [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, 525 - [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, 526 - [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, 527 - [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = HW_OP_UNSUPPORTED, 528 830 [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 529 831 [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES, 530 832 }; ··· 454 912 static const unsigned krait_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 455 913 [PERF_COUNT_HW_CACHE_OP_MAX] 456 914 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 457 - [C(L1D)] = { 458 - /* 459 - * The performance counters don't differentiate between read 460 - * and write accesses/misses so this isn't strictly correct, 461 - * but it's the best we can do. Writes and reads get 462 - * combined. 463 - */ 464 - [C(OP_READ)] = { 465 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 466 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 467 - }, 468 - [C(OP_WRITE)] = { 469 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 470 - [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 471 - }, 472 - [C(OP_PREFETCH)] = { 473 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 474 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 475 - }, 476 - }, 477 - [C(L1I)] = { 478 - [C(OP_READ)] = { 479 - [C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ICACHE_ACCESS, 480 - [C(RESULT_MISS)] = KRAIT_PERFCTR_L1_ICACHE_MISS, 481 - }, 482 - [C(OP_WRITE)] = { 483 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 484 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 485 - }, 486 - [C(OP_PREFETCH)] = { 487 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 488 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 489 - }, 490 - }, 491 - [C(LL)] = { 492 - [C(OP_READ)] = { 493 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 494 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 495 - }, 496 - [C(OP_WRITE)] = { 497 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 498 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 499 - }, 500 - [C(OP_PREFETCH)] = { 501 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 502 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 503 - }, 504 - }, 505 - [C(DTLB)] = { 506 - [C(OP_READ)] = { 507 - [C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_DTLB_ACCESS, 508 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 509 - }, 510 - [C(OP_WRITE)] = { 511 - [C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_DTLB_ACCESS, 512 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 513 - }, 514 - [C(OP_PREFETCH)] = { 515 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 516 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 517 - }, 518 - }, 519 - [C(ITLB)] = { 520 - [C(OP_READ)] = { 521 - [C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ITLB_ACCESS, 522 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 523 - }, 524 - [C(OP_WRITE)] = { 525 - [C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ITLB_ACCESS, 526 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 527 - }, 528 - [C(OP_PREFETCH)] = { 529 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 530 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 531 - }, 532 - }, 533 - [C(BPU)] = { 534 - [C(OP_READ)] = { 535 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 536 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 537 - }, 538 - [C(OP_WRITE)] = { 539 - [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 540 - [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 541 - }, 542 - [C(OP_PREFETCH)] = { 543 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 544 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 545 - }, 546 - }, 547 - [C(NODE)] = { 548 - [C(OP_READ)] = { 549 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 550 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 551 - }, 552 - [C(OP_WRITE)] = { 553 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 554 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 555 - }, 556 - [C(OP_PREFETCH)] = { 557 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 558 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 559 - }, 560 - }, 915 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 916 + 917 + /* 918 + * The performance counters don't differentiate between read and write 919 + * accesses/misses so this isn't strictly correct, but it's the best we 920 + * can do. Writes and reads get combined. 921 + */ 922 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 923 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 924 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, 925 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, 926 + 927 + [C(L1I)][C(OP_READ)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ICACHE_ACCESS, 928 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = KRAIT_PERFCTR_L1_ICACHE_MISS, 929 + 930 + [C(DTLB)][C(OP_READ)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_DTLB_ACCESS, 931 + [C(DTLB)][C(OP_WRITE)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_DTLB_ACCESS, 932 + 933 + [C(ITLB)][C(OP_READ)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ITLB_ACCESS, 934 + [C(ITLB)][C(OP_WRITE)][C(RESULT_ACCESS)] = KRAIT_PERFCTR_L1_ITLB_ACCESS, 935 + 936 + [C(BPU)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 937 + [C(BPU)][C(OP_READ)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 938 + [C(BPU)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, 939 + [C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, 561 940 }; 562 941 563 942 /* ··· 1008 1545 static int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu) 1009 1546 { 1010 1547 armv7pmu_init(cpu_pmu); 1011 - cpu_pmu->name = "ARMv7 Cortex-A8"; 1548 + cpu_pmu->name = "armv7_cortex_a8"; 1012 1549 cpu_pmu->map_event = armv7_a8_map_event; 1013 1550 cpu_pmu->num_events = armv7_read_num_pmnc_events(); 1014 1551 return 0; ··· 1017 1554 static int armv7_a9_pmu_init(struct arm_pmu *cpu_pmu) 1018 1555 { 1019 1556 armv7pmu_init(cpu_pmu); 1020 - cpu_pmu->name = "ARMv7 Cortex-A9"; 1557 + cpu_pmu->name = "armv7_cortex_a9"; 1021 1558 cpu_pmu->map_event = armv7_a9_map_event; 1022 1559 cpu_pmu->num_events = armv7_read_num_pmnc_events(); 1023 1560 return 0; ··· 1026 1563 static int armv7_a5_pmu_init(struct arm_pmu *cpu_pmu) 1027 1564 { 1028 1565 armv7pmu_init(cpu_pmu); 1029 - cpu_pmu->name = "ARMv7 Cortex-A5"; 1566 + cpu_pmu->name = "armv7_cortex_a5"; 1030 1567 cpu_pmu->map_event = armv7_a5_map_event; 1031 1568 cpu_pmu->num_events = armv7_read_num_pmnc_events(); 1032 1569 return 0; ··· 1035 1572 static int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu) 1036 1573 { 1037 1574 armv7pmu_init(cpu_pmu); 1038 - cpu_pmu->name = "ARMv7 Cortex-A15"; 1575 + cpu_pmu->name = "armv7_cortex_a15"; 1039 1576 cpu_pmu->map_event = armv7_a15_map_event; 1040 1577 cpu_pmu->num_events = armv7_read_num_pmnc_events(); 1041 1578 cpu_pmu->set_event_filter = armv7pmu_set_event_filter; ··· 1045 1582 static int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu) 1046 1583 { 1047 1584 armv7pmu_init(cpu_pmu); 1048 - cpu_pmu->name = "ARMv7 Cortex-A7"; 1585 + cpu_pmu->name = "armv7_cortex_a7"; 1049 1586 cpu_pmu->map_event = armv7_a7_map_event; 1050 1587 cpu_pmu->num_events = armv7_read_num_pmnc_events(); 1051 1588 cpu_pmu->set_event_filter = armv7pmu_set_event_filter; ··· 1055 1592 static int armv7_a12_pmu_init(struct arm_pmu *cpu_pmu) 1056 1593 { 1057 1594 armv7pmu_init(cpu_pmu); 1058 - cpu_pmu->name = "ARMv7 Cortex-A12"; 1595 + cpu_pmu->name = "armv7_cortex_a12"; 1059 1596 cpu_pmu->map_event = armv7_a12_map_event; 1060 1597 cpu_pmu->num_events = armv7_read_num_pmnc_events(); 1061 1598 cpu_pmu->set_event_filter = armv7pmu_set_event_filter; ··· 1065 1602 static int armv7_a17_pmu_init(struct arm_pmu *cpu_pmu) 1066 1603 { 1067 1604 armv7_a12_pmu_init(cpu_pmu); 1068 - cpu_pmu->name = "ARMv7 Cortex-A17"; 1605 + cpu_pmu->name = "armv7_cortex_a17"; 1069 1606 return 0; 1070 1607 } 1071 1608 ··· 1286 1823 unsigned long flags; 1287 1824 struct hw_perf_event *hwc = &event->hw; 1288 1825 int idx = hwc->idx; 1826 + struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); 1289 1827 struct pmu_hw_events *events = cpu_pmu->get_hw_events(); 1290 1828 1291 1829 /* Disable counter and interrupt */ ··· 1312 1848 unsigned long flags; 1313 1849 struct hw_perf_event *hwc = &event->hw; 1314 1850 int idx = hwc->idx; 1851 + struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu); 1315 1852 struct pmu_hw_events *events = cpu_pmu->get_hw_events(); 1316 1853 1317 1854 /* ··· 1446 1981 static int krait_pmu_init(struct arm_pmu *cpu_pmu) 1447 1982 { 1448 1983 armv7pmu_init(cpu_pmu); 1449 - cpu_pmu->name = "ARMv7 Krait"; 1984 + cpu_pmu->name = "armv7_krait"; 1450 1985 /* Some early versions of Krait don't support PC write events */ 1451 1986 if (of_property_read_bool(cpu_pmu->plat_device->dev.of_node, 1452 1987 "qcom,no-pc-write"))
+17 -104
arch/arm/kernel/perf_event_xscale.c
··· 48 48 }; 49 49 50 50 static const unsigned xscale_perf_map[PERF_COUNT_HW_MAX] = { 51 + PERF_MAP_ALL_UNSUPPORTED, 51 52 [PERF_COUNT_HW_CPU_CYCLES] = XSCALE_PERFCTR_CCNT, 52 53 [PERF_COUNT_HW_INSTRUCTIONS] = XSCALE_PERFCTR_INSTRUCTION, 53 - [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, 54 - [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, 55 54 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = XSCALE_PERFCTR_BRANCH, 56 55 [PERF_COUNT_HW_BRANCH_MISSES] = XSCALE_PERFCTR_BRANCH_MISS, 57 - [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, 58 56 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = XSCALE_PERFCTR_ICACHE_NO_DELIVER, 59 - [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, 60 57 }; 61 58 62 59 static const unsigned xscale_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 63 60 [PERF_COUNT_HW_CACHE_OP_MAX] 64 61 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 65 - [C(L1D)] = { 66 - [C(OP_READ)] = { 67 - [C(RESULT_ACCESS)] = XSCALE_PERFCTR_DCACHE_ACCESS, 68 - [C(RESULT_MISS)] = XSCALE_PERFCTR_DCACHE_MISS, 69 - }, 70 - [C(OP_WRITE)] = { 71 - [C(RESULT_ACCESS)] = XSCALE_PERFCTR_DCACHE_ACCESS, 72 - [C(RESULT_MISS)] = XSCALE_PERFCTR_DCACHE_MISS, 73 - }, 74 - [C(OP_PREFETCH)] = { 75 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 76 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 77 - }, 78 - }, 79 - [C(L1I)] = { 80 - [C(OP_READ)] = { 81 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 82 - [C(RESULT_MISS)] = XSCALE_PERFCTR_ICACHE_MISS, 83 - }, 84 - [C(OP_WRITE)] = { 85 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 86 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 87 - }, 88 - [C(OP_PREFETCH)] = { 89 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 90 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 91 - }, 92 - }, 93 - [C(LL)] = { 94 - [C(OP_READ)] = { 95 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 96 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 97 - }, 98 - [C(OP_WRITE)] = { 99 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 100 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 101 - }, 102 - [C(OP_PREFETCH)] = { 103 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 104 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 105 - }, 106 - }, 107 - [C(DTLB)] = { 108 - [C(OP_READ)] = { 109 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 110 - [C(RESULT_MISS)] = XSCALE_PERFCTR_DTLB_MISS, 111 - }, 112 - [C(OP_WRITE)] = { 113 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 114 - [C(RESULT_MISS)] = XSCALE_PERFCTR_DTLB_MISS, 115 - }, 116 - [C(OP_PREFETCH)] = { 117 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 118 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 119 - }, 120 - }, 121 - [C(ITLB)] = { 122 - [C(OP_READ)] = { 123 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 124 - [C(RESULT_MISS)] = XSCALE_PERFCTR_ITLB_MISS, 125 - }, 126 - [C(OP_WRITE)] = { 127 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 128 - [C(RESULT_MISS)] = XSCALE_PERFCTR_ITLB_MISS, 129 - }, 130 - [C(OP_PREFETCH)] = { 131 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 132 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 133 - }, 134 - }, 135 - [C(BPU)] = { 136 - [C(OP_READ)] = { 137 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 138 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 139 - }, 140 - [C(OP_WRITE)] = { 141 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 142 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 143 - }, 144 - [C(OP_PREFETCH)] = { 145 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 146 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 147 - }, 148 - }, 149 - [C(NODE)] = { 150 - [C(OP_READ)] = { 151 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 152 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 153 - }, 154 - [C(OP_WRITE)] = { 155 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 156 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 157 - }, 158 - [C(OP_PREFETCH)] = { 159 - [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, 160 - [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, 161 - }, 162 - }, 62 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 63 + 64 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = XSCALE_PERFCTR_DCACHE_ACCESS, 65 + [C(L1D)][C(OP_READ)][C(RESULT_MISS)] = XSCALE_PERFCTR_DCACHE_MISS, 66 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = XSCALE_PERFCTR_DCACHE_ACCESS, 67 + [C(L1D)][C(OP_WRITE)][C(RESULT_MISS)] = XSCALE_PERFCTR_DCACHE_MISS, 68 + 69 + [C(L1I)][C(OP_READ)][C(RESULT_MISS)] = XSCALE_PERFCTR_ICACHE_MISS, 70 + 71 + [C(DTLB)][C(OP_READ)][C(RESULT_MISS)] = XSCALE_PERFCTR_DTLB_MISS, 72 + [C(DTLB)][C(OP_WRITE)][C(RESULT_MISS)] = XSCALE_PERFCTR_DTLB_MISS, 73 + 74 + [C(ITLB)][C(OP_READ)][C(RESULT_MISS)] = XSCALE_PERFCTR_ITLB_MISS, 75 + [C(ITLB)][C(OP_WRITE)][C(RESULT_MISS)] = XSCALE_PERFCTR_ITLB_MISS, 163 76 }; 164 77 165 78 #define XSCALE_PMU_ENABLE 0x001 ··· 355 442 356 443 static int xscale1pmu_init(struct arm_pmu *cpu_pmu) 357 444 { 358 - cpu_pmu->name = "xscale1"; 445 + cpu_pmu->name = "armv5_xscale1"; 359 446 cpu_pmu->handle_irq = xscale1pmu_handle_irq; 360 447 cpu_pmu->enable = xscale1pmu_enable_event; 361 448 cpu_pmu->disable = xscale1pmu_disable_event; ··· 725 812 726 813 static int xscale2pmu_init(struct arm_pmu *cpu_pmu) 727 814 { 728 - cpu_pmu->name = "xscale2"; 815 + cpu_pmu->name = "armv5_xscale2"; 729 816 cpu_pmu->handle_irq = xscale2pmu_handle_irq; 730 817 cpu_pmu->enable = xscale2pmu_enable_event; 731 818 cpu_pmu->disable = xscale2pmu_disable_event;
+8 -6
arch/arm/oprofile/common.c
··· 33 33 char *perf_name; 34 34 char *op_name; 35 35 } op_perf_name_map[] = { 36 - { "xscale1", "arm/xscale1" }, 37 - { "xscale1", "arm/xscale2" }, 38 - { "v6", "arm/armv6" }, 39 - { "v6mpcore", "arm/mpcore" }, 40 - { "ARMv7 Cortex-A8", "arm/armv7" }, 41 - { "ARMv7 Cortex-A9", "arm/armv7-ca9" }, 36 + { "armv5_xscale1", "arm/xscale1" }, 37 + { "armv5_xscale2", "arm/xscale2" }, 38 + { "armv6_1136", "arm/armv6" }, 39 + { "armv6_1156", "arm/armv6" }, 40 + { "armv6_1176", "arm/armv6" }, 41 + { "armv6_11mpcore", "arm/mpcore" }, 42 + { "armv7_cortex_a8", "arm/armv7" }, 43 + { "armv7_cortex_a9", "arm/armv7-ca9" }, 42 44 }; 43 45 44 46 char *op_name_from_perf_id(void)