@@ -91,12 +91,30 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
9191 unsigned int config ;
9292 unsigned long asid_mask ;
9393
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 ;
9695
9796 elf_hwcap = HWCAP_LOONGARCH_CPUCFG ;
9897
9998 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 ;
100118 if (config & CPUCFG1_UAL ) {
101119 c -> options |= LOONGARCH_CPU_UAL ;
102120 elf_hwcap |= HWCAP_LOONGARCH_UAL ;
@@ -139,6 +157,10 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
139157 c -> options |= LOONGARCH_CPU_PTW ;
140158 elf_hwcap |= HWCAP_LOONGARCH_PTW ;
141159 }
160+ if (config & CPUCFG2_LSPW ) {
161+ c -> options |= LOONGARCH_CPU_LSPW ;
162+ elf_hwcap |= HWCAP_LOONGARCH_LSPW ;
163+ }
142164 if (config & CPUCFG2_LVZP ) {
143165 c -> options |= LOONGARCH_CPU_LVZ ;
144166 elf_hwcap |= HWCAP_LOONGARCH_LVZ ;
@@ -162,22 +184,6 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
162184 if (config & CPUCFG6_PMP )
163185 c -> options |= LOONGARCH_CPU_PMP ;
164186
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-
181187 config = csr_read32 (LOONGARCH_CSR_ASID );
182188 config = (config & CSR_ASID_BIT ) >> CSR_ASID_BIT_SHIFT ;
183189 asid_mask = GENMASK (config - 1 , 0 );
@@ -210,6 +216,9 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
210216 default :
211217 pr_warn ("Warning: unknown TLB type\n" );
212218 }
219+
220+ if (get_num_brps () + get_num_wrps ())
221+ c -> options |= LOONGARCH_CPU_WATCH ;
213222}
214223
215224#define MAX_NAME_LEN 32
@@ -220,52 +229,67 @@ static char cpu_full_name[MAX_NAME_LEN] = " - ";
220229
221230static inline void cpu_probe_loongson (struct cpuinfo_loongarch * c , unsigned int cpu )
222231{
232+ uint32_t config ;
223233 uint64_t * vendor = (void * )(& cpu_full_name [VENDOR_OFFSET ]);
224234 uint64_t * cpuname = (void * )(& cpu_full_name [CPUNAME_OFFSET ]);
235+ const char * core_name = "Unknown" ;
225236
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 :
234240 c -> cputype = CPU_LOONGSON32 ;
235- set_isa (c , LOONGARCH_CPU_ISA_LA32S );
236241 __cpu_family [cpu ] = "Loongson-32bit" ;
237- pr_info ("32-bit Loongson Processor probed (LA132 Core)\n" );
238242 break ;
239- case PRID_SERIES_LA264 :
243+ case LOONGARCH_CPU_ISA_LA64 :
240244 c -> cputype = CPU_LOONGSON64 ;
241- set_isa (c , LOONGARCH_CPU_ISA_LA64 );
242245 __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" ;
244255 break ;
245256 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" ;
250258 break ;
251259 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" ;
256261 break ;
257262 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" ;
262264 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" );
268265 }
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 ;
269293}
270294
271295#ifdef CONFIG_64BIT
0 commit comments