diff options
Diffstat (limited to 'arch/arm64/kernel/cpufeature.c')
-rw-r--r-- | arch/arm64/kernel/cpufeature.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index c8cf89223b5a..0669c63281ea 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c | |||
@@ -44,8 +44,9 @@ unsigned int compat_elf_hwcap2 __read_mostly; | |||
44 | 44 | ||
45 | DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS); | 45 | DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS); |
46 | 46 | ||
47 | #define ARM64_FTR_BITS(STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL) \ | 47 | #define __ARM64_FTR_BITS(SIGNED, STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL) \ |
48 | { \ | 48 | { \ |
49 | .sign = SIGNED, \ | ||
49 | .strict = STRICT, \ | 50 | .strict = STRICT, \ |
50 | .type = TYPE, \ | 51 | .type = TYPE, \ |
51 | .shift = SHIFT, \ | 52 | .shift = SHIFT, \ |
@@ -53,6 +54,14 @@ DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS); | |||
53 | .safe_val = SAFE_VAL, \ | 54 | .safe_val = SAFE_VAL, \ |
54 | } | 55 | } |
55 | 56 | ||
57 | /* Define a feature with signed values */ | ||
58 | #define ARM64_FTR_BITS(STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL) \ | ||
59 | __ARM64_FTR_BITS(FTR_SIGNED, STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL) | ||
60 | |||
61 | /* Define a feature with unsigned value */ | ||
62 | #define U_ARM64_FTR_BITS(STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL) \ | ||
63 | __ARM64_FTR_BITS(FTR_UNSIGNED, STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL) | ||
64 | |||
56 | #define ARM64_FTR_END \ | 65 | #define ARM64_FTR_END \ |
57 | { \ | 66 | { \ |
58 | .width = 0, \ | 67 | .width = 0, \ |
@@ -99,7 +108,7 @@ static struct arm64_ftr_bits ftr_id_aa64mmfr0[] = { | |||
99 | * Differing PARange is fine as long as all peripherals and memory are mapped | 108 | * Differing PARange is fine as long as all peripherals and memory are mapped |
100 | * within the minimum PARange of all CPUs | 109 | * within the minimum PARange of all CPUs |
101 | */ | 110 | */ |
102 | ARM64_FTR_BITS(FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64MMFR0_PARANGE_SHIFT, 4, 0), | 111 | U_ARM64_FTR_BITS(FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64MMFR0_PARANGE_SHIFT, 4, 0), |
103 | ARM64_FTR_END, | 112 | ARM64_FTR_END, |
104 | }; | 113 | }; |
105 | 114 | ||
@@ -115,18 +124,18 @@ static struct arm64_ftr_bits ftr_id_aa64mmfr1[] = { | |||
115 | }; | 124 | }; |
116 | 125 | ||
117 | static struct arm64_ftr_bits ftr_ctr[] = { | 126 | static struct arm64_ftr_bits ftr_ctr[] = { |
118 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RAO */ | 127 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RAO */ |
119 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, 28, 3, 0), | 128 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, 28, 3, 0), |
120 | ARM64_FTR_BITS(FTR_STRICT, FTR_HIGHER_SAFE, 24, 4, 0), /* CWG */ | 129 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_HIGHER_SAFE, 24, 4, 0), /* CWG */ |
121 | ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, 20, 4, 0), /* ERG */ | 130 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, 20, 4, 0), /* ERG */ |
122 | ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 1), /* DminLine */ | 131 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 1), /* DminLine */ |
123 | /* | 132 | /* |
124 | * Linux can handle differing I-cache policies. Userspace JITs will | 133 | * Linux can handle differing I-cache policies. Userspace JITs will |
125 | * make use of *minLine | 134 | * make use of *minLine |
126 | */ | 135 | */ |
127 | ARM64_FTR_BITS(FTR_NONSTRICT, FTR_EXACT, 14, 2, 0), /* L1Ip */ | 136 | U_ARM64_FTR_BITS(FTR_NONSTRICT, FTR_EXACT, 14, 2, 0), /* L1Ip */ |
128 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, 4, 10, 0), /* RAZ */ | 137 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, 4, 10, 0), /* RAZ */ |
129 | ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, 0, 4, 0), /* IminLine */ | 138 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, 0, 4, 0), /* IminLine */ |
130 | ARM64_FTR_END, | 139 | ARM64_FTR_END, |
131 | }; | 140 | }; |
132 | 141 | ||
@@ -144,12 +153,12 @@ static struct arm64_ftr_bits ftr_id_mmfr0[] = { | |||
144 | 153 | ||
145 | static struct arm64_ftr_bits ftr_id_aa64dfr0[] = { | 154 | static struct arm64_ftr_bits ftr_id_aa64dfr0[] = { |
146 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, 32, 32, 0), | 155 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, 32, 32, 0), |
147 | ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, ID_AA64DFR0_CTX_CMPS_SHIFT, 4, 0), | 156 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, ID_AA64DFR0_CTX_CMPS_SHIFT, 4, 0), |
148 | ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, ID_AA64DFR0_WRPS_SHIFT, 4, 0), | 157 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, ID_AA64DFR0_WRPS_SHIFT, 4, 0), |
149 | ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, ID_AA64DFR0_BRPS_SHIFT, 4, 0), | 158 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_LOWER_SAFE, ID_AA64DFR0_BRPS_SHIFT, 4, 0), |
150 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, ID_AA64DFR0_PMUVER_SHIFT, 4, 0), | 159 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, ID_AA64DFR0_PMUVER_SHIFT, 4, 0), |
151 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, ID_AA64DFR0_TRACEVER_SHIFT, 4, 0), | 160 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, ID_AA64DFR0_TRACEVER_SHIFT, 4, 0), |
152 | ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, ID_AA64DFR0_DEBUGVER_SHIFT, 4, 0x6), | 161 | U_ARM64_FTR_BITS(FTR_STRICT, FTR_EXACT, ID_AA64DFR0_DEBUGVER_SHIFT, 4, 0x6), |
153 | ARM64_FTR_END, | 162 | ARM64_FTR_END, |
154 | }; | 163 | }; |
155 | 164 | ||