diff options
author | James Hogan <james.hogan@imgtec.com> | 2014-07-04 06:08:57 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2014-08-01 18:06:38 -0400 |
commit | 560b461be17039046ae241426f4adf9bd997abb4 (patch) | |
tree | d9de030d525e33a34d85ae3ab70e5a45a683b89f | |
parent | 67dca667516529b24f98dd9d1d4e832ff705054b (diff) |
MIPS: perf: Add hardware events for P5600
Add cases in perf_event_mipsxx.c for CPU_P5600. All the event numbers
listed for proAptiv also apply to P5600, so we use mipsxxcore_event_map2
and mipsxxcore_cache_map2 too, but the P5600 has 8-bit event numbers so
bit 8 (256) of the user ABI config is used for the parity bit (to
specify odd/even counter events).
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7242/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r-- | arch/mips/kernel/perf_event_mipsxx.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index ef8b3d994c5a..14bf74b0f51c 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c | |||
@@ -1386,6 +1386,9 @@ static irqreturn_t mipsxx_pmu_handle_irq(int irq, void *dev) | |||
1386 | /* proAptiv */ | 1386 | /* proAptiv */ |
1387 | #define IS_BOTH_COUNTERS_PROAPTIV_EVENT(b) \ | 1387 | #define IS_BOTH_COUNTERS_PROAPTIV_EVENT(b) \ |
1388 | ((b) == 0 || (b) == 1) | 1388 | ((b) == 0 || (b) == 1) |
1389 | /* P5600 */ | ||
1390 | #define IS_BOTH_COUNTERS_P5600_EVENT(b) \ | ||
1391 | ((b) == 0 || (b) == 1) | ||
1389 | 1392 | ||
1390 | /* 1004K */ | 1393 | /* 1004K */ |
1391 | #define IS_BOTH_COUNTERS_1004K_EVENT(b) \ | 1394 | #define IS_BOTH_COUNTERS_1004K_EVENT(b) \ |
@@ -1488,6 +1491,19 @@ static const struct mips_perf_event *mipsxx_pmu_map_raw_event(u64 config) | |||
1488 | raw_event.range = P; | 1491 | raw_event.range = P; |
1489 | #endif | 1492 | #endif |
1490 | break; | 1493 | break; |
1494 | case CPU_P5600: | ||
1495 | /* 8-bit event numbers */ | ||
1496 | raw_id = config & 0x1ff; | ||
1497 | base_id = raw_id & 0xff; | ||
1498 | if (IS_BOTH_COUNTERS_P5600_EVENT(base_id)) | ||
1499 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; | ||
1500 | else | ||
1501 | raw_event.cntr_mask = | ||
1502 | raw_id > 255 ? CNTR_ODD : CNTR_EVEN; | ||
1503 | #ifdef CONFIG_MIPS_MT_SMP | ||
1504 | raw_event.range = P; | ||
1505 | #endif | ||
1506 | break; | ||
1491 | case CPU_1004K: | 1507 | case CPU_1004K: |
1492 | if (IS_BOTH_COUNTERS_1004K_EVENT(base_id)) | 1508 | if (IS_BOTH_COUNTERS_1004K_EVENT(base_id)) |
1493 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; | 1509 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; |
@@ -1638,6 +1654,11 @@ init_hw_perf_events(void) | |||
1638 | mipspmu.general_event_map = &mipsxxcore_event_map2; | 1654 | mipspmu.general_event_map = &mipsxxcore_event_map2; |
1639 | mipspmu.cache_event_map = &mipsxxcore_cache_map2; | 1655 | mipspmu.cache_event_map = &mipsxxcore_cache_map2; |
1640 | break; | 1656 | break; |
1657 | case CPU_P5600: | ||
1658 | mipspmu.name = "mips/P5600"; | ||
1659 | mipspmu.general_event_map = &mipsxxcore_event_map2; | ||
1660 | mipspmu.cache_event_map = &mipsxxcore_cache_map2; | ||
1661 | break; | ||
1641 | case CPU_1004K: | 1662 | case CPU_1004K: |
1642 | mipspmu.name = "mips/1004K"; | 1663 | mipspmu.name = "mips/1004K"; |
1643 | mipspmu.general_event_map = &mipsxxcore_event_map; | 1664 | mipspmu.general_event_map = &mipsxxcore_event_map; |