0001
0002
0003
0004
0005 #ifndef __ASM_CPUTYPE_H
0006 #define __ASM_CPUTYPE_H
0007
0008 #define INVALID_HWID ULONG_MAX
0009
0010 #define MPIDR_UP_BITMASK (0x1 << 30)
0011 #define MPIDR_MT_BITMASK (0x1 << 24)
0012 #define MPIDR_HWID_BITMASK UL(0xff00ffffff)
0013
0014 #define MPIDR_LEVEL_BITS_SHIFT 3
0015 #define MPIDR_LEVEL_BITS (1 << MPIDR_LEVEL_BITS_SHIFT)
0016 #define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1)
0017
0018 #define MPIDR_LEVEL_SHIFT(level) \
0019 (((1 << level) >> 1) << MPIDR_LEVEL_BITS_SHIFT)
0020
0021 #define MPIDR_AFFINITY_LEVEL(mpidr, level) \
0022 ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & MPIDR_LEVEL_MASK)
0023
0024 #define MIDR_REVISION_MASK 0xf
0025 #define MIDR_REVISION(midr) ((midr) & MIDR_REVISION_MASK)
0026 #define MIDR_PARTNUM_SHIFT 4
0027 #define MIDR_PARTNUM_MASK (0xfff << MIDR_PARTNUM_SHIFT)
0028 #define MIDR_PARTNUM(midr) \
0029 (((midr) & MIDR_PARTNUM_MASK) >> MIDR_PARTNUM_SHIFT)
0030 #define MIDR_ARCHITECTURE_SHIFT 16
0031 #define MIDR_ARCHITECTURE_MASK (0xf << MIDR_ARCHITECTURE_SHIFT)
0032 #define MIDR_ARCHITECTURE(midr) \
0033 (((midr) & MIDR_ARCHITECTURE_MASK) >> MIDR_ARCHITECTURE_SHIFT)
0034 #define MIDR_VARIANT_SHIFT 20
0035 #define MIDR_VARIANT_MASK (0xf << MIDR_VARIANT_SHIFT)
0036 #define MIDR_VARIANT(midr) \
0037 (((midr) & MIDR_VARIANT_MASK) >> MIDR_VARIANT_SHIFT)
0038 #define MIDR_IMPLEMENTOR_SHIFT 24
0039 #define MIDR_IMPLEMENTOR_MASK (0xffU << MIDR_IMPLEMENTOR_SHIFT)
0040 #define MIDR_IMPLEMENTOR(midr) \
0041 (((midr) & MIDR_IMPLEMENTOR_MASK) >> MIDR_IMPLEMENTOR_SHIFT)
0042
0043 #define MIDR_CPU_MODEL(imp, partnum) \
0044 (((imp) << MIDR_IMPLEMENTOR_SHIFT) | \
0045 (0xf << MIDR_ARCHITECTURE_SHIFT) | \
0046 ((partnum) << MIDR_PARTNUM_SHIFT))
0047
0048 #define MIDR_CPU_VAR_REV(var, rev) \
0049 (((var) << MIDR_VARIANT_SHIFT) | (rev))
0050
0051 #define MIDR_CPU_MODEL_MASK (MIDR_IMPLEMENTOR_MASK | MIDR_PARTNUM_MASK | \
0052 MIDR_ARCHITECTURE_MASK)
0053
0054 #define ARM_CPU_IMP_ARM 0x41
0055 #define ARM_CPU_IMP_APM 0x50
0056 #define ARM_CPU_IMP_CAVIUM 0x43
0057 #define ARM_CPU_IMP_BRCM 0x42
0058 #define ARM_CPU_IMP_QCOM 0x51
0059 #define ARM_CPU_IMP_NVIDIA 0x4E
0060 #define ARM_CPU_IMP_FUJITSU 0x46
0061 #define ARM_CPU_IMP_HISI 0x48
0062 #define ARM_CPU_IMP_APPLE 0x61
0063
0064 #define ARM_CPU_PART_AEM_V8 0xD0F
0065 #define ARM_CPU_PART_FOUNDATION 0xD00
0066 #define ARM_CPU_PART_CORTEX_A57 0xD07
0067 #define ARM_CPU_PART_CORTEX_A72 0xD08
0068 #define ARM_CPU_PART_CORTEX_A53 0xD03
0069 #define ARM_CPU_PART_CORTEX_A73 0xD09
0070 #define ARM_CPU_PART_CORTEX_A75 0xD0A
0071 #define ARM_CPU_PART_CORTEX_A35 0xD04
0072 #define ARM_CPU_PART_CORTEX_A55 0xD05
0073 #define ARM_CPU_PART_CORTEX_A76 0xD0B
0074 #define ARM_CPU_PART_NEOVERSE_N1 0xD0C
0075 #define ARM_CPU_PART_CORTEX_A77 0xD0D
0076 #define ARM_CPU_PART_NEOVERSE_V1 0xD40
0077 #define ARM_CPU_PART_CORTEX_A78 0xD41
0078 #define ARM_CPU_PART_CORTEX_A78AE 0xD42
0079 #define ARM_CPU_PART_CORTEX_X1 0xD44
0080 #define ARM_CPU_PART_CORTEX_A510 0xD46
0081 #define ARM_CPU_PART_CORTEX_A710 0xD47
0082 #define ARM_CPU_PART_CORTEX_X2 0xD48
0083 #define ARM_CPU_PART_NEOVERSE_N2 0xD49
0084 #define ARM_CPU_PART_CORTEX_A78C 0xD4B
0085
0086 #define APM_CPU_PART_POTENZA 0x000
0087
0088 #define CAVIUM_CPU_PART_THUNDERX 0x0A1
0089 #define CAVIUM_CPU_PART_THUNDERX_81XX 0x0A2
0090 #define CAVIUM_CPU_PART_THUNDERX_83XX 0x0A3
0091 #define CAVIUM_CPU_PART_THUNDERX2 0x0AF
0092
0093 #define CAVIUM_CPU_PART_OCTX2_98XX 0x0B1
0094 #define CAVIUM_CPU_PART_OCTX2_96XX 0x0B2
0095 #define CAVIUM_CPU_PART_OCTX2_95XX 0x0B3
0096 #define CAVIUM_CPU_PART_OCTX2_95XXN 0x0B4
0097 #define CAVIUM_CPU_PART_OCTX2_95XXMM 0x0B5
0098 #define CAVIUM_CPU_PART_OCTX2_95XXO 0x0B6
0099
0100 #define BRCM_CPU_PART_BRAHMA_B53 0x100
0101 #define BRCM_CPU_PART_VULCAN 0x516
0102
0103 #define QCOM_CPU_PART_FALKOR_V1 0x800
0104 #define QCOM_CPU_PART_FALKOR 0xC00
0105 #define QCOM_CPU_PART_KRYO 0x200
0106 #define QCOM_CPU_PART_KRYO_2XX_GOLD 0x800
0107 #define QCOM_CPU_PART_KRYO_2XX_SILVER 0x801
0108 #define QCOM_CPU_PART_KRYO_3XX_SILVER 0x803
0109 #define QCOM_CPU_PART_KRYO_4XX_GOLD 0x804
0110 #define QCOM_CPU_PART_KRYO_4XX_SILVER 0x805
0111
0112 #define NVIDIA_CPU_PART_DENVER 0x003
0113 #define NVIDIA_CPU_PART_CARMEL 0x004
0114
0115 #define FUJITSU_CPU_PART_A64FX 0x001
0116
0117 #define HISI_CPU_PART_TSV110 0xD01
0118
0119 #define APPLE_CPU_PART_M1_ICESTORM 0x022
0120 #define APPLE_CPU_PART_M1_FIRESTORM 0x023
0121 #define APPLE_CPU_PART_M1_ICESTORM_PRO 0x024
0122 #define APPLE_CPU_PART_M1_FIRESTORM_PRO 0x025
0123 #define APPLE_CPU_PART_M1_ICESTORM_MAX 0x028
0124 #define APPLE_CPU_PART_M1_FIRESTORM_MAX 0x029
0125
0126 #define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
0127 #define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
0128 #define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
0129 #define MIDR_CORTEX_A73 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A73)
0130 #define MIDR_CORTEX_A75 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A75)
0131 #define MIDR_CORTEX_A35 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A35)
0132 #define MIDR_CORTEX_A55 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A55)
0133 #define MIDR_CORTEX_A76 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A76)
0134 #define MIDR_NEOVERSE_N1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N1)
0135 #define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77)
0136 #define MIDR_NEOVERSE_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V1)
0137 #define MIDR_CORTEX_A78 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78)
0138 #define MIDR_CORTEX_A78AE MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78AE)
0139 #define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1)
0140 #define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510)
0141 #define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710)
0142 #define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2)
0143 #define MIDR_NEOVERSE_N2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N2)
0144 #define MIDR_CORTEX_A78C MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78C)
0145 #define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)
0146 #define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)
0147 #define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
0148 #define MIDR_OCTX2_98XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_98XX)
0149 #define MIDR_OCTX2_96XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_96XX)
0150 #define MIDR_OCTX2_95XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_95XX)
0151 #define MIDR_OCTX2_95XXN MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_95XXN)
0152 #define MIDR_OCTX2_95XXMM MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_95XXMM)
0153 #define MIDR_OCTX2_95XXO MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_OCTX2_95XXO)
0154 #define MIDR_CAVIUM_THUNDERX2 MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX2)
0155 #define MIDR_BRAHMA_B53 MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_BRAHMA_B53)
0156 #define MIDR_BRCM_VULCAN MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_VULCAN)
0157 #define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
0158 #define MIDR_QCOM_FALKOR MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR)
0159 #define MIDR_QCOM_KRYO MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO)
0160 #define MIDR_QCOM_KRYO_2XX_GOLD MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_2XX_GOLD)
0161 #define MIDR_QCOM_KRYO_2XX_SILVER MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_2XX_SILVER)
0162 #define MIDR_QCOM_KRYO_3XX_SILVER MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_3XX_SILVER)
0163 #define MIDR_QCOM_KRYO_4XX_GOLD MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_4XX_GOLD)
0164 #define MIDR_QCOM_KRYO_4XX_SILVER MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO_4XX_SILVER)
0165 #define MIDR_NVIDIA_DENVER MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_DENVER)
0166 #define MIDR_NVIDIA_CARMEL MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_CARMEL)
0167 #define MIDR_FUJITSU_A64FX MIDR_CPU_MODEL(ARM_CPU_IMP_FUJITSU, FUJITSU_CPU_PART_A64FX)
0168 #define MIDR_HISI_TSV110 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV110)
0169 #define MIDR_APPLE_M1_ICESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_ICESTORM)
0170 #define MIDR_APPLE_M1_FIRESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_FIRESTORM)
0171 #define MIDR_APPLE_M1_ICESTORM_PRO MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_ICESTORM_PRO)
0172 #define MIDR_APPLE_M1_FIRESTORM_PRO MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_FIRESTORM_PRO)
0173 #define MIDR_APPLE_M1_ICESTORM_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_ICESTORM_MAX)
0174 #define MIDR_APPLE_M1_FIRESTORM_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_FIRESTORM_MAX)
0175
0176
0177 #define MIDR_FUJITSU_ERRATUM_010001 MIDR_FUJITSU_A64FX
0178 #define MIDR_FUJITSU_ERRATUM_010001_MASK (~MIDR_CPU_VAR_REV(1, 0))
0179 #define TCR_CLEAR_FUJITSU_ERRATUM_010001 (TCR_NFD1 | TCR_NFD0)
0180
0181 #ifndef __ASSEMBLY__
0182
0183 #include <asm/sysreg.h>
0184
0185 #define read_cpuid(reg) read_sysreg_s(SYS_ ## reg)
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196 struct midr_range {
0197 u32 model;
0198 u32 rv_min;
0199 u32 rv_max;
0200 };
0201
0202 #define MIDR_RANGE(m, v_min, r_min, v_max, r_max) \
0203 { \
0204 .model = m, \
0205 .rv_min = MIDR_CPU_VAR_REV(v_min, r_min), \
0206 .rv_max = MIDR_CPU_VAR_REV(v_max, r_max), \
0207 }
0208
0209 #define MIDR_REV_RANGE(m, v, r_min, r_max) MIDR_RANGE(m, v, r_min, v, r_max)
0210 #define MIDR_REV(m, v, r) MIDR_RANGE(m, v, r, v, r)
0211 #define MIDR_ALL_VERSIONS(m) MIDR_RANGE(m, 0, 0, 0xf, 0xf)
0212
0213 static inline bool midr_is_cpu_model_range(u32 midr, u32 model, u32 rv_min,
0214 u32 rv_max)
0215 {
0216 u32 _model = midr & MIDR_CPU_MODEL_MASK;
0217 u32 rv = midr & (MIDR_REVISION_MASK | MIDR_VARIANT_MASK);
0218
0219 return _model == model && rv >= rv_min && rv <= rv_max;
0220 }
0221
0222 static inline bool is_midr_in_range(u32 midr, struct midr_range const *range)
0223 {
0224 return midr_is_cpu_model_range(midr, range->model,
0225 range->rv_min, range->rv_max);
0226 }
0227
0228 static inline bool
0229 is_midr_in_range_list(u32 midr, struct midr_range const *ranges)
0230 {
0231 while (ranges->model)
0232 if (is_midr_in_range(midr, ranges++))
0233 return true;
0234 return false;
0235 }
0236
0237
0238
0239
0240
0241
0242 static inline u32 __attribute_const__ read_cpuid_id(void)
0243 {
0244 return read_cpuid(MIDR_EL1);
0245 }
0246
0247 static inline u64 __attribute_const__ read_cpuid_mpidr(void)
0248 {
0249 return read_cpuid(MPIDR_EL1);
0250 }
0251
0252 static inline unsigned int __attribute_const__ read_cpuid_implementor(void)
0253 {
0254 return MIDR_IMPLEMENTOR(read_cpuid_id());
0255 }
0256
0257 static inline unsigned int __attribute_const__ read_cpuid_part_number(void)
0258 {
0259 return MIDR_PARTNUM(read_cpuid_id());
0260 }
0261
0262 static inline u32 __attribute_const__ read_cpuid_cachetype(void)
0263 {
0264 return read_cpuid(CTR_EL0);
0265 }
0266 #endif
0267
0268 #endif