aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2013-06-28 04:15:17 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2013-06-30 21:50:13 -0400
commit4df489991182d3a9337c0a4b1563077c0004f1ba (patch)
tree003d4f58f51fe3ba102da546e49f6266cc4dce23
parent330a1eb7775ba876dbd46b9885556e57f705e3d4 (diff)
powerpc/perf: Add power8 EBB support
Add logic to the power8 PMU code to support EBB. Future processors would also be expected to implement similar constraints. At that time we could possibly factor these out into common code. Finally mark the power8 PMU as supporting EBB, which is the actual enable switch which allows EBBs to be configured. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/perf/power8-pmu.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c
index d59f5b2d4c2f..96a64d6a8bdf 100644
--- a/arch/powerpc/perf/power8-pmu.c
+++ b/arch/powerpc/perf/power8-pmu.c
@@ -31,9 +31,9 @@
31 * 31 *
32 * 60 56 52 48 44 40 36 32 32 * 60 56 52 48 44 40 36 32
33 * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | 33 * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - |
34 * [ thresh_cmp ] [ thresh_ctl ] 34 * | [ thresh_cmp ] [ thresh_ctl ]
35 * | 35 * | |
36 * thresh start/stop OR FAB match -* 36 * *- EBB (Linux) thresh start/stop OR FAB match -*
37 * 37 *
38 * 28 24 20 16 12 8 4 0 38 * 28 24 20 16 12 8 4 0
39 * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | 39 * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - |
@@ -85,6 +85,7 @@
85 * 85 *
86 */ 86 */
87 87
88#define EVENT_EBB_MASK 1ull
88#define EVENT_THR_CMP_SHIFT 40 /* Threshold CMP value */ 89#define EVENT_THR_CMP_SHIFT 40 /* Threshold CMP value */
89#define EVENT_THR_CMP_MASK 0x3ff 90#define EVENT_THR_CMP_MASK 0x3ff
90#define EVENT_THR_CTL_SHIFT 32 /* Threshold control value (start/stop) */ 91#define EVENT_THR_CTL_SHIFT 32 /* Threshold control value (start/stop) */
@@ -117,6 +118,7 @@
117 (EVENT_UNIT_MASK << EVENT_UNIT_SHIFT) | \ 118 (EVENT_UNIT_MASK << EVENT_UNIT_SHIFT) | \
118 (EVENT_COMBINE_MASK << EVENT_COMBINE_SHIFT) | \ 119 (EVENT_COMBINE_MASK << EVENT_COMBINE_SHIFT) | \
119 (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT) | \ 120 (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT) | \
121 (EVENT_EBB_MASK << EVENT_CONFIG_EBB_SHIFT) | \
120 EVENT_PSEL_MASK) 122 EVENT_PSEL_MASK)
121 123
122/* MMCRA IFM bits - POWER8 */ 124/* MMCRA IFM bits - POWER8 */
@@ -140,10 +142,10 @@
140 * 142 *
141 * 28 24 20 16 12 8 4 0 143 * 28 24 20 16 12 8 4 0
142 * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | 144 * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - |
143 * [ ] [ sample ] [ ] [6] [5] [4] [3] [2] [1] 145 * | [ ] [ sample ] [ ] [6] [5] [4] [3] [2] [1]
144 * | | 146 * EBB -* | |
145 * L1 I/D qualifier -* | Count of events for each PMC. 147 * | | Count of events for each PMC.
146 * | p1, p2, p3, p4, p5, p6. 148 * L1 I/D qualifier -* | p1, p2, p3, p4, p5, p6.
147 * nc - number of counters -* 149 * nc - number of counters -*
148 * 150 *
149 * The PMC fields P1..P6, and NC, are adder fields. As we accumulate constraints 151 * The PMC fields P1..P6, and NC, are adder fields. As we accumulate constraints
@@ -159,6 +161,9 @@
159#define CNST_THRESH_VAL(v) (((v) & EVENT_THRESH_MASK) << 32) 161#define CNST_THRESH_VAL(v) (((v) & EVENT_THRESH_MASK) << 32)
160#define CNST_THRESH_MASK CNST_THRESH_VAL(EVENT_THRESH_MASK) 162#define CNST_THRESH_MASK CNST_THRESH_VAL(EVENT_THRESH_MASK)
161 163
164#define CNST_EBB_VAL(v) (((v) & EVENT_EBB_MASK) << 24)
165#define CNST_EBB_MASK CNST_EBB_VAL(EVENT_EBB_MASK)
166
162#define CNST_L1_QUAL_VAL(v) (((v) & 3) << 22) 167#define CNST_L1_QUAL_VAL(v) (((v) & 3) << 22)
163#define CNST_L1_QUAL_MASK CNST_L1_QUAL_VAL(3) 168#define CNST_L1_QUAL_MASK CNST_L1_QUAL_VAL(3)
164 169
@@ -217,7 +222,7 @@ static inline bool event_is_fab_match(u64 event)
217 222
218static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) 223static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
219{ 224{
220 unsigned int unit, pmc, cache; 225 unsigned int unit, pmc, cache, ebb;
221 unsigned long mask, value; 226 unsigned long mask, value;
222 227
223 mask = value = 0; 228 mask = value = 0;
@@ -225,9 +230,13 @@ static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long
225 if (event & ~EVENT_VALID_MASK) 230 if (event & ~EVENT_VALID_MASK)
226 return -1; 231 return -1;
227 232
228 pmc = (event >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK; 233 pmc = (event >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK;
229 unit = (event >> EVENT_UNIT_SHIFT) & EVENT_UNIT_MASK; 234 unit = (event >> EVENT_UNIT_SHIFT) & EVENT_UNIT_MASK;
230 cache = (event >> EVENT_CACHE_SEL_SHIFT) & EVENT_CACHE_SEL_MASK; 235 cache = (event >> EVENT_CACHE_SEL_SHIFT) & EVENT_CACHE_SEL_MASK;
236 ebb = (event >> EVENT_CONFIG_EBB_SHIFT) & EVENT_EBB_MASK;
237
238 /* Clear the EBB bit in the event, so event checks work below */
239 event &= ~(EVENT_EBB_MASK << EVENT_CONFIG_EBB_SHIFT);
231 240
232 if (pmc) { 241 if (pmc) {
233 if (pmc > 6) 242 if (pmc > 6)
@@ -297,6 +306,18 @@ static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long
297 value |= CNST_THRESH_VAL(event >> EVENT_THRESH_SHIFT); 306 value |= CNST_THRESH_VAL(event >> EVENT_THRESH_SHIFT);
298 } 307 }
299 308
309 if (!pmc && ebb)
310 /* EBB events must specify the PMC */
311 return -1;
312
313 /*
314 * All events must agree on EBB, either all request it or none.
315 * EBB events are pinned & exclusive, so this should never actually
316 * hit, but we leave it as a fallback in case.
317 */
318 mask |= CNST_EBB_VAL(ebb);
319 value |= CNST_EBB_MASK;
320
300 *maskp = mask; 321 *maskp = mask;
301 *valp = value; 322 *valp = value;
302 323
@@ -591,7 +612,7 @@ static struct power_pmu power8_pmu = {
591 .get_constraint = power8_get_constraint, 612 .get_constraint = power8_get_constraint,
592 .get_alternatives = power8_get_alternatives, 613 .get_alternatives = power8_get_alternatives,
593 .disable_pmc = power8_disable_pmc, 614 .disable_pmc = power8_disable_pmc,
594 .flags = PPMU_HAS_SSLOT | PPMU_HAS_SIER | PPMU_BHRB, 615 .flags = PPMU_HAS_SSLOT | PPMU_HAS_SIER | PPMU_BHRB | PPMU_EBB,
595 .n_generic = ARRAY_SIZE(power8_generic_events), 616 .n_generic = ARRAY_SIZE(power8_generic_events),
596 .generic_events = power8_generic_events, 617 .generic_events = power8_generic_events,
597 .attr_groups = power8_pmu_attr_groups, 618 .attr_groups = power8_pmu_attr_groups,