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 for (i = 0; i < cmn->num_dtcs; i++) in arm_cmn_pmu_offline_cpu()
1165 irq_set_affinity(cmn->dtc[i].irq, cpumask_of(target)); in arm_cmn_pmu_offline_cpu()
1166 cmn->cpu = target; in arm_cmn_pmu_offline_cpu()
1207 static int arm_cmn_init_irqs(struct arm_cmn *cmn) in arm_cmn_init_irqs() argument
1211 for (i = 0; i < cmn->num_dtcs; i++) { in arm_cmn_init_irqs()
1212 irq = cmn->dtc[i].irq; in arm_cmn_init_irqs()
1214 if (cmn->dtc[j].irq == irq) { in arm_cmn_init_irqs()
1215 cmn->dtc[j].irq_friend = i - j; in arm_cmn_init_irqs()
1219 err = devm_request_irq(cmn->dev, irq, arm_cmn_handle_irq, in arm_cmn_init_irqs()
1221 dev_name(cmn->dev), &cmn->dtc[i]); in arm_cmn_init_irqs()
1225 err = irq_set_affinity(irq, cpumask_of(cmn->cpu)); in arm_cmn_init_irqs()
1247 static int arm_cmn_init_dtc(struct arm_cmn *cmn, struct arm_cmn_node *dn, int idx) in arm_cmn_init_dtc() argument
1249 struct arm_cmn_dtc *dtc = cmn->dtc + idx; in arm_cmn_init_dtc()
1253 dtc->irq = platform_get_irq(to_platform_device(cmn->dev), idx); in arm_cmn_init_dtc()
1279 static int arm_cmn_init_dtcs(struct arm_cmn *cmn) in arm_cmn_init_dtcs() argument
1284 cmn->dtc = devm_kcalloc(cmn->dev, cmn->num_dtcs, sizeof(cmn->dtc[0]), GFP_KERNEL); in arm_cmn_init_dtcs()
1285 if (!cmn->dtc) in arm_cmn_init_dtcs()
1288 sort(cmn->dns, cmn->num_dns, sizeof(cmn->dns[0]), arm_cmn_node_cmp, NULL); in arm_cmn_init_dtcs()
1290 cmn->xps = arm_cmn_node(cmn, CMN_TYPE_XP); in arm_cmn_init_dtcs()
1292 for (dn = cmn->dns; dn < cmn->dns + cmn->num_dns; dn++) { in arm_cmn_init_dtcs()
1294 arm_cmn_init_node_to_xp(cmn, dn); in arm_cmn_init_dtcs()
1295 else if (cmn->num_dtcs == 1) in arm_cmn_init_dtcs()
1299 arm_cmn_init_dtc(cmn, dn, dtc_idx++); in arm_cmn_init_dtcs()
1306 writel_relaxed(CMN_DT_DTC_CTL_DT_EN, cmn->dtc[0].base + CMN_DT_DTC_CTL); in arm_cmn_init_dtcs()
1311 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
1314 u64 reg = readq_relaxed(cmn->base + offset + CMN_NODE_INFO); in arm_cmn_init_node_info()
1320 node->pmu_base = cmn->base + offset + CMN_PMU_OFFSET; in arm_cmn_init_node_info()
1329 dev_dbg(cmn->dev, "node%*c%#06hx%*ctype:%-#6x id:%-4hd off:%#x\n", in arm_cmn_init_node_info()
1334 static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset) in arm_cmn_discover() argument
1343 cfg_region = cmn->base + rgn_offset; in arm_cmn_discover()
1345 cmn->rev = FIELD_GET(CMN_CFGM_PID2_REVISION, reg); in arm_cmn_discover()
1346 dev_dbg(cmn->dev, "periph_id_2 revision: %d\n", cmn->rev); in arm_cmn_discover()
1348 arm_cmn_init_node_info(cmn, rgn_offset, &cfg); in arm_cmn_discover()
1356 cmn->num_xps = child_count; in arm_cmn_discover()
1357 cmn->num_dns = cmn->num_xps; in arm_cmn_discover()
1360 for (i = 0; i < cmn->num_xps; i++) { in arm_cmn_discover()
1364 reg = readq_relaxed(cmn->base + xp_offset[i] + CMN_CHILD_INFO); in arm_cmn_discover()
1365 cmn->num_dns += FIELD_GET(CMN_CI_CHILD_COUNT, reg); in arm_cmn_discover()
1369 cmn->dns = devm_kcalloc(cmn->dev, cmn->num_dns + 1, in arm_cmn_discover()
1370 sizeof(*cmn->dns), GFP_KERNEL); in arm_cmn_discover()
1371 if (!cmn->dns) in arm_cmn_discover()
1375 dn = cmn->dns; in arm_cmn_discover()
1376 for (i = 0; i < cmn->num_xps; i++) { in arm_cmn_discover()
1377 void __iomem *xp_region = cmn->base + xp_offset[i]; in arm_cmn_discover()
1380 arm_cmn_init_node_info(cmn, xp_offset[i], xp); in arm_cmn_discover()
1389 cmn->mesh_x = xp->logid; in arm_cmn_discover()
1407 dev_dbg(cmn->dev, "ignoring external node %llx\n", reg); in arm_cmn_discover()
1411 arm_cmn_init_node_info(cmn, reg & CMN_CHILD_NODE_ADDR, dn); in arm_cmn_discover()
1415 cmn->num_dtcs++; in arm_cmn_discover()
1435 dev_err(cmn->dev, "invalid device node type: 0x%x\n", dn->type); in arm_cmn_discover()
1442 cmn->num_dns = dn - cmn->dns; in arm_cmn_discover()
1448 if (!cmn->mesh_x) in arm_cmn_discover()
1449 cmn->mesh_x = cmn->num_xps; in arm_cmn_discover()
1450 cmn->mesh_y = cmn->num_xps / cmn->mesh_x; in arm_cmn_discover()
1452 dev_dbg(cmn->dev, "mesh %dx%d, ID width %d\n", in arm_cmn_discover()
1453 cmn->mesh_x, cmn->mesh_y, arm_cmn_xyidbits(cmn)); in arm_cmn_discover()
1458 static int arm_cmn_acpi_probe(struct platform_device *pdev, struct arm_cmn *cmn) in arm_cmn_acpi_probe() argument
1478 cmn->base = devm_ioremap(cmn->dev, cfg->start, resource_size(cfg)); in arm_cmn_acpi_probe()
1479 if (!cmn->base) in arm_cmn_acpi_probe()
1485 static int arm_cmn_of_probe(struct platform_device *pdev, struct arm_cmn *cmn) in arm_cmn_of_probe() argument
1491 cmn->base = devm_platform_ioremap_resource(pdev, 0); in arm_cmn_of_probe()
1492 if (IS_ERR(cmn->base)) in arm_cmn_of_probe()
1493 return PTR_ERR(cmn->base); in arm_cmn_of_probe()
1504 struct arm_cmn *cmn; in arm_cmn_probe() local
1509 cmn = devm_kzalloc(&pdev->dev, sizeof(*cmn), GFP_KERNEL); in arm_cmn_probe()
1510 if (!cmn) in arm_cmn_probe()
1513 cmn->dev = &pdev->dev; in arm_cmn_probe()
1514 platform_set_drvdata(pdev, cmn); in arm_cmn_probe()
1516 if (has_acpi_companion(cmn->dev)) in arm_cmn_probe()
1517 rootnode = arm_cmn_acpi_probe(pdev, cmn); in arm_cmn_probe()
1519 rootnode = arm_cmn_of_probe(pdev, cmn); in arm_cmn_probe()
1523 err = arm_cmn_discover(cmn, rootnode); in arm_cmn_probe()
1527 err = arm_cmn_init_dtcs(cmn); in arm_cmn_probe()
1531 err = arm_cmn_init_irqs(cmn); in arm_cmn_probe()
1535 cmn->cpu = raw_smp_processor_id(); in arm_cmn_probe()
1536 cmn->pmu = (struct pmu) { in arm_cmn_probe()
1554 name = devm_kasprintf(cmn->dev, GFP_KERNEL, "arm_cmn_%d", atomic_fetch_inc(&id)); in arm_cmn_probe()
1558 err = cpuhp_state_add_instance(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_probe()
1562 err = perf_pmu_register(&cmn->pmu, name, -1); in arm_cmn_probe()
1564 cpuhp_state_remove_instance(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_probe()
1570 struct arm_cmn *cmn = platform_get_drvdata(pdev); in arm_cmn_remove() local
1572 writel_relaxed(0, cmn->dtc[0].base + CMN_DT_DTC_CTL); in arm_cmn_remove()
1574 perf_pmu_unregister(&cmn->pmu); in arm_cmn_remove()
1575 cpuhp_state_remove_instance(arm_cmn_hp_state, &cmn->cpuhp_node); in arm_cmn_remove()