diff options
-rw-r--r-- | arch/powerpc/perf/core-book3s.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 29c6482890c8..1ab306815ff3 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
@@ -75,6 +75,7 @@ static unsigned int freeze_events_kernel = MMCR0_FCS; | |||
75 | 75 | ||
76 | #define MMCR0_FCHV 0 | 76 | #define MMCR0_FCHV 0 |
77 | #define MMCR0_PMCjCE MMCR0_PMCnCE | 77 | #define MMCR0_PMCjCE MMCR0_PMCnCE |
78 | #define MMCR0_PMAO 0 | ||
78 | 79 | ||
79 | #define SPRN_MMCRA SPRN_MMCR2 | 80 | #define SPRN_MMCRA SPRN_MMCR2 |
80 | #define MMCRA_SAMPLE_ENABLE 0 | 81 | #define MMCRA_SAMPLE_ENABLE 0 |
@@ -852,7 +853,7 @@ static void write_mmcr0(struct cpu_hw_events *cpuhw, unsigned long mmcr0) | |||
852 | static void power_pmu_disable(struct pmu *pmu) | 853 | static void power_pmu_disable(struct pmu *pmu) |
853 | { | 854 | { |
854 | struct cpu_hw_events *cpuhw; | 855 | struct cpu_hw_events *cpuhw; |
855 | unsigned long flags; | 856 | unsigned long flags, val; |
856 | 857 | ||
857 | if (!ppmu) | 858 | if (!ppmu) |
858 | return; | 859 | return; |
@@ -860,9 +861,6 @@ static void power_pmu_disable(struct pmu *pmu) | |||
860 | cpuhw = &__get_cpu_var(cpu_hw_events); | 861 | cpuhw = &__get_cpu_var(cpu_hw_events); |
861 | 862 | ||
862 | if (!cpuhw->disabled) { | 863 | if (!cpuhw->disabled) { |
863 | cpuhw->disabled = 1; | ||
864 | cpuhw->n_added = 0; | ||
865 | |||
866 | /* | 864 | /* |
867 | * Check if we ever enabled the PMU on this cpu. | 865 | * Check if we ever enabled the PMU on this cpu. |
868 | */ | 866 | */ |
@@ -872,6 +870,21 @@ static void power_pmu_disable(struct pmu *pmu) | |||
872 | } | 870 | } |
873 | 871 | ||
874 | /* | 872 | /* |
873 | * Set the 'freeze counters' bit, clear PMAO. | ||
874 | */ | ||
875 | val = mfspr(SPRN_MMCR0); | ||
876 | val |= MMCR0_FC; | ||
877 | val &= ~MMCR0_PMAO; | ||
878 | |||
879 | /* | ||
880 | * The barrier is to make sure the mtspr has been | ||
881 | * executed and the PMU has frozen the events etc. | ||
882 | * before we return. | ||
883 | */ | ||
884 | write_mmcr0(cpuhw, val); | ||
885 | mb(); | ||
886 | |||
887 | /* | ||
875 | * Disable instruction sampling if it was enabled | 888 | * Disable instruction sampling if it was enabled |
876 | */ | 889 | */ |
877 | if (cpuhw->mmcr[2] & MMCRA_SAMPLE_ENABLE) { | 890 | if (cpuhw->mmcr[2] & MMCRA_SAMPLE_ENABLE) { |
@@ -880,14 +893,8 @@ static void power_pmu_disable(struct pmu *pmu) | |||
880 | mb(); | 893 | mb(); |
881 | } | 894 | } |
882 | 895 | ||
883 | /* | 896 | cpuhw->disabled = 1; |
884 | * Set the 'freeze counters' bit. | 897 | cpuhw->n_added = 0; |
885 | * The barrier is to make sure the mtspr has been | ||
886 | * executed and the PMU has frozen the events | ||
887 | * before we return. | ||
888 | */ | ||
889 | write_mmcr0(cpuhw, mfspr(SPRN_MMCR0) | MMCR0_FC); | ||
890 | mb(); | ||
891 | } | 898 | } |
892 | local_irq_restore(flags); | 899 | local_irq_restore(flags); |
893 | } | 900 | } |