diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2012-12-13 13:40:13 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2012-12-13 13:40:13 -0500 |
commit | 241738bd51cb0efe58e6c570223153e970afe3ae (patch) | |
tree | 05263e1ec3fbd58cc4ba5ee69163612fbb769a4a /arch/mips/kernel | |
parent | bdf20507da11a9a5b32ef04fa09f352828189aef (diff) | |
parent | ce8f0d0607bcad3ec0e8599be80353204427093e (diff) |
Merge branch 'mips-next' of http://dev.phrozen.org/githttp/mips-next into mips-for-linux-next
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/perf_event_mipsxx.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index a9b995dcf691..b14c14d90fc2 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c | |||
@@ -840,6 +840,16 @@ static const struct mips_perf_event bmips5000_event_map | |||
840 | [PERF_COUNT_HW_BRANCH_MISSES] = { 0x02, CNTR_ODD, T }, | 840 | [PERF_COUNT_HW_BRANCH_MISSES] = { 0x02, CNTR_ODD, T }, |
841 | }; | 841 | }; |
842 | 842 | ||
843 | static const struct mips_perf_event xlp_event_map[PERF_COUNT_HW_MAX] = { | ||
844 | [PERF_COUNT_HW_CPU_CYCLES] = { 0x01, CNTR_ALL }, | ||
845 | [PERF_COUNT_HW_INSTRUCTIONS] = { 0x18, CNTR_ALL }, /* PAPI_TOT_INS */ | ||
846 | [PERF_COUNT_HW_CACHE_REFERENCES] = { 0x04, CNTR_ALL }, /* PAPI_L1_ICA */ | ||
847 | [PERF_COUNT_HW_CACHE_MISSES] = { 0x07, CNTR_ALL }, /* PAPI_L1_ICM */ | ||
848 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = { 0x1b, CNTR_ALL }, /* PAPI_BR_CN */ | ||
849 | [PERF_COUNT_HW_BRANCH_MISSES] = { 0x1c, CNTR_ALL }, /* PAPI_BR_MSP */ | ||
850 | [PERF_COUNT_HW_BUS_CYCLES] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
851 | }; | ||
852 | |||
843 | /* 24K/34K/1004K cores can share the same cache event map. */ | 853 | /* 24K/34K/1004K cores can share the same cache event map. */ |
844 | static const struct mips_perf_event mipsxxcore_cache_map | 854 | static const struct mips_perf_event mipsxxcore_cache_map |
845 | [PERF_COUNT_HW_CACHE_MAX] | 855 | [PERF_COUNT_HW_CACHE_MAX] |
@@ -1092,6 +1102,100 @@ static const struct mips_perf_event octeon_cache_map | |||
1092 | }, | 1102 | }, |
1093 | }; | 1103 | }; |
1094 | 1104 | ||
1105 | static const struct mips_perf_event xlp_cache_map | ||
1106 | [PERF_COUNT_HW_CACHE_MAX] | ||
1107 | [PERF_COUNT_HW_CACHE_OP_MAX] | ||
1108 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | ||
1109 | [C(L1D)] = { | ||
1110 | [C(OP_READ)] = { | ||
1111 | [C(RESULT_ACCESS)] = { 0x31, CNTR_ALL }, /* PAPI_L1_DCR */ | ||
1112 | [C(RESULT_MISS)] = { 0x30, CNTR_ALL }, /* PAPI_L1_LDM */ | ||
1113 | }, | ||
1114 | [C(OP_WRITE)] = { | ||
1115 | [C(RESULT_ACCESS)] = { 0x2f, CNTR_ALL }, /* PAPI_L1_DCW */ | ||
1116 | [C(RESULT_MISS)] = { 0x2e, CNTR_ALL }, /* PAPI_L1_STM */ | ||
1117 | }, | ||
1118 | [C(OP_PREFETCH)] = { | ||
1119 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1120 | [C(RESULT_MISS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1121 | }, | ||
1122 | }, | ||
1123 | [C(L1I)] = { | ||
1124 | [C(OP_READ)] = { | ||
1125 | [C(RESULT_ACCESS)] = { 0x04, CNTR_ALL }, /* PAPI_L1_ICA */ | ||
1126 | [C(RESULT_MISS)] = { 0x07, CNTR_ALL }, /* PAPI_L1_ICM */ | ||
1127 | }, | ||
1128 | [C(OP_WRITE)] = { | ||
1129 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1130 | [C(RESULT_MISS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1131 | }, | ||
1132 | [C(OP_PREFETCH)] = { | ||
1133 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1134 | [C(RESULT_MISS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1135 | }, | ||
1136 | }, | ||
1137 | [C(LL)] = { | ||
1138 | [C(OP_READ)] = { | ||
1139 | [C(RESULT_ACCESS)] = { 0x35, CNTR_ALL }, /* PAPI_L2_DCR */ | ||
1140 | [C(RESULT_MISS)] = { 0x37, CNTR_ALL }, /* PAPI_L2_LDM */ | ||
1141 | }, | ||
1142 | [C(OP_WRITE)] = { | ||
1143 | [C(RESULT_ACCESS)] = { 0x34, CNTR_ALL }, /* PAPI_L2_DCA */ | ||
1144 | [C(RESULT_MISS)] = { 0x36, CNTR_ALL }, /* PAPI_L2_DCM */ | ||
1145 | }, | ||
1146 | [C(OP_PREFETCH)] = { | ||
1147 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1148 | [C(RESULT_MISS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1149 | }, | ||
1150 | }, | ||
1151 | [C(DTLB)] = { | ||
1152 | /* | ||
1153 | * Only general DTLB misses are counted use the same event for | ||
1154 | * read and write. | ||
1155 | */ | ||
1156 | [C(OP_READ)] = { | ||
1157 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1158 | [C(RESULT_MISS)] = { 0x2d, CNTR_ALL }, /* PAPI_TLB_DM */ | ||
1159 | }, | ||
1160 | [C(OP_WRITE)] = { | ||
1161 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1162 | [C(RESULT_MISS)] = { 0x2d, CNTR_ALL }, /* PAPI_TLB_DM */ | ||
1163 | }, | ||
1164 | [C(OP_PREFETCH)] = { | ||
1165 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1166 | [C(RESULT_MISS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1167 | }, | ||
1168 | }, | ||
1169 | [C(ITLB)] = { | ||
1170 | [C(OP_READ)] = { | ||
1171 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1172 | [C(RESULT_MISS)] = { 0x08, CNTR_ALL }, /* PAPI_TLB_IM */ | ||
1173 | }, | ||
1174 | [C(OP_WRITE)] = { | ||
1175 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1176 | [C(RESULT_MISS)] = { 0x08, CNTR_ALL }, /* PAPI_TLB_IM */ | ||
1177 | }, | ||
1178 | [C(OP_PREFETCH)] = { | ||
1179 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1180 | [C(RESULT_MISS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1181 | }, | ||
1182 | }, | ||
1183 | [C(BPU)] = { | ||
1184 | [C(OP_READ)] = { | ||
1185 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1186 | [C(RESULT_MISS)] = { 0x25, CNTR_ALL }, | ||
1187 | }, | ||
1188 | [C(OP_WRITE)] = { | ||
1189 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1190 | [C(RESULT_MISS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1191 | }, | ||
1192 | [C(OP_PREFETCH)] = { | ||
1193 | [C(RESULT_ACCESS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1194 | [C(RESULT_MISS)] = { UNSUPPORTED_PERF_EVENT_ID }, | ||
1195 | }, | ||
1196 | }, | ||
1197 | }; | ||
1198 | |||
1095 | #ifdef CONFIG_MIPS_MT_SMP | 1199 | #ifdef CONFIG_MIPS_MT_SMP |
1096 | static void check_and_calc_range(struct perf_event *event, | 1200 | static void check_and_calc_range(struct perf_event *event, |
1097 | const struct mips_perf_event *pev) | 1201 | const struct mips_perf_event *pev) |
@@ -1444,6 +1548,20 @@ static const struct mips_perf_event *octeon_pmu_map_raw_event(u64 config) | |||
1444 | return &raw_event; | 1548 | return &raw_event; |
1445 | } | 1549 | } |
1446 | 1550 | ||
1551 | static const struct mips_perf_event *xlp_pmu_map_raw_event(u64 config) | ||
1552 | { | ||
1553 | unsigned int raw_id = config & 0xff; | ||
1554 | |||
1555 | /* Only 1-63 are defined */ | ||
1556 | if ((raw_id < 0x01) || (raw_id > 0x3f)) | ||
1557 | return ERR_PTR(-EOPNOTSUPP); | ||
1558 | |||
1559 | raw_event.cntr_mask = CNTR_ALL; | ||
1560 | raw_event.event_id = raw_id; | ||
1561 | |||
1562 | return &raw_event; | ||
1563 | } | ||
1564 | |||
1447 | static int __init | 1565 | static int __init |
1448 | init_hw_perf_events(void) | 1566 | init_hw_perf_events(void) |
1449 | { | 1567 | { |
@@ -1522,6 +1640,12 @@ init_hw_perf_events(void) | |||
1522 | mipspmu.general_event_map = &bmips5000_event_map; | 1640 | mipspmu.general_event_map = &bmips5000_event_map; |
1523 | mipspmu.cache_event_map = &bmips5000_cache_map; | 1641 | mipspmu.cache_event_map = &bmips5000_cache_map; |
1524 | break; | 1642 | break; |
1643 | case CPU_XLP: | ||
1644 | mipspmu.name = "xlp"; | ||
1645 | mipspmu.general_event_map = &xlp_event_map; | ||
1646 | mipspmu.cache_event_map = &xlp_cache_map; | ||
1647 | mipspmu.map_raw_event = xlp_pmu_map_raw_event; | ||
1648 | break; | ||
1525 | default: | 1649 | default: |
1526 | pr_cont("Either hardware does not support performance " | 1650 | pr_cont("Either hardware does not support performance " |
1527 | "counters, or not yet implemented.\n"); | 1651 | "counters, or not yet implemented.\n"); |