ohmu
·
2026-10-15
1#pragma once
2
3#include "fastfetch.h"
4
5// https://github.com/util-linux/util-linux/blob/master/sys-utils/lscpu-arm.c
6// We use the util-linux's data but not its code. Call me if it violates util-linux's GPL license.
7
8static const char* hwImplId2Vendor(uint32_t implId) {
9 switch (implId) {
10 case 0x41:
11 return "ARM";
12 case 0x42:
13 return "Broadcom";
14 case 0x43:
15 return "Cavium";
16 case 0x44:
17 return "DEC";
18 case 0x46:
19 return "FUJITSU";
20 case 0x48:
21 return "HiSilicon";
22 case 0x49:
23 return "Infineon";
24 case 0x4d:
25 return "Motorola";
26 case 0x4e:
27 return "NVIDIA";
28 case 0x50:
29 return "APM";
30 case 0x51:
31 return "Qualcomm";
32 case 0x53:
33 return "Samsung";
34 case 0x56:
35 return "Marvell";
36 case 0x61:
37 return "Apple";
38 case 0x66:
39 return "Faraday";
40 case 0x69:
41 return "Intel";
42 case 0x6D:
43 return "Microsoft";
44 case 0x70:
45 return "Phytium";
46 case 0xc0:
47 return "Ampere";
48 default:
49 return "Unknown";
50 }
51}
52
53static const char* armPartId2name(uint32_t partId) {
54 switch (partId) {
55 case 0x810:
56 return "ARM810";
57 case 0x920:
58 return "ARM920";
59 case 0x922:
60 return "ARM922";
61 case 0x926:
62 return "ARM926";
63 case 0x940:
64 return "ARM940";
65 case 0x946:
66 return "ARM946";
67 case 0x966:
68 return "ARM966";
69 case 0xa20:
70 return "ARM1020";
71 case 0xa22:
72 return "ARM1022";
73 case 0xa26:
74 return "ARM1026";
75 case 0xb02:
76 return "ARM11-MPCore";
77 case 0xb36:
78 return "ARM1136";
79 case 0xb56:
80 return "ARM1156";
81 case 0xb76:
82 return "ARM1176";
83 case 0xc05:
84 return "Cortex-A5";
85 case 0xc07:
86 return "Cortex-A7";
87 case 0xc08:
88 return "Cortex-A8";
89 case 0xc09:
90 return "Cortex-A9";
91 case 0xc0d:
92 return "Cortex-A17"; /* Originally A12 */
93 case 0xc0f:
94 return "Cortex-A15";
95 case 0xc0e:
96 return "Cortex-A17";
97 case 0xc14:
98 return "Cortex-R4";
99 case 0xc15:
100 return "Cortex-R5";
101 case 0xc17:
102 return "Cortex-R7";
103 case 0xc18:
104 return "Cortex-R8";
105 case 0xc20:
106 return "Cortex-M0";
107 case 0xc21:
108 return "Cortex-M1";
109 case 0xc23:
110 return "Cortex-M3";
111 case 0xc24:
112 return "Cortex-M4";
113 case 0xc27:
114 return "Cortex-M7";
115 case 0xc60:
116 return "Cortex-M0+";
117 case 0xd01:
118 return "Cortex-A32";
119 case 0xd02:
120 return "Cortex-A34";
121 case 0xd03:
122 return "Cortex-A53";
123 case 0xd04:
124 return "Cortex-A35";
125 case 0xd05:
126 return "Cortex-A55";
127 case 0xd06:
128 return "Cortex-A65";
129 case 0xd07:
130 return "Cortex-A57";
131 case 0xd08:
132 return "Cortex-A72";
133 case 0xd09:
134 return "Cortex-A73";
135 case 0xd0a:
136 return "Cortex-A75";
137 case 0xd0b:
138 return "Cortex-A76";
139 case 0xd0c:
140 return "Neoverse-N1";
141 case 0xd0d:
142 return "Cortex-A77";
143 case 0xd0e:
144 return "Cortex-A76AE";
145 case 0xd13:
146 return "Cortex-R52";
147 case 0xd14:
148 return "Cortex-R82AE";
149 case 0xd15:
150 return "Cortex-R82";
151 case 0xd16:
152 return "Cortex-R52+";
153 case 0xd20:
154 return "Cortex-M23";
155 case 0xd21:
156 return "Cortex-M33";
157 case 0xd24:
158 return "Cortex-M52";
159 case 0xd22:
160 return "Cortex-M55";
161 case 0xd23:
162 return "Cortex-M85";
163 case 0xd40:
164 return "Neoverse-V1";
165 case 0xd41:
166 return "Cortex-A78";
167 case 0xd42:
168 return "Cortex-A78AE";
169 case 0xd43:
170 return "Cortex-A65AE";
171 case 0xd44:
172 return "Cortex-X1";
173 case 0xd46:
174 return "Cortex-A510";
175 case 0xd47:
176 return "Cortex-A710";
177 case 0xd48:
178 return "Cortex-X2";
179 case 0xd49:
180 return "Neoverse-N2";
181 case 0xd4a:
182 return "Neoverse-E1";
183 case 0xd4b:
184 return "Cortex-A78C";
185 case 0xd4c:
186 return "Cortex-X1C";
187 case 0xd4d:
188 return "Cortex-A715";
189 case 0xd4e:
190 return "Cortex-X3";
191 case 0xd4f:
192 return "Neoverse-V2";
193 case 0xd80:
194 return "Cortex-A520";
195 case 0xd81:
196 return "Cortex-A720";
197 case 0xd82:
198 return "Cortex-X4";
199 case 0xd83:
200 return "Neoverse-V3AE";
201 case 0xd84:
202 return "Neoverse-V3";
203 case 0xd85:
204 return "Cortex-X925";
205 case 0xd87:
206 return "Cortex-A725";
207 case 0xd88:
208 return "Cortex-A520AE";
209 case 0xd89:
210 return "Cortex-A720AE";
211 case 0xd8a:
212 return "C1-Nano";
213 case 0xd8b:
214 return "C1-Pro";
215 case 0xd8c:
216 return "C1-Ultra";
217 case 0xd8e:
218 return "Neoverse-N3";
219 case 0xd8f:
220 return "Cortex-A320";
221 case 0xd90:
222 return "C1-Premium";
223 default:
224 return nullptr;
225 }
226}
227
228static const char* brcmPartId2name(uint32_t partId) {
229 switch (partId) {
230 case 0x0f:
231 return "Brahma-B15";
232 case 0x100:
233 return "Brahma-B53";
234 case 0x516:
235 return "ThunderX2";
236 default:
237 return nullptr;
238 }
239}
240
241static const char* decPartId2name(uint32_t partId) {
242 switch (partId) {
243 case 0xa10:
244 return "SA110";
245 case 0xa11:
246 return "SA1100";
247 default:
248 return nullptr;
249 }
250}
251
252static const char* caviumPartId2name(uint32_t partId) {
253 switch (partId) {
254 case 0x0a0:
255 return "ThunderX";
256 case 0x0a1:
257 return "ThunderX-88XX";
258 case 0x0a2:
259 return "ThunderX-81XX";
260 case 0x0a3:
261 return "ThunderX-83XX";
262 case 0x0af:
263 return "ThunderX2-99xx";
264 case 0x0b0:
265 return "OcteonTX2";
266 case 0x0b1:
267 return "OcteonTX2-98XX";
268 case 0x0b2:
269 return "OcteonTX2-96XX";
270 case 0x0b3:
271 return "OcteonTX2-95XX";
272 case 0x0b4:
273 return "OcteonTX2-95XXN";
274 case 0x0b5:
275 return "OcteonTX2-95XXMM";
276 case 0x0b6:
277 return "OcteonTX2-95XXO";
278 case 0x0b8:
279 return "ThunderX3-T110";
280 default:
281 return nullptr;
282 }
283}
284
285static const char* apmPartId2name(uint32_t partId) {
286 switch (partId) {
287 case 0x000:
288 return "X-Gene";
289 default:
290 return nullptr;
291 }
292}
293
294static const char* qcomPartId2name(uint32_t partId) {
295 switch (partId) {
296 case 0x001:
297 return "Oryon 1";
298 case 0x002:
299 return "Oryon 2";
300 case 0x00f:
301 return "Scorpion";
302 case 0x02d:
303 return "Scorpion";
304 case 0x04d:
305 return "Krait";
306 case 0x06f:
307 return "Krait";
308 case 0x201:
309 return "Kryo";
310 case 0x205:
311 return "Kryo";
312 case 0x211:
313 return "Kryo";
314 case 0x800:
315 return "Falkor-V1/Kryo";
316 case 0x801:
317 return "Kryo-V2";
318 case 0x802:
319 return "Kryo-3XX-Gold";
320 case 0x803:
321 return "Kryo-3XX-Silver";
322 case 0x804:
323 return "Kryo-4XX-Gold";
324 case 0x805:
325 return "Kryo-4XX-Silver";
326 case 0xc00:
327 return "Falkor";
328 case 0xc01:
329 return "Saphira";
330 default:
331 return nullptr;
332 }
333}
334
335static const char* samsungPartId2name(uint32_t partId) {
336 switch (partId) {
337 case 0x001:
338 return "Exynos-M1";
339 case 0x002:
340 return "Exynos-M3";
341 case 0x003:
342 return "Exynos-M4";
343 case 0x004:
344 return "Exynos-M5";
345 default:
346 return nullptr;
347 }
348}
349
350static const char* nvidiaPartId2name(uint32_t partId) {
351 switch (partId) {
352 case 0x000:
353 return "Denver";
354 case 0x003:
355 return "Denver-2";
356 case 0x004:
357 return "Carmel";
358 case 0x010:
359 return "Olympus";
360 default:
361 return nullptr;
362 }
363}
364
365static const char* marvellPartId2name(uint32_t partId) {
366 switch (partId) {
367 case 0x131:
368 return "Feroceon-88FR131";
369 case 0x581:
370 return "PJ4/PJ4b";
371 case 0x584:
372 return "PJ4B-MP";
373 default:
374 return nullptr;
375 }
376}
377
378static const char* applePartId2name(uint32_t partId) {
379 switch (partId) {
380 case 0x000:
381 return "Swift";
382 case 0x001:
383 return "Cyclone";
384 case 0x002:
385 return "Typhoon";
386 case 0x003:
387 return "Typhoon/Capri";
388 case 0x004:
389 return "Twister";
390 case 0x005:
391 return "Twister/Elba/Malta";
392 case 0x006:
393 return "Hurricane";
394 case 0x007:
395 return "Hurricane/Myst";
396 case 0x008:
397 return "Monsoon";
398 case 0x009:
399 return "Mistral";
400 case 0x00b:
401 return "Vortex";
402 case 0x00c:
403 return "Tempest";
404 case 0x00f:
405 return "Tempest-M9";
406 case 0x010:
407 return "Vortex/Aruba";
408 case 0x011:
409 return "Tempest/Aruba";
410 case 0x012:
411 return "Lightning";
412 case 0x013:
413 return "Thunder";
414 case 0x020:
415 return "Icestorm-A14";
416 case 0x021:
417 return "Firestorm-A14";
418 case 0x022:
419 return "Icestorm-M1";
420 case 0x023:
421 return "Firestorm-M1";
422 case 0x024:
423 return "Icestorm-M1-Pro";
424 case 0x025:
425 return "Firestorm-M1-Pro";
426 case 0x026:
427 return "Thunder-M10";
428 case 0x028:
429 return "Icestorm-M1-Max";
430 case 0x029:
431 return "Firestorm-M1-Max";
432 case 0x030:
433 return "Blizzard-A15";
434 case 0x031:
435 return "Avalanche-A15";
436 case 0x032:
437 return "Blizzard-M2";
438 case 0x033:
439 return "Avalanche-M2";
440 case 0x034:
441 return "Blizzard-M2-Pro";
442 case 0x035:
443 return "Avalanche-M2-Pro";
444 case 0x036:
445 return "Sawtooth-A16";
446 case 0x037:
447 return "Everest-A16";
448 case 0x038:
449 return "Blizzard-M2-Max";
450 case 0x039:
451 return "Avalanche-M2-Max";
452 case 0x046:
453 return "Sawtooth-M11";
454 case 0x048:
455 return "Sawtooth-M3-Max";
456 case 0x049:
457 return "Everest-M3-Max";
458 default:
459 return nullptr;
460 }
461}
462
463static const char* faradayPartId2name(uint32_t partId) {
464 switch (partId) {
465 case 0x526:
466 return "FA526";
467 case 0x626:
468 return "FA626";
469 default:
470 return nullptr;
471 }
472}
473
474static const char* intelPartId2name(uint32_t partId) {
475 switch (partId) {
476 case 0x200:
477 return "i80200";
478 case 0x210:
479 return "PXA250A";
480 case 0x212:
481 return "PXA210A";
482 case 0x242:
483 return "i80321-400";
484 case 0x243:
485 return "i80321-600";
486 case 0x290:
487 return "PXA250B/PXA26x";
488 case 0x292:
489 return "PXA210B";
490 case 0x2c2:
491 return "i80321-400-B0";
492 case 0x2c3:
493 return "i80321-600-B0";
494 case 0x2d0:
495 return "PXA250C/PXA255/PXA26x";
496 case 0x2d2:
497 return "PXA210C";
498 case 0x411:
499 return "PXA27x";
500 case 0x41c:
501 return "IPX425-533";
502 case 0x41d:
503 return "IPX425-400";
504 case 0x41f:
505 return "IPX425-266";
506 case 0x682:
507 return "PXA32x";
508 case 0x683:
509 return "PXA930/PXA935";
510 case 0x688:
511 return "PXA30x";
512 case 0x689:
513 return "PXA31x";
514 case 0xb11:
515 return "SA1110";
516 case 0xc12:
517 return "IPX1200";
518 default:
519 return nullptr;
520 }
521}
522
523static const char* fujitsuPartId2name(uint32_t partId) {
524 switch (partId) {
525 case 0x001:
526 return "A64FX";
527 case 0x003:
528 return "MONAKA";
529 default:
530 return nullptr;
531 }
532}
533
534static const char* hisiPartId2name(uint32_t partId) {
535 switch (partId) {
536 case 0xd01:
537 return "TaiShan-v110"; /* used in Kunpeng-920 SoC */
538 case 0xd02:
539 return "TaiShan-v120"; /* used in Kirin 990A and 9000S SoCs */
540 case 0xd40:
541 return "Cortex-A76"; /* HiSilicon uses this ID though advertises A76 */
542 case 0xd41:
543 return "Cortex-A77"; /* HiSilicon uses this ID though advertises A77 */
544 default:
545 return nullptr;
546 }
547}
548
549static const char* amperePartId2name(uint32_t partId) {
550 switch (partId) {
551 case 0xac3:
552 return "Ampere-1";
553 case 0xac4:
554 return "Ampere-1a";
555 default:
556 return nullptr;
557 }
558}
559
560static const char* ftPartId2name(uint32_t partId) {
561 switch (partId) {
562 case 0x303:
563 return "FTC310";
564 case 0x660:
565 return "FTC660";
566 case 0x661:
567 return "FTC661";
568 case 0x662:
569 return "FTC662";
570 case 0x663:
571 return "FTC663";
572 case 0x664:
573 return "FTC664";
574 case 0x862:
575 return "FTC862";
576 default:
577 return nullptr;
578 }
579}
580
581static const char* msPartId2name(uint32_t partId) {
582 switch (partId) {
583 case 0xd49:
584 return "Azure-Cobalt-100";
585 default:
586 return nullptr;
587 }
588}