• Home
  • Raw
  • Download

Lines Matching +full:spe +full:- +full:pmu

1 // SPDX-License-Identifier: GPL-2.0-only
28 gsi = gicc->performance_interrupt; in arm_pmu_acpi_register_irq()
31 * Per the ACPI spec, the MADT cannot describe a PMU that doesn't in arm_pmu_acpi_register_irq()
40 if (gicc->flags & ACPI_MADT_PERFORMANCE_IRQ_MODE) in arm_pmu_acpi_register_irq()
66 gsi = gicc->performance_interrupt; in arm_pmu_acpi_unregister_irq()
81 .id = -1,
87 * For lack of a better place, hook the normal PMU MADT walk
88 * and create a SPE device if we detect a recent MADT with
99 * For now, we only support homogeneous ACPI/SPE machines. in arm_spe_acpi_register_device()
105 if (gicc->header.length < ACPI_MADT_GICC_SPE) in arm_spe_acpi_register_device()
109 gsi = gicc->spe_interrupt; in arm_spe_acpi_register_device()
114 } else if ((gsi != gicc->spe_interrupt) || in arm_spe_acpi_register_device()
116 pr_warn("ACPI: SPE must be homogeneous\n"); in arm_spe_acpi_register_device()
124 pr_warn("ACPI: SPE Unable to register interrupt: %d\n", gsi); in arm_spe_acpi_register_device()
131 pr_warn("ACPI: SPE: Unable to register device\n"); in arm_spe_acpi_register_device()
149 pr_warn("Unable to parse ACPI PMU IRQ for CPU%d: %d\n", in arm_pmu_acpi_parse_irqs()
153 pr_warn("No ACPI PMU IRQ for CPU%d\n", cpu); in arm_pmu_acpi_parse_irqs()
158 * it. We'll have to sanity-check IRQs later when we associate in arm_pmu_acpi_parse_irqs()
191 struct arm_pmu *pmu; in arm_pmu_acpi_find_alloc_pmu() local
195 pmu = per_cpu(probed_pmus, cpu); in arm_pmu_acpi_find_alloc_pmu()
196 if (!pmu || pmu->acpi_cpuid != cpuid) in arm_pmu_acpi_find_alloc_pmu()
199 return pmu; in arm_pmu_acpi_find_alloc_pmu()
202 pmu = armpmu_alloc_atomic(); in arm_pmu_acpi_find_alloc_pmu()
203 if (!pmu) { in arm_pmu_acpi_find_alloc_pmu()
204 pr_warn("Unable to allocate PMU for CPU%d\n", in arm_pmu_acpi_find_alloc_pmu()
209 pmu->acpi_cpuid = cpuid; in arm_pmu_acpi_find_alloc_pmu()
211 return pmu; in arm_pmu_acpi_find_alloc_pmu()
216 * the PMU (e.g. we don't have mismatched PPIs).
218 static bool pmu_irq_matches(struct arm_pmu *pmu, int irq) in pmu_irq_matches() argument
220 struct pmu_hw_events __percpu *hw_events = pmu->hw_events; in pmu_irq_matches()
226 for_each_cpu(cpu, &pmu->supported_cpus) { in pmu_irq_matches()
227 int other_irq = per_cpu(hw_events->irq, cpu); in pmu_irq_matches()
254 struct arm_pmu *pmu; in arm_pmu_acpi_cpu_starting() local
264 pmu = arm_pmu_acpi_find_alloc_pmu(); in arm_pmu_acpi_cpu_starting()
265 if (!pmu) in arm_pmu_acpi_cpu_starting()
266 return -ENOMEM; in arm_pmu_acpi_cpu_starting()
268 per_cpu(probed_pmus, cpu) = pmu; in arm_pmu_acpi_cpu_starting()
270 if (pmu_irq_matches(pmu, irq)) { in arm_pmu_acpi_cpu_starting()
271 hw_events = pmu->hw_events; in arm_pmu_acpi_cpu_starting()
272 per_cpu(hw_events->irq, cpu) = irq; in arm_pmu_acpi_cpu_starting()
275 cpumask_set_cpu(cpu, &pmu->supported_cpus); in arm_pmu_acpi_cpu_starting()
278 * Ideally, we'd probe the PMU here when we find the first matching in arm_pmu_acpi_cpu_starting()
300 * without tying this too deeply into the "real" PMU driver. in arm_pmu_acpi_probe()
303 * of a PMU's CPUs to be online at probe time. in arm_pmu_acpi_probe()
306 struct arm_pmu *pmu = per_cpu(probed_pmus, cpu); in arm_pmu_acpi_probe() local
309 if (!pmu || pmu->name) in arm_pmu_acpi_probe()
312 ret = init_fn(pmu); in arm_pmu_acpi_probe()
313 if (ret == -ENODEV) { in arm_pmu_acpi_probe()
314 /* PMU not handled by this driver, or not present */ in arm_pmu_acpi_probe()
317 pr_warn("Unable to initialise PMU for CPU%d\n", cpu); in arm_pmu_acpi_probe()
321 base_name = pmu->name; in arm_pmu_acpi_probe()
322 pmu->name = kasprintf(GFP_KERNEL, "%s_%d", base_name, pmu_idx++); in arm_pmu_acpi_probe()
323 if (!pmu->name) { in arm_pmu_acpi_probe()
324 pr_warn("Unable to allocate PMU name for CPU%d\n", cpu); in arm_pmu_acpi_probe()
325 return -ENOMEM; in arm_pmu_acpi_probe()
328 ret = armpmu_register(pmu); in arm_pmu_acpi_probe()
330 pr_warn("Failed to register PMU for CPU%d\n", cpu); in arm_pmu_acpi_probe()
331 kfree(pmu->name); in arm_pmu_acpi_probe()