diff options
| -rw-r--r-- | arch/x86/include/asm/perf_event.h | 58 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 19 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_amd.c | 15 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel.c | 22 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event_p6.c | 20 |
5 files changed, 45 insertions, 89 deletions
diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 987bf673141e..f6d43dbfd8e7 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h | |||
| @@ -18,39 +18,31 @@ | |||
| 18 | #define MSR_ARCH_PERFMON_EVENTSEL0 0x186 | 18 | #define MSR_ARCH_PERFMON_EVENTSEL0 0x186 |
| 19 | #define MSR_ARCH_PERFMON_EVENTSEL1 0x187 | 19 | #define MSR_ARCH_PERFMON_EVENTSEL1 0x187 |
| 20 | 20 | ||
| 21 | #define ARCH_PERFMON_EVENTSEL_ENABLE (1 << 22) | 21 | #define ARCH_PERFMON_EVENTSEL_EVENT 0x000000FFULL |
| 22 | #define ARCH_PERFMON_EVENTSEL_ANY (1 << 21) | 22 | #define ARCH_PERFMON_EVENTSEL_UMASK 0x0000FF00ULL |
| 23 | #define ARCH_PERFMON_EVENTSEL_INT (1 << 20) | 23 | #define ARCH_PERFMON_EVENTSEL_USR (1ULL << 16) |
| 24 | #define ARCH_PERFMON_EVENTSEL_OS (1 << 17) | 24 | #define ARCH_PERFMON_EVENTSEL_OS (1ULL << 17) |
| 25 | #define ARCH_PERFMON_EVENTSEL_USR (1 << 16) | 25 | #define ARCH_PERFMON_EVENTSEL_EDGE (1ULL << 18) |
| 26 | 26 | #define ARCH_PERFMON_EVENTSEL_INT (1ULL << 20) | |
| 27 | /* | 27 | #define ARCH_PERFMON_EVENTSEL_ANY (1ULL << 21) |
| 28 | * Includes eventsel and unit mask as well: | 28 | #define ARCH_PERFMON_EVENTSEL_ENABLE (1ULL << 22) |
| 29 | */ | 29 | #define ARCH_PERFMON_EVENTSEL_INV (1ULL << 23) |
| 30 | 30 | #define ARCH_PERFMON_EVENTSEL_CMASK 0xFF000000ULL | |
| 31 | 31 | ||
| 32 | #define INTEL_ARCH_EVTSEL_MASK 0x000000FFULL | 32 | #define AMD64_EVENTSEL_EVENT \ |
| 33 | #define INTEL_ARCH_UNIT_MASK 0x0000FF00ULL | 33 | (ARCH_PERFMON_EVENTSEL_EVENT | (0x0FULL << 32)) |
| 34 | #define INTEL_ARCH_EDGE_MASK 0x00040000ULL | 34 | #define INTEL_ARCH_EVENT_MASK \ |
| 35 | #define INTEL_ARCH_INV_MASK 0x00800000ULL | 35 | (ARCH_PERFMON_EVENTSEL_UMASK | ARCH_PERFMON_EVENTSEL_EVENT) |
| 36 | #define INTEL_ARCH_CNT_MASK 0xFF000000ULL | 36 | |
| 37 | #define INTEL_ARCH_EVENT_MASK (INTEL_ARCH_UNIT_MASK|INTEL_ARCH_EVTSEL_MASK) | 37 | #define X86_RAW_EVENT_MASK \ |
| 38 | 38 | (ARCH_PERFMON_EVENTSEL_EVENT | \ | |
| 39 | /* | 39 | ARCH_PERFMON_EVENTSEL_UMASK | \ |
| 40 | * filter mask to validate fixed counter events. | 40 | ARCH_PERFMON_EVENTSEL_EDGE | \ |
| 41 | * the following filters disqualify for fixed counters: | 41 | ARCH_PERFMON_EVENTSEL_INV | \ |
| 42 | * - inv | 42 | ARCH_PERFMON_EVENTSEL_CMASK) |
| 43 | * - edge | 43 | #define AMD64_RAW_EVENT_MASK \ |
| 44 | * - cnt-mask | 44 | (X86_RAW_EVENT_MASK | \ |
| 45 | * The other filters are supported by fixed counters. | 45 | AMD64_EVENTSEL_EVENT) |
| 46 | * The any-thread option is supported starting with v3. | ||
| 47 | */ | ||
| 48 | #define INTEL_ARCH_FIXED_MASK \ | ||
| 49 | (INTEL_ARCH_CNT_MASK| \ | ||
| 50 | INTEL_ARCH_INV_MASK| \ | ||
| 51 | INTEL_ARCH_EDGE_MASK|\ | ||
| 52 | INTEL_ARCH_UNIT_MASK|\ | ||
| 53 | INTEL_ARCH_EVENT_MASK) | ||
| 54 | 46 | ||
| 55 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c | 47 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c |
| 56 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8) | 48 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8) |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 9daaa1ef504c..1dd42c18f1cb 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -143,13 +143,21 @@ struct cpu_hw_events { | |||
| 143 | * Constraint on the Event code. | 143 | * Constraint on the Event code. |
| 144 | */ | 144 | */ |
| 145 | #define INTEL_EVENT_CONSTRAINT(c, n) \ | 145 | #define INTEL_EVENT_CONSTRAINT(c, n) \ |
| 146 | EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVTSEL_MASK) | 146 | EVENT_CONSTRAINT(c, n, ARCH_PERFMON_EVENTSEL_EVENT) |
| 147 | 147 | ||
| 148 | /* | 148 | /* |
| 149 | * Constraint on the Event code + UMask + fixed-mask | 149 | * Constraint on the Event code + UMask + fixed-mask |
| 150 | * | ||
| 151 | * filter mask to validate fixed counter events. | ||
| 152 | * the following filters disqualify for fixed counters: | ||
| 153 | * - inv | ||
| 154 | * - edge | ||
| 155 | * - cnt-mask | ||
| 156 | * The other filters are supported by fixed counters. | ||
| 157 | * The any-thread option is supported starting with v3. | ||
| 150 | */ | 158 | */ |
| 151 | #define FIXED_EVENT_CONSTRAINT(c, n) \ | 159 | #define FIXED_EVENT_CONSTRAINT(c, n) \ |
| 152 | EVENT_CONSTRAINT(c, (1ULL << (32+n)), INTEL_ARCH_FIXED_MASK) | 160 | EVENT_CONSTRAINT(c, (1ULL << (32+n)), X86_RAW_EVENT_MASK) |
| 153 | 161 | ||
| 154 | /* | 162 | /* |
| 155 | * Constraint on the Event code + UMask | 163 | * Constraint on the Event code + UMask |
| @@ -437,6 +445,11 @@ static int x86_hw_config(struct perf_event_attr *attr, struct hw_perf_event *hwc | |||
| 437 | return 0; | 445 | return 0; |
| 438 | } | 446 | } |
| 439 | 447 | ||
| 448 | static u64 x86_pmu_raw_event(u64 hw_event) | ||
| 449 | { | ||
| 450 | return hw_event & X86_RAW_EVENT_MASK; | ||
| 451 | } | ||
| 452 | |||
| 440 | /* | 453 | /* |
| 441 | * Setup the hardware configuration for a given attr_type | 454 | * Setup the hardware configuration for a given attr_type |
| 442 | */ | 455 | */ |
| @@ -1427,7 +1440,7 @@ void __init init_hw_perf_events(void) | |||
| 1427 | 1440 | ||
| 1428 | if (x86_pmu.event_constraints) { | 1441 | if (x86_pmu.event_constraints) { |
| 1429 | for_each_event_constraint(c, x86_pmu.event_constraints) { | 1442 | for_each_event_constraint(c, x86_pmu.event_constraints) { |
| 1430 | if (c->cmask != INTEL_ARCH_FIXED_MASK) | 1443 | if (c->cmask != X86_RAW_EVENT_MASK) |
| 1431 | continue; | 1444 | continue; |
| 1432 | 1445 | ||
| 1433 | c->idxmsk64 |= (1ULL << x86_pmu.num_counters) - 1; | 1446 | c->idxmsk64 |= (1ULL << x86_pmu.num_counters) - 1; |
diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c index 7753a5c76535..37e9517729df 100644 --- a/arch/x86/kernel/cpu/perf_event_amd.c +++ b/arch/x86/kernel/cpu/perf_event_amd.c | |||
| @@ -113,20 +113,7 @@ static u64 amd_pmu_event_map(int hw_event) | |||
| 113 | 113 | ||
| 114 | static u64 amd_pmu_raw_event(u64 hw_event) | 114 | static u64 amd_pmu_raw_event(u64 hw_event) |
| 115 | { | 115 | { |
| 116 | #define K7_EVNTSEL_EVENT_MASK 0xF000000FFULL | 116 | return hw_event & AMD64_RAW_EVENT_MASK; |
| 117 | #define K7_EVNTSEL_UNIT_MASK 0x00000FF00ULL | ||
| 118 | #define K7_EVNTSEL_EDGE_MASK 0x000040000ULL | ||
| 119 | #define K7_EVNTSEL_INV_MASK 0x000800000ULL | ||
| 120 | #define K7_EVNTSEL_REG_MASK 0x0FF000000ULL | ||
| 121 | |||
| 122 | #define K7_EVNTSEL_MASK \ | ||
| 123 | (K7_EVNTSEL_EVENT_MASK | \ | ||
| 124 | K7_EVNTSEL_UNIT_MASK | \ | ||
| 125 | K7_EVNTSEL_EDGE_MASK | \ | ||
| 126 | K7_EVNTSEL_INV_MASK | \ | ||
| 127 | K7_EVNTSEL_REG_MASK) | ||
| 128 | |||
| 129 | return hw_event & K7_EVNTSEL_MASK; | ||
| 130 | } | 117 | } |
| 131 | 118 | ||
| 132 | /* | 119 | /* |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index cc4d90a13d53..dfdd6f90fc8e 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -452,24 +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_disable_all(void) | 455 | static void intel_pmu_disable_all(void) |
| 474 | { | 456 | { |
| 475 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); | 457 | struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); |
| @@ -788,7 +770,7 @@ static __initconst struct x86_pmu core_pmu = { | |||
| 788 | .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, | 770 | .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, |
| 789 | .perfctr = MSR_ARCH_PERFMON_PERFCTR0, | 771 | .perfctr = MSR_ARCH_PERFMON_PERFCTR0, |
| 790 | .event_map = intel_pmu_event_map, | 772 | .event_map = intel_pmu_event_map, |
| 791 | .raw_event = intel_pmu_raw_event, | 773 | .raw_event = x86_pmu_raw_event, |
| 792 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), | 774 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), |
| 793 | .apic = 1, | 775 | .apic = 1, |
| 794 | /* | 776 | /* |
| @@ -827,7 +809,7 @@ static __initconst struct x86_pmu intel_pmu = { | |||
| 827 | .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, | 809 | .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, |
| 828 | .perfctr = MSR_ARCH_PERFMON_PERFCTR0, | 810 | .perfctr = MSR_ARCH_PERFMON_PERFCTR0, |
| 829 | .event_map = intel_pmu_event_map, | 811 | .event_map = intel_pmu_event_map, |
| 830 | .raw_event = intel_pmu_raw_event, | 812 | .raw_event = x86_pmu_raw_event, |
| 831 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), | 813 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), |
| 832 | .apic = 1, | 814 | .apic = 1, |
| 833 | /* | 815 | /* |
diff --git a/arch/x86/kernel/cpu/perf_event_p6.c b/arch/x86/kernel/cpu/perf_event_p6.c index b26fbc7eb93c..03c139a67baa 100644 --- a/arch/x86/kernel/cpu/perf_event_p6.c +++ b/arch/x86/kernel/cpu/perf_event_p6.c | |||
| @@ -27,24 +27,6 @@ static u64 p6_pmu_event_map(int hw_event) | |||
| 27 | */ | 27 | */ |
| 28 | #define P6_NOP_EVENT 0x0000002EULL | 28 | #define P6_NOP_EVENT 0x0000002EULL |
| 29 | 29 | ||
| 30 | static u64 p6_pmu_raw_event(u64 hw_event) | ||
| 31 | { | ||
| 32 | #define P6_EVNTSEL_EVENT_MASK 0x000000FFULL | ||
| 33 | #define P6_EVNTSEL_UNIT_MASK 0x0000FF00ULL | ||
| 34 | #define P6_EVNTSEL_EDGE_MASK 0x00040000ULL | ||
| 35 | #define P6_EVNTSEL_INV_MASK 0x00800000ULL | ||
| 36 | #define P6_EVNTSEL_REG_MASK 0xFF000000ULL | ||
| 37 | |||
| 38 | #define P6_EVNTSEL_MASK \ | ||
| 39 | (P6_EVNTSEL_EVENT_MASK | \ | ||
| 40 | P6_EVNTSEL_UNIT_MASK | \ | ||
| 41 | P6_EVNTSEL_EDGE_MASK | \ | ||
| 42 | P6_EVNTSEL_INV_MASK | \ | ||
| 43 | P6_EVNTSEL_REG_MASK) | ||
| 44 | |||
| 45 | return hw_event & P6_EVNTSEL_MASK; | ||
| 46 | } | ||
| 47 | |||
| 48 | static struct event_constraint p6_event_constraints[] = | 30 | static struct event_constraint p6_event_constraints[] = |
| 49 | { | 31 | { |
| 50 | INTEL_EVENT_CONSTRAINT(0xc1, 0x1), /* FLOPS */ | 32 | INTEL_EVENT_CONSTRAINT(0xc1, 0x1), /* FLOPS */ |
| @@ -114,7 +96,7 @@ static __initconst struct x86_pmu p6_pmu = { | |||
| 114 | .eventsel = MSR_P6_EVNTSEL0, | 96 | .eventsel = MSR_P6_EVNTSEL0, |
| 115 | .perfctr = MSR_P6_PERFCTR0, | 97 | .perfctr = MSR_P6_PERFCTR0, |
| 116 | .event_map = p6_pmu_event_map, | 98 | .event_map = p6_pmu_event_map, |
| 117 | .raw_event = p6_pmu_raw_event, | 99 | .raw_event = x86_pmu_raw_event, |
| 118 | .max_events = ARRAY_SIZE(p6_perfmon_event_map), | 100 | .max_events = ARRAY_SIZE(p6_perfmon_event_map), |
| 119 | .apic = 1, | 101 | .apic = 1, |
| 120 | .max_period = (1ULL << 31) - 1, | 102 | .max_period = (1ULL << 31) - 1, |
