diff options
Diffstat (limited to 'arch/mips/kernel/perf_event_mipsxx.c')
-rw-r--r-- | arch/mips/kernel/perf_event_mipsxx.c | 80 |
1 files changed, 72 insertions, 8 deletions
diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index 24cdf64789c3..4f2d9dece7ab 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c | |||
@@ -805,7 +805,7 @@ static void reset_counters(void *arg) | |||
805 | } | 805 | } |
806 | } | 806 | } |
807 | 807 | ||
808 | /* 24K/34K/1004K cores can share the same event map. */ | 808 | /* 24K/34K/1004K/interAptiv/loongson1 cores share the same event map. */ |
809 | static const struct mips_perf_event mipsxxcore_event_map | 809 | static const struct mips_perf_event mipsxxcore_event_map |
810 | [PERF_COUNT_HW_MAX] = { | 810 | [PERF_COUNT_HW_MAX] = { |
811 | [PERF_COUNT_HW_CPU_CYCLES] = { 0x00, CNTR_EVEN | CNTR_ODD, P }, | 811 | [PERF_COUNT_HW_CPU_CYCLES] = { 0x00, CNTR_EVEN | CNTR_ODD, P }, |
@@ -814,8 +814,8 @@ static const struct mips_perf_event mipsxxcore_event_map | |||
814 | [PERF_COUNT_HW_BRANCH_MISSES] = { 0x02, CNTR_ODD, T }, | 814 | [PERF_COUNT_HW_BRANCH_MISSES] = { 0x02, CNTR_ODD, T }, |
815 | }; | 815 | }; |
816 | 816 | ||
817 | /* 74K core has different branch event code. */ | 817 | /* 74K/proAptiv core has different branch event code. */ |
818 | static const struct mips_perf_event mipsxx74Kcore_event_map | 818 | static const struct mips_perf_event mipsxxcore_event_map2 |
819 | [PERF_COUNT_HW_MAX] = { | 819 | [PERF_COUNT_HW_MAX] = { |
820 | [PERF_COUNT_HW_CPU_CYCLES] = { 0x00, CNTR_EVEN | CNTR_ODD, P }, | 820 | [PERF_COUNT_HW_CPU_CYCLES] = { 0x00, CNTR_EVEN | CNTR_ODD, P }, |
821 | [PERF_COUNT_HW_INSTRUCTIONS] = { 0x01, CNTR_EVEN | CNTR_ODD, T }, | 821 | [PERF_COUNT_HW_INSTRUCTIONS] = { 0x01, CNTR_EVEN | CNTR_ODD, T }, |
@@ -849,7 +849,7 @@ static const struct mips_perf_event xlp_event_map[PERF_COUNT_HW_MAX] = { | |||
849 | [PERF_COUNT_HW_BRANCH_MISSES] = { 0x1c, CNTR_ALL }, /* PAPI_BR_MSP */ | 849 | [PERF_COUNT_HW_BRANCH_MISSES] = { 0x1c, CNTR_ALL }, /* PAPI_BR_MSP */ |
850 | }; | 850 | }; |
851 | 851 | ||
852 | /* 24K/34K/1004K cores can share the same cache event map. */ | 852 | /* 24K/34K/1004K/interAptiv/loongson1 cores share the same cache event map. */ |
853 | static const struct mips_perf_event mipsxxcore_cache_map | 853 | static const struct mips_perf_event mipsxxcore_cache_map |
854 | [PERF_COUNT_HW_CACHE_MAX] | 854 | [PERF_COUNT_HW_CACHE_MAX] |
855 | [PERF_COUNT_HW_CACHE_OP_MAX] | 855 | [PERF_COUNT_HW_CACHE_OP_MAX] |
@@ -930,8 +930,8 @@ static const struct mips_perf_event mipsxxcore_cache_map | |||
930 | }, | 930 | }, |
931 | }; | 931 | }; |
932 | 932 | ||
933 | /* 74K core has completely different cache event map. */ | 933 | /* 74K/proAptiv core has completely different cache event map. */ |
934 | static const struct mips_perf_event mipsxx74Kcore_cache_map | 934 | static const struct mips_perf_event mipsxxcore_cache_map2 |
935 | [PERF_COUNT_HW_CACHE_MAX] | 935 | [PERF_COUNT_HW_CACHE_MAX] |
936 | [PERF_COUNT_HW_CACHE_OP_MAX] | 936 | [PERF_COUNT_HW_CACHE_OP_MAX] |
937 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | 937 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { |
@@ -978,6 +978,11 @@ static const struct mips_perf_event mipsxx74Kcore_cache_map | |||
978 | [C(RESULT_MISS)] = { 0x1d, CNTR_EVEN, P }, | 978 | [C(RESULT_MISS)] = { 0x1d, CNTR_EVEN, P }, |
979 | }, | 979 | }, |
980 | }, | 980 | }, |
981 | /* | ||
982 | * 74K core does not have specific DTLB events. proAptiv core has | ||
983 | * "speculative" DTLB events which are numbered 0x63 (even/odd) and | ||
984 | * not included here. One can use raw events if really needed. | ||
985 | */ | ||
981 | [C(ITLB)] = { | 986 | [C(ITLB)] = { |
982 | [C(OP_READ)] = { | 987 | [C(OP_READ)] = { |
983 | [C(RESULT_ACCESS)] = { 0x04, CNTR_EVEN, T }, | 988 | [C(RESULT_ACCESS)] = { 0x04, CNTR_EVEN, T }, |
@@ -1378,6 +1383,10 @@ static irqreturn_t mipsxx_pmu_handle_irq(int irq, void *dev) | |||
1378 | #define IS_BOTH_COUNTERS_74K_EVENT(b) \ | 1383 | #define IS_BOTH_COUNTERS_74K_EVENT(b) \ |
1379 | ((b) == 0 || (b) == 1) | 1384 | ((b) == 0 || (b) == 1) |
1380 | 1385 | ||
1386 | /* proAptiv */ | ||
1387 | #define IS_BOTH_COUNTERS_PROAPTIV_EVENT(b) \ | ||
1388 | ((b) == 0 || (b) == 1) | ||
1389 | |||
1381 | /* 1004K */ | 1390 | /* 1004K */ |
1382 | #define IS_BOTH_COUNTERS_1004K_EVENT(b) \ | 1391 | #define IS_BOTH_COUNTERS_1004K_EVENT(b) \ |
1383 | ((b) == 0 || (b) == 1 || (b) == 11) | 1392 | ((b) == 0 || (b) == 1 || (b) == 11) |
@@ -1391,6 +1400,20 @@ static irqreturn_t mipsxx_pmu_handle_irq(int irq, void *dev) | |||
1391 | #define IS_RANGE_V_1004K_EVENT(r) ((r) == 47) | 1400 | #define IS_RANGE_V_1004K_EVENT(r) ((r) == 47) |
1392 | #endif | 1401 | #endif |
1393 | 1402 | ||
1403 | /* interAptiv */ | ||
1404 | #define IS_BOTH_COUNTERS_INTERAPTIV_EVENT(b) \ | ||
1405 | ((b) == 0 || (b) == 1 || (b) == 11) | ||
1406 | #ifdef CONFIG_MIPS_MT_SMP | ||
1407 | /* The P/V/T info is not provided for "(b) == 38" in SUM, assume P. */ | ||
1408 | #define IS_RANGE_P_INTERAPTIV_EVENT(r, b) \ | ||
1409 | ((b) == 0 || (r) == 18 || (b) == 21 || (b) == 22 || \ | ||
1410 | (b) == 25 || (b) == 36 || (b) == 38 || (b) == 39 || \ | ||
1411 | (r) == 44 || (r) == 174 || (r) == 176 || ((b) >= 50 && \ | ||
1412 | (b) <= 59) || (r) == 188 || (b) == 61 || (b) == 62 || \ | ||
1413 | ((b) >= 64 && (b) <= 67)) | ||
1414 | #define IS_RANGE_V_INTERAPTIV_EVENT(r) ((r) == 47 || (r) == 175) | ||
1415 | #endif | ||
1416 | |||
1394 | /* BMIPS5000 */ | 1417 | /* BMIPS5000 */ |
1395 | #define IS_BOTH_COUNTERS_BMIPS5000_EVENT(b) \ | 1418 | #define IS_BOTH_COUNTERS_BMIPS5000_EVENT(b) \ |
1396 | ((b) == 0 || (b) == 1) | 1419 | ((b) == 0 || (b) == 1) |
@@ -1442,6 +1465,7 @@ static const struct mips_perf_event *mipsxx_pmu_map_raw_event(u64 config) | |||
1442 | #endif | 1465 | #endif |
1443 | break; | 1466 | break; |
1444 | case CPU_74K: | 1467 | case CPU_74K: |
1468 | case CPU_1074K: | ||
1445 | if (IS_BOTH_COUNTERS_74K_EVENT(base_id)) | 1469 | if (IS_BOTH_COUNTERS_74K_EVENT(base_id)) |
1446 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; | 1470 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; |
1447 | else | 1471 | else |
@@ -1451,6 +1475,16 @@ static const struct mips_perf_event *mipsxx_pmu_map_raw_event(u64 config) | |||
1451 | raw_event.range = P; | 1475 | raw_event.range = P; |
1452 | #endif | 1476 | #endif |
1453 | break; | 1477 | break; |
1478 | case CPU_PROAPTIV: | ||
1479 | if (IS_BOTH_COUNTERS_PROAPTIV_EVENT(base_id)) | ||
1480 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; | ||
1481 | else | ||
1482 | raw_event.cntr_mask = | ||
1483 | raw_id > 127 ? CNTR_ODD : CNTR_EVEN; | ||
1484 | #ifdef CONFIG_MIPS_MT_SMP | ||
1485 | raw_event.range = P; | ||
1486 | #endif | ||
1487 | break; | ||
1454 | case CPU_1004K: | 1488 | case CPU_1004K: |
1455 | if (IS_BOTH_COUNTERS_1004K_EVENT(base_id)) | 1489 | if (IS_BOTH_COUNTERS_1004K_EVENT(base_id)) |
1456 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; | 1490 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; |
@@ -1466,6 +1500,21 @@ static const struct mips_perf_event *mipsxx_pmu_map_raw_event(u64 config) | |||
1466 | raw_event.range = T; | 1500 | raw_event.range = T; |
1467 | #endif | 1501 | #endif |
1468 | break; | 1502 | break; |
1503 | case CPU_INTERAPTIV: | ||
1504 | if (IS_BOTH_COUNTERS_INTERAPTIV_EVENT(base_id)) | ||
1505 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; | ||
1506 | else | ||
1507 | raw_event.cntr_mask = | ||
1508 | raw_id > 127 ? CNTR_ODD : CNTR_EVEN; | ||
1509 | #ifdef CONFIG_MIPS_MT_SMP | ||
1510 | if (IS_RANGE_P_INTERAPTIV_EVENT(raw_id, base_id)) | ||
1511 | raw_event.range = P; | ||
1512 | else if (unlikely(IS_RANGE_V_INTERAPTIV_EVENT(raw_id))) | ||
1513 | raw_event.range = V; | ||
1514 | else | ||
1515 | raw_event.range = T; | ||
1516 | #endif | ||
1517 | break; | ||
1469 | case CPU_BMIPS5000: | 1518 | case CPU_BMIPS5000: |
1470 | if (IS_BOTH_COUNTERS_BMIPS5000_EVENT(base_id)) | 1519 | if (IS_BOTH_COUNTERS_BMIPS5000_EVENT(base_id)) |
1471 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; | 1520 | raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD; |
@@ -1576,14 +1625,29 @@ init_hw_perf_events(void) | |||
1576 | break; | 1625 | break; |
1577 | case CPU_74K: | 1626 | case CPU_74K: |
1578 | mipspmu.name = "mips/74K"; | 1627 | mipspmu.name = "mips/74K"; |
1579 | mipspmu.general_event_map = &mipsxx74Kcore_event_map; | 1628 | mipspmu.general_event_map = &mipsxxcore_event_map2; |
1580 | mipspmu.cache_event_map = &mipsxx74Kcore_cache_map; | 1629 | mipspmu.cache_event_map = &mipsxxcore_cache_map2; |
1630 | break; | ||
1631 | case CPU_PROAPTIV: | ||
1632 | mipspmu.name = "mips/proAptiv"; | ||
1633 | mipspmu.general_event_map = &mipsxxcore_event_map2; | ||
1634 | mipspmu.cache_event_map = &mipsxxcore_cache_map2; | ||
1581 | break; | 1635 | break; |
1582 | case CPU_1004K: | 1636 | case CPU_1004K: |
1583 | mipspmu.name = "mips/1004K"; | 1637 | mipspmu.name = "mips/1004K"; |
1584 | mipspmu.general_event_map = &mipsxxcore_event_map; | 1638 | mipspmu.general_event_map = &mipsxxcore_event_map; |
1585 | mipspmu.cache_event_map = &mipsxxcore_cache_map; | 1639 | mipspmu.cache_event_map = &mipsxxcore_cache_map; |
1586 | break; | 1640 | break; |
1641 | case CPU_1074K: | ||
1642 | mipspmu.name = "mips/1074K"; | ||
1643 | mipspmu.general_event_map = &mipsxxcore_event_map; | ||
1644 | mipspmu.cache_event_map = &mipsxxcore_cache_map; | ||
1645 | break; | ||
1646 | case CPU_INTERAPTIV: | ||
1647 | mipspmu.name = "mips/interAptiv"; | ||
1648 | mipspmu.general_event_map = &mipsxxcore_event_map; | ||
1649 | mipspmu.cache_event_map = &mipsxxcore_cache_map; | ||
1650 | break; | ||
1587 | case CPU_LOONGSON1: | 1651 | case CPU_LOONGSON1: |
1588 | mipspmu.name = "mips/loongson1"; | 1652 | mipspmu.name = "mips/loongson1"; |
1589 | mipspmu.general_event_map = &mipsxxcore_event_map; | 1653 | mipspmu.general_event_map = &mipsxxcore_event_map; |