diff options
-rw-r--r-- | arch/powerpc/perf/power8-pmu.c | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c index 67aab104b9fe..3ad363da05f6 100644 --- a/arch/powerpc/perf/power8-pmu.c +++ b/arch/powerpc/perf/power8-pmu.c | |||
@@ -64,9 +64,11 @@ | |||
64 | * | 64 | * |
65 | * 60 56 52 48 44 40 36 32 | 65 | * 60 56 52 48 44 40 36 32 |
66 | * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | | 66 | * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | |
67 | * | [ thresh_cmp ] [ thresh_ctl ] | 67 | * | | [ ] [ thresh_cmp ] [ thresh_ctl ] |
68 | * | | | 68 | * | | | | |
69 | * *- EBB (Linux) thresh start/stop OR FAB match -* | 69 | * | | *- IFM (Linux) thresh start/stop OR FAB match -* |
70 | * | *- BHRB (Linux) | ||
71 | * *- EBB (Linux) | ||
70 | * | 72 | * |
71 | * 28 24 20 16 12 8 4 0 | 73 | * 28 24 20 16 12 8 4 0 |
72 | * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | | 74 | * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | |
@@ -116,10 +118,18 @@ | |||
116 | * MMCRA[57:59] = sample[0:2] (RAND_SAMP_ELIG) | 118 | * MMCRA[57:59] = sample[0:2] (RAND_SAMP_ELIG) |
117 | * MMCRA[61:62] = sample[3:4] (RAND_SAMP_MODE) | 119 | * MMCRA[61:62] = sample[3:4] (RAND_SAMP_MODE) |
118 | * | 120 | * |
121 | * if EBB and BHRB: | ||
122 | * MMCRA[32:33] = IFM | ||
123 | * | ||
119 | */ | 124 | */ |
120 | 125 | ||
121 | #define EVENT_EBB_MASK 1ull | 126 | #define EVENT_EBB_MASK 1ull |
122 | #define EVENT_EBB_SHIFT PERF_EVENT_CONFIG_EBB_SHIFT | 127 | #define EVENT_EBB_SHIFT PERF_EVENT_CONFIG_EBB_SHIFT |
128 | #define EVENT_BHRB_MASK 1ull | ||
129 | #define EVENT_BHRB_SHIFT 62 | ||
130 | #define EVENT_WANTS_BHRB (EVENT_BHRB_MASK << EVENT_BHRB_SHIFT) | ||
131 | #define EVENT_IFM_MASK 3ull | ||
132 | #define EVENT_IFM_SHIFT 60 | ||
123 | #define EVENT_THR_CMP_SHIFT 40 /* Threshold CMP value */ | 133 | #define EVENT_THR_CMP_SHIFT 40 /* Threshold CMP value */ |
124 | #define EVENT_THR_CMP_MASK 0x3ff | 134 | #define EVENT_THR_CMP_MASK 0x3ff |
125 | #define EVENT_THR_CTL_SHIFT 32 /* Threshold control value (start/stop) */ | 135 | #define EVENT_THR_CTL_SHIFT 32 /* Threshold control value (start/stop) */ |
@@ -144,6 +154,12 @@ | |||
144 | #define EVENT_IS_MARKED (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT) | 154 | #define EVENT_IS_MARKED (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT) |
145 | #define EVENT_PSEL_MASK 0xff /* PMCxSEL value */ | 155 | #define EVENT_PSEL_MASK 0xff /* PMCxSEL value */ |
146 | 156 | ||
157 | /* Bits defined by Linux */ | ||
158 | #define EVENT_LINUX_MASK \ | ||
159 | ((EVENT_EBB_MASK << EVENT_EBB_SHIFT) | \ | ||
160 | (EVENT_BHRB_MASK << EVENT_BHRB_SHIFT) | \ | ||
161 | (EVENT_IFM_MASK << EVENT_IFM_SHIFT)) | ||
162 | |||
147 | #define EVENT_VALID_MASK \ | 163 | #define EVENT_VALID_MASK \ |
148 | ((EVENT_THRESH_MASK << EVENT_THRESH_SHIFT) | \ | 164 | ((EVENT_THRESH_MASK << EVENT_THRESH_SHIFT) | \ |
149 | (EVENT_SAMPLE_MASK << EVENT_SAMPLE_SHIFT) | \ | 165 | (EVENT_SAMPLE_MASK << EVENT_SAMPLE_SHIFT) | \ |
@@ -152,7 +168,7 @@ | |||
152 | (EVENT_UNIT_MASK << EVENT_UNIT_SHIFT) | \ | 168 | (EVENT_UNIT_MASK << EVENT_UNIT_SHIFT) | \ |
153 | (EVENT_COMBINE_MASK << EVENT_COMBINE_SHIFT) | \ | 169 | (EVENT_COMBINE_MASK << EVENT_COMBINE_SHIFT) | \ |
154 | (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT) | \ | 170 | (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT) | \ |
155 | (EVENT_EBB_MASK << EVENT_EBB_SHIFT) | \ | 171 | EVENT_LINUX_MASK | \ |
156 | EVENT_PSEL_MASK) | 172 | EVENT_PSEL_MASK) |
157 | 173 | ||
158 | /* MMCRA IFM bits - POWER8 */ | 174 | /* MMCRA IFM bits - POWER8 */ |
@@ -176,10 +192,11 @@ | |||
176 | * | 192 | * |
177 | * 28 24 20 16 12 8 4 0 | 193 | * 28 24 20 16 12 8 4 0 |
178 | * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | | 194 | * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | |
179 | * | [ ] [ sample ] [ ] [6] [5] [4] [3] [2] [1] | 195 | * [ ] | [ ] [ sample ] [ ] [6] [5] [4] [3] [2] [1] |
180 | * EBB -* | | | 196 | * | | | | |
181 | * | | Count of events for each PMC. | 197 | * BHRB IFM -* | | | Count of events for each PMC. |
182 | * L1 I/D qualifier -* | p1, p2, p3, p4, p5, p6. | 198 | * EBB -* | | p1, p2, p3, p4, p5, p6. |
199 | * L1 I/D qualifier -* | | ||
183 | * nc - number of counters -* | 200 | * nc - number of counters -* |
184 | * | 201 | * |
185 | * The PMC fields P1..P6, and NC, are adder fields. As we accumulate constraints | 202 | * The PMC fields P1..P6, and NC, are adder fields. As we accumulate constraints |
@@ -198,6 +215,9 @@ | |||
198 | #define CNST_EBB_VAL(v) (((v) & EVENT_EBB_MASK) << 24) | 215 | #define CNST_EBB_VAL(v) (((v) & EVENT_EBB_MASK) << 24) |
199 | #define CNST_EBB_MASK CNST_EBB_VAL(EVENT_EBB_MASK) | 216 | #define CNST_EBB_MASK CNST_EBB_VAL(EVENT_EBB_MASK) |
200 | 217 | ||
218 | #define CNST_IFM_VAL(v) (((v) & EVENT_IFM_MASK) << 25) | ||
219 | #define CNST_IFM_MASK CNST_IFM_VAL(EVENT_IFM_MASK) | ||
220 | |||
201 | #define CNST_L1_QUAL_VAL(v) (((v) & 3) << 22) | 221 | #define CNST_L1_QUAL_VAL(v) (((v) & 3) << 22) |
202 | #define CNST_L1_QUAL_MASK CNST_L1_QUAL_VAL(3) | 222 | #define CNST_L1_QUAL_MASK CNST_L1_QUAL_VAL(3) |
203 | 223 | ||
@@ -244,6 +264,7 @@ | |||
244 | #define MMCRA_THR_SEL_SHIFT 16 | 264 | #define MMCRA_THR_SEL_SHIFT 16 |
245 | #define MMCRA_THR_CMP_SHIFT 32 | 265 | #define MMCRA_THR_CMP_SHIFT 32 |
246 | #define MMCRA_SDAR_MODE_TLB (1ull << 42) | 266 | #define MMCRA_SDAR_MODE_TLB (1ull << 42) |
267 | #define MMCRA_IFM_SHIFT 30 | ||
247 | 268 | ||
248 | 269 | ||
249 | static inline bool event_is_fab_match(u64 event) | 270 | static inline bool event_is_fab_match(u64 event) |
@@ -277,7 +298,7 @@ static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long | |||
277 | return -1; | 298 | return -1; |
278 | 299 | ||
279 | /* Ignore Linux defined bits when checking event below */ | 300 | /* Ignore Linux defined bits when checking event below */ |
280 | base_event = event & ~(EVENT_EBB_MASK << EVENT_EBB_SHIFT); | 301 | base_event = event & ~EVENT_LINUX_MASK; |
281 | 302 | ||
282 | if (pmc >= 5 && base_event != 0x500fa && base_event != 0x600f4) | 303 | if (pmc >= 5 && base_event != 0x500fa && base_event != 0x600f4) |
283 | return -1; | 304 | return -1; |
@@ -347,6 +368,15 @@ static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long | |||
347 | /* EBB events must specify the PMC */ | 368 | /* EBB events must specify the PMC */ |
348 | return -1; | 369 | return -1; |
349 | 370 | ||
371 | if (event & EVENT_WANTS_BHRB) { | ||
372 | if (!ebb) | ||
373 | /* Only EBB events can request BHRB */ | ||
374 | return -1; | ||
375 | |||
376 | mask |= CNST_IFM_MASK; | ||
377 | value |= CNST_IFM_VAL(event >> EVENT_IFM_SHIFT); | ||
378 | } | ||
379 | |||
350 | /* | 380 | /* |
351 | * All events must agree on EBB, either all request it or none. | 381 | * All events must agree on EBB, either all request it or none. |
352 | * EBB events are pinned & exclusive, so this should never actually | 382 | * EBB events are pinned & exclusive, so this should never actually |
@@ -436,6 +466,11 @@ static int power8_compute_mmcr(u64 event[], int n_ev, | |||
436 | mmcra |= val << MMCRA_THR_CMP_SHIFT; | 466 | mmcra |= val << MMCRA_THR_CMP_SHIFT; |
437 | } | 467 | } |
438 | 468 | ||
469 | if (event[i] & EVENT_WANTS_BHRB) { | ||
470 | val = (event[i] >> EVENT_IFM_SHIFT) & EVENT_IFM_MASK; | ||
471 | mmcra |= val << MMCRA_IFM_SHIFT; | ||
472 | } | ||
473 | |||
439 | hwc[i] = pmc - 1; | 474 | hwc[i] = pmc - 1; |
440 | } | 475 | } |
441 | 476 | ||