Lines Matching refs:cmn

350 static int arm_cmn_xyidbits(const struct arm_cmn *cmn)  in arm_cmn_xyidbits()  argument
352 return fls((cmn->mesh_x - 1) | (cmn->mesh_y - 1) | 2); in arm_cmn_xyidbits()
355 static struct arm_cmn_nodeid arm_cmn_nid(const struct arm_cmn *cmn, u16 id) in arm_cmn_nid() argument
359 if (cmn->num_xps == 1) { in arm_cmn_nid()
365 int bits = arm_cmn_xyidbits(cmn); in arm_cmn_nid()
369 if (cmn->ports_used & 0xc) { in arm_cmn_nid()
380 static struct arm_cmn_node *arm_cmn_node_to_xp(const struct arm_cmn *cmn, in arm_cmn_node_to_xp() argument
383 struct arm_cmn_nodeid nid = arm_cmn_nid(cmn, dn->id); in arm_cmn_node_to_xp()
384 int xp_idx = cmn->mesh_x * nid.y + nid.x; in arm_cmn_node_to_xp()
386 return cmn->xps + xp_idx; in arm_cmn_node_to_xp()
388 static struct arm_cmn_node *arm_cmn_node(const struct arm_cmn *cmn, in arm_cmn_node() argument
393 for (dn = cmn->dns; dn->type; dn++) in arm_cmn_node()
439 struct arm_cmn *cmn = s->private; in arm_cmn_show_logid() local
442 for (dn = cmn->dns; dn->type; dn++) { in arm_cmn_show_logid()
443 struct arm_cmn_nodeid nid = arm_cmn_nid(cmn, dn->id); in arm_cmn_show_logid()
462 struct arm_cmn *cmn = s->private; in arm_cmn_map_show() local
463 int x, y, p, pmax = fls(cmn->ports_used); in arm_cmn_map_show()
466 for (x = 0; x < cmn->mesh_x; x++) in arm_cmn_map_show()
469 y = cmn->mesh_y; in arm_cmn_map_show()
471 int xp_base = cmn->mesh_x * y; in arm_cmn_map_show()
474 for (x = 0; x < cmn->mesh_x; x++) in arm_cmn_map_show()
478 for (x = 0; x < cmn->mesh_x; x++) { in arm_cmn_map_show()
479 struct arm_cmn_node *xp = cmn->xps + xp_base + x; in arm_cmn_map_show()
492 for (x = 0; x < cmn->mesh_x; x++) { in arm_cmn_map_show()
493 u8 dtc = cmn->xps[xp_base + x].dtc; in arm_cmn_map_show()
501 for (x = 0; x < cmn->mesh_x; x++) in arm_cmn_map_show()
506 for (x = 0; x < cmn->mesh_x; x++) in arm_cmn_map_show()
509 for (x = 0; x < cmn->mesh_x; x++) in arm_cmn_map_show()
512 for (x = 0; x < cmn->mesh_x; x++) in arm_cmn_map_show()
517 for (x = 0; x < cmn->mesh_x; x++) in arm_cmn_map_show()
524 static void arm_cmn_debugfs_init(struct arm_cmn *cmn, int id) in arm_cmn_debugfs_init() argument
529 name = devm_kasprintf(cmn->dev, GFP_KERNEL, "map_%d", id); in arm_cmn_debugfs_init()
533 cmn->debug = debugfs_create_file(name, 0444, arm_cmn_debugfs, cmn, &arm_cmn_map_fops); in arm_cmn_debugfs_init()
536 static void arm_cmn_debugfs_init(struct arm_cmn *cmn, int id) {} in arm_cmn_debugfs_init() argument
624 struct arm_cmn *cmn = to_cmn(dev_get_drvdata(dev)); in arm_cmn_event_attr_is_visible() local
631 if (!(eattr->model & cmn->model)) in arm_cmn_event_attr_is_visible()
646 if ((intf & 4) && !(cmn->ports_used & BIT(intf & 3))) in arm_cmn_event_attr_is_visible()
649 if (chan == 4 && cmn->model == CMN600) in arm_cmn_event_attr_is_visible()
652 if ((chan == 5 && cmn->rsp_vc_num < 2) || in arm_cmn_event_attr_is_visible()
653 (chan == 6 && cmn->dat_vc_num < 2) || in arm_cmn_event_attr_is_visible()
654 (chan == 7 && cmn->snp_vc_num < 2) || in arm_cmn_event_attr_is_visible()
655 (chan == 8 && cmn->req_vc_num < 2)) in arm_cmn_event_attr_is_visible()
660 if (cmn->model == CMN600) { in arm_cmn_event_attr_is_visible()
661 if (cmn->rev < CMN600_R1P3) { in arm_cmn_event_attr_is_visible()
665 if (cmn->rev < CMN600_R1P2) { in arm_cmn_event_attr_is_visible()
671 } else if (cmn->model == CMN650) { in arm_cmn_event_attr_is_visible()
672 if (cmn->rev < CMN650_R2P0 || cmn->rev == CMN650_R1P2) { in arm_cmn_event_attr_is_visible()
680 } else if (cmn->model == CMN700) { in arm_cmn_event_attr_is_visible()
681 if (cmn->rev < CMN700_R2P0) { in arm_cmn_event_attr_is_visible()
689 if (cmn->rev < CMN700_R1P0) { in arm_cmn_event_attr_is_visible()
695 if (!arm_cmn_node(cmn, type)) in arm_cmn_event_attr_is_visible()
1154 struct arm_cmn *cmn = to_cmn(dev_get_drvdata(dev)); in arm_cmn_cpumask_show() local
1156 return cpumap_print_to_pagebuf(true, buf, cpumask_of(cmn->cpu)); in arm_cmn_cpumask_show()
1206 static void arm_cmn_set_state(struct arm_cmn *cmn, u32 state) in arm_cmn_set_state() argument
1208 if (!cmn->state) in arm_cmn_set_state()
1209 writel_relaxed(0, cmn->dtc[0].base + CMN_DT_PMCR); in arm_cmn_set_state()
1210 cmn->state |= state; in arm_cmn_set_state()
1213 static void arm_cmn_clear_state(struct arm_cmn *cmn, u32 state) in arm_cmn_clear_state() argument
1215 cmn->state &= ~state; in arm_cmn_clear_state()
1216 if (!cmn->state) in arm_cmn_clear_state()
1218 cmn->dtc[0].base + CMN_DT_PMCR); in arm_cmn_clear_state()
1231 static u64 arm_cmn_read_dtm(struct arm_cmn *cmn, struct arm_cmn_hw_event *hw, in arm_cmn_read_dtm() argument
1241 if (dtm != &cmn->dtms[dn->dtm]) { in arm_cmn_read_dtm()
1242 dtm = &cmn->dtms[dn->dtm] + hw->dtm_offset; in arm_cmn_read_dtm()
1270 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_init_counter() local
1276 writel_relaxed(CMN_COUNTER_INIT, cmn->dtc[i].base + pmevcnt); in arm_cmn_init_counter()
1277 cmn->dtc[i].counters[hw->dtc_idx] = event; in arm_cmn_init_counter()
1280 count = arm_cmn_read_dtm(cmn, hw, false); in arm_cmn_init_counter()
1286 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_read() local
1294 delta = arm_cmn_read_cc(cmn->dtc + i); in arm_cmn_event_read()
1298 new = arm_cmn_read_dtm(cmn, hw, false); in arm_cmn_event_read()
1305 new = arm_cmn_read_counter(cmn->dtc + i, hw->dtc_idx); in arm_cmn_event_read()
1350 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_start() local
1358 writeq_relaxed(CMN_CC_INIT, cmn->dtc[i].base + CMN_DT_PMCCNTR); in arm_cmn_event_start()
1359 cmn->dtc[i].cc_active = true; in arm_cmn_event_start()
1381 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_stop() local
1389 cmn->dtc[i].cc_active = false; in arm_cmn_event_stop()
1416 static void arm_cmn_val_add_event(struct arm_cmn *cmn, struct arm_cmn_val *val, in arm_cmn_val_add_event() argument
1451 static int arm_cmn_validate_group(struct arm_cmn *cmn, struct perf_event *event) in arm_cmn_validate_group() argument
1470 arm_cmn_val_add_event(cmn, val, leader); in arm_cmn_validate_group()
1472 arm_cmn_val_add_event(cmn, val, sibling); in arm_cmn_validate_group()
1529 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_init() local
1542 event->cpu = cmn->cpu; in arm_cmn_event_init()
1559 if (cmn->multi_dtm) in arm_cmn_event_init()
1561 } else if (type == CMN_TYPE_XP && cmn->model == CMN700) { in arm_cmn_event_init()
1566 hw->filter_sel = arm_cmn_filter_sel(cmn->model, type, eventid); in arm_cmn_event_init()
1571 hw->dn = arm_cmn_node(cmn, type); in arm_cmn_event_init()
1579 hw->dtcs_used |= arm_cmn_node_to_xp(cmn, dn)->dtc; in arm_cmn_event_init()
1586 struct arm_cmn_nodeid nid = arm_cmn_nid(cmn, nodeid); in arm_cmn_event_init()
1588 dev_dbg(cmn->dev, "invalid node 0x%x (%d,%d,%d,%d) type 0x%x\n", in arm_cmn_event_init()
1593 return arm_cmn_validate_group(cmn, event); in arm_cmn_event_init()
1596 static void arm_cmn_event_clear(struct arm_cmn *cmn, struct perf_event *event, in arm_cmn_event_clear() argument
1603 struct arm_cmn_dtm *dtm = &cmn->dtms[hw->dn[i].dtm] + hw->dtm_offset; in arm_cmn_event_clear()
1618 cmn->dtc[i].counters[hw->dtc_idx] = NULL; in arm_cmn_event_clear()
1623 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_add() local
1625 struct arm_cmn_dtc *dtc = &cmn->dtc[0]; in arm_cmn_event_add()
1632 while (cmn->dtc[i].cycles) in arm_cmn_event_add()
1633 if (++i == cmn->num_dtcs) in arm_cmn_event_add()
1636 cmn->dtc[i].cycles = event; in arm_cmn_event_add()
1655 struct arm_cmn_dtm *dtm = &cmn->dtms[dn->dtm] + hw->dtm_offset; in arm_cmn_event_add()
1682 struct arm_cmn_nodeid nid = arm_cmn_nid(cmn, dn->id); in arm_cmn_event_add()
1684 if (cmn->multi_dtm) in arm_cmn_event_add()
1714 arm_cmn_event_clear(cmn, event, i); in arm_cmn_event_add()
1720 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_del() local
1727 cmn->dtc[__ffs(hw->dtcs_used)].cycles = NULL; in arm_cmn_event_del()
1729 arm_cmn_event_clear(cmn, event, hw->num_dns); in arm_cmn_event_del()
1754 static void arm_cmn_migrate(struct arm_cmn *cmn, unsigned int cpu) in arm_cmn_migrate() argument
1758 perf_pmu_migrate_context(&cmn->pmu, cmn->cpu, cpu); in arm_cmn_migrate()
1759 for (i = 0; i < cmn->num_dtcs; i++) in arm_cmn_migrate()
1760 irq_set_affinity(cmn->dtc[i].irq, cpumask_of(cpu)); in arm_cmn_migrate()
1761 cmn->cpu = cpu; in arm_cmn_migrate()
1766 struct arm_cmn *cmn; in arm_cmn_pmu_online_cpu() local
1769 cmn = hlist_entry_safe(cpuhp_node, struct arm_cmn, cpuhp_node); in arm_cmn_pmu_online_cpu()
1770 node = dev_to_node(cmn->dev); in arm_cmn_pmu_online_cpu()
1771 if (node != NUMA_NO_NODE && cpu_to_node(cmn->cpu) != node && cpu_to_node(cpu) == node) in arm_cmn_pmu_online_cpu()
1772 arm_cmn_migrate(cmn, cpu); in arm_cmn_pmu_online_cpu()
1778 struct arm_cmn *cmn; in arm_cmn_pmu_offline_cpu() local
1783 cmn = hlist_entry_safe(cpuhp_node, struct arm_cmn, cpuhp_node); in arm_cmn_pmu_offline_cpu()
1784 if (cpu != cmn->cpu) in arm_cmn_pmu_offline_cpu()
1787 node = dev_to_node(cmn->dev); in arm_cmn_pmu_offline_cpu()
1794 arm_cmn_migrate(cmn, target); in arm_cmn_pmu_offline_cpu()
1835 static int arm_cmn_init_irqs(struct arm_cmn *cmn) in arm_cmn_init_irqs() argument
1839 for (i = 0; i < cmn->num_dtcs; i++) { in arm_cmn_init_irqs()
1840 irq = cmn->dtc[i].irq; in arm_cmn_init_irqs()
1842 if (cmn->dtc[j].irq == irq) { in arm_cmn_init_irqs()
1843 cmn->dtc[j].irq_friend = i - j; in arm_cmn_init_irqs()
1847 err = devm_request_irq(cmn->dev, irq, arm_cmn_handle_irq, in arm_cmn_init_irqs()
1849 dev_name(cmn->dev), &cmn->dtc[i]); in arm_cmn_init_irqs()
1853 err = irq_set_affinity(irq, cpumask_of(cmn->cpu)); in arm_cmn_init_irqs()
1875 static int arm_cmn_init_dtc(struct arm_cmn *cmn, struct arm_cmn_node *dn, int idx) in arm_cmn_init_dtc() argument
1877 struct arm_cmn_dtc *dtc = cmn->dtc + idx; in arm_cmn_init_dtc()
1880 dtc->irq = platform_get_irq(to_platform_device(cmn->dev), idx); in arm_cmn_init_dtc()
1902 static int arm_cmn_init_dtcs(struct arm_cmn *cmn) in arm_cmn_init_dtcs() argument
1906 u8 dtcs_present = (1 << cmn->num_dtcs) - 1; in arm_cmn_init_dtcs()
1908 cmn->dtc = devm_kcalloc(cmn->dev, cmn->num_dtcs, sizeof(cmn->dtc[0]), GFP_KERNEL); in arm_cmn_init_dtcs()
1909 if (!cmn->dtc) in arm_cmn_init_dtcs()
1912 sort(cmn->dns, cmn->num_dns, sizeof(cmn->dns[0]), arm_cmn_node_cmp, NULL); in arm_cmn_init_dtcs()
1914 cmn->xps = arm_cmn_node(cmn, CMN_TYPE_XP); in arm_cmn_init_dtcs()
1916 for (dn = cmn->dns; dn->type; dn++) { in arm_cmn_init_dtcs()
1922 xp = arm_cmn_node_to_xp(cmn, dn); in arm_cmn_init_dtcs()
1924 if (cmn->multi_dtm) in arm_cmn_init_dtcs()
1925 dn->dtm += arm_cmn_nid(cmn, dn->id).port / 2; in arm_cmn_init_dtcs()
1932 err = arm_cmn_init_dtc(cmn, dn, dtc_idx++); in arm_cmn_init_dtcs()
1946 writel_relaxed(CMN_DT_DTC_CTL_DT_EN, cmn->dtc[0].base + CMN_DT_DTC_CTL); in arm_cmn_init_dtcs()
1951 static void arm_cmn_init_node_info(struct arm_cmn *cmn, u32 offset, struct arm_cmn_node *node) in arm_cmn_init_node_info() argument
1954 u64 reg = readq_relaxed(cmn->base + offset + CMN_NODE_INFO); in arm_cmn_init_node_info()
1960 node->pmu_base = cmn->base + offset + CMN_PMU_OFFSET; in arm_cmn_init_node_info()
1969 dev_dbg(cmn->dev, "node%*c%#06hx%*ctype:%-#6x id:%-4hd off:%#x\n", in arm_cmn_init_node_info()
1986 static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset) in arm_cmn_discover() argument
1997 arm_cmn_init_node_info(cmn, rgn_offset, &cfg); in arm_cmn_discover()
2001 cfg_region = cmn->base + rgn_offset; in arm_cmn_discover()
2003 cmn->rev = FIELD_GET(CMN_CFGM_PID2_REVISION, reg); in arm_cmn_discover()
2006 cmn->multi_dtm = reg & CMN_INFO_MULTIPLE_DTM_EN; in arm_cmn_discover()
2007 cmn->rsp_vc_num = FIELD_GET(CMN_INFO_RSP_VC_NUM, reg); in arm_cmn_discover()
2008 cmn->dat_vc_num = FIELD_GET(CMN_INFO_DAT_VC_NUM, reg); in arm_cmn_discover()
2011 cmn->snp_vc_num = FIELD_GET(CMN_INFO_SNP_VC_NUM, reg); in arm_cmn_discover()
2012 cmn->req_vc_num = FIELD_GET(CMN_INFO_REQ_VC_NUM, reg); in arm_cmn_discover()
2018 cmn->num_xps = child_count; in arm_cmn_discover()
2019 cmn->num_dns = cmn->num_xps; in arm_cmn_discover()
2022 for (i = 0; i < cmn->num_xps; i++) { in arm_cmn_discover()
2026 reg = readq_relaxed(cmn->base + xp_offset[i] + CMN_CHILD_INFO); in arm_cmn_discover()
2027 cmn->num_dns += FIELD_GET(CMN_CI_CHILD_COUNT, reg); in arm_cmn_discover()
2035 dn = devm_kcalloc(cmn->dev, cmn->num_dns * 2 - cmn->num_xps, in arm_cmn_discover()
2041 i = cmn->num_xps; in arm_cmn_discover()
2042 if (cmn->multi_dtm) in arm_cmn_discover()
2043 i += cmn->num_xps + 1; in arm_cmn_discover()
2044 dtm = devm_kcalloc(cmn->dev, i, sizeof(*dtm), GFP_KERNEL); in arm_cmn_discover()
2049 cmn->dns = dn; in arm_cmn_discover()
2050 cmn->dtms = dtm; in arm_cmn_discover()
2051 for (i = 0; i < cmn->num_xps; i++) { in arm_cmn_discover()
2052 void __iomem *xp_region = cmn->base + xp_offset[i]; in arm_cmn_discover()
2056 arm_cmn_init_node_info(cmn, xp_offset[i], xp); in arm_cmn_discover()
2064 cmn->mesh_x = xp->logid; in arm_cmn_discover()
2066 if (cmn->model == CMN600) in arm_cmn_discover()
2071 xp->dtm = dtm - cmn->dtms; in arm_cmn_discover()
2093 if (cmn->multi_dtm && (xp_ports & 0xc)) in arm_cmn_discover()
2095 if (cmn->multi_dtm && (xp_ports & 0x30)) in arm_cmn_discover()
2098 cmn->ports_used |= xp_ports; in arm_cmn_discover()
2116 dev_dbg(cmn->dev, "ignoring external node %llx\n", reg); in arm_cmn_discover()
2120 arm_cmn_init_node_info(cmn, reg & CMN_CHILD_NODE_ADDR, dn); in arm_cmn_discover()
2124 cmn->num_dtcs++; in arm_cmn_discover()
2163 dev_err(cmn->dev, "invalid device node type: 0x%x\n", dn->type); in arm_cmn_discover()
2170 cmn->num_dns = dn - cmn->dns; in arm_cmn_discover()
2173 sz = (void *)(dn + 1) - (void *)cmn->dns; in arm_cmn_discover()
2174 dn = devm_krealloc(cmn->dev, cmn->dns, sz, GFP_KERNEL); in arm_cmn_discover()
2176 cmn->dns = dn; in arm_cmn_discover()
2178 sz = (void *)dtm - (void *)cmn->dtms; in arm_cmn_discover()
2179 dtm = devm_krealloc(cmn->dev, cmn->dtms, sz, GFP_KERNEL); in arm_cmn_discover()
2181 cmn->dtms = dtm; in arm_cmn_discover()
2187 if (!cmn->mesh_x) in arm_cmn_discover()
2188 cmn->mesh_x = cmn->num_xps; in arm_cmn_discover()
2189 cmn->mesh_y = cmn->num_xps / cmn->mesh_x; in arm_cmn_discover()
2192 if (cmn->num_xps == 1) in arm_cmn_discover()
2193 dev_warn(cmn->dev, "1x1 config not fully supported, translate XP events manually\n"); in arm_cmn_discover()
2195 dev_dbg(cmn->dev, "model %d, periph_id_2 revision %d\n", cmn->model, cmn->rev); in arm_cmn_discover()
2196 reg = cmn->ports_used; in arm_cmn_discover()
2197 dev_dbg(cmn->dev, "mesh %dx%d, ID width %d, ports %6pbl%s\n", in arm_cmn_discover()
2198 cmn->mesh_x, cmn->mesh_y, arm_cmn_xyidbits(cmn), &reg, in arm_cmn_discover()
2199 cmn->multi_dtm ? ", multi-DTM" : ""); in arm_cmn_discover()
2204 static int arm_cmn600_acpi_probe(struct platform_device *pdev, struct arm_cmn *cmn) in arm_cmn600_acpi_probe() argument
2224 cmn->base = devm_ioremap(cmn->dev, cfg->start, resource_size(cfg)); in arm_cmn600_acpi_probe()
2225 if (!cmn->base) in arm_cmn600_acpi_probe()
2240 struct arm_cmn *cmn; in arm_cmn_probe() local
2245 cmn = devm_kzalloc(&pdev->dev, sizeof(*cmn), GFP_KERNEL); in arm_cmn_probe()
2246 if (!cmn) in arm_cmn_probe()
2249 cmn->dev = &pdev->dev; in arm_cmn_probe()
2250 cmn->model = (unsigned long)device_get_match_data(cmn->dev); in arm_cmn_probe()
2251 platform_set_drvdata(pdev, cmn); in arm_cmn_probe()
2253 if (cmn->model == CMN600 && has_acpi_companion(cmn->dev)) { in arm_cmn_probe()
2254 rootnode = arm_cmn600_acpi_probe(pdev, cmn); in arm_cmn_probe()
2257 cmn->base = devm_platform_ioremap_resource(pdev, 0); in arm_cmn_probe()
2258 if (IS_ERR(cmn->base)) in arm_cmn_probe()
2259 return PTR_ERR(cmn->base); in arm_cmn_probe()
2260 if (cmn->model == CMN600) in arm_cmn_probe()
2266 err = arm_cmn_discover(cmn, rootnode); in arm_cmn_probe()
2270 err = arm_cmn_init_dtcs(cmn); in arm_cmn_probe()
2274 err = arm_cmn_init_irqs(cmn); in arm_cmn_probe()
2278 cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev)); in arm_cmn_probe()
2279 cmn->pmu = (struct pmu) { in arm_cmn_probe()
2298 name = devm_kasprintf(cmn->dev, GFP_KERNEL, "arm_cmn_%d", this_id); in arm_cmn_probe()
2302 err = cpuhp_state_add_instance(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_probe()
2306 err = perf_pmu_register(&cmn->pmu, name, -1); in arm_cmn_probe()
2308 cpuhp_state_remove_instance_nocalls(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_probe()
2310 arm_cmn_debugfs_init(cmn, this_id); in arm_cmn_probe()
2317 struct arm_cmn *cmn = platform_get_drvdata(pdev); in arm_cmn_remove() local
2319 writel_relaxed(0, cmn->dtc[0].base + CMN_DT_DTC_CTL); in arm_cmn_remove()
2321 perf_pmu_unregister(&cmn->pmu); in arm_cmn_remove()
2322 cpuhp_state_remove_instance_nocalls(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_remove()
2323 debugfs_remove(cmn->debug); in arm_cmn_remove()