@@ -91,12 +91,30 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
91
91
unsigned int config ;
92
92
unsigned long asid_mask ;
93
93
94
- c -> options = LOONGARCH_CPU_CPUCFG | LOONGARCH_CPU_CSR |
95
- LOONGARCH_CPU_TLB | LOONGARCH_CPU_VINT | LOONGARCH_CPU_WATCH ;
94
+ c -> options = LOONGARCH_CPU_CPUCFG | LOONGARCH_CPU_CSR | LOONGARCH_CPU_VINT ;
96
95
97
96
elf_hwcap = HWCAP_LOONGARCH_CPUCFG ;
98
97
99
98
config = read_cpucfg (LOONGARCH_CPUCFG1 );
99
+
100
+ switch (config & CPUCFG1_ISA ) {
101
+ case 0 :
102
+ set_isa (c , LOONGARCH_CPU_ISA_LA32R );
103
+ break ;
104
+ case 1 :
105
+ set_isa (c , LOONGARCH_CPU_ISA_LA32S );
106
+ break ;
107
+ case 2 :
108
+ set_isa (c , LOONGARCH_CPU_ISA_LA64 );
109
+ break ;
110
+ default :
111
+ pr_warn ("Warning: unknown ISA level\n" );
112
+ }
113
+
114
+ if (config & CPUCFG1_PAGING )
115
+ c -> options |= LOONGARCH_CPU_TLB ;
116
+ if (config & CPUCFG1_IOCSR )
117
+ c -> options |= LOONGARCH_CPU_IOCSR ;
100
118
if (config & CPUCFG1_UAL ) {
101
119
c -> options |= LOONGARCH_CPU_UAL ;
102
120
elf_hwcap |= HWCAP_LOONGARCH_UAL ;
@@ -139,6 +157,10 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
139
157
c -> options |= LOONGARCH_CPU_PTW ;
140
158
elf_hwcap |= HWCAP_LOONGARCH_PTW ;
141
159
}
160
+ if (config & CPUCFG2_LSPW ) {
161
+ c -> options |= LOONGARCH_CPU_LSPW ;
162
+ elf_hwcap |= HWCAP_LOONGARCH_LSPW ;
163
+ }
142
164
if (config & CPUCFG2_LVZP ) {
143
165
c -> options |= LOONGARCH_CPU_LVZ ;
144
166
elf_hwcap |= HWCAP_LOONGARCH_LVZ ;
@@ -162,22 +184,6 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
162
184
if (config & CPUCFG6_PMP )
163
185
c -> options |= LOONGARCH_CPU_PMP ;
164
186
165
- config = iocsr_read32 (LOONGARCH_IOCSR_FEATURES );
166
- if (config & IOCSRF_CSRIPI )
167
- c -> options |= LOONGARCH_CPU_CSRIPI ;
168
- if (config & IOCSRF_EXTIOI )
169
- c -> options |= LOONGARCH_CPU_EXTIOI ;
170
- if (config & IOCSRF_FREQSCALE )
171
- c -> options |= LOONGARCH_CPU_SCALEFREQ ;
172
- if (config & IOCSRF_FLATMODE )
173
- c -> options |= LOONGARCH_CPU_FLATMODE ;
174
- if (config & IOCSRF_EIODECODE )
175
- c -> options |= LOONGARCH_CPU_EIODECODE ;
176
- if (config & IOCSRF_AVEC )
177
- c -> options |= LOONGARCH_CPU_AVECINT ;
178
- if (config & IOCSRF_VM )
179
- c -> options |= LOONGARCH_CPU_HYPERVISOR ;
180
-
181
187
config = csr_read32 (LOONGARCH_CSR_ASID );
182
188
config = (config & CSR_ASID_BIT ) >> CSR_ASID_BIT_SHIFT ;
183
189
asid_mask = GENMASK (config - 1 , 0 );
@@ -210,6 +216,9 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
210
216
default :
211
217
pr_warn ("Warning: unknown TLB type\n" );
212
218
}
219
+
220
+ if (get_num_brps () + get_num_wrps ())
221
+ c -> options |= LOONGARCH_CPU_WATCH ;
213
222
}
214
223
215
224
#define MAX_NAME_LEN 32
@@ -220,52 +229,67 @@ static char cpu_full_name[MAX_NAME_LEN] = " - ";
220
229
221
230
static inline void cpu_probe_loongson (struct cpuinfo_loongarch * c , unsigned int cpu )
222
231
{
232
+ uint32_t config ;
223
233
uint64_t * vendor = (void * )(& cpu_full_name [VENDOR_OFFSET ]);
224
234
uint64_t * cpuname = (void * )(& cpu_full_name [CPUNAME_OFFSET ]);
235
+ const char * core_name = "Unknown" ;
225
236
226
- if (!__cpu_full_name [cpu ])
227
- __cpu_full_name [cpu ] = cpu_full_name ;
228
-
229
- * vendor = iocsr_read64 (LOONGARCH_IOCSR_VENDOR );
230
- * cpuname = iocsr_read64 (LOONGARCH_IOCSR_CPUNAME );
231
-
232
- switch (c -> processor_id & PRID_SERIES_MASK ) {
233
- case PRID_SERIES_LA132 :
237
+ switch (BIT (fls (c -> isa_level ) - 1 )) {
238
+ case LOONGARCH_CPU_ISA_LA32R :
239
+ case LOONGARCH_CPU_ISA_LA32S :
234
240
c -> cputype = CPU_LOONGSON32 ;
235
- set_isa (c , LOONGARCH_CPU_ISA_LA32S );
236
241
__cpu_family [cpu ] = "Loongson-32bit" ;
237
- pr_info ("32-bit Loongson Processor probed (LA132 Core)\n" );
238
242
break ;
239
- case PRID_SERIES_LA264 :
243
+ case LOONGARCH_CPU_ISA_LA64 :
240
244
c -> cputype = CPU_LOONGSON64 ;
241
- set_isa (c , LOONGARCH_CPU_ISA_LA64 );
242
245
__cpu_family [cpu ] = "Loongson-64bit" ;
243
- pr_info ("64-bit Loongson Processor probed (LA264 Core)\n" );
246
+ break ;
247
+ }
248
+
249
+ switch (c -> processor_id & PRID_SERIES_MASK ) {
250
+ case PRID_SERIES_LA132 :
251
+ core_name = "LA132" ;
252
+ break ;
253
+ case PRID_SERIES_LA264 :
254
+ core_name = "LA264" ;
244
255
break ;
245
256
case PRID_SERIES_LA364 :
246
- c -> cputype = CPU_LOONGSON64 ;
247
- set_isa (c , LOONGARCH_CPU_ISA_LA64 );
248
- __cpu_family [cpu ] = "Loongson-64bit" ;
249
- pr_info ("64-bit Loongson Processor probed (LA364 Core)\n" );
257
+ core_name = "LA364" ;
250
258
break ;
251
259
case PRID_SERIES_LA464 :
252
- c -> cputype = CPU_LOONGSON64 ;
253
- set_isa (c , LOONGARCH_CPU_ISA_LA64 );
254
- __cpu_family [cpu ] = "Loongson-64bit" ;
255
- pr_info ("64-bit Loongson Processor probed (LA464 Core)\n" );
260
+ core_name = "LA464" ;
256
261
break ;
257
262
case PRID_SERIES_LA664 :
258
- c -> cputype = CPU_LOONGSON64 ;
259
- set_isa (c , LOONGARCH_CPU_ISA_LA64 );
260
- __cpu_family [cpu ] = "Loongson-64bit" ;
261
- pr_info ("64-bit Loongson Processor probed (LA664 Core)\n" );
263
+ core_name = "LA664" ;
262
264
break ;
263
- default : /* Default to 64 bit */
264
- c -> cputype = CPU_LOONGSON64 ;
265
- set_isa (c , LOONGARCH_CPU_ISA_LA64 );
266
- __cpu_family [cpu ] = "Loongson-64bit" ;
267
- pr_info ("64-bit Loongson Processor probed (Unknown Core)\n" );
268
265
}
266
+
267
+ pr_info ("%s Processor probed (%s Core)\n" , __cpu_family [cpu ], core_name );
268
+
269
+ if (!cpu_has_iocsr )
270
+ return ;
271
+
272
+ if (!__cpu_full_name [cpu ])
273
+ __cpu_full_name [cpu ] = cpu_full_name ;
274
+
275
+ * vendor = iocsr_read64 (LOONGARCH_IOCSR_VENDOR );
276
+ * cpuname = iocsr_read64 (LOONGARCH_IOCSR_CPUNAME );
277
+
278
+ config = iocsr_read32 (LOONGARCH_IOCSR_FEATURES );
279
+ if (config & IOCSRF_CSRIPI )
280
+ c -> options |= LOONGARCH_CPU_CSRIPI ;
281
+ if (config & IOCSRF_EXTIOI )
282
+ c -> options |= LOONGARCH_CPU_EXTIOI ;
283
+ if (config & IOCSRF_FREQSCALE )
284
+ c -> options |= LOONGARCH_CPU_SCALEFREQ ;
285
+ if (config & IOCSRF_FLATMODE )
286
+ c -> options |= LOONGARCH_CPU_FLATMODE ;
287
+ if (config & IOCSRF_EIODECODE )
288
+ c -> options |= LOONGARCH_CPU_EIODECODE ;
289
+ if (config & IOCSRF_AVEC )
290
+ c -> options |= LOONGARCH_CPU_AVECINT ;
291
+ if (config & IOCSRF_VM )
292
+ c -> options |= LOONGARCH_CPU_HYPERVISOR ;
269
293
}
270
294
271
295
#ifdef CONFIG_64BIT
0 commit comments