diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2013-07-18 05:02:24 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2013-09-02 02:42:47 -0400 |
commit | 1fa64180fbf7a33b7a30636a2f174a5cad68d48f (patch) | |
tree | 7059129ce3951101a79dfa9ea91046383435b3e4 | |
parent | 53ad0447208d3f5897f673ca0b16c776583eedba (diff) |
perf/x86: Add Silvermont (22nm Atom) support
Compared to old atom, Silvermont has offcore and has more events
that support PEBS.
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Reviewed-by: Stephane Eranian <eranian@google.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1374138144-17278-2-git-send-email-zheng.z.yan@intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/kernel/cpu/perf_event.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel.c | 158 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_ds.c | 26 |
3 files changed, 186 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index 97e557bc4c91..cc16faae0538 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
@@ -641,6 +641,8 @@ extern struct event_constraint intel_core2_pebs_event_constraints[]; | |||
641 | 641 | ||
642 | extern struct event_constraint intel_atom_pebs_event_constraints[]; | 642 | extern struct event_constraint intel_atom_pebs_event_constraints[]; |
643 | 643 | ||
644 | extern struct event_constraint intel_slm_pebs_event_constraints[]; | ||
645 | |||
644 | extern struct event_constraint intel_nehalem_pebs_event_constraints[]; | 646 | extern struct event_constraint intel_nehalem_pebs_event_constraints[]; |
645 | 647 | ||
646 | extern struct event_constraint intel_westmere_pebs_event_constraints[]; | 648 | extern struct event_constraint intel_westmere_pebs_event_constraints[]; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 0d59a42847c4..0abf6742a8b0 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
@@ -164,6 +164,15 @@ static struct event_constraint intel_gen_event_constraints[] __read_mostly = | |||
164 | EVENT_CONSTRAINT_END | 164 | EVENT_CONSTRAINT_END |
165 | }; | 165 | }; |
166 | 166 | ||
167 | static struct event_constraint intel_slm_event_constraints[] __read_mostly = | ||
168 | { | ||
169 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ | ||
170 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ | ||
171 | FIXED_EVENT_CONSTRAINT(0x013c, 2), /* CPU_CLK_UNHALTED.REF */ | ||
172 | FIXED_EVENT_CONSTRAINT(0x0300, 2), /* pseudo CPU_CLK_UNHALTED.REF */ | ||
173 | EVENT_CONSTRAINT_END | ||
174 | }; | ||
175 | |||
167 | static struct extra_reg intel_snb_extra_regs[] __read_mostly = { | 176 | static struct extra_reg intel_snb_extra_regs[] __read_mostly = { |
168 | /* must define OFFCORE_RSP_X first, see intel_fixup_er() */ | 177 | /* must define OFFCORE_RSP_X first, see intel_fixup_er() */ |
169 | INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0), | 178 | INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0), |
@@ -886,6 +895,140 @@ static __initconst const u64 atom_hw_cache_event_ids | |||
886 | }, | 895 | }, |
887 | }; | 896 | }; |
888 | 897 | ||
898 | static struct extra_reg intel_slm_extra_regs[] __read_mostly = | ||
899 | { | ||
900 | /* must define OFFCORE_RSP_X first, see intel_fixup_er() */ | ||
901 | INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x768005ffff, RSP_0), | ||
902 | INTEL_UEVENT_EXTRA_REG(0x02b7, MSR_OFFCORE_RSP_1, 0x768005ffff, RSP_1), | ||
903 | EVENT_EXTRA_END | ||
904 | }; | ||
905 | |||
906 | #define SLM_DMND_READ SNB_DMND_DATA_RD | ||
907 | #define SLM_DMND_WRITE SNB_DMND_RFO | ||
908 | #define SLM_DMND_PREFETCH (SNB_PF_DATA_RD|SNB_PF_RFO) | ||
909 | |||
910 | #define SLM_SNP_ANY (SNB_SNP_NONE|SNB_SNP_MISS|SNB_NO_FWD|SNB_HITM) | ||
911 | #define SLM_LLC_ACCESS SNB_RESP_ANY | ||
912 | #define SLM_LLC_MISS (SLM_SNP_ANY|SNB_NON_DRAM) | ||
913 | |||
914 | static __initconst const u64 slm_hw_cache_extra_regs | ||
915 | [PERF_COUNT_HW_CACHE_MAX] | ||
916 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
917 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | ||
918 | { | ||
919 | [ C(LL ) ] = { | ||
920 | [ C(OP_READ) ] = { | ||
921 | [ C(RESULT_ACCESS) ] = SLM_DMND_READ|SLM_LLC_ACCESS, | ||
922 | [ C(RESULT_MISS) ] = SLM_DMND_READ|SLM_LLC_MISS, | ||
923 | }, | ||
924 | [ C(OP_WRITE) ] = { | ||
925 | [ C(RESULT_ACCESS) ] = SLM_DMND_WRITE|SLM_LLC_ACCESS, | ||
926 | [ C(RESULT_MISS) ] = SLM_DMND_WRITE|SLM_LLC_MISS, | ||
927 | }, | ||
928 | [ C(OP_PREFETCH) ] = { | ||
929 | [ C(RESULT_ACCESS) ] = SLM_DMND_PREFETCH|SLM_LLC_ACCESS, | ||
930 | [ C(RESULT_MISS) ] = SLM_DMND_PREFETCH|SLM_LLC_MISS, | ||
931 | }, | ||
932 | }, | ||
933 | }; | ||
934 | |||
935 | static __initconst const u64 slm_hw_cache_event_ids | ||
936 | [PERF_COUNT_HW_CACHE_MAX] | ||
937 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
938 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | ||
939 | { | ||
940 | [ C(L1D) ] = { | ||
941 | [ C(OP_READ) ] = { | ||
942 | [ C(RESULT_ACCESS) ] = 0, | ||
943 | [ C(RESULT_MISS) ] = 0x0104, /* LD_DCU_MISS */ | ||
944 | }, | ||
945 | [ C(OP_WRITE) ] = { | ||
946 | [ C(RESULT_ACCESS) ] = 0, | ||
947 | [ C(RESULT_MISS) ] = 0, | ||
948 | }, | ||
949 | [ C(OP_PREFETCH) ] = { | ||
950 | [ C(RESULT_ACCESS) ] = 0, | ||
951 | [ C(RESULT_MISS) ] = 0, | ||
952 | }, | ||
953 | }, | ||
954 | [ C(L1I ) ] = { | ||
955 | [ C(OP_READ) ] = { | ||
956 | [ C(RESULT_ACCESS) ] = 0x0380, /* ICACHE.ACCESSES */ | ||
957 | [ C(RESULT_MISS) ] = 0x0280, /* ICACGE.MISSES */ | ||
958 | }, | ||
959 | [ C(OP_WRITE) ] = { | ||
960 | [ C(RESULT_ACCESS) ] = -1, | ||
961 | [ C(RESULT_MISS) ] = -1, | ||
962 | }, | ||
963 | [ C(OP_PREFETCH) ] = { | ||
964 | [ C(RESULT_ACCESS) ] = 0, | ||
965 | [ C(RESULT_MISS) ] = 0, | ||
966 | }, | ||
967 | }, | ||
968 | [ C(LL ) ] = { | ||
969 | [ C(OP_READ) ] = { | ||
970 | /* OFFCORE_RESPONSE.ANY_DATA.LOCAL_CACHE */ | ||
971 | [ C(RESULT_ACCESS) ] = 0x01b7, | ||
972 | /* OFFCORE_RESPONSE.ANY_DATA.ANY_LLC_MISS */ | ||
973 | [ C(RESULT_MISS) ] = 0x01b7, | ||
974 | }, | ||
975 | [ C(OP_WRITE) ] = { | ||
976 | /* OFFCORE_RESPONSE.ANY_RFO.LOCAL_CACHE */ | ||
977 | [ C(RESULT_ACCESS) ] = 0x01b7, | ||
978 | /* OFFCORE_RESPONSE.ANY_RFO.ANY_LLC_MISS */ | ||
979 | [ C(RESULT_MISS) ] = 0x01b7, | ||
980 | }, | ||
981 | [ C(OP_PREFETCH) ] = { | ||
982 | /* OFFCORE_RESPONSE.PREFETCH.LOCAL_CACHE */ | ||
983 | [ C(RESULT_ACCESS) ] = 0x01b7, | ||
984 | /* OFFCORE_RESPONSE.PREFETCH.ANY_LLC_MISS */ | ||
985 | [ C(RESULT_MISS) ] = 0x01b7, | ||
986 | }, | ||
987 | }, | ||
988 | [ C(DTLB) ] = { | ||
989 | [ C(OP_READ) ] = { | ||
990 | [ C(RESULT_ACCESS) ] = 0, | ||
991 | [ C(RESULT_MISS) ] = 0x0804, /* LD_DTLB_MISS */ | ||
992 | }, | ||
993 | [ C(OP_WRITE) ] = { | ||
994 | [ C(RESULT_ACCESS) ] = 0, | ||
995 | [ C(RESULT_MISS) ] = 0, | ||
996 | }, | ||
997 | [ C(OP_PREFETCH) ] = { | ||
998 | [ C(RESULT_ACCESS) ] = 0, | ||
999 | [ C(RESULT_MISS) ] = 0, | ||
1000 | }, | ||
1001 | }, | ||
1002 | [ C(ITLB) ] = { | ||
1003 | [ C(OP_READ) ] = { | ||
1004 | [ C(RESULT_ACCESS) ] = 0x00c0, /* INST_RETIRED.ANY_P */ | ||
1005 | [ C(RESULT_MISS) ] = 0x0282, /* ITLB.MISSES */ | ||
1006 | }, | ||
1007 | [ C(OP_WRITE) ] = { | ||
1008 | [ C(RESULT_ACCESS) ] = -1, | ||
1009 | [ C(RESULT_MISS) ] = -1, | ||
1010 | }, | ||
1011 | [ C(OP_PREFETCH) ] = { | ||
1012 | [ C(RESULT_ACCESS) ] = -1, | ||
1013 | [ C(RESULT_MISS) ] = -1, | ||
1014 | }, | ||
1015 | }, | ||
1016 | [ C(BPU ) ] = { | ||
1017 | [ C(OP_READ) ] = { | ||
1018 | [ C(RESULT_ACCESS) ] = 0x00c4, /* BR_INST_RETIRED.ANY */ | ||
1019 | [ C(RESULT_MISS) ] = 0x00c5, /* BP_INST_RETIRED.MISPRED */ | ||
1020 | }, | ||
1021 | [ C(OP_WRITE) ] = { | ||
1022 | [ C(RESULT_ACCESS) ] = -1, | ||
1023 | [ C(RESULT_MISS) ] = -1, | ||
1024 | }, | ||
1025 | [ C(OP_PREFETCH) ] = { | ||
1026 | [ C(RESULT_ACCESS) ] = -1, | ||
1027 | [ C(RESULT_MISS) ] = -1, | ||
1028 | }, | ||
1029 | }, | ||
1030 | }; | ||
1031 | |||
889 | static inline bool intel_pmu_needs_lbr_smpl(struct perf_event *event) | 1032 | static inline bool intel_pmu_needs_lbr_smpl(struct perf_event *event) |
890 | { | 1033 | { |
891 | /* user explicitly requested branch sampling */ | 1034 | /* user explicitly requested branch sampling */ |
@@ -2180,6 +2323,21 @@ __init int intel_pmu_init(void) | |||
2180 | pr_cont("Atom events, "); | 2323 | pr_cont("Atom events, "); |
2181 | break; | 2324 | break; |
2182 | 2325 | ||
2326 | case 55: /* Atom 22nm "Silvermont" */ | ||
2327 | memcpy(hw_cache_event_ids, slm_hw_cache_event_ids, | ||
2328 | sizeof(hw_cache_event_ids)); | ||
2329 | memcpy(hw_cache_extra_regs, slm_hw_cache_extra_regs, | ||
2330 | sizeof(hw_cache_extra_regs)); | ||
2331 | |||
2332 | intel_pmu_lbr_init_atom(); | ||
2333 | |||
2334 | x86_pmu.event_constraints = intel_slm_event_constraints; | ||
2335 | x86_pmu.pebs_constraints = intel_slm_pebs_event_constraints; | ||
2336 | x86_pmu.extra_regs = intel_slm_extra_regs; | ||
2337 | x86_pmu.er_flags |= ERF_HAS_RSP_1; | ||
2338 | pr_cont("Silvermont events, "); | ||
2339 | break; | ||
2340 | |||
2183 | case 37: /* 32 nm nehalem, "Clarkdale" */ | 2341 | case 37: /* 32 nm nehalem, "Clarkdale" */ |
2184 | case 44: /* 32 nm nehalem, "Gulftown" */ | 2342 | case 44: /* 32 nm nehalem, "Gulftown" */ |
2185 | case 47: /* 32 nm Xeon E7 */ | 2343 | case 47: /* 32 nm Xeon E7 */ |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index 3065c57a63c1..442fcc23f3a8 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
@@ -517,6 +517,32 @@ struct event_constraint intel_atom_pebs_event_constraints[] = { | |||
517 | EVENT_CONSTRAINT_END | 517 | EVENT_CONSTRAINT_END |
518 | }; | 518 | }; |
519 | 519 | ||
520 | struct event_constraint intel_slm_pebs_event_constraints[] = { | ||
521 | INTEL_UEVENT_CONSTRAINT(0x0103, 0x1), /* REHABQ.LD_BLOCK_ST_FORWARD_PS */ | ||
522 | INTEL_UEVENT_CONSTRAINT(0x0803, 0x1), /* REHABQ.LD_SPLITS_PS */ | ||
523 | INTEL_UEVENT_CONSTRAINT(0x0204, 0x1), /* MEM_UOPS_RETIRED.L2_HIT_LOADS_PS */ | ||
524 | INTEL_UEVENT_CONSTRAINT(0x0404, 0x1), /* MEM_UOPS_RETIRED.L2_MISS_LOADS_PS */ | ||
525 | INTEL_UEVENT_CONSTRAINT(0x0804, 0x1), /* MEM_UOPS_RETIRED.DTLB_MISS_LOADS_PS */ | ||
526 | INTEL_UEVENT_CONSTRAINT(0x2004, 0x1), /* MEM_UOPS_RETIRED.HITM_PS */ | ||
527 | INTEL_UEVENT_CONSTRAINT(0x00c0, 0x1), /* INST_RETIRED.ANY_PS */ | ||
528 | INTEL_UEVENT_CONSTRAINT(0x00c4, 0x1), /* BR_INST_RETIRED.ALL_BRANCHES_PS */ | ||
529 | INTEL_UEVENT_CONSTRAINT(0x7ec4, 0x1), /* BR_INST_RETIRED.JCC_PS */ | ||
530 | INTEL_UEVENT_CONSTRAINT(0xbfc4, 0x1), /* BR_INST_RETIRED.FAR_BRANCH_PS */ | ||
531 | INTEL_UEVENT_CONSTRAINT(0xebc4, 0x1), /* BR_INST_RETIRED.NON_RETURN_IND_PS */ | ||
532 | INTEL_UEVENT_CONSTRAINT(0xf7c4, 0x1), /* BR_INST_RETIRED.RETURN_PS */ | ||
533 | INTEL_UEVENT_CONSTRAINT(0xf9c4, 0x1), /* BR_INST_RETIRED.CALL_PS */ | ||
534 | INTEL_UEVENT_CONSTRAINT(0xfbc4, 0x1), /* BR_INST_RETIRED.IND_CALL_PS */ | ||
535 | INTEL_UEVENT_CONSTRAINT(0xfdc4, 0x1), /* BR_INST_RETIRED.REL_CALL_PS */ | ||
536 | INTEL_UEVENT_CONSTRAINT(0xfec4, 0x1), /* BR_INST_RETIRED.TAKEN_JCC_PS */ | ||
537 | INTEL_UEVENT_CONSTRAINT(0x00c5, 0x1), /* BR_INST_MISP_RETIRED.ALL_BRANCHES_PS */ | ||
538 | INTEL_UEVENT_CONSTRAINT(0x7ec5, 0x1), /* BR_INST_MISP_RETIRED.JCC_PS */ | ||
539 | INTEL_UEVENT_CONSTRAINT(0xebc5, 0x1), /* BR_INST_MISP_RETIRED.NON_RETURN_IND_PS */ | ||
540 | INTEL_UEVENT_CONSTRAINT(0xf7c5, 0x1), /* BR_INST_MISP_RETIRED.RETURN_PS */ | ||
541 | INTEL_UEVENT_CONSTRAINT(0xfbc5, 0x1), /* BR_INST_MISP_RETIRED.IND_CALL_PS */ | ||
542 | INTEL_UEVENT_CONSTRAINT(0xfec5, 0x1), /* BR_INST_MISP_RETIRED.TAKEN_JCC_PS */ | ||
543 | EVENT_CONSTRAINT_END | ||
544 | }; | ||
545 | |||
520 | struct event_constraint intel_nehalem_pebs_event_constraints[] = { | 546 | struct event_constraint intel_nehalem_pebs_event_constraints[] = { |
521 | INTEL_PLD_CONSTRAINT(0x100b, 0xf), /* MEM_INST_RETIRED.* */ | 547 | INTEL_PLD_CONSTRAINT(0x100b, 0xf), /* MEM_INST_RETIRED.* */ |
522 | INTEL_EVENT_CONSTRAINT(0x0f, 0xf), /* MEM_UNCORE_RETIRED.* */ | 548 | INTEL_EVENT_CONSTRAINT(0x0f, 0xf), /* MEM_UNCORE_RETIRED.* */ |