blob: 3c9bf285e96d8e5a22515c76c758d1a3d5cc8b5c [file] [log] [blame]
Vineet Gupta9c575642013-01-18 15:12:24 +05301/*
Mischa Jonker0dd450f2013-11-07 14:55:11 +01002 * Linux performance counter support for ARC
3 *
Vineet Guptafb7c5722015-08-24 13:37:01 +03004 * Copyright (C) 2014-2015 Synopsys, Inc. (www.synopsys.com)
Mischa Jonker0dd450f2013-11-07 14:55:11 +01005 * Copyright (C) 2011-2013 Synopsys, Inc. (www.synopsys.com)
Vineet Gupta9c575642013-01-18 15:12:24 +05306 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 */
12
13#ifndef __ASM_PERF_EVENT_H
14#define __ASM_PERF_EVENT_H
15
Vineet Guptafb7c5722015-08-24 13:37:01 +030016/* Max number of counters that PCT block may ever have */
17#define ARC_PERF_MAX_COUNTERS 32
Mischa Jonker0dd450f2013-11-07 14:55:11 +010018
19#define ARC_REG_CC_BUILD 0xF6
20#define ARC_REG_CC_INDEX 0x240
21#define ARC_REG_CC_NAME0 0x241
22#define ARC_REG_CC_NAME1 0x242
23
24#define ARC_REG_PCT_BUILD 0xF5
25#define ARC_REG_PCT_COUNTL 0x250
26#define ARC_REG_PCT_COUNTH 0x251
27#define ARC_REG_PCT_SNAPL 0x252
28#define ARC_REG_PCT_SNAPH 0x253
29#define ARC_REG_PCT_CONFIG 0x254
30#define ARC_REG_PCT_CONTROL 0x255
31#define ARC_REG_PCT_INDEX 0x256
32
33#define ARC_REG_PCT_CONTROL_CC (1 << 16) /* clear counts */
34#define ARC_REG_PCT_CONTROL_SN (1 << 17) /* snapshot */
35
36struct arc_reg_pct_build {
37#ifdef CONFIG_CPU_BIG_ENDIAN
38 unsigned int m:8, c:8, r:6, s:2, v:8;
39#else
40 unsigned int v:8, s:2, r:6, c:8, m:8;
41#endif
42};
43
44struct arc_reg_cc_build {
45#ifdef CONFIG_CPU_BIG_ENDIAN
46 unsigned int c:16, r:8, v:8;
47#else
48 unsigned int v:8, r:8, c:16;
49#endif
50};
51
52#define PERF_COUNT_ARC_DCLM (PERF_COUNT_HW_MAX + 0)
53#define PERF_COUNT_ARC_DCSM (PERF_COUNT_HW_MAX + 1)
54#define PERF_COUNT_ARC_ICM (PERF_COUNT_HW_MAX + 2)
55#define PERF_COUNT_ARC_BPOK (PERF_COUNT_HW_MAX + 3)
56#define PERF_COUNT_ARC_EDTLB (PERF_COUNT_HW_MAX + 4)
57#define PERF_COUNT_ARC_EITLB (PERF_COUNT_HW_MAX + 5)
Vineet Gupta0a8a4762015-01-07 13:14:07 +053058#define PERF_COUNT_ARC_LDC (PERF_COUNT_HW_MAX + 6)
59#define PERF_COUNT_ARC_STC (PERF_COUNT_HW_MAX + 7)
60
61#define PERF_COUNT_ARC_HW_MAX (PERF_COUNT_HW_MAX + 8)
Mischa Jonker0dd450f2013-11-07 14:55:11 +010062
63/*
Vineet Guptabde80c22015-04-15 19:44:07 +053064 * Some ARC pct quirks:
Mischa Jonker0dd450f2013-11-07 14:55:11 +010065 *
66 * PERF_COUNT_HW_STALLED_CYCLES_BACKEND
67 * PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
68 * The ARC 700 can either measure stalls per pipeline stage, or all stalls
69 * combined; for now we assign all stalls to STALLED_CYCLES_BACKEND
70 * and all pipeline flushes (e.g. caused by mispredicts, etc.) to
71 * STALLED_CYCLES_FRONTEND.
72 *
73 * We could start multiple performance counters and combine everything
74 * afterwards, but that makes it complicated.
75 *
76 * Note that I$ cache misses aren't counted by either of the two!
77 */
78
Vineet Guptabde80c22015-04-15 19:44:07 +053079/*
80 * ARC PCT has hardware conditions with fixed "names" but variable "indexes"
81 * (based on a specific RTL build)
82 * Below is the static map between perf generic/arc specific event_id and
83 * h/w condition names.
84 * At the time of probe, we loop thru each index and find it's name to
85 * complete the mapping of perf event_id to h/w index as latter is needed
86 * to program the counter really
87 */
Mischa Jonker0dd450f2013-11-07 14:55:11 +010088static const char * const arc_pmu_ev_hw_map[] = {
Vineet Guptabde80c22015-04-15 19:44:07 +053089 /* count cycles */
Mischa Jonker0dd450f2013-11-07 14:55:11 +010090 [PERF_COUNT_HW_CPU_CYCLES] = "crun",
91 [PERF_COUNT_HW_REF_CPU_CYCLES] = "crun",
92 [PERF_COUNT_HW_BUS_CYCLES] = "crun",
Vineet Guptabde80c22015-04-15 19:44:07 +053093
Mischa Jonker0dd450f2013-11-07 14:55:11 +010094 [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = "bflush",
95 [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = "bstall",
Vineet Guptabde80c22015-04-15 19:44:07 +053096
97 /* counts condition */
98 [PERF_COUNT_HW_INSTRUCTIONS] = "iall",
Vineet Gupta09074952015-08-19 17:23:58 +053099 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "ijmp", /* Excludes ZOL jumps */
Vineet Guptabde80c22015-04-15 19:44:07 +0530100 [PERF_COUNT_ARC_BPOK] = "bpok", /* NP-NT, PT-T, PNT-NT */
101 [PERF_COUNT_HW_BRANCH_MISSES] = "bpfail", /* NP-T, PT-NT, PNT-T */
102
Vineet Gupta0a8a4762015-01-07 13:14:07 +0530103 [PERF_COUNT_ARC_LDC] = "imemrdc", /* Instr: mem read cached */
104 [PERF_COUNT_ARC_STC] = "imemwrc", /* Instr: mem write cached */
105
Vineet Guptabde80c22015-04-15 19:44:07 +0530106 [PERF_COUNT_ARC_DCLM] = "dclm", /* D-cache Load Miss */
107 [PERF_COUNT_ARC_DCSM] = "dcsm", /* D-cache Store Miss */
108 [PERF_COUNT_ARC_ICM] = "icm", /* I-cache Miss */
109 [PERF_COUNT_ARC_EDTLB] = "edtlb", /* D-TLB Miss */
110 [PERF_COUNT_ARC_EITLB] = "eitlb", /* I-TLB Miss */
Mischa Jonker0dd450f2013-11-07 14:55:11 +0100111};
112
113#define C(_x) PERF_COUNT_HW_CACHE_##_x
114#define CACHE_OP_UNSUPPORTED 0xffff
115
116static const unsigned arc_pmu_cache_map[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
117 [C(L1D)] = {
118 [C(OP_READ)] = {
Vineet Gupta0a8a4762015-01-07 13:14:07 +0530119 [C(RESULT_ACCESS)] = PERF_COUNT_ARC_LDC,
Mischa Jonker0dd450f2013-11-07 14:55:11 +0100120 [C(RESULT_MISS)] = PERF_COUNT_ARC_DCLM,
121 },
122 [C(OP_WRITE)] = {
Vineet Gupta0a8a4762015-01-07 13:14:07 +0530123 [C(RESULT_ACCESS)] = PERF_COUNT_ARC_STC,
Mischa Jonker0dd450f2013-11-07 14:55:11 +0100124 [C(RESULT_MISS)] = PERF_COUNT_ARC_DCSM,
125 },
126 [C(OP_PREFETCH)] = {
127 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
128 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
129 },
130 },
131 [C(L1I)] = {
132 [C(OP_READ)] = {
Vineet Gupta0a8a4762015-01-07 13:14:07 +0530133 [C(RESULT_ACCESS)] = PERF_COUNT_HW_INSTRUCTIONS,
Mischa Jonker0dd450f2013-11-07 14:55:11 +0100134 [C(RESULT_MISS)] = PERF_COUNT_ARC_ICM,
135 },
136 [C(OP_WRITE)] = {
137 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
138 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
139 },
140 [C(OP_PREFETCH)] = {
141 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
142 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
143 },
144 },
145 [C(LL)] = {
146 [C(OP_READ)] = {
147 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
148 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
149 },
150 [C(OP_WRITE)] = {
151 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
152 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
153 },
154 [C(OP_PREFETCH)] = {
155 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
156 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
157 },
158 },
159 [C(DTLB)] = {
160 [C(OP_READ)] = {
Vineet Gupta0a8a4762015-01-07 13:14:07 +0530161 [C(RESULT_ACCESS)] = PERF_COUNT_ARC_LDC,
Mischa Jonker0dd450f2013-11-07 14:55:11 +0100162 [C(RESULT_MISS)] = PERF_COUNT_ARC_EDTLB,
163 },
Vineet Gupta0a8a4762015-01-07 13:14:07 +0530164 /* DTLB LD/ST Miss not segregated by h/w*/
Mischa Jonker0dd450f2013-11-07 14:55:11 +0100165 [C(OP_WRITE)] = {
166 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
167 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
168 },
169 [C(OP_PREFETCH)] = {
170 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
171 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
172 },
173 },
174 [C(ITLB)] = {
175 [C(OP_READ)] = {
176 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
177 [C(RESULT_MISS)] = PERF_COUNT_ARC_EITLB,
178 },
179 [C(OP_WRITE)] = {
180 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
181 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
182 },
183 [C(OP_PREFETCH)] = {
184 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
185 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
186 },
187 },
188 [C(BPU)] = {
189 [C(OP_READ)] = {
190 [C(RESULT_ACCESS)] = PERF_COUNT_HW_BRANCH_INSTRUCTIONS,
191 [C(RESULT_MISS)] = PERF_COUNT_HW_BRANCH_MISSES,
192 },
193 [C(OP_WRITE)] = {
194 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
195 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
196 },
197 [C(OP_PREFETCH)] = {
198 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
199 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
200 },
201 },
202 [C(NODE)] = {
203 [C(OP_READ)] = {
204 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
205 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
206 },
207 [C(OP_WRITE)] = {
208 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
209 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
210 },
211 [C(OP_PREFETCH)] = {
212 [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
213 [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
214 },
215 },
216};
217
Vineet Gupta9c575642013-01-18 15:12:24 +0530218#endif /* __ASM_PERF_EVENT_H */