Lines Matching refs:cmn

297 static int arm_cmn_xyidbits(const struct arm_cmn *cmn)  in arm_cmn_xyidbits()  argument
299 return cmn->mesh_x > 4 || cmn->mesh_y > 4 ? 3 : 2; in arm_cmn_xyidbits()
302 static void arm_cmn_init_node_to_xp(const struct arm_cmn *cmn, in arm_cmn_init_node_to_xp() argument
305 int bits = arm_cmn_xyidbits(cmn); in arm_cmn_init_node_to_xp()
308 int xp_idx = cmn->mesh_x * y + x; in arm_cmn_init_node_to_xp()
310 dn->to_xp = (cmn->xps + xp_idx) - dn; in arm_cmn_init_node_to_xp()
318 static struct arm_cmn_node *arm_cmn_node(const struct arm_cmn *cmn, in arm_cmn_node() argument
323 for (i = 0; i < cmn->num_dns; i++) in arm_cmn_node()
324 if (cmn->dns[i].type == type) in arm_cmn_node()
325 return &cmn->dns[i]; in arm_cmn_node()
371 struct arm_cmn *cmn = to_cmn(dev_get_drvdata(dev)); in arm_cmn_event_attr_is_visible() local
383 if (cmn->rev < CMN600_R1P2) { in arm_cmn_event_attr_is_visible()
388 if (!arm_cmn_node(cmn, type)) in arm_cmn_event_attr_is_visible()
606 struct arm_cmn *cmn = to_cmn(dev_get_drvdata(dev)); in arm_cmn_cpumask_show() local
608 return cpumap_print_to_pagebuf(true, buf, cpumask_of(cmn->cpu)); in arm_cmn_cpumask_show()
654 static void arm_cmn_set_state(struct arm_cmn *cmn, u32 state) in arm_cmn_set_state() argument
656 if (!cmn->state) in arm_cmn_set_state()
657 writel_relaxed(0, cmn->dtc[0].base + CMN_DT_PMCR); in arm_cmn_set_state()
658 cmn->state |= state; in arm_cmn_set_state()
661 static void arm_cmn_clear_state(struct arm_cmn *cmn, u32 state) in arm_cmn_clear_state() argument
663 cmn->state &= ~state; in arm_cmn_clear_state()
664 if (!cmn->state) in arm_cmn_clear_state()
666 cmn->dtc[0].base + CMN_DT_PMCR); in arm_cmn_clear_state()
679 static u64 arm_cmn_read_dtm(struct arm_cmn *cmn, struct arm_cmn_hw_event *hw, in arm_cmn_read_dtm() argument
717 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_init_counter() local
723 writel_relaxed(CMN_COUNTER_INIT, cmn->dtc[i].base + pmevcnt); in arm_cmn_init_counter()
724 cmn->dtc[i].counters[hw->dtc_idx] = event; in arm_cmn_init_counter()
727 count = arm_cmn_read_dtm(cmn, hw, false); in arm_cmn_init_counter()
733 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_read() local
741 delta = arm_cmn_read_cc(cmn->dtc + i); in arm_cmn_event_read()
745 new = arm_cmn_read_dtm(cmn, hw, false); in arm_cmn_event_read()
752 new = arm_cmn_read_counter(cmn->dtc + i, hw->dtc_idx); in arm_cmn_event_read()
761 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_start() local
769 writeq_relaxed(CMN_CC_INIT, cmn->dtc[i].base + CMN_DT_PMCCNTR); in arm_cmn_event_start()
770 cmn->dtc[i].cc_active = true; in arm_cmn_event_start()
790 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_stop() local
798 cmn->dtc[i].cc_active = false; in arm_cmn_event_stop()
921 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_init() local
934 event->cpu = cmn->cpu; in arm_cmn_event_init()
955 hw->dn = arm_cmn_node(cmn, type); in arm_cmn_event_init()
956 for (i = hw->dn - cmn->dns; i < cmn->num_dns && cmn->dns[i].type == type; i++) { in arm_cmn_event_init()
959 } else if (cmn->dns[i].id != nodeid) { in arm_cmn_event_init()
968 int bits = arm_cmn_xyidbits(cmn); in arm_cmn_event_init()
970 dev_dbg(cmn->dev, "invalid node 0x%x (%d,%d,%d,%d) type 0x%x\n", in arm_cmn_event_init()
979 hw->dtcs_used = (1U << cmn->num_dtcs) - 1; in arm_cmn_event_init()
984 static void arm_cmn_event_clear(struct arm_cmn *cmn, struct perf_event *event, in arm_cmn_event_clear() argument
1006 cmn->dtc[i].counters[hw->dtc_idx] = NULL; in arm_cmn_event_clear()
1011 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_add() local
1013 struct arm_cmn_dtc *dtc = &cmn->dtc[0]; in arm_cmn_event_add()
1020 while (cmn->dtc[i].cycles) in arm_cmn_event_add()
1021 if (++i == cmn->num_dtcs) in arm_cmn_event_add()
1024 cmn->dtc[i].cycles = event; in arm_cmn_event_add()
1110 arm_cmn_event_clear(cmn, event, i); in arm_cmn_event_add()
1116 struct arm_cmn *cmn = to_cmn(event->pmu); in arm_cmn_event_del() local
1123 cmn->dtc[__ffs(hw->dtcs_used)].cycles = NULL; in arm_cmn_event_del()
1125 arm_cmn_event_clear(cmn, event, hw->num_dns); in arm_cmn_event_del()
1152 struct arm_cmn *cmn; in arm_cmn_pmu_offline_cpu() local
1155 cmn = hlist_entry_safe(node, struct arm_cmn, cpuhp_node); in arm_cmn_pmu_offline_cpu()
1156 if (cpu != cmn->cpu) in arm_cmn_pmu_offline_cpu()
1163 perf_pmu_migrate_context(&cmn->pmu, cpu, target); in arm_cmn_pmu_offline_cpu()
1164 cmn->cpu = target; in arm_cmn_pmu_offline_cpu()
1205 static int arm_cmn_init_irqs(struct arm_cmn *cmn) in arm_cmn_init_irqs() argument
1209 for (i = 0; i < cmn->num_dtcs; i++) { in arm_cmn_init_irqs()
1210 irq = cmn->dtc[i].irq; in arm_cmn_init_irqs()
1212 if (cmn->dtc[j].irq == irq) { in arm_cmn_init_irqs()
1213 cmn->dtc[j].irq_friend = j - i; in arm_cmn_init_irqs()
1217 err = devm_request_irq(cmn->dev, irq, arm_cmn_handle_irq, in arm_cmn_init_irqs()
1219 dev_name(cmn->dev), &cmn->dtc[i]); in arm_cmn_init_irqs()
1223 err = irq_set_affinity_hint(irq, cpumask_of(cmn->cpu)); in arm_cmn_init_irqs()
1245 static int arm_cmn_init_dtc(struct arm_cmn *cmn, struct arm_cmn_node *dn, int idx) in arm_cmn_init_dtc() argument
1247 struct arm_cmn_dtc *dtc = cmn->dtc + idx; in arm_cmn_init_dtc()
1251 dtc->irq = platform_get_irq(to_platform_device(cmn->dev), idx); in arm_cmn_init_dtc()
1277 static int arm_cmn_init_dtcs(struct arm_cmn *cmn) in arm_cmn_init_dtcs() argument
1282 cmn->dtc = devm_kcalloc(cmn->dev, cmn->num_dtcs, sizeof(cmn->dtc[0]), GFP_KERNEL); in arm_cmn_init_dtcs()
1283 if (!cmn->dtc) in arm_cmn_init_dtcs()
1286 sort(cmn->dns, cmn->num_dns, sizeof(cmn->dns[0]), arm_cmn_node_cmp, NULL); in arm_cmn_init_dtcs()
1288 cmn->xps = arm_cmn_node(cmn, CMN_TYPE_XP); in arm_cmn_init_dtcs()
1290 for (dn = cmn->dns; dn < cmn->dns + cmn->num_dns; dn++) { in arm_cmn_init_dtcs()
1292 arm_cmn_init_node_to_xp(cmn, dn); in arm_cmn_init_dtcs()
1293 else if (cmn->num_dtcs == 1) in arm_cmn_init_dtcs()
1297 arm_cmn_init_dtc(cmn, dn, dtc_idx++); in arm_cmn_init_dtcs()
1304 writel_relaxed(CMN_DT_DTC_CTL_DT_EN, cmn->dtc[0].base + CMN_DT_DTC_CTL); in arm_cmn_init_dtcs()
1309 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
1312 u64 reg = readq_relaxed(cmn->base + offset + CMN_NODE_INFO); in arm_cmn_init_node_info()
1318 node->pmu_base = cmn->base + offset + CMN_PMU_OFFSET; in arm_cmn_init_node_info()
1327 dev_dbg(cmn->dev, "node%*c%#06hx%*ctype:%-#6x id:%-4hd off:%#x\n", in arm_cmn_init_node_info()
1332 static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset) in arm_cmn_discover() argument
1341 cfg_region = cmn->base + rgn_offset; in arm_cmn_discover()
1343 cmn->rev = FIELD_GET(CMN_CFGM_PID2_REVISION, reg); in arm_cmn_discover()
1344 dev_dbg(cmn->dev, "periph_id_2 revision: %d\n", cmn->rev); in arm_cmn_discover()
1346 arm_cmn_init_node_info(cmn, rgn_offset, &cfg); in arm_cmn_discover()
1354 cmn->num_xps = child_count; in arm_cmn_discover()
1355 cmn->num_dns = cmn->num_xps; in arm_cmn_discover()
1358 for (i = 0; i < cmn->num_xps; i++) { in arm_cmn_discover()
1362 reg = readq_relaxed(cmn->base + xp_offset[i] + CMN_CHILD_INFO); in arm_cmn_discover()
1363 cmn->num_dns += FIELD_GET(CMN_CI_CHILD_COUNT, reg); in arm_cmn_discover()
1367 cmn->dns = devm_kcalloc(cmn->dev, cmn->num_dns + 1, in arm_cmn_discover()
1368 sizeof(*cmn->dns), GFP_KERNEL); in arm_cmn_discover()
1369 if (!cmn->dns) in arm_cmn_discover()
1373 dn = cmn->dns; in arm_cmn_discover()
1374 for (i = 0; i < cmn->num_xps; i++) { in arm_cmn_discover()
1375 void __iomem *xp_region = cmn->base + xp_offset[i]; in arm_cmn_discover()
1378 arm_cmn_init_node_info(cmn, xp_offset[i], xp); in arm_cmn_discover()
1387 cmn->mesh_x = xp->logid; in arm_cmn_discover()
1405 dev_dbg(cmn->dev, "ignoring external node %llx\n", reg); in arm_cmn_discover()
1409 arm_cmn_init_node_info(cmn, reg & CMN_CHILD_NODE_ADDR, dn); in arm_cmn_discover()
1413 cmn->num_dtcs++; in arm_cmn_discover()
1433 dev_err(cmn->dev, "invalid device node type: 0x%x\n", dn->type); in arm_cmn_discover()
1440 cmn->num_dns = dn - cmn->dns; in arm_cmn_discover()
1446 if (!cmn->mesh_x) in arm_cmn_discover()
1447 cmn->mesh_x = cmn->num_xps; in arm_cmn_discover()
1448 cmn->mesh_y = cmn->num_xps / cmn->mesh_x; in arm_cmn_discover()
1450 dev_dbg(cmn->dev, "mesh %dx%d, ID width %d\n", in arm_cmn_discover()
1451 cmn->mesh_x, cmn->mesh_y, arm_cmn_xyidbits(cmn)); in arm_cmn_discover()
1456 static int arm_cmn_acpi_probe(struct platform_device *pdev, struct arm_cmn *cmn) in arm_cmn_acpi_probe() argument
1476 cmn->base = devm_ioremap(cmn->dev, cfg->start, resource_size(cfg)); in arm_cmn_acpi_probe()
1477 if (!cmn->base) in arm_cmn_acpi_probe()
1483 static int arm_cmn_of_probe(struct platform_device *pdev, struct arm_cmn *cmn) in arm_cmn_of_probe() argument
1489 cmn->base = devm_platform_ioremap_resource(pdev, 0); in arm_cmn_of_probe()
1490 if (IS_ERR(cmn->base)) in arm_cmn_of_probe()
1491 return PTR_ERR(cmn->base); in arm_cmn_of_probe()
1502 struct arm_cmn *cmn; in arm_cmn_probe() local
1507 cmn = devm_kzalloc(&pdev->dev, sizeof(*cmn), GFP_KERNEL); in arm_cmn_probe()
1508 if (!cmn) in arm_cmn_probe()
1511 cmn->dev = &pdev->dev; in arm_cmn_probe()
1512 platform_set_drvdata(pdev, cmn); in arm_cmn_probe()
1514 if (has_acpi_companion(cmn->dev)) in arm_cmn_probe()
1515 rootnode = arm_cmn_acpi_probe(pdev, cmn); in arm_cmn_probe()
1517 rootnode = arm_cmn_of_probe(pdev, cmn); in arm_cmn_probe()
1521 err = arm_cmn_discover(cmn, rootnode); in arm_cmn_probe()
1525 err = arm_cmn_init_dtcs(cmn); in arm_cmn_probe()
1529 err = arm_cmn_init_irqs(cmn); in arm_cmn_probe()
1533 cmn->cpu = raw_smp_processor_id(); in arm_cmn_probe()
1534 cmn->pmu = (struct pmu) { in arm_cmn_probe()
1556 name = devm_kasprintf(cmn->dev, GFP_KERNEL, "arm_cmn_%d", this_id); in arm_cmn_probe()
1561 err = cpuhp_state_add_instance(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_probe()
1565 err = perf_pmu_register(&cmn->pmu, name, -1); in arm_cmn_probe()
1567 cpuhp_state_remove_instance(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_probe()
1573 struct arm_cmn *cmn = platform_get_drvdata(pdev); in arm_cmn_remove() local
1576 writel_relaxed(0, cmn->dtc[0].base + CMN_DT_DTC_CTL); in arm_cmn_remove()
1578 perf_pmu_unregister(&cmn->pmu); in arm_cmn_remove()
1579 cpuhp_state_remove_instance(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_remove()
1581 for (i = 0; i < cmn->num_dtcs; i++) in arm_cmn_remove()
1582 irq_set_affinity_hint(cmn->dtc[i].irq, NULL); in arm_cmn_remove()