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

Jean Pihet jpihet at mvista.com
Thu Jan 21 07:21:44 EST 2010


On Thursday 21 January 2010 11:38:03 Russell King - ARM Linux wrote:
> On Thu, Jan 21, 2010 at 10:28:26AM -0000, Will Deacon wrote:
> > Hi Jamie,
> >
> > * Jamie Iles wrote:
> > > 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
> >
> > Whilst I understand that the whole cpuid thing is a complete mess [I saw
> > the lkml posts yesterday], I'm not sure this is necessary for v7 cores.
> > For v7, the PMU is part of the architecture and so *must* be implemented
> > in the way described in the ARM ARM [Chapter 9], regardless of the
> > implementer.
>
> This function is called whenever the PMU support is built in - and
> this is the first place a decision is made about how to handle stuff.
>
> Merely checking the part number without checking the implementer is
> nonsense - the part number is defined by the implmenter, not ARM, so
> the part number can only be interpreted with knowledge of the
> implementer.
>
> So, when v7 gets added, checking the main ID register is the wrong
> thing to do.
>
> Given that cpu_architecture() appears to have been redefined to return
> the MMU architecture, we have no real way to properly determine if we
> have a v7 PMU present - in fact, the whole "are we v6 or v7 or something
> later" question seems to be extremely muddy and indeterminant.
>
> So I don't think even checking cpu_architecture() == CPU_ARCH_ARMv7
> is the right thing either.
Agree. Here is the latest version of the detection code, after merging Jamie's 
latest version:

        unsigned long cpuid = read_cpuid_id() & CPUID_MASK;

        switch (cpuid) {
        case 0xB360:    /* ARM1136 */
        case 0xB560:    /* ARM1156 */
        case 0xB760:    /* ARM1176 */
	    ...
                break;
        case 0xB020:    /* ARM11mpcore */
	    ...
                break;
        case 0xC080:    /* Cortex-A8 */
	    ...
                break;
        case 0xC090:    /* Cortex-A9 */
	    ...
                break;
        default:
                pr_info("no hardware support available\n");
                perf_max_events = -1;
       }
       ...

Is that OK if we just add 'if (implementor == 0x41) {' before the switch 
statement, as proposed above?

Jean




More information about the linux-arm-kernel mailing list