Brad Bishop | bec4ebc | 2022-08-03 09:55:16 -0400 | [diff] [blame] | 1 | From f5d0979c2385c3ef43d6f2af07c14ee897835e2c Mon Sep 17 00:00:00 2001 |
| 2 | From: Robin Murphy <robin.murphy@arm.com> |
| 3 | Date: Fri, 3 Dec 2021 11:45:02 +0000 |
| 4 | Subject: [PATCH 14/14] perf/arm-cmn: Add CI-700 Support |
| 5 | |
| 6 | Add the identifiers and events for the CI-700 coherent interconnect. |
| 7 | |
| 8 | Signed-off-by: Robin Murphy <robin.murphy@arm.com> |
| 9 | Link: https://lore.kernel.org/r/28f566ab23a83733c6c9ef9414c010b760b4549c.1638530442.git.robin.murphy@arm.com |
| 10 | Signed-off-by: Will Deacon <will@kernel.org> |
| 11 | |
| 12 | Upstream-Status: Backport [https://lore.kernel.org/r/28f566ab23a83733c6c9ef9414c010b760b4549c.1638530442.git.robin.murphy@arm.com] |
| 13 | Signed-off-by: Rupinderjit Singh <rupinderjit.singh@arm.com> |
| 14 | --- |
| 15 | drivers/perf/arm-cmn.c | 57 +++++++++++++++++++++++++++++++++++++++--- |
| 16 | 1 file changed, 53 insertions(+), 4 deletions(-) |
| 17 | |
| 18 | diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c |
| 19 | index 871c86687379..e0f78b6c643c 100644 |
| 20 | --- a/drivers/perf/arm-cmn.c |
| 21 | +++ b/drivers/perf/arm-cmn.c |
| 22 | @@ -175,6 +175,7 @@ |
| 23 | enum cmn_model { |
| 24 | CMN_ANY = -1, |
| 25 | CMN600 = 1, |
| 26 | + CI700 = 2, |
| 27 | }; |
| 28 | |
| 29 | /* CMN-600 r0px shouldn't exist in silicon, thankfully */ |
| 30 | @@ -186,6 +187,9 @@ enum cmn_revision { |
| 31 | CMN600_R2P0, |
| 32 | CMN600_R3P0, |
| 33 | CMN600_R3P1, |
| 34 | + CI700_R0P0 = 0, |
| 35 | + CI700_R1P0, |
| 36 | + CI700_R2P0, |
| 37 | }; |
| 38 | |
| 39 | enum cmn_node_type { |
| 40 | @@ -401,8 +405,10 @@ struct arm_cmn_format_attr { |
| 41 | static bool arm_cmn_is_occup_event(enum cmn_model model, |
| 42 | enum cmn_node_type type, unsigned int id) |
| 43 | { |
| 44 | - return (type == CMN_TYPE_DVM && id == 0x05) || |
| 45 | - (type == CMN_TYPE_HNF && id == 0x0f); |
| 46 | + if (type == CMN_TYPE_DVM) |
| 47 | + return (model == CMN600 && id == 0x05) || |
| 48 | + (model == CI700 && id == 0x0c); |
| 49 | + return type == CMN_TYPE_HNF && id == 0x0f; |
| 50 | } |
| 51 | |
| 52 | static ssize_t arm_cmn_event_show(struct device *dev, |
| 53 | @@ -497,14 +503,19 @@ static umode_t arm_cmn_event_attr_is_visible(struct kobject *kobj, |
| 54 | __CMN_EVENT_XP(n_##_name, (_event) | (2 << 2)), \ |
| 55 | __CMN_EVENT_XP(s_##_name, (_event) | (3 << 2)), \ |
| 56 | __CMN_EVENT_XP(p0_##_name, (_event) | (4 << 2)), \ |
| 57 | - __CMN_EVENT_XP(p1_##_name, (_event) | (5 << 2)) |
| 58 | + __CMN_EVENT_XP(p1_##_name, (_event) | (5 << 2)), \ |
| 59 | + __CMN_EVENT_XP(p2_##_name, (_event) | (6 << 2)), \ |
| 60 | + __CMN_EVENT_XP(p3_##_name, (_event) | (7 << 2)) |
| 61 | |
| 62 | /* Good thing there are only 3 fundamental XP events... */ |
| 63 | #define CMN_EVENT_XP(_name, _event) \ |
| 64 | _CMN_EVENT_XP(req_##_name, (_event) | (0 << 5)), \ |
| 65 | _CMN_EVENT_XP(rsp_##_name, (_event) | (1 << 5)), \ |
| 66 | _CMN_EVENT_XP(snp_##_name, (_event) | (2 << 5)), \ |
| 67 | - _CMN_EVENT_XP(dat_##_name, (_event) | (3 << 5)) |
| 68 | + _CMN_EVENT_XP(dat_##_name, (_event) | (3 << 5)), \ |
| 69 | + _CMN_EVENT_XP(pub_##_name, (_event) | (4 << 5)), \ |
| 70 | + _CMN_EVENT_XP(rsp2_##_name, (_event) | (5 << 5)), \ |
| 71 | + _CMN_EVENT_XP(dat2_##_name, (_event) | (6 << 5)) |
| 72 | |
| 73 | |
| 74 | static struct attribute *arm_cmn_event_attrs[] = { |
| 75 | @@ -522,6 +533,20 @@ static struct attribute *arm_cmn_event_attrs[] = { |
| 76 | _CMN_EVENT_DVM(CMN600, rxreq_trk_occupancy_all, 0x05, 0), |
| 77 | _CMN_EVENT_DVM(CMN600, rxreq_trk_occupancy_dvmop, 0x05, 1), |
| 78 | _CMN_EVENT_DVM(CMN600, rxreq_trk_occupancy_dvmsync, 0x05, 2), |
| 79 | + CMN_EVENT_DVM(CI700, dvmop_tlbi, 0x01), |
| 80 | + CMN_EVENT_DVM(CI700, dvmop_bpi, 0x02), |
| 81 | + CMN_EVENT_DVM(CI700, dvmop_pici, 0x03), |
| 82 | + CMN_EVENT_DVM(CI700, dvmop_vici, 0x04), |
| 83 | + CMN_EVENT_DVM(CI700, dvmsync, 0x05), |
| 84 | + CMN_EVENT_DVM(CI700, vmid_filtered, 0x06), |
| 85 | + CMN_EVENT_DVM(CI700, rndop_filtered, 0x07), |
| 86 | + CMN_EVENT_DVM(CI700, retry, 0x08), |
| 87 | + CMN_EVENT_DVM(CI700, txsnp_flitv, 0x09), |
| 88 | + CMN_EVENT_DVM(CI700, txsnp_stall, 0x0a), |
| 89 | + CMN_EVENT_DVM(CI700, trkfull, 0x0b), |
| 90 | + _CMN_EVENT_DVM(CI700, trk_occupancy_all, 0x0c, 0), |
| 91 | + _CMN_EVENT_DVM(CI700, trk_occupancy_dvmop, 0x0c, 1), |
| 92 | + _CMN_EVENT_DVM(CI700, trk_occupancy_dvmsync, 0x0c, 2), |
| 93 | |
| 94 | CMN_EVENT_HNF(CMN_ANY, cache_miss, 0x01), |
| 95 | CMN_EVENT_HNF(CMN_ANY, slc_sf_cache_access, 0x02), |
| 96 | @@ -558,6 +583,9 @@ static struct attribute *arm_cmn_event_attrs[] = { |
| 97 | CMN_EVENT_HNF(CMN_ANY, stash_snp_sent, 0x1d), |
| 98 | CMN_EVENT_HNF(CMN_ANY, stash_data_pull, 0x1e), |
| 99 | CMN_EVENT_HNF(CMN_ANY, snp_fwded, 0x1f), |
| 100 | + CMN_EVENT_HNF(CI700, atomic_fwd, 0x20), |
| 101 | + CMN_EVENT_HNF(CI700, mpam_hardlim, 0x21), |
| 102 | + CMN_EVENT_HNF(CI700, mpam_softlim, 0x22), |
| 103 | |
| 104 | CMN_EVENT_HNI(rrt_rd_occ_cnt_ovfl, 0x20), |
| 105 | CMN_EVENT_HNI(rrt_wr_occ_cnt_ovfl, 0x21), |
| 106 | @@ -598,6 +626,7 @@ static struct attribute *arm_cmn_event_attrs[] = { |
| 107 | CMN_EVENT_SBSX(CMN_ANY, wdb_occ_cnt_ovfl, 0x14), |
| 108 | CMN_EVENT_SBSX(CMN_ANY, rd_axi_trkr_occ_cnt_ovfl, 0x15), |
| 109 | CMN_EVENT_SBSX(CMN_ANY, cmo_axi_trkr_occ_cnt_ovfl, 0x16), |
| 110 | + CMN_EVENT_SBSX(CI700, rdb_occ_cnt_ovfl, 0x17), |
| 111 | CMN_EVENT_SBSX(CMN_ANY, arvalid_no_arready, 0x21), |
| 112 | CMN_EVENT_SBSX(CMN_ANY, awvalid_no_awready, 0x22), |
| 113 | CMN_EVENT_SBSX(CMN_ANY, wvalid_no_wready, 0x23), |
| 114 | @@ -624,6 +653,25 @@ static struct attribute *arm_cmn_event_attrs[] = { |
| 115 | CMN_EVENT_RNID(CMN600, rdb_replay, 0x12), |
| 116 | CMN_EVENT_RNID(CMN600, rdb_hybrid, 0x13), |
| 117 | CMN_EVENT_RNID(CMN600, rdb_ord, 0x14), |
| 118 | + CMN_EVENT_RNID(CI700, padb_occ_ovfl, 0x11), |
| 119 | + CMN_EVENT_RNID(CI700, rpdb_occ_ovfl, 0x12), |
| 120 | + CMN_EVENT_RNID(CI700, rrt_occup_ovfl_slice1, 0x13), |
| 121 | + CMN_EVENT_RNID(CI700, rrt_occup_ovfl_slice2, 0x14), |
| 122 | + CMN_EVENT_RNID(CI700, rrt_occup_ovfl_slice3, 0x15), |
| 123 | + CMN_EVENT_RNID(CI700, wrt_throttled, 0x16), |
| 124 | + |
| 125 | + CMN_EVENT_MTSX(tc_lookup, 0x01), |
| 126 | + CMN_EVENT_MTSX(tc_fill, 0x02), |
| 127 | + CMN_EVENT_MTSX(tc_miss, 0x03), |
| 128 | + CMN_EVENT_MTSX(tdb_forward, 0x04), |
| 129 | + CMN_EVENT_MTSX(tcq_hazard, 0x05), |
| 130 | + CMN_EVENT_MTSX(tcq_rd_alloc, 0x06), |
| 131 | + CMN_EVENT_MTSX(tcq_wr_alloc, 0x07), |
| 132 | + CMN_EVENT_MTSX(tcq_cmo_alloc, 0x08), |
| 133 | + CMN_EVENT_MTSX(axi_rd_req, 0x09), |
| 134 | + CMN_EVENT_MTSX(axi_wr_req, 0x0a), |
| 135 | + CMN_EVENT_MTSX(tcq_occ_cnt_ovfl, 0x0b), |
| 136 | + CMN_EVENT_MTSX(tdb_occ_cnt_ovfl, 0x0c), |
| 137 | |
| 138 | NULL |
| 139 | }; |
| 140 | @@ -1773,6 +1821,7 @@ static int arm_cmn_remove(struct platform_device *pdev) |
| 141 | #ifdef CONFIG_OF |
| 142 | static const struct of_device_id arm_cmn_of_match[] = { |
| 143 | { .compatible = "arm,cmn-600", .data = (void *)CMN600 }, |
| 144 | + { .compatible = "arm,ci-700", .data = (void *)CI700 }, |
| 145 | {} |
| 146 | }; |
| 147 | MODULE_DEVICE_TABLE(of, arm_cmn_of_match); |
| 148 | -- |
| 149 | 2.25.1 |
| 150 | |