xref: /aosp_15_r20/external/cpuinfo/src/arm/uarch.c (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li #include <stdint.h>
2*2b54f0dbSXin Li 
3*2b54f0dbSXin Li #include <arm/api.h>
4*2b54f0dbSXin Li #include <arm/midr.h>
5*2b54f0dbSXin Li #include <cpuinfo/log.h>
6*2b54f0dbSXin Li 
7*2b54f0dbSXin Li 
cpuinfo_arm_decode_vendor_uarch(uint32_t midr,bool has_vfpv4,enum cpuinfo_vendor vendor[restrict static1],enum cpuinfo_uarch uarch[restrict static1])8*2b54f0dbSXin Li void cpuinfo_arm_decode_vendor_uarch(
9*2b54f0dbSXin Li 	uint32_t midr,
10*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM
11*2b54f0dbSXin Li 	bool has_vfpv4,
12*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM */
13*2b54f0dbSXin Li 	enum cpuinfo_vendor vendor[restrict static 1],
14*2b54f0dbSXin Li 	enum cpuinfo_uarch uarch[restrict static 1])
15*2b54f0dbSXin Li {
16*2b54f0dbSXin Li 	switch (midr_get_implementer(midr)) {
17*2b54f0dbSXin Li 		case 'A':
18*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_arm;
19*2b54f0dbSXin Li 			switch (midr_get_part(midr)) {
20*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM
21*2b54f0dbSXin Li 				case 0xC05:
22*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a5;
23*2b54f0dbSXin Li 					break;
24*2b54f0dbSXin Li 				case 0xC07:
25*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a7;
26*2b54f0dbSXin Li 					break;
27*2b54f0dbSXin Li 				case 0xC08:
28*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a8;
29*2b54f0dbSXin Li 					break;
30*2b54f0dbSXin Li 				case 0xC09:
31*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a9;
32*2b54f0dbSXin Li 					break;
33*2b54f0dbSXin Li 				case 0xC0C:
34*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a12;
35*2b54f0dbSXin Li 					break;
36*2b54f0dbSXin Li 				case 0xC0E:
37*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a17;
38*2b54f0dbSXin Li 					break;
39*2b54f0dbSXin Li 				case 0xC0D:
40*2b54f0dbSXin Li 					/*
41*2b54f0dbSXin Li 					 * Rockchip RK3288 only.
42*2b54f0dbSXin Li 					 * Core information is ambiguous: some sources specify Cortex-A12, others - Cortex-A17.
43*2b54f0dbSXin Li 					 * Assume it is Cortex-A12.
44*2b54f0dbSXin Li 					 */
45*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a12;
46*2b54f0dbSXin Li 					break;
47*2b54f0dbSXin Li 				case 0xC0F:
48*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a15;
49*2b54f0dbSXin Li 					break;
50*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM */
51*2b54f0dbSXin Li 				case 0xD01:
52*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a32;
53*2b54f0dbSXin Li 					break;
54*2b54f0dbSXin Li 				case 0xD03:
55*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a53;
56*2b54f0dbSXin Li 					break;
57*2b54f0dbSXin Li 				case 0xD04:
58*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a35;
59*2b54f0dbSXin Li 					break;
60*2b54f0dbSXin Li 				case 0xD05:
61*2b54f0dbSXin Li 					// Note: use Variant, not Revision, field
62*2b54f0dbSXin Li 					*uarch = (midr & CPUINFO_ARM_MIDR_VARIANT_MASK) == 0 ?
63*2b54f0dbSXin Li 						cpuinfo_uarch_cortex_a55r0 : cpuinfo_uarch_cortex_a55;
64*2b54f0dbSXin Li 					break;
65*2b54f0dbSXin Li 				case 0xD06:
66*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a65;
67*2b54f0dbSXin Li 					break;
68*2b54f0dbSXin Li 				case 0xD07:
69*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a57;
70*2b54f0dbSXin Li 					break;
71*2b54f0dbSXin Li 				case 0xD08:
72*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a72;
73*2b54f0dbSXin Li 					break;
74*2b54f0dbSXin Li 				case 0xD09:
75*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a73;
76*2b54f0dbSXin Li 					break;
77*2b54f0dbSXin Li 				case 0xD0A:
78*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a75;
79*2b54f0dbSXin Li 					break;
80*2b54f0dbSXin Li 				case 0xD0B:
81*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a76;
82*2b54f0dbSXin Li 					break;
83*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
84*2b54f0dbSXin Li 				case 0xD0C:
85*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_neoverse_n1;
86*2b54f0dbSXin Li 					break;
87*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM64 && !defined(__ANDROID__) */
88*2b54f0dbSXin Li 				case 0xD0D:
89*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a77;
90*2b54f0dbSXin Li 					break;
91*2b54f0dbSXin Li 				case 0xD0E: /* Cortex-A76AE */
92*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a76;
93*2b54f0dbSXin Li 					break;
94*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
95*2b54f0dbSXin Li 				case 0xD40:
96*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_neoverse_v1;
97*2b54f0dbSXin Li 					break;
98*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM64 && !defined(__ANDROID__) */
99*2b54f0dbSXin Li 				case 0xD41: /* Cortex-A78 */
100*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a78;
101*2b54f0dbSXin Li 					break;
102*2b54f0dbSXin Li 				case 0xD44: /* Cortex-X1 */
103*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_x1;
104*2b54f0dbSXin Li 					break;
105*2b54f0dbSXin Li 				case 0xD46: /* Cortex-A510 */
106*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a510;
107*2b54f0dbSXin Li 					break;
108*2b54f0dbSXin Li 				case 0xD47: /* Cortex-A710 */
109*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a710;
110*2b54f0dbSXin Li 					break;
111*2b54f0dbSXin Li 				case 0xD48: /* Cortex-X2 */
112*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_x2;
113*2b54f0dbSXin Li 					break;
114*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
115*2b54f0dbSXin Li 				case 0xD49:
116*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_neoverse_n2;
117*2b54f0dbSXin Li 					break;
118*2b54f0dbSXin Li 				case 0xD4A:
119*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_neoverse_e1;
120*2b54f0dbSXin Li 					break;
121*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM64 && !defined(__ANDROID__) */
122*2b54f0dbSXin Li 				default:
123*2b54f0dbSXin Li 					switch (midr_get_part(midr) >> 8) {
124*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM
125*2b54f0dbSXin Li 						case 7:
126*2b54f0dbSXin Li 							*uarch = cpuinfo_uarch_arm7;
127*2b54f0dbSXin Li 							break;
128*2b54f0dbSXin Li 						case 9:
129*2b54f0dbSXin Li 							*uarch = cpuinfo_uarch_arm9;
130*2b54f0dbSXin Li 							break;
131*2b54f0dbSXin Li 						case 11:
132*2b54f0dbSXin Li 							*uarch = cpuinfo_uarch_arm11;
133*2b54f0dbSXin Li 							break;
134*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM */
135*2b54f0dbSXin Li 						default:
136*2b54f0dbSXin Li 							cpuinfo_log_warning("unknown ARM CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
137*2b54f0dbSXin Li 					}
138*2b54f0dbSXin Li 			}
139*2b54f0dbSXin Li 			break;
140*2b54f0dbSXin Li 		case 'B':
141*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_broadcom;
142*2b54f0dbSXin Li 			switch (midr_get_part(midr)) {
143*2b54f0dbSXin Li 				case 0x00F:
144*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_brahma_b15;
145*2b54f0dbSXin Li 					break;
146*2b54f0dbSXin Li 				case 0x100:
147*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_brahma_b53;
148*2b54f0dbSXin Li 					break;
149*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
150*2b54f0dbSXin Li 				case 0x516:
151*2b54f0dbSXin Li 					/* Broadcom Vulkan was sold to Cavium before it reached the market, so we identify it as Cavium ThunderX2 */
152*2b54f0dbSXin Li 					*vendor = cpuinfo_vendor_cavium;
153*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_thunderx2;
154*2b54f0dbSXin Li 					break;
155*2b54f0dbSXin Li #endif
156*2b54f0dbSXin Li 				default:
157*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Broadcom CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
158*2b54f0dbSXin Li 			}
159*2b54f0dbSXin Li 			break;
160*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
161*2b54f0dbSXin Li 		case 'C':
162*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_cavium;
163*2b54f0dbSXin Li 			switch (midr_get_part(midr)) {
164*2b54f0dbSXin Li 				case 0x0A0: /* ThunderX */
165*2b54f0dbSXin Li 				case 0x0A1: /* ThunderX 88XX */
166*2b54f0dbSXin Li 				case 0x0A2: /* ThunderX 81XX */
167*2b54f0dbSXin Li 				case 0x0A3: /* ThunderX 83XX */
168*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_thunderx;
169*2b54f0dbSXin Li 					break;
170*2b54f0dbSXin Li 				case 0x0AF: /* ThunderX2 99XX */
171*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_thunderx2;
172*2b54f0dbSXin Li 					break;
173*2b54f0dbSXin Li 				default:
174*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Cavium CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
175*2b54f0dbSXin Li 			}
176*2b54f0dbSXin Li 			break;
177*2b54f0dbSXin Li #endif
178*2b54f0dbSXin Li 		case 'H':
179*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_huawei;
180*2b54f0dbSXin Li 			switch (midr_get_part(midr)) {
181*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
182*2b54f0dbSXin Li 				case 0xD01: /* Kunpeng 920 series */
183*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_taishan_v110;
184*2b54f0dbSXin Li 					break;
185*2b54f0dbSXin Li #endif
186*2b54f0dbSXin Li 				case 0xD40: /* Kirin 980 Big/Medium cores -> Cortex-A76 */
187*2b54f0dbSXin Li 					*vendor = cpuinfo_vendor_arm;
188*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a76;
189*2b54f0dbSXin Li 					break;
190*2b54f0dbSXin Li 				default:
191*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Huawei CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
192*2b54f0dbSXin Li 			}
193*2b54f0dbSXin Li 			break;
194*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM
195*2b54f0dbSXin Li 		case 'i':
196*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_intel;
197*2b54f0dbSXin Li 			switch (midr_get_part(midr) >> 8) {
198*2b54f0dbSXin Li 				case 2: /* PXA 210/25X/26X */
199*2b54f0dbSXin Li 				case 4: /* PXA 27X */
200*2b54f0dbSXin Li 				case 6: /* PXA 3XX */
201*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_xscale;
202*2b54f0dbSXin Li 					break;
203*2b54f0dbSXin Li 				default:
204*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Intel CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
205*2b54f0dbSXin Li 			}
206*2b54f0dbSXin Li 			break;
207*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM */
208*2b54f0dbSXin Li 		case 'N':
209*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_nvidia;
210*2b54f0dbSXin Li 			switch (midr_get_part(midr)) {
211*2b54f0dbSXin Li 				case 0x000:
212*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_denver;
213*2b54f0dbSXin Li 					break;
214*2b54f0dbSXin Li 				case 0x003:
215*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_denver2;
216*2b54f0dbSXin Li 					break;
217*2b54f0dbSXin Li 				case 0x004:
218*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_carmel;
219*2b54f0dbSXin Li 					break;
220*2b54f0dbSXin Li 				default:
221*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Nvidia CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
222*2b54f0dbSXin Li 			}
223*2b54f0dbSXin Li 			break;
224*2b54f0dbSXin Li #if !defined(__ANDROID__)
225*2b54f0dbSXin Li 		case 'P':
226*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_apm;
227*2b54f0dbSXin Li 			switch (midr_get_part(midr)) {
228*2b54f0dbSXin Li 				case 0x000:
229*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_xgene;
230*2b54f0dbSXin Li 					break;
231*2b54f0dbSXin Li 				default:
232*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Applied Micro CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
233*2b54f0dbSXin Li 			}
234*2b54f0dbSXin Li 			break;
235*2b54f0dbSXin Li #endif
236*2b54f0dbSXin Li 		case 'Q':
237*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_qualcomm;
238*2b54f0dbSXin Li 			switch (midr_get_part(midr)) {
239*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM
240*2b54f0dbSXin Li 				case 0x00F:
241*2b54f0dbSXin Li 					/* Mostly Scorpions, but some Cortex A5 may report this value as well */
242*2b54f0dbSXin Li 					if (has_vfpv4) {
243*2b54f0dbSXin Li 						/* Unlike Scorpion, Cortex-A5 comes with VFPv4 */
244*2b54f0dbSXin Li 						*vendor = cpuinfo_vendor_arm;
245*2b54f0dbSXin Li 						*uarch = cpuinfo_uarch_cortex_a5;
246*2b54f0dbSXin Li 					} else {
247*2b54f0dbSXin Li 						*uarch = cpuinfo_uarch_scorpion;
248*2b54f0dbSXin Li 					}
249*2b54f0dbSXin Li 					break;
250*2b54f0dbSXin Li 				case 0x02D: /* Dual-core Scorpions */
251*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_scorpion;
252*2b54f0dbSXin Li 					break;
253*2b54f0dbSXin Li 				case 0x04D:
254*2b54f0dbSXin Li 					/*
255*2b54f0dbSXin Li 					 * Dual-core Krait:
256*2b54f0dbSXin Li 					 * - r1p0 -> Krait 200
257*2b54f0dbSXin Li 					 * - r1p4 -> Krait 200
258*2b54f0dbSXin Li 					 * - r2p0 -> Krait 300
259*2b54f0dbSXin Li 					 */
260*2b54f0dbSXin Li 				case 0x06F:
261*2b54f0dbSXin Li 					/*
262*2b54f0dbSXin Li 					 * Quad-core Krait:
263*2b54f0dbSXin Li 					 * - r0p1 -> Krait 200
264*2b54f0dbSXin Li 					 * - r0p2 -> Krait 200
265*2b54f0dbSXin Li 					 * - r1p0 -> Krait 300
266*2b54f0dbSXin Li 					 * - r2p0 -> Krait 400 (Snapdragon 800 MSMxxxx)
267*2b54f0dbSXin Li 					 * - r2p1 -> Krait 400 (Snapdragon 801 MSMxxxxPRO)
268*2b54f0dbSXin Li 					 * - r3p1 -> Krait 450
269*2b54f0dbSXin Li 					 */
270*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_krait;
271*2b54f0dbSXin Li 					break;
272*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM */
273*2b54f0dbSXin Li 				case 0x201: /* Qualcomm Snapdragon 821: Low-power Kryo "Silver" */
274*2b54f0dbSXin Li 				case 0x205: /* Qualcomm Snapdragon 820 & 821: High-performance Kryo "Gold" */
275*2b54f0dbSXin Li 				case 0x211: /* Qualcomm Snapdragon 820: Low-power Kryo "Silver" */
276*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_kryo;
277*2b54f0dbSXin Li 					break;
278*2b54f0dbSXin Li 				case 0x800: /* High-performance Kryo 260 (r10p2) / Kryo 280 (r10p1) "Gold" -> Cortex-A73 */
279*2b54f0dbSXin Li 					*vendor = cpuinfo_vendor_arm;
280*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a73;
281*2b54f0dbSXin Li 					break;
282*2b54f0dbSXin Li 				case 0x801: /* Low-power Kryo 260 / 280 "Silver" -> Cortex-A53 */
283*2b54f0dbSXin Li 					*vendor = cpuinfo_vendor_arm;
284*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a53;
285*2b54f0dbSXin Li 					break;
286*2b54f0dbSXin Li 				case 0x802: /* High-performance Kryo 385 "Gold" -> Cortex-A75 */
287*2b54f0dbSXin Li 					*vendor = cpuinfo_vendor_arm;
288*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a75;
289*2b54f0dbSXin Li 					break;
290*2b54f0dbSXin Li 				case 0x803: /* Low-power Kryo 385 "Silver" -> Cortex-A55r0 */
291*2b54f0dbSXin Li 					*vendor = cpuinfo_vendor_arm;
292*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a55r0;
293*2b54f0dbSXin Li 					break;
294*2b54f0dbSXin Li 				case 0x804: /* High-performance Kryo 485 "Gold" / "Gold Prime" -> Cortex-A76 */
295*2b54f0dbSXin Li 					*vendor = cpuinfo_vendor_arm;
296*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a76;
297*2b54f0dbSXin Li 					break;
298*2b54f0dbSXin Li 				case 0x805: /* Low-performance Kryo 485 "Silver" -> Cortex-A55 */
299*2b54f0dbSXin Li 					*vendor = cpuinfo_vendor_arm;
300*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_cortex_a55;
301*2b54f0dbSXin Li 					break;
302*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM64 && !defined(__ANDROID__)
303*2b54f0dbSXin Li 				case 0xC00:
304*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_falkor;
305*2b54f0dbSXin Li 					break;
306*2b54f0dbSXin Li 				case 0xC01:
307*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_saphira;
308*2b54f0dbSXin Li 					break;
309*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM64 && !defined(__ANDROID__) */
310*2b54f0dbSXin Li 				default:
311*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Qualcomm CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
312*2b54f0dbSXin Li 			}
313*2b54f0dbSXin Li 			break;
314*2b54f0dbSXin Li 		case 'S':
315*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_samsung;
316*2b54f0dbSXin Li 			switch (midr & (CPUINFO_ARM_MIDR_VARIANT_MASK | CPUINFO_ARM_MIDR_PART_MASK)) {
317*2b54f0dbSXin Li 				case 0x00100010:
318*2b54f0dbSXin Li 					/*
319*2b54f0dbSXin Li 					 * Exynos 8890 MIDR = 0x531F0011, assume Exynos M1 has:
320*2b54f0dbSXin Li 					 * - CPU variant 0x1
321*2b54f0dbSXin Li 					 * - CPU part 0x001
322*2b54f0dbSXin Li 					 */
323*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_exynos_m1;
324*2b54f0dbSXin Li 					break;
325*2b54f0dbSXin Li 				case 0x00400010:
326*2b54f0dbSXin Li 					/*
327*2b54f0dbSXin Li 					 * Exynos 8895 MIDR = 0x534F0010, assume Exynos M2 has:
328*2b54f0dbSXin Li 					 * - CPU variant 0x4
329*2b54f0dbSXin Li 					 * - CPU part 0x001
330*2b54f0dbSXin Li 					 */
331*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_exynos_m2;
332*2b54f0dbSXin Li 					break;
333*2b54f0dbSXin Li 				case 0x00100020:
334*2b54f0dbSXin Li 					/*
335*2b54f0dbSXin Li 					 * Exynos 9810 MIDR = 0x531F0020, assume Exynos M3 has:
336*2b54f0dbSXin Li 					 * - CPU variant 0x1
337*2b54f0dbSXin Li 					 * - CPU part 0x002
338*2b54f0dbSXin Li 					 */
339*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_exynos_m3;
340*2b54f0dbSXin Li 					break;
341*2b54f0dbSXin Li 				case 0x00100030:
342*2b54f0dbSXin Li 					/*
343*2b54f0dbSXin Li 					 * Exynos 9820 MIDR = 0x531F0030, assume Exynos M4 has:
344*2b54f0dbSXin Li 					 * - CPU variant 0x1
345*2b54f0dbSXin Li 					 * - CPU part 0x003
346*2b54f0dbSXin Li 					 */
347*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_exynos_m4;
348*2b54f0dbSXin Li 					break;
349*2b54f0dbSXin Li 				case 0x00100040:
350*2b54f0dbSXin Li 					/*
351*2b54f0dbSXin Li 					 * Exynos 9820 MIDR = 0x531F0040, assume Exynos M5 has:
352*2b54f0dbSXin Li 					 * - CPU variant 0x1
353*2b54f0dbSXin Li 					 * - CPU part 0x004
354*2b54f0dbSXin Li 					 */
355*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_exynos_m5;
356*2b54f0dbSXin Li 					break;
357*2b54f0dbSXin Li 				default:
358*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Samsung CPU variant 0x%01"PRIx32" part 0x%03"PRIx32" ignored",
359*2b54f0dbSXin Li 						midr_get_variant(midr), midr_get_part(midr));
360*2b54f0dbSXin Li 			}
361*2b54f0dbSXin Li 			break;
362*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM
363*2b54f0dbSXin Li 		case 'V':
364*2b54f0dbSXin Li 			*vendor = cpuinfo_vendor_marvell;
365*2b54f0dbSXin Li 			switch (midr_get_part(midr)) {
366*2b54f0dbSXin Li 				case 0x581: /* PJ4 / PJ4B */
367*2b54f0dbSXin Li 				case 0x584: /* PJ4B-MP / PJ4C */
368*2b54f0dbSXin Li 					*uarch = cpuinfo_uarch_pj4;
369*2b54f0dbSXin Li 					break;
370*2b54f0dbSXin Li 				default:
371*2b54f0dbSXin Li 					cpuinfo_log_warning("unknown Marvell CPU part 0x%03"PRIx32" ignored", midr_get_part(midr));
372*2b54f0dbSXin Li 			}
373*2b54f0dbSXin Li 			break;
374*2b54f0dbSXin Li #endif /* CPUINFO_ARCH_ARM */
375*2b54f0dbSXin Li 		default:
376*2b54f0dbSXin Li 			cpuinfo_log_warning("unknown CPU implementer '%c' (0x%02"PRIx32") with CPU part 0x%03"PRIx32" ignored",
377*2b54f0dbSXin Li 				(char) midr_get_implementer(midr), midr_get_implementer(midr), midr_get_part(midr));
378*2b54f0dbSXin Li 	}
379*2b54f0dbSXin Li }
380