aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2014-07-04 06:08:57 -0400
committerRalf Baechle <ralf@linux-mips.org>2014-08-01 18:06:38 -0400
commit560b461be17039046ae241426f4adf9bd997abb4 (patch)
treed9de030d525e33a34d85ae3ab70e5a45a683b89f
parent67dca667516529b24f98dd9d1d4e832ff705054b (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.c21
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;