Lines Matching refs:pcie_pmu
122 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); in cpumask_show() local
124 return cpumap_print_to_pagebuf(true, buf, cpumask_of(pcie_pmu->on_cpu)); in cpumask_show()
130 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); in identifier_show() local
132 return sysfs_emit(buf, "%#x\n", pcie_pmu->identifier); in identifier_show()
138 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); in bus_show() local
140 return sysfs_emit(buf, "%#04x\n", PCI_BUS_NUM(pcie_pmu->bdf_min)); in bus_show()
146 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); in bdf_min_show() local
148 return sysfs_emit(buf, "%#04x\n", pcie_pmu->bdf_min); in bdf_min_show()
154 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); in bdf_max_show() local
156 return sysfs_emit(buf, "%#04x\n", pcie_pmu->bdf_max); in bdf_max_show()
161 hisi_pcie_parse_reg_value(struct hisi_pcie_pmu *pcie_pmu, u32 reg_off) in hisi_pcie_parse_reg_value() argument
163 u32 val = readl_relaxed(pcie_pmu->base + reg_off); in hisi_pcie_parse_reg_value()
195 static u32 hisi_pcie_pmu_readl(struct hisi_pcie_pmu *pcie_pmu, u32 reg_offset, in hisi_pcie_pmu_readl() argument
200 return readl_relaxed(pcie_pmu->base + offset); in hisi_pcie_pmu_readl()
203 static void hisi_pcie_pmu_writel(struct hisi_pcie_pmu *pcie_pmu, u32 reg_offset, u32 idx, u32 val) in hisi_pcie_pmu_writel() argument
207 writel_relaxed(val, pcie_pmu->base + offset); in hisi_pcie_pmu_writel()
210 static u64 hisi_pcie_pmu_readq(struct hisi_pcie_pmu *pcie_pmu, u32 reg_offset, u32 idx) in hisi_pcie_pmu_readq() argument
214 return readq_relaxed(pcie_pmu->base + offset); in hisi_pcie_pmu_readq()
217 static void hisi_pcie_pmu_writeq(struct hisi_pcie_pmu *pcie_pmu, u32 reg_offset, u32 idx, u64 val) in hisi_pcie_pmu_writeq() argument
221 writeq_relaxed(val, pcie_pmu->base + offset); in hisi_pcie_pmu_writeq()
267 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_config_event_ctrl() local
271 hisi_pcie_pmu_writeq(pcie_pmu, HISI_PCIE_EVENT_CTRL, hwc->idx, reg); in hisi_pcie_pmu_config_event_ctrl()
276 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_clear_event_ctrl() local
279 hisi_pcie_pmu_writeq(pcie_pmu, HISI_PCIE_EVENT_CTRL, hwc->idx, HISI_PCIE_INIT_SET); in hisi_pcie_pmu_clear_event_ctrl()
282 static bool hisi_pcie_pmu_valid_requester_id(struct hisi_pcie_pmu *pcie_pmu, u32 bdf) in hisi_pcie_pmu_valid_requester_id() argument
287 pdev = pci_get_domain_bus_and_slot(pci_domain_nr(pcie_pmu->pdev->bus), PCI_BUS_NUM(bdf), in hisi_pcie_pmu_valid_requester_id()
300 return rp_bdf >= pcie_pmu->bdf_min && rp_bdf <= pcie_pmu->bdf_max; in hisi_pcie_pmu_valid_requester_id()
304 struct hisi_pcie_pmu *pcie_pmu) in hisi_pcie_pmu_valid_filter() argument
316 !hisi_pcie_pmu_valid_requester_id(pcie_pmu, requester_id)) in hisi_pcie_pmu_valid_filter()
383 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_event_init() local
399 if (!hisi_pcie_pmu_valid_filter(event, pcie_pmu)) in hisi_pcie_pmu_event_init()
405 event->cpu = pcie_pmu->on_cpu; in hisi_pcie_pmu_event_init()
412 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_read_counter() local
415 return hisi_pcie_pmu_readq(pcie_pmu, event->hw.event_base, idx); in hisi_pcie_pmu_read_counter()
422 static int hisi_pcie_pmu_get_event_idx(struct hisi_pcie_pmu *pcie_pmu, in hisi_pcie_pmu_get_event_idx() argument
430 sibling = pcie_pmu->hw_events[idx]; in hisi_pcie_pmu_get_event_idx()
468 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_set_period() local
476 hisi_pcie_pmu_writeq(pcie_pmu, HISI_PCIE_CNT, idx, HISI_PCIE_INIT_VAL); in hisi_pcie_pmu_set_period()
477 hisi_pcie_pmu_writeq(pcie_pmu, HISI_PCIE_EXT_CNT, idx, HISI_PCIE_INIT_VAL); in hisi_pcie_pmu_set_period()
491 static void hisi_pcie_pmu_enable_counter(struct hisi_pcie_pmu *pcie_pmu, struct hw_perf_event *hwc) in hisi_pcie_pmu_enable_counter() argument
496 val = hisi_pcie_pmu_readq(pcie_pmu, HISI_PCIE_EVENT_CTRL, idx); in hisi_pcie_pmu_enable_counter()
498 hisi_pcie_pmu_writeq(pcie_pmu, HISI_PCIE_EVENT_CTRL, idx, val); in hisi_pcie_pmu_enable_counter()
501 static void hisi_pcie_pmu_disable_counter(struct hisi_pcie_pmu *pcie_pmu, struct hw_perf_event *hwc) in hisi_pcie_pmu_disable_counter() argument
506 val = hisi_pcie_pmu_readq(pcie_pmu, HISI_PCIE_EVENT_CTRL, idx); in hisi_pcie_pmu_disable_counter()
508 hisi_pcie_pmu_writeq(pcie_pmu, HISI_PCIE_EVENT_CTRL, idx, val); in hisi_pcie_pmu_disable_counter()
511 static void hisi_pcie_pmu_enable_int(struct hisi_pcie_pmu *pcie_pmu, struct hw_perf_event *hwc) in hisi_pcie_pmu_enable_int() argument
515 hisi_pcie_pmu_writel(pcie_pmu, HISI_PCIE_INT_MASK, idx, 0); in hisi_pcie_pmu_enable_int()
518 static void hisi_pcie_pmu_disable_int(struct hisi_pcie_pmu *pcie_pmu, struct hw_perf_event *hwc) in hisi_pcie_pmu_disable_int() argument
522 hisi_pcie_pmu_writel(pcie_pmu, HISI_PCIE_INT_MASK, idx, 1); in hisi_pcie_pmu_disable_int()
525 static void hisi_pcie_pmu_reset_counter(struct hisi_pcie_pmu *pcie_pmu, int idx) in hisi_pcie_pmu_reset_counter() argument
527 hisi_pcie_pmu_writeq(pcie_pmu, HISI_PCIE_EVENT_CTRL, idx, HISI_PCIE_RESET_CNT); in hisi_pcie_pmu_reset_counter()
528 hisi_pcie_pmu_writeq(pcie_pmu, HISI_PCIE_EVENT_CTRL, idx, HISI_PCIE_INIT_SET); in hisi_pcie_pmu_reset_counter()
533 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_start() local
545 hisi_pcie_pmu_enable_counter(pcie_pmu, hwc); in hisi_pcie_pmu_start()
546 hisi_pcie_pmu_enable_int(pcie_pmu, hwc); in hisi_pcie_pmu_start()
551 hisi_pcie_pmu_writeq(pcie_pmu, hwc->event_base, idx, prev_cnt); in hisi_pcie_pmu_start()
559 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_stop() local
563 hisi_pcie_pmu_disable_int(pcie_pmu, hwc); in hisi_pcie_pmu_stop()
564 hisi_pcie_pmu_disable_counter(pcie_pmu, hwc); in hisi_pcie_pmu_stop()
577 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_add() local
583 idx = hisi_pcie_pmu_get_event_idx(pcie_pmu, event); in hisi_pcie_pmu_add()
590 if (!pcie_pmu->hw_events[idx]) { in hisi_pcie_pmu_add()
591 hisi_pcie_pmu_reset_counter(pcie_pmu, idx); in hisi_pcie_pmu_add()
592 pcie_pmu->hw_events[idx] = event; in hisi_pcie_pmu_add()
603 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); in hisi_pcie_pmu_del() local
607 pcie_pmu->hw_events[hwc->idx] = NULL; in hisi_pcie_pmu_del()
613 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(pmu); in hisi_pcie_pmu_enable() local
617 if (pcie_pmu->hw_events[num]) in hisi_pcie_pmu_enable()
624 writel(HISI_PCIE_GLOBAL_EN, pcie_pmu->base + HISI_PCIE_GLOBAL_CTRL); in hisi_pcie_pmu_enable()
629 struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(pmu); in hisi_pcie_pmu_disable() local
631 writel(HISI_PCIE_GLOBAL_NONE, pcie_pmu->base + HISI_PCIE_GLOBAL_CTRL); in hisi_pcie_pmu_disable()
636 struct hisi_pcie_pmu *pcie_pmu = data; in hisi_pcie_pmu_irq() local
643 overflown = hisi_pcie_pmu_readl(pcie_pmu, HISI_PCIE_INT_STAT, idx); in hisi_pcie_pmu_irq()
648 hisi_pcie_pmu_writel(pcie_pmu, HISI_PCIE_INT_STAT, idx, 1); in hisi_pcie_pmu_irq()
649 event = pcie_pmu->hw_events[idx]; in hisi_pcie_pmu_irq()
661 static int hisi_pcie_pmu_irq_register(struct pci_dev *pdev, struct hisi_pcie_pmu *pcie_pmu) in hisi_pcie_pmu_irq_register() argument
673 pcie_pmu); in hisi_pcie_pmu_irq_register()
680 pcie_pmu->irq = irq; in hisi_pcie_pmu_irq_register()
685 static void hisi_pcie_pmu_irq_unregister(struct pci_dev *pdev, struct hisi_pcie_pmu *pcie_pmu) in hisi_pcie_pmu_irq_unregister() argument
687 free_irq(pcie_pmu->irq, pcie_pmu); in hisi_pcie_pmu_irq_unregister()
693 struct hisi_pcie_pmu *pcie_pmu = hlist_entry_safe(node, struct hisi_pcie_pmu, node); in hisi_pcie_pmu_online_cpu() local
695 if (pcie_pmu->on_cpu == -1) { in hisi_pcie_pmu_online_cpu()
696 pcie_pmu->on_cpu = cpumask_local_spread(0, dev_to_node(&pcie_pmu->pdev->dev)); in hisi_pcie_pmu_online_cpu()
697 WARN_ON(irq_set_affinity(pcie_pmu->irq, cpumask_of(pcie_pmu->on_cpu))); in hisi_pcie_pmu_online_cpu()
705 struct hisi_pcie_pmu *pcie_pmu = hlist_entry_safe(node, struct hisi_pcie_pmu, node); in hisi_pcie_pmu_offline_cpu() local
710 if (pcie_pmu->on_cpu != cpu) in hisi_pcie_pmu_offline_cpu()
713 pcie_pmu->on_cpu = -1; in hisi_pcie_pmu_offline_cpu()
716 numa_node = dev_to_node(&pcie_pmu->pdev->dev); in hisi_pcie_pmu_offline_cpu()
724 pci_err(pcie_pmu->pdev, "There is no CPU to set\n"); in hisi_pcie_pmu_offline_cpu()
728 perf_pmu_migrate_context(&pcie_pmu->pmu, cpu, target); in hisi_pcie_pmu_offline_cpu()
730 pcie_pmu->on_cpu = target; in hisi_pcie_pmu_offline_cpu()
731 WARN_ON(irq_set_affinity(pcie_pmu->irq, cpumask_of(target))); in hisi_pcie_pmu_offline_cpu()
818 static int hisi_pcie_alloc_pmu(struct pci_dev *pdev, struct hisi_pcie_pmu *pcie_pmu) in hisi_pcie_alloc_pmu() argument
824 regs = hisi_pcie_parse_reg_value(pcie_pmu, HISI_PCIE_REG_BDF); in hisi_pcie_alloc_pmu()
825 pcie_pmu->bdf_min = regs.lo; in hisi_pcie_alloc_pmu()
826 pcie_pmu->bdf_max = regs.hi; in hisi_pcie_alloc_pmu()
828 regs = hisi_pcie_parse_reg_value(pcie_pmu, HISI_PCIE_REG_INFO); in hisi_pcie_alloc_pmu()
836 pcie_pmu->pdev = pdev; in hisi_pcie_alloc_pmu()
837 pcie_pmu->on_cpu = -1; in hisi_pcie_alloc_pmu()
838 pcie_pmu->identifier = readl(pcie_pmu->base + HISI_PCIE_REG_VERSION); in hisi_pcie_alloc_pmu()
839 pcie_pmu->pmu = (struct pmu) { in hisi_pcie_alloc_pmu()
859 static int hisi_pcie_init_pmu(struct pci_dev *pdev, struct hisi_pcie_pmu *pcie_pmu) in hisi_pcie_init_pmu() argument
863 pcie_pmu->base = pci_ioremap_bar(pdev, 2); in hisi_pcie_init_pmu()
864 if (!pcie_pmu->base) { in hisi_pcie_init_pmu()
869 ret = hisi_pcie_alloc_pmu(pdev, pcie_pmu); in hisi_pcie_init_pmu()
873 ret = hisi_pcie_pmu_irq_register(pdev, pcie_pmu); in hisi_pcie_init_pmu()
877 ret = cpuhp_state_add_instance(CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE, &pcie_pmu->node); in hisi_pcie_init_pmu()
883 ret = perf_pmu_register(&pcie_pmu->pmu, pcie_pmu->pmu.name, -1); in hisi_pcie_init_pmu()
893 CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE, &pcie_pmu->node); in hisi_pcie_init_pmu()
896 hisi_pcie_pmu_irq_unregister(pdev, pcie_pmu); in hisi_pcie_init_pmu()
899 iounmap(pcie_pmu->base); in hisi_pcie_init_pmu()
906 struct hisi_pcie_pmu *pcie_pmu = pci_get_drvdata(pdev); in hisi_pcie_uninit_pmu() local
908 perf_pmu_unregister(&pcie_pmu->pmu); in hisi_pcie_uninit_pmu()
910 CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE, &pcie_pmu->node); in hisi_pcie_uninit_pmu()
911 hisi_pcie_pmu_irq_unregister(pdev, pcie_pmu); in hisi_pcie_uninit_pmu()
912 iounmap(pcie_pmu->base); in hisi_pcie_uninit_pmu()
938 struct hisi_pcie_pmu *pcie_pmu; in hisi_pcie_pmu_probe() local
941 pcie_pmu = devm_kzalloc(&pdev->dev, sizeof(*pcie_pmu), GFP_KERNEL); in hisi_pcie_pmu_probe()
942 if (!pcie_pmu) in hisi_pcie_pmu_probe()
949 ret = hisi_pcie_init_pmu(pdev, pcie_pmu); in hisi_pcie_pmu_probe()
953 pci_set_drvdata(pdev, pcie_pmu); in hisi_pcie_pmu_probe()