[PATCH 5/5] arm/perfevents: implement perf event support for ARMv6

Jamie Iles jamie at jamieiles.com
Thu Jan 21 04:39:17 EST 2010


On Thu, Jan 14, 2010 at 12:14:16PM +0000, Jamie Iles wrote:
> This patch implements support for ARMv6 performance counters in the
> Linux performance events subsystem. ARMv6 architectures that have the
> performance counters should enable HW_PERF_EVENTS and define the
> interrupts for the counters in arch/arm/kernel/perf_event.c
The commit message needs a tweak before submitting as the IRQs are listed in
arch/arm/kernel/pmu.c now rather than perf_event.c.

> +static int __init
> +init_hw_perf_events(void)
> +{
> +#define CPUID_MASK	0xFFF0
> +	unsigned long cpuid = read_cpuid_id() & CPUID_MASK;
> +
> +	switch (cpuid) {
> +	case 0xB360:	/* ARM1136 */
> +	case 0xB560:	/* ARM1156 */
> +	case 0xB760:	/* ARM1176 */
> +		armpmu = &armv6pmu;
> +		memcpy(armpmu_perf_cache_map, armv6_perf_cache_map,
> +				sizeof(armv6_perf_cache_map));
> +		perf_max_events	= armv6pmu.num_events;
> +		break;
> +	case 0xB020:	/* ARM11mpcore */
> +		armpmu = &armv6mpcore_pmu;
> +		memcpy(armpmu_perf_cache_map, armv6mpcore_perf_cache_map,
> +				sizeof(armv6mpcore_perf_cache_map));
> +		perf_max_events = armv6mpcore_pmu.num_events;
> +		break;
> +	default:
> +		pr_info("no hardware support available\n");
> +		perf_max_events = -1;
> +	}
> +
> +	if (armpmu)
> +		pr_info("enabled with %s PMU driver\n",
> +				armpmu->name);
> +
> +	return 0;
> +}
> +arch_initcall(init_hw_perf_events);
Given the difficulty in determining the CPU type 100%, this should be changed
to:

	unsigned long cpuid = read_cpuid_id();
	unsigned long implementor = (cpuid & 0xFF000000) >> 24;
	unsigned long part_number = (cpuid & 0xFFF0);
	
	/* We only support ARM CPUs implemented by ARM at the moment. */
	if (implementor == 0x41) {
		switch (part_number) {
		case 0xB360:
		case 0xB560:
			etc

Jamie



More information about the linux-arm-kernel mailing list