staticint probe_current_pmu(struct arm_pmu *pmu, conststruct pmu_probe_info *info)
{ int cpu = get_cpu(); unsignedint cpuid = read_cpuid_id(); int ret = -ENODEV;
pr_info("probing PMU on CPU %d\n", cpu);
for (; info->init != NULL; info++) { if ((cpuid & info->mask) != info->cpuid) continue;
ret = info->init(pmu); break;
}
put_cpu(); return ret;
}
staticint pmu_parse_percpu_irq(struct arm_pmu *pmu, int irq)
{ int cpu, ret; struct pmu_hw_events __percpu *hw_events = pmu->hw_events;
ret = irq_get_percpu_devid_partition(irq, &pmu->supported_cpus); if (ret) return ret;
ret = pmu_parse_irqs(pmu); if (ret) goto out_free;
init_fn = of_device_get_match_data(dev); if (init_fn) {
pmu->secure_access = of_property_read_bool(dev->of_node, "secure-reg-access");
/* arm64 systems boot only as non-secure */ if (IS_ENABLED(CONFIG_ARM64) && pmu->secure_access) {
dev_warn(dev, "ignoring \"secure-reg-access\" property for arm64\n");
pmu->secure_access = false;
}
ret = init_fn(pmu);
} elseif (probe_table) {
cpumask_setall(&pmu->supported_cpus);
ret = probe_current_pmu(pmu, probe_table);
}
if (ret) {
dev_err(dev, "failed to probe PMU!\n"); goto out_free;
}
ret = armpmu_request_irqs(pmu); if (ret) goto out_free_irqs;
ret = armpmu_register(pmu); if (ret) {
dev_err(dev, "failed to register PMU devices!\n"); goto out_free_irqs;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.