[PATCH 1/3] arm64: add MIDR_EL1 field accessors
Will Deacon
will.deacon at arm.com
Mon May 12 08:05:14 PDT 2014
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.
Will
More information about the linux-arm-kernel
mailing list