Lines Matching refs:pmu

45 #define to_ddr_pmu(p)		container_of(p, struct ddr_pmu, pmu)
57 struct pmu pmu;
75 {.compatible = "fsl,imx93-ddr-pmu", .data = &imx93_devtype_data},
84 struct ddr_pmu *pmu = dev_get_drvdata(dev);
86 return sysfs_emit(page, "%s\n", pmu->devtype_data->identifier);
104 struct ddr_pmu *pmu = dev_get_drvdata(dev);
106 return cpumap_print_to_pagebuf(true, buf, cpumask_of(pmu->cpu));
271 static void ddr_perf_clear_counter(struct ddr_pmu *pmu, int counter)
274 writel(0, pmu->base + PMC(counter) + 0x4);
275 writel(0, pmu->base + PMC(counter));
277 writel(0, pmu->base + PMC(counter));
281 static u64 ddr_perf_read_counter(struct ddr_pmu *pmu, int counter)
287 val = readl_relaxed(pmu->base + PMC(counter));
293 val_upper = readl_relaxed(pmu->base + PMC(counter) + 0x4);
294 val_lower = readl_relaxed(pmu->base + PMC(counter));
295 } while (val_upper != readl_relaxed(pmu->base + PMC(counter) + 0x4));
304 static void ddr_perf_counter_global_config(struct ddr_pmu *pmu, bool enable)
308 ctrl = readl_relaxed(pmu->base + PMGC0);
322 writel(ctrl, pmu->base + PMGC0);
330 writel(ctrl, pmu->base + PMGC0);
334 writel(ctrl, pmu->base + PMGC0);
338 static void ddr_perf_counter_local_config(struct ddr_pmu *pmu, int config,
343 ctrl_a = readl_relaxed(pmu->base + PMLCA(counter));
347 writel(ctrl_a, pmu->base + PMLCA(counter));
349 ddr_perf_clear_counter(pmu, counter);
356 writel(ctrl_a, pmu->base + PMLCA(counter));
360 writel(ctrl_a, pmu->base + PMLCA(counter));
364 static void ddr_perf_monitor_config(struct ddr_pmu *pmu, int cfg, int cfg1, int cfg2)
372 pmcfg1 = readl_relaxed(pmu->base + PMCFG1);
391 writel(pmcfg1, pmu->base + PMCFG1);
393 pmcfg2 = readl_relaxed(pmu->base + PMCFG2);
396 writel(pmcfg2, pmu->base + PMCFG2);
401 struct ddr_pmu *pmu = to_ddr_pmu(event->pmu);
406 new_raw_count = ddr_perf_read_counter(pmu, counter);
410 ddr_perf_clear_counter(pmu, counter);
415 struct ddr_pmu *pmu = to_ddr_pmu(event->pmu);
419 if (event->attr.type != event->pmu->type)
426 dev_warn(pmu->dev, "Can't provide per-task data!\n");
435 if (event->group_leader->pmu != event->pmu &&
440 if (sibling->pmu != event->pmu &&
445 event->cpu = pmu->cpu;
453 struct ddr_pmu *pmu = to_ddr_pmu(event->pmu);
459 ddr_perf_counter_local_config(pmu, event->attr.config, counter, true);
465 struct ddr_pmu *pmu = to_ddr_pmu(event->pmu);
474 pmu->events[counter] = event;
475 pmu->active_events++;
483 ddr_perf_monitor_config(pmu, cfg, cfg1, cfg2);
490 struct ddr_pmu *pmu = to_ddr_pmu(event->pmu);
494 ddr_perf_counter_local_config(pmu, event->attr.config, counter, false);
502 struct ddr_pmu *pmu = to_ddr_pmu(event->pmu);
507 pmu->active_events--;
511 static void ddr_perf_pmu_enable(struct pmu *pmu)
513 struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu);
518 static void ddr_perf_pmu_disable(struct pmu *pmu)
520 struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu);
525 static void ddr_perf_init(struct ddr_pmu *pmu, void __iomem *base,
528 *pmu = (struct ddr_pmu) {
529 .pmu = (struct pmu) {
550 struct ddr_pmu *pmu = (struct ddr_pmu *)p;
566 if (!pmu->events[i])
569 event = pmu->events[i];
574 ddr_perf_counter_global_config(pmu, true);
581 struct ddr_pmu *pmu = hlist_entry_safe(node, struct ddr_pmu, node);
584 if (cpu != pmu->cpu)
591 perf_pmu_migrate_context(&pmu->pmu, cpu, target);
592 pmu->cpu = target;
594 WARN_ON(irq_set_affinity(pmu->irq, cpumask_of(pmu->cpu)));
601 struct ddr_pmu *pmu;
610 pmu = devm_kzalloc(&pdev->dev, sizeof(*pmu), GFP_KERNEL);
611 if (!pmu)
614 ddr_perf_init(pmu, base, &pdev->dev);
616 pmu->devtype_data = of_device_get_match_data(&pdev->dev);
618 platform_set_drvdata(pdev, pmu);
620 pmu->id = ida_alloc(&ddr_ida, GFP_KERNEL);
621 name = devm_kasprintf(&pdev->dev, GFP_KERNEL, DDR_PERF_DEV_NAME "%d", pmu->id);
627 pmu->cpu = raw_smp_processor_id();
634 pmu->cpuhp_state = ret;
636 /* Register the pmu instance for cpu hotplug */
637 ret = cpuhp_state_add_instance_nocalls(pmu->cpuhp_state, &pmu->node);
652 DDR_CPUHP_CB_NAME, pmu);
658 pmu->irq = irq;
659 ret = irq_set_affinity(pmu->irq, cpumask_of(pmu->cpu));
661 dev_err(pmu->dev, "Failed to set interrupt affinity\n");
665 ret = perf_pmu_register(&pmu->pmu, name, -1);
672 cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node);
674 cpuhp_remove_multi_state(pmu->cpuhp_state);
677 ida_free(&ddr_ida, pmu->id);
684 struct ddr_pmu *pmu = platform_get_drvdata(pdev);
686 cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node);
687 cpuhp_remove_multi_state(pmu->cpuhp_state);
689 perf_pmu_unregister(&pmu->pmu);
691 ida_free(&ddr_ida, pmu->id);
696 .name = "imx9-ddr-pmu",