diff options
Diffstat (limited to 'arch/x86/kernel/cpu/perf_event_intel.c')
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel.c | 357 |
1 files changed, 192 insertions, 165 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 9c794ac87837..fdbc652d3feb 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
@@ -88,7 +88,7 @@ static u64 intel_pmu_event_map(int hw_event) | |||
88 | return intel_perfmon_event_map[hw_event]; | 88 | return intel_perfmon_event_map[hw_event]; |
89 | } | 89 | } |
90 | 90 | ||
91 | static __initconst u64 westmere_hw_cache_event_ids | 91 | static __initconst const u64 westmere_hw_cache_event_ids |
92 | [PERF_COUNT_HW_CACHE_MAX] | 92 | [PERF_COUNT_HW_CACHE_MAX] |
93 | [PERF_COUNT_HW_CACHE_OP_MAX] | 93 | [PERF_COUNT_HW_CACHE_OP_MAX] |
94 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | 94 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = |
@@ -179,7 +179,7 @@ static __initconst u64 westmere_hw_cache_event_ids | |||
179 | }, | 179 | }, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | static __initconst u64 nehalem_hw_cache_event_ids | 182 | static __initconst const u64 nehalem_hw_cache_event_ids |
183 | [PERF_COUNT_HW_CACHE_MAX] | 183 | [PERF_COUNT_HW_CACHE_MAX] |
184 | [PERF_COUNT_HW_CACHE_OP_MAX] | 184 | [PERF_COUNT_HW_CACHE_OP_MAX] |
185 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | 185 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = |
@@ -270,7 +270,7 @@ static __initconst u64 nehalem_hw_cache_event_ids | |||
270 | }, | 270 | }, |
271 | }; | 271 | }; |
272 | 272 | ||
273 | static __initconst u64 core2_hw_cache_event_ids | 273 | static __initconst const u64 core2_hw_cache_event_ids |
274 | [PERF_COUNT_HW_CACHE_MAX] | 274 | [PERF_COUNT_HW_CACHE_MAX] |
275 | [PERF_COUNT_HW_CACHE_OP_MAX] | 275 | [PERF_COUNT_HW_CACHE_OP_MAX] |
276 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | 276 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = |
@@ -361,7 +361,7 @@ static __initconst u64 core2_hw_cache_event_ids | |||
361 | }, | 361 | }, |
362 | }; | 362 | }; |
363 | 363 | ||
364 | static __initconst u64 atom_hw_cache_event_ids | 364 | static __initconst const u64 atom_hw_cache_event_ids |
365 | [PERF_COUNT_HW_CACHE_MAX] | 365 | [PERF_COUNT_HW_CACHE_MAX] |
366 | [PERF_COUNT_HW_CACHE_OP_MAX] | 366 | [PERF_COUNT_HW_CACHE_OP_MAX] |
367 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | 367 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = |
@@ -452,60 +452,6 @@ static __initconst u64 atom_hw_cache_event_ids | |||
452 | }, | 452 | }, |
453 | }; | 453 | }; |
454 | 454 | ||
455 | static u64 intel_pmu_raw_event(u64 hw_event) | ||
456 | { | ||
457 | #define CORE_EVNTSEL_EVENT_MASK 0x000000FFULL | ||
458 | #define CORE_EVNTSEL_UNIT_MASK 0x0000FF00ULL | ||
459 | #define CORE_EVNTSEL_EDGE_MASK 0x00040000ULL | ||
460 | #define CORE_EVNTSEL_INV_MASK 0x00800000ULL | ||
461 | #define CORE_EVNTSEL_REG_MASK 0xFF000000ULL | ||
462 | |||
463 | #define CORE_EVNTSEL_MASK \ | ||
464 | (INTEL_ARCH_EVTSEL_MASK | \ | ||
465 | INTEL_ARCH_UNIT_MASK | \ | ||
466 | INTEL_ARCH_EDGE_MASK | \ | ||
467 | INTEL_ARCH_INV_MASK | \ | ||
468 | INTEL_ARCH_CNT_MASK) | ||
469 | |||
470 | return hw_event & CORE_EVNTSEL_MASK; | ||
471 | } | ||
472 | |||
473 | static void intel_pmu_enable_bts(u64 config) | ||
474 | { | ||
475 | unsigned long debugctlmsr; | ||
476 | |||
477 | debugctlmsr = get_debugctlmsr(); | ||
478 | |||
479 | debugctlmsr |= X86_DEBUGCTL_TR; | ||
480 | debugctlmsr |= X86_DEBUGCTL_BTS; | ||
481 | debugctlmsr |= X86_DEBUGCTL_BTINT; | ||
482 | |||
483 | if (!(config & ARCH_PERFMON_EVENTSEL_OS)) | ||
484 | debugctlmsr |= X86_DEBUGCTL_BTS_OFF_OS; | ||
485 | |||
486 | if (!(config & ARCH_PERFMON_EVENTSEL_USR)) | ||
487 | debugctlmsr |= X86_DEBUGCTL_BTS_OFF_USR; | ||
488 | |||
489 | update_debugctlmsr(debugctlmsr); | ||
490 | } | ||
491 | |||
492 | static void intel_pmu_disable_bts(void) | ||
493 | { | ||
494 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); | ||
495 | unsigned long debugctlmsr; | ||
496 | |||
497 | if (!cpuc->ds) | ||
498 | return; | ||
499 | |||
500 | debugctlmsr = get_debugctlmsr(); | ||
501 | |||
502 | debugctlmsr &= | ||
503 | ~(X86_DEBUGCTL_TR | X86_DEBUGCTL_BTS | X86_DEBUGCTL_BTINT | | ||
504 | X86_DEBUGCTL_BTS_OFF_OS | X86_DEBUGCTL_BTS_OFF_USR); | ||
505 | |||
506 | update_debugctlmsr(debugctlmsr); | ||
507 | } | ||
508 | |||
509 | static void intel_pmu_disable_all(void) | 455 | static void intel_pmu_disable_all(void) |
510 | { | 456 | { |
511 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); | 457 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); |
@@ -514,12 +460,17 @@ static void intel_pmu_disable_all(void) | |||
514 | 460 | ||
515 | if (test_bit(X86_PMC_IDX_FIXED_BTS, cpuc->active_mask)) | 461 | if (test_bit(X86_PMC_IDX_FIXED_BTS, cpuc->active_mask)) |
516 | intel_pmu_disable_bts(); | 462 | intel_pmu_disable_bts(); |
463 | |||
464 | intel_pmu_pebs_disable_all(); | ||
465 | intel_pmu_lbr_disable_all(); | ||
517 | } | 466 | } |
518 | 467 | ||
519 | static void intel_pmu_enable_all(void) | 468 | static void intel_pmu_enable_all(int added) |
520 | { | 469 | { |
521 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); | 470 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); |
522 | 471 | ||
472 | intel_pmu_pebs_enable_all(); | ||
473 | intel_pmu_lbr_enable_all(); | ||
523 | wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, x86_pmu.intel_ctrl); | 474 | wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, x86_pmu.intel_ctrl); |
524 | 475 | ||
525 | if (test_bit(X86_PMC_IDX_FIXED_BTS, cpuc->active_mask)) { | 476 | if (test_bit(X86_PMC_IDX_FIXED_BTS, cpuc->active_mask)) { |
@@ -533,6 +484,42 @@ static void intel_pmu_enable_all(void) | |||
533 | } | 484 | } |
534 | } | 485 | } |
535 | 486 | ||
487 | /* | ||
488 | * Workaround for: | ||
489 | * Intel Errata AAK100 (model 26) | ||
490 | * Intel Errata AAP53 (model 30) | ||
491 | * Intel Errata BD53 (model 44) | ||
492 | * | ||
493 | * These chips need to be 'reset' when adding counters by programming | ||
494 | * the magic three (non counting) events 0x4300D2, 0x4300B1 and 0x4300B5 | ||
495 | * either in sequence on the same PMC or on different PMCs. | ||
496 | */ | ||
497 | static void intel_pmu_nhm_enable_all(int added) | ||
498 | { | ||
499 | if (added) { | ||
500 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); | ||
501 | int i; | ||
502 | |||
503 | wrmsrl(MSR_ARCH_PERFMON_EVENTSEL0 + 0, 0x4300D2); | ||
504 | wrmsrl(MSR_ARCH_PERFMON_EVENTSEL0 + 1, 0x4300B1); | ||
505 | wrmsrl(MSR_ARCH_PERFMON_EVENTSEL0 + 2, 0x4300B5); | ||
506 | |||
507 | wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0x3); | ||
508 | wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0x0); | ||
509 | |||
510 | for (i = 0; i < 3; i++) { | ||
511 | struct perf_event *event = cpuc->events[i]; | ||
512 | |||
513 | if (!event) | ||
514 | continue; | ||
515 | |||
516 | __x86_pmu_enable_event(&event->hw, | ||
517 | ARCH_PERFMON_EVENTSEL_ENABLE); | ||
518 | } | ||
519 | } | ||
520 | intel_pmu_enable_all(added); | ||
521 | } | ||
522 | |||
536 | static inline u64 intel_pmu_get_status(void) | 523 | static inline u64 intel_pmu_get_status(void) |
537 | { | 524 | { |
538 | u64 status; | 525 | u64 status; |
@@ -547,8 +534,7 @@ static inline void intel_pmu_ack_status(u64 ack) | |||
547 | wrmsrl(MSR_CORE_PERF_GLOBAL_OVF_CTRL, ack); | 534 | wrmsrl(MSR_CORE_PERF_GLOBAL_OVF_CTRL, ack); |
548 | } | 535 | } |
549 | 536 | ||
550 | static inline void | 537 | static void intel_pmu_disable_fixed(struct hw_perf_event *hwc) |
551 | intel_pmu_disable_fixed(struct hw_perf_event *hwc) | ||
552 | { | 538 | { |
553 | int idx = hwc->idx - X86_PMC_IDX_FIXED; | 539 | int idx = hwc->idx - X86_PMC_IDX_FIXED; |
554 | u64 ctrl_val, mask; | 540 | u64 ctrl_val, mask; |
@@ -557,71 +543,10 @@ intel_pmu_disable_fixed(struct hw_perf_event *hwc) | |||
557 | 543 | ||
558 | rdmsrl(hwc->config_base, ctrl_val); | 544 | rdmsrl(hwc->config_base, ctrl_val); |
559 | ctrl_val &= ~mask; | 545 | ctrl_val &= ~mask; |
560 | (void)checking_wrmsrl(hwc->config_base, ctrl_val); | 546 | wrmsrl(hwc->config_base, ctrl_val); |
561 | } | ||
562 | |||
563 | static void intel_pmu_drain_bts_buffer(void) | ||
564 | { | ||
565 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); | ||
566 | struct debug_store *ds = cpuc->ds; | ||
567 | struct bts_record { | ||
568 | u64 from; | ||
569 | u64 to; | ||
570 | u64 flags; | ||
571 | }; | ||
572 | struct perf_event *event = cpuc->events[X86_PMC_IDX_FIXED_BTS]; | ||
573 | struct bts_record *at, *top; | ||
574 | struct perf_output_handle handle; | ||
575 | struct perf_event_header header; | ||
576 | struct perf_sample_data data; | ||
577 | struct pt_regs regs; | ||
578 | |||
579 | if (!event) | ||
580 | return; | ||
581 | |||
582 | if (!ds) | ||
583 | return; | ||
584 | |||
585 | at = (struct bts_record *)(unsigned long)ds->bts_buffer_base; | ||
586 | top = (struct bts_record *)(unsigned long)ds->bts_index; | ||
587 | |||
588 | if (top <= at) | ||
589 | return; | ||
590 | |||
591 | ds->bts_index = ds->bts_buffer_base; | ||
592 | |||
593 | perf_sample_data_init(&data, 0); | ||
594 | |||
595 | data.period = event->hw.last_period; | ||
596 | regs.ip = 0; | ||
597 | |||
598 | /* | ||
599 | * Prepare a generic sample, i.e. fill in the invariant fields. | ||
600 | * We will overwrite the from and to address before we output | ||
601 | * the sample. | ||
602 | */ | ||
603 | perf_prepare_sample(&header, &data, event, ®s); | ||
604 | |||
605 | if (perf_output_begin(&handle, event, | ||
606 | header.size * (top - at), 1, 1)) | ||
607 | return; | ||
608 | |||
609 | for (; at < top; at++) { | ||
610 | data.ip = at->from; | ||
611 | data.addr = at->to; | ||
612 | |||
613 | perf_output_sample(&handle, &header, &data, event); | ||
614 | } | ||
615 | |||
616 | perf_output_end(&handle); | ||
617 | |||
618 | /* There's new data available. */ | ||
619 | event->hw.interrupts++; | ||
620 | event->pending_kill = POLL_IN; | ||
621 | } | 547 | } |
622 | 548 | ||
623 | static inline void | 549 | static void intel_pmu_disable_event(struct perf_event *event) |
624 | intel_pmu_disable_event(struct perf_event *event) | ||
625 | { | 550 | { |
626 | struct hw_perf_event *hwc = &event->hw; | 551 | struct hw_perf_event *hwc = &event->hw; |
627 | 552 | ||
@@ -637,14 +562,15 @@ intel_pmu_disable_event(struct perf_event *event) | |||
637 | } | 562 | } |
638 | 563 | ||
639 | x86_pmu_disable_event(event); | 564 | x86_pmu_disable_event(event); |
565 | |||
566 | if (unlikely(event->attr.precise_ip)) | ||
567 | intel_pmu_pebs_disable(event); | ||
640 | } | 568 | } |
641 | 569 | ||
642 | static inline void | 570 | static void intel_pmu_enable_fixed(struct hw_perf_event *hwc) |
643 | intel_pmu_enable_fixed(struct hw_perf_event *hwc) | ||
644 | { | 571 | { |
645 | int idx = hwc->idx - X86_PMC_IDX_FIXED; | 572 | int idx = hwc->idx - X86_PMC_IDX_FIXED; |
646 | u64 ctrl_val, bits, mask; | 573 | u64 ctrl_val, bits, mask; |
647 | int err; | ||
648 | 574 | ||
649 | /* | 575 | /* |
650 | * Enable IRQ generation (0x8), | 576 | * Enable IRQ generation (0x8), |
@@ -669,7 +595,7 @@ intel_pmu_enable_fixed(struct hw_perf_event *hwc) | |||
669 | rdmsrl(hwc->config_base, ctrl_val); | 595 | rdmsrl(hwc->config_base, ctrl_val); |
670 | ctrl_val &= ~mask; | 596 | ctrl_val &= ~mask; |
671 | ctrl_val |= bits; | 597 | ctrl_val |= bits; |
672 | err = checking_wrmsrl(hwc->config_base, ctrl_val); | 598 | wrmsrl(hwc->config_base, ctrl_val); |
673 | } | 599 | } |
674 | 600 | ||
675 | static void intel_pmu_enable_event(struct perf_event *event) | 601 | static void intel_pmu_enable_event(struct perf_event *event) |
@@ -689,7 +615,10 @@ static void intel_pmu_enable_event(struct perf_event *event) | |||
689 | return; | 615 | return; |
690 | } | 616 | } |
691 | 617 | ||
692 | __x86_pmu_enable_event(hwc); | 618 | if (unlikely(event->attr.precise_ip)) |
619 | intel_pmu_pebs_enable(event); | ||
620 | |||
621 | __x86_pmu_enable_event(hwc, ARCH_PERFMON_EVENTSEL_ENABLE); | ||
693 | } | 622 | } |
694 | 623 | ||
695 | /* | 624 | /* |
@@ -708,20 +637,20 @@ static void intel_pmu_reset(void) | |||
708 | unsigned long flags; | 637 | unsigned long flags; |
709 | int idx; | 638 | int idx; |
710 | 639 | ||
711 | if (!x86_pmu.num_events) | 640 | if (!x86_pmu.num_counters) |
712 | return; | 641 | return; |
713 | 642 | ||
714 | local_irq_save(flags); | 643 | local_irq_save(flags); |
715 | 644 | ||
716 | printk("clearing PMU state on CPU#%d\n", smp_processor_id()); | 645 | printk("clearing PMU state on CPU#%d\n", smp_processor_id()); |
717 | 646 | ||
718 | for (idx = 0; idx < x86_pmu.num_events; idx++) { | 647 | for (idx = 0; idx < x86_pmu.num_counters; idx++) { |
719 | checking_wrmsrl(x86_pmu.eventsel + idx, 0ull); | 648 | checking_wrmsrl(x86_pmu.eventsel + idx, 0ull); |
720 | checking_wrmsrl(x86_pmu.perfctr + idx, 0ull); | 649 | checking_wrmsrl(x86_pmu.perfctr + idx, 0ull); |
721 | } | 650 | } |
722 | for (idx = 0; idx < x86_pmu.num_events_fixed; idx++) { | 651 | for (idx = 0; idx < x86_pmu.num_counters_fixed; idx++) |
723 | checking_wrmsrl(MSR_ARCH_PERFMON_FIXED_CTR0 + idx, 0ull); | 652 | checking_wrmsrl(MSR_ARCH_PERFMON_FIXED_CTR0 + idx, 0ull); |
724 | } | 653 | |
725 | if (ds) | 654 | if (ds) |
726 | ds->bts_index = ds->bts_buffer_base; | 655 | ds->bts_index = ds->bts_buffer_base; |
727 | 656 | ||
@@ -747,7 +676,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) | |||
747 | intel_pmu_drain_bts_buffer(); | 676 | intel_pmu_drain_bts_buffer(); |
748 | status = intel_pmu_get_status(); | 677 | status = intel_pmu_get_status(); |
749 | if (!status) { | 678 | if (!status) { |
750 | intel_pmu_enable_all(); | 679 | intel_pmu_enable_all(0); |
751 | return 0; | 680 | return 0; |
752 | } | 681 | } |
753 | 682 | ||
@@ -762,6 +691,15 @@ again: | |||
762 | 691 | ||
763 | inc_irq_stat(apic_perf_irqs); | 692 | inc_irq_stat(apic_perf_irqs); |
764 | ack = status; | 693 | ack = status; |
694 | |||
695 | intel_pmu_lbr_read(); | ||
696 | |||
697 | /* | ||
698 | * PEBS overflow sets bit 62 in the global status register | ||
699 | */ | ||
700 | if (__test_and_clear_bit(62, (unsigned long *)&status)) | ||
701 | x86_pmu.drain_pebs(regs); | ||
702 | |||
765 | for_each_set_bit(bit, (unsigned long *)&status, X86_PMC_IDX_MAX) { | 703 | for_each_set_bit(bit, (unsigned long *)&status, X86_PMC_IDX_MAX) { |
766 | struct perf_event *event = cpuc->events[bit]; | 704 | struct perf_event *event = cpuc->events[bit]; |
767 | 705 | ||
@@ -787,26 +725,22 @@ again: | |||
787 | goto again; | 725 | goto again; |
788 | 726 | ||
789 | done: | 727 | done: |
790 | intel_pmu_enable_all(); | 728 | intel_pmu_enable_all(0); |
791 | return 1; | 729 | return 1; |
792 | } | 730 | } |
793 | 731 | ||
794 | static struct event_constraint bts_constraint = | ||
795 | EVENT_CONSTRAINT(0, 1ULL << X86_PMC_IDX_FIXED_BTS, 0); | ||
796 | |||
797 | static struct event_constraint * | 732 | static struct event_constraint * |
798 | intel_special_constraints(struct perf_event *event) | 733 | intel_bts_constraints(struct perf_event *event) |
799 | { | 734 | { |
800 | unsigned int hw_event; | 735 | struct hw_perf_event *hwc = &event->hw; |
801 | 736 | unsigned int hw_event, bts_event; | |
802 | hw_event = event->hw.config & INTEL_ARCH_EVENT_MASK; | ||
803 | 737 | ||
804 | if (unlikely((hw_event == | 738 | hw_event = hwc->config & INTEL_ARCH_EVENT_MASK; |
805 | x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS)) && | 739 | bts_event = x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS); |
806 | (event->hw.sample_period == 1))) { | ||
807 | 740 | ||
741 | if (unlikely(hw_event == bts_event && hwc->sample_period == 1)) | ||
808 | return &bts_constraint; | 742 | return &bts_constraint; |
809 | } | 743 | |
810 | return NULL; | 744 | return NULL; |
811 | } | 745 | } |
812 | 746 | ||
@@ -815,24 +749,53 @@ intel_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event | |||
815 | { | 749 | { |
816 | struct event_constraint *c; | 750 | struct event_constraint *c; |
817 | 751 | ||
818 | c = intel_special_constraints(event); | 752 | c = intel_bts_constraints(event); |
753 | if (c) | ||
754 | return c; | ||
755 | |||
756 | c = intel_pebs_constraints(event); | ||
819 | if (c) | 757 | if (c) |
820 | return c; | 758 | return c; |
821 | 759 | ||
822 | return x86_get_event_constraints(cpuc, event); | 760 | return x86_get_event_constraints(cpuc, event); |
823 | } | 761 | } |
824 | 762 | ||
825 | static __initconst struct x86_pmu core_pmu = { | 763 | static int intel_pmu_hw_config(struct perf_event *event) |
764 | { | ||
765 | int ret = x86_pmu_hw_config(event); | ||
766 | |||
767 | if (ret) | ||
768 | return ret; | ||
769 | |||
770 | if (event->attr.type != PERF_TYPE_RAW) | ||
771 | return 0; | ||
772 | |||
773 | if (!(event->attr.config & ARCH_PERFMON_EVENTSEL_ANY)) | ||
774 | return 0; | ||
775 | |||
776 | if (x86_pmu.version < 3) | ||
777 | return -EINVAL; | ||
778 | |||
779 | if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) | ||
780 | return -EACCES; | ||
781 | |||
782 | event->hw.config |= ARCH_PERFMON_EVENTSEL_ANY; | ||
783 | |||
784 | return 0; | ||
785 | } | ||
786 | |||
787 | static __initconst const struct x86_pmu core_pmu = { | ||
826 | .name = "core", | 788 | .name = "core", |
827 | .handle_irq = x86_pmu_handle_irq, | 789 | .handle_irq = x86_pmu_handle_irq, |
828 | .disable_all = x86_pmu_disable_all, | 790 | .disable_all = x86_pmu_disable_all, |
829 | .enable_all = x86_pmu_enable_all, | 791 | .enable_all = x86_pmu_enable_all, |
830 | .enable = x86_pmu_enable_event, | 792 | .enable = x86_pmu_enable_event, |
831 | .disable = x86_pmu_disable_event, | 793 | .disable = x86_pmu_disable_event, |
794 | .hw_config = x86_pmu_hw_config, | ||
795 | .schedule_events = x86_schedule_events, | ||
832 | .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, | 796 | .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, |
833 | .perfctr = MSR_ARCH_PERFMON_PERFCTR0, | 797 | .perfctr = MSR_ARCH_PERFMON_PERFCTR0, |
834 | .event_map = intel_pmu_event_map, | 798 | .event_map = intel_pmu_event_map, |
835 | .raw_event = intel_pmu_raw_event, | ||
836 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), | 799 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), |
837 | .apic = 1, | 800 | .apic = 1, |
838 | /* | 801 | /* |
@@ -845,17 +808,32 @@ static __initconst struct x86_pmu core_pmu = { | |||
845 | .event_constraints = intel_core_event_constraints, | 808 | .event_constraints = intel_core_event_constraints, |
846 | }; | 809 | }; |
847 | 810 | ||
848 | static __initconst struct x86_pmu intel_pmu = { | 811 | static void intel_pmu_cpu_starting(int cpu) |
812 | { | ||
813 | init_debug_store_on_cpu(cpu); | ||
814 | /* | ||
815 | * Deal with CPUs that don't clear their LBRs on power-up. | ||
816 | */ | ||
817 | intel_pmu_lbr_reset(); | ||
818 | } | ||
819 | |||
820 | static void intel_pmu_cpu_dying(int cpu) | ||
821 | { | ||
822 | fini_debug_store_on_cpu(cpu); | ||
823 | } | ||
824 | |||
825 | static __initconst const struct x86_pmu intel_pmu = { | ||
849 | .name = "Intel", | 826 | .name = "Intel", |
850 | .handle_irq = intel_pmu_handle_irq, | 827 | .handle_irq = intel_pmu_handle_irq, |
851 | .disable_all = intel_pmu_disable_all, | 828 | .disable_all = intel_pmu_disable_all, |
852 | .enable_all = intel_pmu_enable_all, | 829 | .enable_all = intel_pmu_enable_all, |
853 | .enable = intel_pmu_enable_event, | 830 | .enable = intel_pmu_enable_event, |
854 | .disable = intel_pmu_disable_event, | 831 | .disable = intel_pmu_disable_event, |
832 | .hw_config = intel_pmu_hw_config, | ||
833 | .schedule_events = x86_schedule_events, | ||
855 | .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, | 834 | .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, |
856 | .perfctr = MSR_ARCH_PERFMON_PERFCTR0, | 835 | .perfctr = MSR_ARCH_PERFMON_PERFCTR0, |
857 | .event_map = intel_pmu_event_map, | 836 | .event_map = intel_pmu_event_map, |
858 | .raw_event = intel_pmu_raw_event, | ||
859 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), | 837 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), |
860 | .apic = 1, | 838 | .apic = 1, |
861 | /* | 839 | /* |
@@ -864,14 +842,38 @@ static __initconst struct x86_pmu intel_pmu = { | |||
864 | * the generic event period: | 842 | * the generic event period: |
865 | */ | 843 | */ |
866 | .max_period = (1ULL << 31) - 1, | 844 | .max_period = (1ULL << 31) - 1, |
867 | .enable_bts = intel_pmu_enable_bts, | ||
868 | .disable_bts = intel_pmu_disable_bts, | ||
869 | .get_event_constraints = intel_get_event_constraints, | 845 | .get_event_constraints = intel_get_event_constraints, |
870 | 846 | ||
871 | .cpu_starting = init_debug_store_on_cpu, | 847 | .cpu_starting = intel_pmu_cpu_starting, |
872 | .cpu_dying = fini_debug_store_on_cpu, | 848 | .cpu_dying = intel_pmu_cpu_dying, |
873 | }; | 849 | }; |
874 | 850 | ||
851 | static void intel_clovertown_quirks(void) | ||
852 | { | ||
853 | /* | ||
854 | * PEBS is unreliable due to: | ||
855 | * | ||
856 | * AJ67 - PEBS may experience CPL leaks | ||
857 | * AJ68 - PEBS PMI may be delayed by one event | ||
858 | * AJ69 - GLOBAL_STATUS[62] will only be set when DEBUGCTL[12] | ||
859 | * AJ106 - FREEZE_LBRS_ON_PMI doesn't work in combination with PEBS | ||
860 | * | ||
861 | * AJ67 could be worked around by restricting the OS/USR flags. | ||
862 | * AJ69 could be worked around by setting PMU_FREEZE_ON_PMI. | ||
863 | * | ||
864 | * AJ106 could possibly be worked around by not allowing LBR | ||
865 | * usage from PEBS, including the fixup. | ||
866 | * AJ68 could possibly be worked around by always programming | ||
867 | * a pebs_event_reset[0] value and coping with the lost events. | ||
868 | * | ||
869 | * But taken together it might just make sense to not enable PEBS on | ||
870 | * these chips. | ||
871 | */ | ||
872 | printk(KERN_WARNING "PEBS disabled due to CPU errata.\n"); | ||
873 | x86_pmu.pebs = 0; | ||
874 | x86_pmu.pebs_constraints = NULL; | ||
875 | } | ||
876 | |||
875 | static __init int intel_pmu_init(void) | 877 | static __init int intel_pmu_init(void) |
876 | { | 878 | { |
877 | union cpuid10_edx edx; | 879 | union cpuid10_edx edx; |
@@ -881,12 +883,13 @@ static __init int intel_pmu_init(void) | |||
881 | int version; | 883 | int version; |
882 | 884 | ||
883 | if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) { | 885 | if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) { |
884 | /* check for P6 processor family */ | 886 | switch (boot_cpu_data.x86) { |
885 | if (boot_cpu_data.x86 == 6) { | 887 | case 0x6: |
886 | return p6_pmu_init(); | 888 | return p6_pmu_init(); |
887 | } else { | 889 | case 0xf: |
890 | return p4_pmu_init(); | ||
891 | } | ||
888 | return -ENODEV; | 892 | return -ENODEV; |
889 | } | ||
890 | } | 893 | } |
891 | 894 | ||
892 | /* | 895 | /* |
@@ -904,16 +907,28 @@ static __init int intel_pmu_init(void) | |||
904 | x86_pmu = intel_pmu; | 907 | x86_pmu = intel_pmu; |
905 | 908 | ||
906 | x86_pmu.version = version; | 909 | x86_pmu.version = version; |
907 | x86_pmu.num_events = eax.split.num_events; | 910 | x86_pmu.num_counters = eax.split.num_counters; |
908 | x86_pmu.event_bits = eax.split.bit_width; | 911 | x86_pmu.cntval_bits = eax.split.bit_width; |
909 | x86_pmu.event_mask = (1ULL << eax.split.bit_width) - 1; | 912 | x86_pmu.cntval_mask = (1ULL << eax.split.bit_width) - 1; |
910 | 913 | ||
911 | /* | 914 | /* |
912 | * Quirk: v2 perfmon does not report fixed-purpose events, so | 915 | * Quirk: v2 perfmon does not report fixed-purpose events, so |
913 | * assume at least 3 events: | 916 | * assume at least 3 events: |
914 | */ | 917 | */ |
915 | if (version > 1) | 918 | if (version > 1) |
916 | x86_pmu.num_events_fixed = max((int)edx.split.num_events_fixed, 3); | 919 | x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); |
920 | |||
921 | /* | ||
922 | * v2 and above have a perf capabilities MSR | ||
923 | */ | ||
924 | if (version > 1) { | ||
925 | u64 capabilities; | ||
926 | |||
927 | rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities); | ||
928 | x86_pmu.intel_cap.capabilities = capabilities; | ||
929 | } | ||
930 | |||
931 | intel_ds_init(); | ||
917 | 932 | ||
918 | /* | 933 | /* |
919 | * Install the hw-cache-events table: | 934 | * Install the hw-cache-events table: |
@@ -924,12 +939,15 @@ static __init int intel_pmu_init(void) | |||
924 | break; | 939 | break; |
925 | 940 | ||
926 | case 15: /* original 65 nm celeron/pentium/core2/xeon, "Merom"/"Conroe" */ | 941 | case 15: /* original 65 nm celeron/pentium/core2/xeon, "Merom"/"Conroe" */ |
942 | x86_pmu.quirks = intel_clovertown_quirks; | ||
927 | case 22: /* single-core 65 nm celeron/core2solo "Merom-L"/"Conroe-L" */ | 943 | case 22: /* single-core 65 nm celeron/core2solo "Merom-L"/"Conroe-L" */ |
928 | case 23: /* current 45 nm celeron/core2/xeon "Penryn"/"Wolfdale" */ | 944 | case 23: /* current 45 nm celeron/core2/xeon "Penryn"/"Wolfdale" */ |
929 | case 29: /* six-core 45 nm xeon "Dunnington" */ | 945 | case 29: /* six-core 45 nm xeon "Dunnington" */ |
930 | memcpy(hw_cache_event_ids, core2_hw_cache_event_ids, | 946 | memcpy(hw_cache_event_ids, core2_hw_cache_event_ids, |
931 | sizeof(hw_cache_event_ids)); | 947 | sizeof(hw_cache_event_ids)); |
932 | 948 | ||
949 | intel_pmu_lbr_init_core(); | ||
950 | |||
933 | x86_pmu.event_constraints = intel_core2_event_constraints; | 951 | x86_pmu.event_constraints = intel_core2_event_constraints; |
934 | pr_cont("Core2 events, "); | 952 | pr_cont("Core2 events, "); |
935 | break; | 953 | break; |
@@ -940,13 +958,19 @@ static __init int intel_pmu_init(void) | |||
940 | memcpy(hw_cache_event_ids, nehalem_hw_cache_event_ids, | 958 | memcpy(hw_cache_event_ids, nehalem_hw_cache_event_ids, |
941 | sizeof(hw_cache_event_ids)); | 959 | sizeof(hw_cache_event_ids)); |
942 | 960 | ||
961 | intel_pmu_lbr_init_nhm(); | ||
962 | |||
943 | x86_pmu.event_constraints = intel_nehalem_event_constraints; | 963 | x86_pmu.event_constraints = intel_nehalem_event_constraints; |
944 | pr_cont("Nehalem/Corei7 events, "); | 964 | x86_pmu.enable_all = intel_pmu_nhm_enable_all; |
965 | pr_cont("Nehalem events, "); | ||
945 | break; | 966 | break; |
967 | |||
946 | case 28: /* Atom */ | 968 | case 28: /* Atom */ |
947 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, | 969 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, |
948 | sizeof(hw_cache_event_ids)); | 970 | sizeof(hw_cache_event_ids)); |
949 | 971 | ||
972 | intel_pmu_lbr_init_atom(); | ||
973 | |||
950 | x86_pmu.event_constraints = intel_gen_event_constraints; | 974 | x86_pmu.event_constraints = intel_gen_event_constraints; |
951 | pr_cont("Atom events, "); | 975 | pr_cont("Atom events, "); |
952 | break; | 976 | break; |
@@ -956,7 +980,10 @@ static __init int intel_pmu_init(void) | |||
956 | memcpy(hw_cache_event_ids, westmere_hw_cache_event_ids, | 980 | memcpy(hw_cache_event_ids, westmere_hw_cache_event_ids, |
957 | sizeof(hw_cache_event_ids)); | 981 | sizeof(hw_cache_event_ids)); |
958 | 982 | ||
983 | intel_pmu_lbr_init_nhm(); | ||
984 | |||
959 | x86_pmu.event_constraints = intel_westmere_event_constraints; | 985 | x86_pmu.event_constraints = intel_westmere_event_constraints; |
986 | x86_pmu.enable_all = intel_pmu_nhm_enable_all; | ||
960 | pr_cont("Westmere events, "); | 987 | pr_cont("Westmere events, "); |
961 | break; | 988 | break; |
962 | 989 | ||