@@ -52,9 +52,10 @@ EXPORT_SYMBOL(cpu_hwcaps);
52
52
DEFINE_STATIC_KEY_ARRAY_FALSE (cpu_hwcap_keys , ARM64_NCAPS );
53
53
EXPORT_SYMBOL (cpu_hwcap_keys );
54
54
55
- #define __ARM64_FTR_BITS (SIGNED , STRICT , TYPE , SHIFT , WIDTH , SAFE_VAL ) \
55
+ #define __ARM64_FTR_BITS (SIGNED , VISIBLE , STRICT , TYPE , SHIFT , WIDTH , SAFE_VAL ) \
56
56
{ \
57
57
.sign = SIGNED, \
58
+ .visible = VISIBLE, \
58
59
.strict = STRICT, \
59
60
.type = TYPE, \
60
61
.shift = SHIFT, \
@@ -63,12 +64,12 @@ EXPORT_SYMBOL(cpu_hwcap_keys);
63
64
}
64
65
65
66
/* Define a feature with unsigned values */
66
- #define ARM64_FTR_BITS (STRICT , TYPE , SHIFT , WIDTH , SAFE_VAL ) \
67
- __ARM64_FTR_BITS(FTR_UNSIGNED, STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL)
67
+ #define ARM64_FTR_BITS (VISIBLE , STRICT , TYPE , SHIFT , WIDTH , SAFE_VAL ) \
68
+ __ARM64_FTR_BITS(FTR_UNSIGNED, VISIBLE, STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL)
68
69
69
70
/* Define a feature with a signed value */
70
- #define S_ARM64_FTR_BITS (STRICT , TYPE , SHIFT , WIDTH , SAFE_VAL ) \
71
- __ARM64_FTR_BITS(FTR_SIGNED, STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL)
71
+ #define S_ARM64_FTR_BITS (VISIBLE , STRICT , TYPE , SHIFT , WIDTH , SAFE_VAL ) \
72
+ __ARM64_FTR_BITS(FTR_SIGNED, VISIBLE, STRICT, TYPE, SHIFT, WIDTH, SAFE_VAL)
72
73
73
74
#define ARM64_FTR_END \
74
75
{ \
@@ -81,75 +82,75 @@ cpufeature_pan_not_uao(const struct arm64_cpu_capabilities *entry, int __unused)
81
82
82
83
83
84
static const struct arm64_ftr_bits ftr_id_aa64isar0 [] = {
84
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64ISAR0_RDM_SHIFT , 4 , 0 ),
85
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_ATOMICS_SHIFT , 4 , 0 ),
86
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_CRC32_SHIFT , 4 , 0 ),
87
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_SHA2_SHIFT , 4 , 0 ),
88
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_SHA1_SHIFT , 4 , 0 ),
89
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_AES_SHIFT , 4 , 0 ),
85
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_EXACT , ID_AA64ISAR0_RDM_SHIFT , 4 , 0 ),
86
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_ATOMICS_SHIFT , 4 , 0 ),
87
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_CRC32_SHIFT , 4 , 0 ),
88
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_SHA2_SHIFT , 4 , 0 ),
89
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_SHA1_SHIFT , 4 , 0 ),
90
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64ISAR0_AES_SHIFT , 4 , 0 ),
90
91
ARM64_FTR_END ,
91
92
};
92
93
93
94
static const struct arm64_ftr_bits ftr_id_aa64pfr0 [] = {
94
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64PFR0_GIC_SHIFT , 4 , 0 ),
95
- S_ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64PFR0_ASIMD_SHIFT , 4 , ID_AA64PFR0_ASIMD_NI ),
96
- S_ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64PFR0_FP_SHIFT , 4 , ID_AA64PFR0_FP_NI ),
95
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64PFR0_GIC_SHIFT , 4 , 0 ),
96
+ S_ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64PFR0_ASIMD_SHIFT , 4 , ID_AA64PFR0_ASIMD_NI ),
97
+ S_ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64PFR0_FP_SHIFT , 4 , ID_AA64PFR0_FP_NI ),
97
98
/* Linux doesn't care about the EL3 */
98
- ARM64_FTR_BITS (FTR_NONSTRICT , FTR_EXACT , ID_AA64PFR0_EL3_SHIFT , 4 , 0 ),
99
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64PFR0_EL2_SHIFT , 4 , 0 ),
100
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64PFR0_EL1_SHIFT , 4 , ID_AA64PFR0_EL1_64BIT_ONLY ),
101
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64PFR0_EL0_SHIFT , 4 , ID_AA64PFR0_EL0_64BIT_ONLY ),
99
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_NONSTRICT , FTR_EXACT , ID_AA64PFR0_EL3_SHIFT , 4 , 0 ),
100
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64PFR0_EL2_SHIFT , 4 , 0 ),
101
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64PFR0_EL1_SHIFT , 4 , ID_AA64PFR0_EL1_64BIT_ONLY ),
102
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64PFR0_EL0_SHIFT , 4 , ID_AA64PFR0_EL0_64BIT_ONLY ),
102
103
ARM64_FTR_END ,
103
104
};
104
105
105
106
static const struct arm64_ftr_bits ftr_id_aa64mmfr0 [] = {
106
- S_ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_TGRAN4_SHIFT , 4 , ID_AA64MMFR0_TGRAN4_NI ),
107
- S_ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_TGRAN64_SHIFT , 4 , ID_AA64MMFR0_TGRAN64_NI ),
108
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_TGRAN16_SHIFT , 4 , ID_AA64MMFR0_TGRAN16_NI ),
109
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_BIGENDEL0_SHIFT , 4 , 0 ),
107
+ S_ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_TGRAN4_SHIFT , 4 , ID_AA64MMFR0_TGRAN4_NI ),
108
+ S_ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_TGRAN64_SHIFT , 4 , ID_AA64MMFR0_TGRAN64_NI ),
109
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_TGRAN16_SHIFT , 4 , ID_AA64MMFR0_TGRAN16_NI ),
110
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_BIGENDEL0_SHIFT , 4 , 0 ),
110
111
/* Linux shouldn't care about secure memory */
111
- ARM64_FTR_BITS (FTR_NONSTRICT , FTR_EXACT , ID_AA64MMFR0_SNSMEM_SHIFT , 4 , 0 ),
112
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_BIGENDEL_SHIFT , 4 , 0 ),
113
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_ASID_SHIFT , 4 , 0 ),
112
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_NONSTRICT , FTR_EXACT , ID_AA64MMFR0_SNSMEM_SHIFT , 4 , 0 ),
113
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_BIGENDEL_SHIFT , 4 , 0 ),
114
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR0_ASID_SHIFT , 4 , 0 ),
114
115
/*
115
116
* Differing PARange is fine as long as all peripherals and memory are mapped
116
117
* within the minimum PARange of all CPUs
117
118
*/
118
- ARM64_FTR_BITS (FTR_NONSTRICT , FTR_LOWER_SAFE , ID_AA64MMFR0_PARANGE_SHIFT , 4 , 0 ),
119
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_NONSTRICT , FTR_LOWER_SAFE , ID_AA64MMFR0_PARANGE_SHIFT , 4 , 0 ),
119
120
ARM64_FTR_END ,
120
121
};
121
122
122
123
static const struct arm64_ftr_bits ftr_id_aa64mmfr1 [] = {
123
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64MMFR1_PAN_SHIFT , 4 , 0 ),
124
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_LOR_SHIFT , 4 , 0 ),
125
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_HPD_SHIFT , 4 , 0 ),
126
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_VHE_SHIFT , 4 , 0 ),
127
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_VMIDBITS_SHIFT , 4 , 0 ),
128
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_HADBS_SHIFT , 4 , 0 ),
124
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64MMFR1_PAN_SHIFT , 4 , 0 ),
125
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_LOR_SHIFT , 4 , 0 ),
126
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_HPD_SHIFT , 4 , 0 ),
127
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_VHE_SHIFT , 4 , 0 ),
128
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_VMIDBITS_SHIFT , 4 , 0 ),
129
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR1_HADBS_SHIFT , 4 , 0 ),
129
130
ARM64_FTR_END ,
130
131
};
131
132
132
133
static const struct arm64_ftr_bits ftr_id_aa64mmfr2 [] = {
133
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_LVA_SHIFT , 4 , 0 ),
134
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_IESB_SHIFT , 4 , 0 ),
135
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_LSM_SHIFT , 4 , 0 ),
136
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_UAO_SHIFT , 4 , 0 ),
137
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_CNP_SHIFT , 4 , 0 ),
134
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_LVA_SHIFT , 4 , 0 ),
135
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_IESB_SHIFT , 4 , 0 ),
136
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_LSM_SHIFT , 4 , 0 ),
137
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_UAO_SHIFT , 4 , 0 ),
138
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64MMFR2_CNP_SHIFT , 4 , 0 ),
138
139
ARM64_FTR_END ,
139
140
};
140
141
141
142
static const struct arm64_ftr_bits ftr_ctr [] = {
142
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 31 , 1 , 1 ), /* RAO */
143
- ARM64_FTR_BITS (FTR_STRICT , FTR_HIGHER_SAFE , 24 , 4 , 0 ), /* CWG */
144
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 20 , 4 , 0 ), /* ERG */
145
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 16 , 4 , 1 ), /* DminLine */
143
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_EXACT , 31 , 1 , 1 ), /* RAO */
144
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_HIGHER_SAFE , 24 , 4 , 0 ), /* CWG */
145
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , 20 , 4 , 0 ), /* ERG */
146
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , 16 , 4 , 1 ), /* DminLine */
146
147
/*
147
148
* Linux can handle differing I-cache policies. Userspace JITs will
148
149
* make use of *minLine.
149
150
* If we have differing I-cache policies, report it as the weakest - AIVIVT.
150
151
*/
151
- ARM64_FTR_BITS (FTR_NONSTRICT , FTR_EXACT , 14 , 2 , ICACHE_POLICY_AIVIVT ), /* L1Ip */
152
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 0 , 4 , 0 ), /* IminLine */
152
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_NONSTRICT , FTR_EXACT , 14 , 2 , ICACHE_POLICY_AIVIVT ), /* L1Ip */
153
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , 0 , 4 , 0 ), /* IminLine */
153
154
ARM64_FTR_END ,
154
155
};
155
156
@@ -159,78 +160,78 @@ struct arm64_ftr_reg arm64_ftr_reg_ctrel0 = {
159
160
};
160
161
161
162
static const struct arm64_ftr_bits ftr_id_mmfr0 [] = {
162
- S_ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 28 , 4 , 0xf ), /* InnerShr */
163
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 24 , 4 , 0 ), /* FCSE */
164
- ARM64_FTR_BITS (FTR_NONSTRICT , FTR_LOWER_SAFE , 20 , 4 , 0 ), /* AuxReg */
165
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 16 , 4 , 0 ), /* TCM */
166
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 12 , 4 , 0 ), /* ShareLvl */
167
- S_ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 8 , 4 , 0xf ), /* OuterShr */
168
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 4 , 4 , 0 ), /* PMSA */
169
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 0 , 4 , 0 ), /* VMSA */
163
+ S_ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 28 , 4 , 0xf ), /* InnerShr */
164
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 24 , 4 , 0 ), /* FCSE */
165
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_NONSTRICT , FTR_LOWER_SAFE , 20 , 4 , 0 ), /* AuxReg */
166
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 16 , 4 , 0 ), /* TCM */
167
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 12 , 4 , 0 ), /* ShareLvl */
168
+ S_ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 8 , 4 , 0xf ), /* OuterShr */
169
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 4 , 4 , 0 ), /* PMSA */
170
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 0 , 4 , 0 ), /* VMSA */
170
171
ARM64_FTR_END ,
171
172
};
172
173
173
174
static const struct arm64_ftr_bits ftr_id_aa64dfr0 [] = {
174
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 36 , 28 , 0 ),
175
- ARM64_FTR_BITS (FTR_NONSTRICT , FTR_LOWER_SAFE , ID_AA64DFR0_PMSVER_SHIFT , 4 , 0 ),
176
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64DFR0_CTX_CMPS_SHIFT , 4 , 0 ),
177
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64DFR0_WRPS_SHIFT , 4 , 0 ),
178
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , ID_AA64DFR0_BRPS_SHIFT , 4 , 0 ),
175
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 36 , 28 , 0 ),
176
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_NONSTRICT , FTR_LOWER_SAFE , ID_AA64DFR0_PMSVER_SHIFT , 4 , 0 ),
177
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64DFR0_CTX_CMPS_SHIFT , 4 , 0 ),
178
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64DFR0_WRPS_SHIFT , 4 , 0 ),
179
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , ID_AA64DFR0_BRPS_SHIFT , 4 , 0 ),
179
180
/*
180
181
* We can instantiate multiple PMU instances with different levels
181
182
* of support.
182
- * * /
183
- S_ARM64_FTR_BITS (FTR_NONSTRICT , FTR_EXACT , ID_AA64DFR0_PMUVER_SHIFT , 4 , 0 ),
184
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64DFR0_TRACEVER_SHIFT , 4 , 0 ),
185
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_AA64DFR0_DEBUGVER_SHIFT , 4 , 0x6 ),
183
+ */
184
+ S_ARM64_FTR_BITS (FTR_HIDDEN , FTR_NONSTRICT , FTR_EXACT , ID_AA64DFR0_PMUVER_SHIFT , 4 , 0 ),
185
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64DFR0_TRACEVER_SHIFT , 4 , 0 ),
186
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_AA64DFR0_DEBUGVER_SHIFT , 4 , 0x6 ),
186
187
ARM64_FTR_END ,
187
188
};
188
189
189
190
static const struct arm64_ftr_bits ftr_mvfr2 [] = {
190
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 4 , 4 , 0 ), /* FPMisc */
191
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 0 , 4 , 0 ), /* SIMDMisc */
191
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 4 , 4 , 0 ), /* FPMisc */
192
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 0 , 4 , 0 ), /* SIMDMisc */
192
193
ARM64_FTR_END ,
193
194
};
194
195
195
196
static const struct arm64_ftr_bits ftr_dczid [] = {
196
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 4 , 1 , 1 ), /* DZP */
197
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 0 , 4 , 0 ), /* BS */
197
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_EXACT , 4 , 1 , 1 ), /* DZP */
198
+ ARM64_FTR_BITS (FTR_VISIBLE , FTR_STRICT , FTR_LOWER_SAFE , 0 , 4 , 0 ), /* BS */
198
199
ARM64_FTR_END ,
199
200
};
200
201
201
202
202
203
static const struct arm64_ftr_bits ftr_id_isar5 [] = {
203
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_ISAR5_RDM_SHIFT , 4 , 0 ),
204
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_ISAR5_CRC32_SHIFT , 4 , 0 ),
205
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_ISAR5_SHA2_SHIFT , 4 , 0 ),
206
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_ISAR5_SHA1_SHIFT , 4 , 0 ),
207
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_ISAR5_AES_SHIFT , 4 , 0 ),
208
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , ID_ISAR5_SEVL_SHIFT , 4 , 0 ),
204
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_ISAR5_RDM_SHIFT , 4 , 0 ),
205
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_ISAR5_CRC32_SHIFT , 4 , 0 ),
206
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_ISAR5_SHA2_SHIFT , 4 , 0 ),
207
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_ISAR5_SHA1_SHIFT , 4 , 0 ),
208
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_ISAR5_AES_SHIFT , 4 , 0 ),
209
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , ID_ISAR5_SEVL_SHIFT , 4 , 0 ),
209
210
ARM64_FTR_END ,
210
211
};
211
212
212
213
static const struct arm64_ftr_bits ftr_id_mmfr4 [] = {
213
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 4 , 4 , 0 ), /* ac2 */
214
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 4 , 4 , 0 ), /* ac2 */
214
215
ARM64_FTR_END ,
215
216
};
216
217
217
218
static const struct arm64_ftr_bits ftr_id_pfr0 [] = {
218
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 12 , 4 , 0 ), /* State3 */
219
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 8 , 4 , 0 ), /* State2 */
220
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 4 , 4 , 0 ), /* State1 */
221
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 0 , 4 , 0 ), /* State0 */
219
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 12 , 4 , 0 ), /* State3 */
220
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 8 , 4 , 0 ), /* State2 */
221
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 4 , 4 , 0 ), /* State1 */
222
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 0 , 4 , 0 ), /* State0 */
222
223
ARM64_FTR_END ,
223
224
};
224
225
225
226
static const struct arm64_ftr_bits ftr_id_dfr0 [] = {
226
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 28 , 4 , 0 ),
227
- S_ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 24 , 4 , 0xf ), /* PerfMon */
228
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 20 , 4 , 0 ),
229
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 16 , 4 , 0 ),
230
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 12 , 4 , 0 ),
231
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 8 , 4 , 0 ),
232
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 4 , 4 , 0 ),
233
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 0 , 4 , 0 ),
227
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 28 , 4 , 0 ),
228
+ S_ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 24 , 4 , 0xf ), /* PerfMon */
229
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 20 , 4 , 0 ),
230
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 16 , 4 , 0 ),
231
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 12 , 4 , 0 ),
232
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 8 , 4 , 0 ),
233
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 4 , 4 , 0 ),
234
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 0 , 4 , 0 ),
234
235
ARM64_FTR_END ,
235
236
};
236
237
@@ -241,20 +242,20 @@ static const struct arm64_ftr_bits ftr_id_dfr0[] = {
241
242
* id_isar[0-4], id_mmfr[1-3], id_pfr1, mvfr[0-1]
242
243
*/
243
244
static const struct arm64_ftr_bits ftr_generic_32bits [] = {
244
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 28 , 4 , 0 ),
245
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 24 , 4 , 0 ),
246
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 20 , 4 , 0 ),
247
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 16 , 4 , 0 ),
248
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 12 , 4 , 0 ),
249
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 8 , 4 , 0 ),
250
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 4 , 4 , 0 ),
251
- ARM64_FTR_BITS (FTR_STRICT , FTR_LOWER_SAFE , 0 , 4 , 0 ),
245
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 28 , 4 , 0 ),
246
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 24 , 4 , 0 ),
247
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 20 , 4 , 0 ),
248
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 16 , 4 , 0 ),
249
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 12 , 4 , 0 ),
250
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 8 , 4 , 0 ),
251
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 4 , 4 , 0 ),
252
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_LOWER_SAFE , 0 , 4 , 0 ),
252
253
ARM64_FTR_END ,
253
254
};
254
255
255
256
/* Table for a single 32bit feature value */
256
257
static const struct arm64_ftr_bits ftr_single32 [] = {
257
- ARM64_FTR_BITS (FTR_STRICT , FTR_EXACT , 0 , 32 , 0 ),
258
+ ARM64_FTR_BITS (FTR_HIDDEN , FTR_STRICT , FTR_EXACT , 0 , 32 , 0 ),
258
259
ARM64_FTR_END ,
259
260
};
260
261
@@ -402,6 +403,7 @@ static void __init init_cpu_ftr_reg(u32 sys_reg, u64 new)
402
403
{
403
404
u64 val = 0 ;
404
405
u64 strict_mask = ~0x0ULL ;
406
+ u64 user_mask = 0 ;
405
407
u64 valid_mask = 0 ;
406
408
407
409
const struct arm64_ftr_bits * ftrp ;
@@ -418,12 +420,19 @@ static void __init init_cpu_ftr_reg(u32 sys_reg, u64 new)
418
420
valid_mask |= ftr_mask ;
419
421
if (!ftrp -> strict )
420
422
strict_mask &= ~ftr_mask ;
423
+ if (ftrp -> visible )
424
+ user_mask |= ftr_mask ;
425
+ else
426
+ reg -> user_val = arm64_ftr_set_value (ftrp ,
427
+ reg -> user_val ,
428
+ ftrp -> safe_val );
421
429
}
422
430
423
431
val &= valid_mask ;
424
432
425
433
reg -> sys_val = val ;
426
434
reg -> strict_mask = strict_mask ;
435
+ reg -> user_mask = user_mask ;
427
436
}
428
437
429
438
void __init init_cpu_features (struct cpuinfo_arm64 * info )
0 commit comments