master ohmu/fastfetch-openbsd / src / detection / cpu / cpu_arm.h
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}