diff options
-rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 124 |
1 files changed, 117 insertions, 7 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index cf10839f20ea..3fac0bfc2dee 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -244,18 +244,26 @@ static struct event_constraint intel_core_event_constraints[] = | |||
244 | 244 | ||
245 | static struct event_constraint intel_nehalem_event_constraints[] = | 245 | static struct event_constraint intel_nehalem_event_constraints[] = |
246 | { | 246 | { |
247 | FIXED_EVENT_CONSTRAINT(0xc0, (0x3|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 247 | FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ |
248 | FIXED_EVENT_CONSTRAINT(0x3c, (0x3|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 248 | FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ |
249 | INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ | 249 | INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ |
250 | INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ | 250 | INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ |
251 | INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ | 251 | INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ |
252 | INTEL_EVENT_CONSTRAINT(0x43, 0x3), /* L1D_ALL_REF */ | 252 | INTEL_EVENT_CONSTRAINT(0x43, 0x3), /* L1D_ALL_REF */ |
253 | INTEL_EVENT_CONSTRAINT(0x48, 0x3), /* L1D_PEND_MISS */ | ||
253 | INTEL_EVENT_CONSTRAINT(0x4e, 0x3), /* L1D_PREFETCH */ | 254 | INTEL_EVENT_CONSTRAINT(0x4e, 0x3), /* L1D_PREFETCH */ |
254 | INTEL_EVENT_CONSTRAINT(0x4c, 0x3), /* LOAD_HIT_PRE */ | ||
255 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ | 255 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ |
256 | INTEL_EVENT_CONSTRAINT(0x52, 0x3), /* L1D_CACHE_PREFETCH_LOCK_FB_HIT */ | 256 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ |
257 | INTEL_EVENT_CONSTRAINT(0x53, 0x3), /* L1D_CACHE_LOCK_FB_HIT */ | 257 | EVENT_CONSTRAINT_END |
258 | INTEL_EVENT_CONSTRAINT(0xc5, 0x3), /* CACHE_LOCK_CYCLES */ | 258 | }; |
259 | |||
260 | static struct event_constraint intel_westmere_event_constraints[] = | ||
261 | { | ||
262 | FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | ||
263 | FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | ||
264 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ | ||
265 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ | ||
266 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ | ||
259 | EVENT_CONSTRAINT_END | 267 | EVENT_CONSTRAINT_END |
260 | }; | 268 | }; |
261 | 269 | ||
@@ -286,6 +294,97 @@ static u64 __read_mostly hw_cache_event_ids | |||
286 | [PERF_COUNT_HW_CACHE_OP_MAX] | 294 | [PERF_COUNT_HW_CACHE_OP_MAX] |
287 | [PERF_COUNT_HW_CACHE_RESULT_MAX]; | 295 | [PERF_COUNT_HW_CACHE_RESULT_MAX]; |
288 | 296 | ||
297 | static __initconst u64 westmere_hw_cache_event_ids | ||
298 | [PERF_COUNT_HW_CACHE_MAX] | ||
299 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
300 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | ||
301 | { | ||
302 | [ C(L1D) ] = { | ||
303 | [ C(OP_READ) ] = { | ||
304 | [ C(RESULT_ACCESS) ] = 0x010b, /* MEM_INST_RETIRED.LOADS */ | ||
305 | [ C(RESULT_MISS) ] = 0x0151, /* L1D.REPL */ | ||
306 | }, | ||
307 | [ C(OP_WRITE) ] = { | ||
308 | [ C(RESULT_ACCESS) ] = 0x020b, /* MEM_INST_RETURED.STORES */ | ||
309 | [ C(RESULT_MISS) ] = 0x0251, /* L1D.M_REPL */ | ||
310 | }, | ||
311 | [ C(OP_PREFETCH) ] = { | ||
312 | [ C(RESULT_ACCESS) ] = 0x014e, /* L1D_PREFETCH.REQUESTS */ | ||
313 | [ C(RESULT_MISS) ] = 0x024e, /* L1D_PREFETCH.MISS */ | ||
314 | }, | ||
315 | }, | ||
316 | [ C(L1I ) ] = { | ||
317 | [ C(OP_READ) ] = { | ||
318 | [ C(RESULT_ACCESS) ] = 0x0380, /* L1I.READS */ | ||
319 | [ C(RESULT_MISS) ] = 0x0280, /* L1I.MISSES */ | ||
320 | }, | ||
321 | [ C(OP_WRITE) ] = { | ||
322 | [ C(RESULT_ACCESS) ] = -1, | ||
323 | [ C(RESULT_MISS) ] = -1, | ||
324 | }, | ||
325 | [ C(OP_PREFETCH) ] = { | ||
326 | [ C(RESULT_ACCESS) ] = 0x0, | ||
327 | [ C(RESULT_MISS) ] = 0x0, | ||
328 | }, | ||
329 | }, | ||
330 | [ C(LL ) ] = { | ||
331 | [ C(OP_READ) ] = { | ||
332 | [ C(RESULT_ACCESS) ] = 0x0324, /* L2_RQSTS.LOADS */ | ||
333 | [ C(RESULT_MISS) ] = 0x0224, /* L2_RQSTS.LD_MISS */ | ||
334 | }, | ||
335 | [ C(OP_WRITE) ] = { | ||
336 | [ C(RESULT_ACCESS) ] = 0x0c24, /* L2_RQSTS.RFOS */ | ||
337 | [ C(RESULT_MISS) ] = 0x0824, /* L2_RQSTS.RFO_MISS */ | ||
338 | }, | ||
339 | [ C(OP_PREFETCH) ] = { | ||
340 | [ C(RESULT_ACCESS) ] = 0x4f2e, /* LLC Reference */ | ||
341 | [ C(RESULT_MISS) ] = 0x412e, /* LLC Misses */ | ||
342 | }, | ||
343 | }, | ||
344 | [ C(DTLB) ] = { | ||
345 | [ C(OP_READ) ] = { | ||
346 | [ C(RESULT_ACCESS) ] = 0x010b, /* MEM_INST_RETIRED.LOADS */ | ||
347 | [ C(RESULT_MISS) ] = 0x0108, /* DTLB_LOAD_MISSES.ANY */ | ||
348 | }, | ||
349 | [ C(OP_WRITE) ] = { | ||
350 | [ C(RESULT_ACCESS) ] = 0x020b, /* MEM_INST_RETURED.STORES */ | ||
351 | [ C(RESULT_MISS) ] = 0x010c, /* MEM_STORE_RETIRED.DTLB_MISS */ | ||
352 | }, | ||
353 | [ C(OP_PREFETCH) ] = { | ||
354 | [ C(RESULT_ACCESS) ] = 0x0, | ||
355 | [ C(RESULT_MISS) ] = 0x0, | ||
356 | }, | ||
357 | }, | ||
358 | [ C(ITLB) ] = { | ||
359 | [ C(OP_READ) ] = { | ||
360 | [ C(RESULT_ACCESS) ] = 0x01c0, /* INST_RETIRED.ANY_P */ | ||
361 | [ C(RESULT_MISS) ] = 0x0185, /* ITLB_MISSES.ANY */ | ||
362 | }, | ||
363 | [ C(OP_WRITE) ] = { | ||
364 | [ C(RESULT_ACCESS) ] = -1, | ||
365 | [ C(RESULT_MISS) ] = -1, | ||
366 | }, | ||
367 | [ C(OP_PREFETCH) ] = { | ||
368 | [ C(RESULT_ACCESS) ] = -1, | ||
369 | [ C(RESULT_MISS) ] = -1, | ||
370 | }, | ||
371 | }, | ||
372 | [ C(BPU ) ] = { | ||
373 | [ C(OP_READ) ] = { | ||
374 | [ C(RESULT_ACCESS) ] = 0x00c4, /* BR_INST_RETIRED.ALL_BRANCHES */ | ||
375 | [ C(RESULT_MISS) ] = 0x03e8, /* BPU_CLEARS.ANY */ | ||
376 | }, | ||
377 | [ C(OP_WRITE) ] = { | ||
378 | [ C(RESULT_ACCESS) ] = -1, | ||
379 | [ C(RESULT_MISS) ] = -1, | ||
380 | }, | ||
381 | [ C(OP_PREFETCH) ] = { | ||
382 | [ C(RESULT_ACCESS) ] = -1, | ||
383 | [ C(RESULT_MISS) ] = -1, | ||
384 | }, | ||
385 | }, | ||
386 | }; | ||
387 | |||
289 | static __initconst u64 nehalem_hw_cache_event_ids | 388 | static __initconst u64 nehalem_hw_cache_event_ids |
290 | [PERF_COUNT_HW_CACHE_MAX] | 389 | [PERF_COUNT_HW_CACHE_MAX] |
291 | [PERF_COUNT_HW_CACHE_OP_MAX] | 390 | [PERF_COUNT_HW_CACHE_OP_MAX] |
@@ -2423,7 +2522,9 @@ static __init int intel_pmu_init(void) | |||
2423 | x86_pmu.event_constraints = intel_core_event_constraints; | 2522 | x86_pmu.event_constraints = intel_core_event_constraints; |
2424 | pr_cont("Core2 events, "); | 2523 | pr_cont("Core2 events, "); |
2425 | break; | 2524 | break; |
2426 | case 26: | 2525 | |
2526 | case 26: /* 45 nm nehalem, "Bloomfield" */ | ||
2527 | case 30: /* 45 nm nehalem, "Lynnfield" */ | ||
2427 | memcpy(hw_cache_event_ids, nehalem_hw_cache_event_ids, | 2528 | memcpy(hw_cache_event_ids, nehalem_hw_cache_event_ids, |
2428 | sizeof(hw_cache_event_ids)); | 2529 | sizeof(hw_cache_event_ids)); |
2429 | 2530 | ||
@@ -2437,6 +2538,15 @@ static __init int intel_pmu_init(void) | |||
2437 | x86_pmu.event_constraints = intel_gen_event_constraints; | 2538 | x86_pmu.event_constraints = intel_gen_event_constraints; |
2438 | pr_cont("Atom events, "); | 2539 | pr_cont("Atom events, "); |
2439 | break; | 2540 | break; |
2541 | |||
2542 | case 37: /* 32 nm nehalem, "Clarkdale" */ | ||
2543 | case 44: /* 32 nm nehalem, "Gulftown" */ | ||
2544 | memcpy(hw_cache_event_ids, westmere_hw_cache_event_ids, | ||
2545 | sizeof(hw_cache_event_ids)); | ||
2546 | |||
2547 | x86_pmu.event_constraints = intel_westmere_event_constraints; | ||
2548 | pr_cont("Westmere events, "); | ||
2549 | break; | ||
2440 | default: | 2550 | default: |
2441 | /* | 2551 | /* |
2442 | * default constraints for v2 and up | 2552 | * default constraints for v2 and up |