Lines Matching defs:dsu_pmu
99 * struct dsu_pmu - DSU PMU descriptor
113 struct dsu_pmu {
128 static inline struct dsu_pmu *to_dsu_pmu(struct pmu *pmu)
130 return container_of(pmu, struct dsu_pmu, pmu);
157 struct dsu_pmu *dsu_pmu = to_dsu_pmu(pmu);
165 cpumask = &dsu_pmu->active_cpu;
168 cpumask = &dsu_pmu->associated_cpus;
203 struct dsu_pmu *dsu_pmu = to_dsu_pmu(pmu);
208 return test_bit(evt, dsu_pmu->cpmceid_bitmap) ? attr->mode : 0;
234 static int dsu_pmu_get_online_cpu_any_but(struct dsu_pmu *dsu_pmu, int cpu)
239 &dsu_pmu->associated_cpus, cpu_online_mask);
243 static inline bool dsu_pmu_counter_valid(struct dsu_pmu *dsu_pmu, u32 idx)
245 return (idx < dsu_pmu->num_counters) ||
253 struct dsu_pmu *dsu_pmu = to_dsu_pmu(event->pmu);
257 &dsu_pmu->associated_cpus)))
260 if (!dsu_pmu_counter_valid(dsu_pmu, idx)) {
266 raw_spin_lock_irqsave(&dsu_pmu->pmu_lock, flags);
271 raw_spin_unlock_irqrestore(&dsu_pmu->pmu_lock, flags);
279 struct dsu_pmu *dsu_pmu = to_dsu_pmu(event->pmu);
283 &dsu_pmu->associated_cpus)))
286 if (!dsu_pmu_counter_valid(dsu_pmu, idx)) {
292 raw_spin_lock_irqsave(&dsu_pmu->pmu_lock, flags);
297 raw_spin_unlock_irqrestore(&dsu_pmu->pmu_lock, flags);
305 struct dsu_pmu *dsu_pmu = to_dsu_pmu(event->pmu);
314 idx = find_first_zero_bit(used_mask, dsu_pmu->num_counters);
315 if (idx >= dsu_pmu->num_counters)
321 static void dsu_pmu_enable_counter(struct dsu_pmu *dsu_pmu, int idx)
327 static void dsu_pmu_disable_counter(struct dsu_pmu *dsu_pmu, int idx)
333 static inline void dsu_pmu_set_event(struct dsu_pmu *dsu_pmu,
339 if (!dsu_pmu_counter_valid(dsu_pmu, idx)) {
345 raw_spin_lock_irqsave(&dsu_pmu->pmu_lock, flags);
347 raw_spin_unlock_irqrestore(&dsu_pmu->pmu_lock, flags);
395 struct dsu_pmu *dsu_pmu = dev;
396 struct dsu_hw_events *hw_events = &dsu_pmu->hw_events;
418 struct dsu_pmu *dsu_pmu = to_dsu_pmu(event->pmu);
425 dsu_pmu_set_event(dsu_pmu, event);
427 dsu_pmu_enable_counter(dsu_pmu, event->hw.idx);
432 struct dsu_pmu *dsu_pmu = to_dsu_pmu(event->pmu);
436 dsu_pmu_disable_counter(dsu_pmu, event->hw.idx);
443 struct dsu_pmu *dsu_pmu = to_dsu_pmu(event->pmu);
444 struct dsu_hw_events *hw_events = &dsu_pmu->hw_events;
449 &dsu_pmu->associated_cpus)))
469 struct dsu_pmu *dsu_pmu = to_dsu_pmu(event->pmu);
470 struct dsu_hw_events *hw_events = &dsu_pmu->hw_events;
484 struct dsu_pmu *dsu_pmu = to_dsu_pmu(pmu);
487 if (bitmap_empty(dsu_pmu->hw_events.used_mask, DSU_PMU_MAX_HW_CNTRS))
490 raw_spin_lock_irqsave(&dsu_pmu->pmu_lock, flags);
494 raw_spin_unlock_irqrestore(&dsu_pmu->pmu_lock, flags);
501 struct dsu_pmu *dsu_pmu = to_dsu_pmu(pmu);
503 raw_spin_lock_irqsave(&dsu_pmu->pmu_lock, flags);
507 raw_spin_unlock_irqrestore(&dsu_pmu->pmu_lock, flags);
546 struct dsu_pmu *dsu_pmu = to_dsu_pmu(event->pmu);
553 dev_dbg(dsu_pmu->pmu.dev, "Can't support sampling events\n");
559 dev_dbg(dsu_pmu->pmu.dev, "Can't support per-task counters\n");
564 dev_dbg(dsu_pmu->pmu.dev, "Can't support filtering\n");
568 if (!cpumask_test_cpu(event->cpu, &dsu_pmu->associated_cpus)) {
569 dev_dbg(dsu_pmu->pmu.dev,
579 event->cpu = cpumask_first(&dsu_pmu->active_cpu);
589 static struct dsu_pmu *dsu_pmu_alloc(struct platform_device *pdev)
591 struct dsu_pmu *dsu_pmu;
593 dsu_pmu = devm_kzalloc(&pdev->dev, sizeof(*dsu_pmu), GFP_KERNEL);
594 if (!dsu_pmu)
597 raw_spin_lock_init(&dsu_pmu->pmu_lock);
602 dsu_pmu->num_counters = -1;
603 return dsu_pmu;
669 static void dsu_pmu_probe_pmu(struct dsu_pmu *dsu_pmu)
679 dsu_pmu->num_counters = num_counters;
680 if (!dsu_pmu->num_counters)
684 bitmap_from_arr32(dsu_pmu->cpmceid_bitmap, cpmceid,
688 static void dsu_pmu_set_active_cpu(int cpu, struct dsu_pmu *dsu_pmu)
690 cpumask_set_cpu(cpu, &dsu_pmu->active_cpu);
691 if (irq_set_affinity_hint(dsu_pmu->irq, &dsu_pmu->active_cpu))
699 static void dsu_pmu_init_pmu(struct dsu_pmu *dsu_pmu)
701 if (dsu_pmu->num_counters == -1)
702 dsu_pmu_probe_pmu(dsu_pmu);
710 struct dsu_pmu *dsu_pmu;
715 dsu_pmu = dsu_pmu_alloc(pdev);
716 if (IS_ERR(dsu_pmu))
717 return PTR_ERR(dsu_pmu);
723 rc = dsu_pmu_dt_get_cpus(&pdev->dev, &dsu_pmu->associated_cpus);
725 rc = dsu_pmu_acpi_get_cpus(&pdev->dev, &dsu_pmu->associated_cpus);
743 IRQF_NOBALANCING, name, dsu_pmu);
749 dsu_pmu->irq = irq;
750 platform_set_drvdata(pdev, dsu_pmu);
752 &dsu_pmu->cpuhp_node);
756 dsu_pmu->pmu = (struct pmu) {
772 rc = perf_pmu_register(&dsu_pmu->pmu, name, -1);
775 &dsu_pmu->cpuhp_node);
776 irq_set_affinity_hint(dsu_pmu->irq, NULL);
784 struct dsu_pmu *dsu_pmu = platform_get_drvdata(pdev);
786 perf_pmu_unregister(&dsu_pmu->pmu);
787 cpuhp_state_remove_instance(dsu_pmu_cpuhp_state, &dsu_pmu->cpuhp_node);
788 irq_set_affinity_hint(dsu_pmu->irq, NULL);
820 struct dsu_pmu *dsu_pmu = hlist_entry_safe(node, struct dsu_pmu,
823 if (!cpumask_test_cpu(cpu, &dsu_pmu->associated_cpus))
827 if (!cpumask_empty(&dsu_pmu->active_cpu))
830 dsu_pmu_init_pmu(dsu_pmu);
831 dsu_pmu_set_active_cpu(cpu, dsu_pmu);
839 struct dsu_pmu *dsu_pmu = hlist_entry_safe(node, struct dsu_pmu,
842 if (!cpumask_test_and_clear_cpu(cpu, &dsu_pmu->active_cpu))
845 dst = dsu_pmu_get_online_cpu_any_but(dsu_pmu, cpu);
848 irq_set_affinity_hint(dsu_pmu->irq, NULL);
852 perf_pmu_migrate_context(&dsu_pmu->pmu, cpu, dst);
853 dsu_pmu_set_active_cpu(dst, dsu_pmu);