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