Message ID | 1413897084-19715-3-git-send-email-mark.rutland@arm.com |
---|---|
State | New |
Headers | show |
On 10/21/2014 06:11 AM, Mark Rutland wrote: > diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c > index 4bf4cce..79c1cf4 100644 > --- a/arch/arm/kernel/perf_event_cpu.c > +++ b/arch/arm/kernel/perf_event_cpu.c > @@ -241,48 +241,34 @@ static struct platform_device_id cpu_pmu_plat_device_ids[] = { > {}, > }; > > +static struct pmu_probe_info pmu_probe_table[] = { const? > + ARM_PMU_PROBE(ARM_CPU_PART_ARM1136, armv6_1136_pmu_init), > + ARM_PMU_PROBE(ARM_CPU_PART_ARM1156, armv6_1156_pmu_init), > + ARM_PMU_PROBE(ARM_CPU_PART_ARM1176, armv6_1176_pmu_init), > + ARM_PMU_PROBE(ARM_CPU_PART_ARM11MPCORE, armv6mpcore_pmu_init), > + ARM_PMU_PROBE(ARM_CPU_PART_CORTEX_A8, armv7_a8_pmu_init), > + ARM_PMU_PROBE(ARM_CPU_PART_CORTEX_A9, armv7_a9_pmu_init), > + XSCALE_PMU_PROBE(ARM_CPU_XSCALE_ARCH_V1, xscale1pmu_init), > + XSCALE_PMU_PROBE(ARM_CPU_XSCALE_ARCH_V2, xscale2pmu_init), > + { /* sentinel value */ } > +}; > + > /* > * CPU PMU identification and probing. > */ > static int probe_current_pmu(struct arm_pmu *pmu) > { > int cpu = get_cpu(); > + unsigned int cpuid = read_cpuid_id(); > int ret = -ENODEV; > + struct pmu_probe_info *info; > > - pr_info("probing PMU on CPU %d\n", cpu); > + pr_info("probing PMU on CPU %d", cpu); Why drop the newline? Looks like all the other prints in this file are missing the newline.
On Tue, Oct 21, 2014 at 10:25:02PM +0100, Stephen Boyd wrote: > On 10/21/2014 06:11 AM, Mark Rutland wrote: > > diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c > > index 4bf4cce..79c1cf4 100644 > > --- a/arch/arm/kernel/perf_event_cpu.c > > +++ b/arch/arm/kernel/perf_event_cpu.c > > @@ -241,48 +241,34 @@ static struct platform_device_id cpu_pmu_plat_device_ids[] = { > > {}, > > }; > > > > +static struct pmu_probe_info pmu_probe_table[] = { > > const? Sure. Done. > > + ARM_PMU_PROBE(ARM_CPU_PART_ARM1136, armv6_1136_pmu_init), > > + ARM_PMU_PROBE(ARM_CPU_PART_ARM1156, armv6_1156_pmu_init), > > + ARM_PMU_PROBE(ARM_CPU_PART_ARM1176, armv6_1176_pmu_init), > > + ARM_PMU_PROBE(ARM_CPU_PART_ARM11MPCORE, armv6mpcore_pmu_init), > > + ARM_PMU_PROBE(ARM_CPU_PART_CORTEX_A8, armv7_a8_pmu_init), > > + ARM_PMU_PROBE(ARM_CPU_PART_CORTEX_A9, armv7_a9_pmu_init), > > + XSCALE_PMU_PROBE(ARM_CPU_XSCALE_ARCH_V1, xscale1pmu_init), > > + XSCALE_PMU_PROBE(ARM_CPU_XSCALE_ARCH_V2, xscale2pmu_init), > > + { /* sentinel value */ } > > +}; > > + > > /* > > * CPU PMU identification and probing. > > */ > > static int probe_current_pmu(struct arm_pmu *pmu) > > { > > int cpu = get_cpu(); > > + unsigned int cpuid = read_cpuid_id(); > > int ret = -ENODEV; > > + struct pmu_probe_info *info; > > > > - pr_info("probing PMU on CPU %d\n", cpu); > > + pr_info("probing PMU on CPU %d", cpu); > > Why drop the newline? Unintentional -- at one point I'd changed the print while debugging and must have messed up trying to restore it to its original state. I've restored the newline locally. > Looks like all the other prints in this file are missing the newline. Hmm. All other pr_info instances are missing newlines, but pr_err and pr_warning instances have them. It looks like we get lucky with the next print having a log prefix, and this causing the existing text to be flushed. I'll put together a cleanup patch introducing the relevant newlines. Thanks, Mark.
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index 0b648c5..ff39290 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h @@ -15,6 +15,8 @@ #include <linux/interrupt.h> #include <linux/perf_event.h> +#include <asm/cputype.h> + /* * struct arm_pmu_platdata - ARM PMU platform data * @@ -127,6 +129,27 @@ int armpmu_map_event(struct perf_event *event, [PERF_COUNT_HW_CACHE_RESULT_MAX], u32 raw_event_mask); +struct pmu_probe_info { + unsigned int cpuid; + unsigned int mask; + int (*init)(struct arm_pmu *); +}; + +#define PMU_PROBE(_cpuid, _mask, _fn) \ +{ \ + .cpuid = (_cpuid), \ + .mask = (_mask), \ + .init = (_fn), \ +} + +#define ARM_PMU_PROBE(_cpuid, _fn) \ + PMU_PROBE(_cpuid, ARM_CPU_PART_MASK, _fn) + +#define ARM_PMU_XSCALE_MASK ((0xff << 24) | ARM_CPU_XSCALE_ARCH_MASK) + +#define XSCALE_PMU_PROBE(_version, _fn) \ + PMU_PROBE(ARM_CPU_IMP_INTEL << 24 | _version, ARM_PMU_XSCALE_MASK, _fn) + #endif /* CONFIG_HW_PERF_EVENTS */ #endif /* __ARM_PMU_H__ */ diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index 4bf4cce..79c1cf4 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c @@ -241,48 +241,34 @@ static struct platform_device_id cpu_pmu_plat_device_ids[] = { {}, }; +static struct pmu_probe_info pmu_probe_table[] = { + ARM_PMU_PROBE(ARM_CPU_PART_ARM1136, armv6_1136_pmu_init), + ARM_PMU_PROBE(ARM_CPU_PART_ARM1156, armv6_1156_pmu_init), + ARM_PMU_PROBE(ARM_CPU_PART_ARM1176, armv6_1176_pmu_init), + ARM_PMU_PROBE(ARM_CPU_PART_ARM11MPCORE, armv6mpcore_pmu_init), + ARM_PMU_PROBE(ARM_CPU_PART_CORTEX_A8, armv7_a8_pmu_init), + ARM_PMU_PROBE(ARM_CPU_PART_CORTEX_A9, armv7_a9_pmu_init), + XSCALE_PMU_PROBE(ARM_CPU_XSCALE_ARCH_V1, xscale1pmu_init), + XSCALE_PMU_PROBE(ARM_CPU_XSCALE_ARCH_V2, xscale2pmu_init), + { /* sentinel value */ } +}; + /* * CPU PMU identification and probing. */ static int probe_current_pmu(struct arm_pmu *pmu) { int cpu = get_cpu(); + unsigned int cpuid = read_cpuid_id(); int ret = -ENODEV; + struct pmu_probe_info *info; - pr_info("probing PMU on CPU %d\n", cpu); + pr_info("probing PMU on CPU %d", cpu); - switch (read_cpuid_part()) { - /* ARM Ltd CPUs. */ - case ARM_CPU_PART_ARM1136: - ret = armv6_1136_pmu_init(pmu); - break; - case ARM_CPU_PART_ARM1156: - ret = armv6_1156_pmu_init(pmu); - break; - case ARM_CPU_PART_ARM1176: - ret = armv6_1176_pmu_init(pmu); - break; - case ARM_CPU_PART_ARM11MPCORE: - ret = armv6mpcore_pmu_init(pmu); - break; - case ARM_CPU_PART_CORTEX_A8: - ret = armv7_a8_pmu_init(pmu); - break; - case ARM_CPU_PART_CORTEX_A9: - ret = armv7_a9_pmu_init(pmu); - break; - - default: - if (read_cpuid_implementor() == ARM_CPU_IMP_INTEL) { - switch (xscale_cpu_arch_version()) { - case ARM_CPU_XSCALE_ARCH_V1: - ret = xscale1pmu_init(pmu); - break; - case ARM_CPU_XSCALE_ARCH_V2: - ret = xscale2pmu_init(pmu); - break; - } - } + for (info = pmu_probe_table; info->init != NULL; info++) { + if ((cpuid & info->mask) != info->cpuid) + continue; + ret = info->init(pmu); break; }