Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2012 ARM Ltd.
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 /* OcteonTx2 series */
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 /* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */
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  * Represent a range of MIDR values for a given CPU model and a
0189  * range of variant/revision values.
0190  *
0191  * @model   - CPU model as defined by MIDR_CPU_MODEL
0192  * @rv_min  - Minimum value for the revision/variant as defined by
0193  *        MIDR_CPU_VAR_REV
0194  * @rv_max  - Maximum value for the variant/revision for the range.
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  * The CPU ID never changes at run time, so we might as well tell the
0239  * compiler that it's constant.  Use this function to read the CPU ID
0240  * rather than directly reading processor_id or read_cpuid() directly.
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 /* __ASSEMBLY__ */
0267 
0268 #endif