[PATCH 1/3] arm64: add MIDR_EL1 field accessors
Mark Rutland
mark.rutland at arm.com
Mon May 12 08:22:42 PDT 2014
On Mon, May 12, 2014 at 04:05:14PM +0100, Will Deacon wrote:
> On Mon, May 12, 2014 at 03:37:48PM +0100, Mark Rutland wrote:
> > The MIDR_EL1 register is composed of a number of bitfields, and uses of
> > the fields has so far involved open-coding of the shifts and masks
> > required.
> >
> > This patch adds shifts and masks for each of the MIDR_EL1 subfields, and
> > also provides accessors built atop of these. Existing uses within
> > cputype.h are updated to use these accessors.
> >
> > Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> > ---
> > arch/arm64/include/asm/cputype.h | 27 +++++++++++++++++++++++++--
> > 1 file changed, 25 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h
> > index c404fb0..541b829 100644
> > --- a/arch/arm64/include/asm/cputype.h
> > +++ b/arch/arm64/include/asm/cputype.h
> > @@ -36,6 +36,25 @@
> > __val; \
> > })
> >
> > +#define MIDR_REVISION_MASK 0xf
> > +#define MIDR_REVISION(midr) ((midr) & MIDR_REVISION_MASK)
> > +#define MIDR_PARTNUM_SHIFT 4
> > +#define MIDR_PARTNUM_MASK (0xfff << MIDR_PARTNUM_SHIFT)
> > +#define MIDR_PARTNUM(midr) \
> > + (((midr) & MIDR_PARTNUM_MASK) >> MIDR_PARTNUM_SHIFT)
> > +#define MIDR_ARCHITECTURE_SHIFT 16
> > +#define MIDR_ARCHITECTURE_MASK (0xf << MIDR_ARCHITECTURE_SHIFT)
> > +#define MIDR_ARCHITECTURE(midr) \
> > + (((midr) & MIDR_ARCHITECTURE_MASK) >> MIDR_ARCHITECTURE_SHIFT)
> > +#define MIDR_VARIANT_SHIFT 20
> > +#define MIDR_VARIANT_MASK (0xf << MIDR_VARIANT_SHIFT)
> > +#define MIDR_VARIANT(midr) \
> > + (((midr) & MIDR_VARIANT_MASK) >> MIDR_VARIANT_SHIFT)
> > +#define MIDR_IMPLEMENTOR_SHIFT 24
> > +#define MIDR_IMPLEMENTOR_MASK (0xff << MIDR_IMPLEMENTOR_SHIFT)
> > +#define MIDR_IMPLEMENTOR(midr) \
> > + (((midr) & MIDR_IMPLEMENTOR_MASK) >> MIDR_IMPLEMENTOR_SHIFT)
> > +
> > #define ARM_CPU_IMP_ARM 0x41
> > #define ARM_CPU_IMP_APM 0x50
> >
> > @@ -64,12 +83,16 @@ static inline u64 __attribute_const__ read_cpuid_mpidr(void)
> >
> > static inline unsigned int __attribute_const__ read_cpuid_implementor(void)
> > {
> > - return (read_cpuid_id() & 0xFF000000) >> 24;
> > + return MIDR_IMPLEMENTOR(read_cpuid_id());
> > }
> >
> > static inline unsigned int __attribute_const__ read_cpuid_part_number(void)
> > {
> > - return (read_cpuid_id() & 0xFFF0);
> > + /*
> > + * The part number field is used in-place as a userspace ABI, so we
> > + * cannot use MIDR_PARTNUM() here.
> > + */
> > + return (read_cpuid_id() & MIDR_PARTNUM_MASK);
>
> Where is this used as ABI? c_show is open-coded and kvm_target_cpu could
> just add a shift left.
For some reason I thought this was called by some code included from
arch/arm, but that doesn't seem to be the case.
I'll add the left shift in kvm_target_cpu instead.
Cheers,
Mark.
More information about the linux-arm-kernel
mailing list