libcpuid_dump 0.1.2

This library is part of https://github.com/Umio-Yasuno/cpuid_dump_rs
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
use crate::{CpuVendor, ProcInfo, CpuCodename, CpuMicroArch, CpuStepping, ProcessNode};
#[cfg(feature = "std")]
use std::fmt;
/* ref: https://github.com/illumos/illumos-gate/blob/master/usr/src/uts/intel/os/cpuid_subr.c */
/* ref: https://en.wikipedia.org/wiki/List_of_AMD_CPU_microarchitectures */
/* ref: https://developer.amd.com/resources/developer-guides-manuals/ */

impl ProcInfo {
    pub(super) fn amd_fam10h(m: u32, s: u32) -> Self {
        /* https://www.amd.com/system/files/TechDocs/41322_10h_Rev_Gd.pdf */
        /* https://www.amd.com/system/files/TechDocs/43374.pdf */
        match m {
            0x2 => Self {
                codename: CpuCodename::Amd(AmdCodename::DR),
                archname: CpuMicroArch::Amd(AmdMicroArch::Barcelona),
                step_info: match s {
                    0x1 => CpuStepping::B1,
                    0x2 => CpuStepping::B2,
                    0x3 => CpuStepping::B3,
                    0xA => CpuStepping::BA,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(65)),
            },
            0x4 => Self {
                codename: CpuCodename::Amd(AmdCodename::RB),
                archname: CpuMicroArch::Amd(AmdMicroArch::Shanghai),
                step_info: match s {
                    0x2 => CpuStepping::C2,
                    0x3 => CpuStepping::C3,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(45)),
            },
            0x5 => Self {
                codename: CpuCodename::Amd(AmdCodename::BL),
                archname: CpuMicroArch::Amd(AmdMicroArch::K10),
                step_info: match s {
                    0x2 => CpuStepping::C2,
                    0x3 => CpuStepping::C3,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(45)),
            },
            0x6 => Self {
                codename: CpuCodename::Amd(AmdCodename::DA),
                archname: CpuMicroArch::Amd(AmdMicroArch::K10),
                step_info: match s {
                    0x2 => CpuStepping::C2,
                    0x3 => CpuStepping::C3,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(45)),
            },
            0x8 => Self {
                codename: CpuCodename::Amd(AmdCodename::HY),
                archname: CpuMicroArch::Amd(AmdMicroArch::Istanbul),
                step_info: match s {
                    0x0 => CpuStepping::D0,
                    0x1 => CpuStepping::D1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(45)),
            },
            0x9 => Self {
                codename: CpuCodename::Amd(AmdCodename::HY),
                archname: CpuMicroArch::Amd(AmdMicroArch::K10),
                step_info: match s {
                    0x1 => CpuStepping::D1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(45)),
            },
            0xA => Self {
                codename: CpuCodename::Amd(AmdCodename::PH),
                archname: CpuMicroArch::Amd(AmdMicroArch::K10),
                step_info: match s {
                    0x0 => CpuStepping::E0,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(45)),
            },
            _ => Self {
                codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x10, m),
                archname: CpuMicroArch::Unknown,
                step_info: CpuStepping::Unknown(s),
                node: None,
            },
        }
    }
    pub(super) fn amd_fam11h(m: u32, s: u32) -> Self {
        match m {
            0x3 => Self {
                codename: CpuCodename::Amd(AmdCodename::Griffin),
                archname: CpuMicroArch::Amd(AmdMicroArch::Puma2008),
                step_info: CpuStepping::B1, // LG-B1
                node: Some(ProcessNode::NM(65)),
            },
            _ => Self {
                codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x11, m),
                archname: CpuMicroArch::Unknown,
                step_info: CpuStepping::Unknown(s),
                node: None,
            },
        }
    }
    pub(super) fn amd_fam12h(m: u32, s: u32) -> Self {
        match m {
            0x1 => Self {
                codename: CpuCodename::Amd(AmdCodename::Llano),
                archname: CpuMicroArch::Amd(AmdMicroArch::K10),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(32)),
            },
            _ => Self {
                codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x12, m),
                archname: CpuMicroArch::Unknown,
                step_info: CpuStepping::Unknown(s),
                node: None,
            },
        }
    }
    pub(super) fn amd_fam14h(m: u32, s: u32) -> Self {
        /* https://www.amd.com/system/files/TechDocs/47534_14h_Mod_00h-0Fh_Rev_Guide.pdf */
        match m {
            0x1 | 0x2 => Self {
                codename: CpuCodename::Amd(AmdCodename::Ontario_Zacate),
                archname: CpuMicroArch::Amd(AmdMicroArch::Bobcat),
                step_info: match m {
                    0x1 => CpuStepping::B0,
                    0x2 => CpuStepping::C0,
                    _ => unreachable!(),
                },
                node: Some(ProcessNode::NM(40)),
            },
            _ => Self {
                codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x14, m),
                archname: CpuMicroArch::Unknown,
                step_info: CpuStepping::Unknown(s),
                node: None,
            },
        }
    }
    pub(super) fn amd_fam15h(m: u32, s: u32) -> Self {
        match m {
            0x1 | 0x2 => Self {
                codename: CpuCodename::Amd(AmdCodename::Orochi),
                archname: CpuMicroArch::Amd(AmdMicroArch::Bulldozer),
                step_info: match (m, s) {
                    (0x1, 0x2) => CpuStepping::B2,
                    (0x2, 0x0) => CpuStepping::C0,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(32)),
            },
            0x10 => Self {
                codename: CpuCodename::Amd(AmdCodename::Trinity),
                archname: CpuMicroArch::Amd(AmdMicroArch::Piledriver),
                step_info: match s {
                    0x0 => CpuStepping::A0,
                    0x1 => CpuStepping::A1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(32)),
            },
            0x13 => Self {
                codename: CpuCodename::Amd(AmdCodename::Richland),
                archname: CpuMicroArch::Amd(AmdMicroArch::Piledriver),
                step_info: match s {
                    0x1 => CpuStepping::A1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(32)),
            },
            0x30 => Self {
                codename: CpuCodename::Amd(AmdCodename::Kaveri),
                archname: CpuMicroArch::Amd(AmdMicroArch::Steamroller),
                step_info: match s {
                    0x1 => CpuStepping::A1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(28)),
            },
            0x38 => Self {
                codename: CpuCodename::Amd(AmdCodename::Godavari),
                archname: CpuMicroArch::Amd(AmdMicroArch::Steamroller),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(28)),
            },
            0x60 => Self {
                codename: CpuCodename::Amd(AmdCodename::Carrizo),
                archname: CpuMicroArch::Amd(AmdMicroArch::Excavator),
                step_info: match s {
                    0x0 => CpuStepping::A0,
                    0x1 => CpuStepping::A1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(28)),
            },
            0x65 => Self {
                codename: CpuCodename::Amd(AmdCodename::BristolRidge),
                archname: CpuMicroArch::Amd(AmdMicroArch::Excavator),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(28)),
            },
            0x70 => Self {
                codename: CpuCodename::Amd(AmdCodename::StoneyRidge),
                archname: CpuMicroArch::Amd(AmdMicroArch::Excavator),
                step_info: match s {
                    0x0 => CpuStepping::A0,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(28)),
            },
            _ => Self {
                codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x15, m),
                archname: CpuMicroArch::Unknown,
                step_info: CpuStepping::Unknown(s),
                node: None,
            },
        }
    }
    pub(super) fn amd_fam16h(m: u32, s: u32) -> Self {
        match m {
            0x00 => Self {
                codename: CpuCodename::Amd(AmdCodename::Kabini_Temash),
                archname: CpuMicroArch::Amd(AmdMicroArch::Jaguar),
                step_info: match s {
                    0x1 => CpuStepping::A1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(28)),
            },
            /*
            0x13: DG1101SKF84HV
            https://linux-hardware.org/?probe=87f754ac29
            */
            /* A9-9820: https://linux-hardware.org/?probe=1053adf355 */
            0x26 => Self {
                codename: CpuCodename::Amd(AmdCodename::Cato),
                archname: CpuMicroArch::Amd(AmdMicroArch::Jaguar),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(28)),
            },
            0x30 => Self {
                codename: CpuCodename::Amd(AmdCodename::Beema_Mullins),
                archname: CpuMicroArch::Amd(AmdMicroArch::Puma2014),
                step_info: match s {
                    0x1 => CpuStepping::A1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(28)),
            },
            /*
            0x43: DG1501SML87LB
            https://linux-hardware.org/?probe=2fb1797d3d
            */
            _ => Self {
                codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x16, m),
                archname: CpuMicroArch::Unknown,
                step_info: CpuStepping::Unknown(s),
                node: None,
            },
        }
    }
    pub(super) fn amd_fam17h(m: u32, s: u32) -> Self {
        match m {
            /* Zen */
            /* Naples, Zeppelin/ZP */
            0x00 | 0x01 => Self {
                codename: CpuCodename::Amd(AmdCodename::Naples),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen),
                step_info: match (m, s) {
                    (0x00, _) => CpuStepping::A0,
                    (0x01, 0x1) => CpuStepping::B1, // Ryzen, Summit Ridge
                    (0x01, 0x2) => CpuStepping::B2,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(14)),
            },
            0x11 => Self {
                codename: CpuCodename::Amd(AmdCodename::RavenRidge),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(14)),
            },
            0x20 => Self {
                codename: CpuCodename::Amd(AmdCodename::Raven2),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen),
                step_info: match m {
                    0x1 => CpuStepping::A1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(14)),
            },

            /* Zen+ */
            0x08 => Self {
                codename: CpuCodename::Amd(AmdCodename::PinnacleRidge),
                archname: CpuMicroArch::Amd(AmdMicroArch::ZenPlus),
                step_info: match s {
                    0x2 => CpuStepping::B2,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(12)),
            },
            0x18 => Self {
                codename: CpuCodename::Amd(AmdCodename::Picasso),
                archname: CpuMicroArch::Amd(AmdMicroArch::ZenPlus),
                step_info: match s {
                    0x0 => CpuStepping::B0,
                    0x1 => CpuStepping::B1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(12)),
            },

            /* Zen 2 */
            /* Rome, Starship/SSP */
            0x30 | 0x31 => Self {
                codename: CpuCodename::Amd(AmdCodename::Rome),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
                step_info: match (m, s) {
                    (0x30, 0x0) => CpuStepping::A0,
                    (0x31, 0x0) => CpuStepping::B0,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(7)),
            },
            0x60 => Self {
                codename: CpuCodename::Amd(AmdCodename::Renoir),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
                step_info: match s {
                    0x1 => CpuStepping::A1,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(7)),
            },
            0x68 => Self {
                codename: CpuCodename::Amd(AmdCodename::Lucienne),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(7)),
            },
            0x71 => Self {
                codename: CpuCodename::Amd(AmdCodename::Matisse),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(7)),
            },
            0x90 => Self {
                codename: CpuCodename::Amd(AmdCodename::VanGogh),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(7)),
            },
            /* Mero?: AMD Eng Samples: 100-000000003-11_35/24_N */
            /* https://developer-docs.magicleap.cloud/docs/1.1.0-dev2/guides/developer-tools/lumin-aosp-tools/radeon-gpu-profiler */
            /* https://github.com/magicleap/developer-portal-docs/blob/main/static/img/developer-tools/lumin-aosp-tools/radeon-gpu-profiler/rgp-launch.png */
            0xA0..=0xAF => Self {
                codename: CpuCodename::Amd(AmdCodename::Mendocino),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(6)),
            },
            _ => Self {
                codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x17, m),
                archname: CpuMicroArch::Unknown,
                step_info: CpuStepping::Unknown(s),
                node: None,
            },
        }
    }

    pub(crate) fn amd_fam19h(m: u32, s: u32) -> Self {
        match m {
            /* Milan, Genesis/GN */
            /* Revision Guide for AMD Family 19h Models 00h-0Fh Processors: https://www.amd.com/system/files/TechDocs/56683-PUB-1.07.pdf */
            0x00 | 0x01 => Self {
                codename: CpuCodename::Amd(AmdCodename::Milan),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
                step_info: match (m, s) {
                    (0x00, _) => CpuStepping::A0,
                    (0x01, 0x0) => CpuStepping::B0,
                    (0x01, 0x1) => CpuStepping::B1, // EPYC 7003
                    (0x01, 0x2) => CpuStepping::B2, // EPYC 7003 with 3D V-Cache
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(7)),
            },
            0x08 => Self {
                codename: CpuCodename::Amd(AmdCodename::Chagall),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(7)),
            },
            0x20 | 0x21 => Self {
                codename: CpuCodename::Amd(AmdCodename::Vermeer),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
                step_info: match (m, s) {
                    (0x20, _) => CpuStepping::A0,
                    (0x21, 0x0) => CpuStepping::B0,
                    (0x21, 0x2) => CpuStepping::B2,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(7)),
            },
            /* https://www.openmp.org/wp-content/uploads/ecp_sollve_openmp_monthly.offload_perf_ana_craypat.marcus.hpe_.26aug2022.v2.pdf */
            0x30 => Self {
                codename: CpuCodename::Amd(AmdCodename::Trento),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(7)),
            },
            0x40..=0x4F => Self {
                codename: CpuCodename::Amd(AmdCodename::Rembrandt),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen3Plus),
                step_info: match (m, s) {
                    (0x40, _) => CpuStepping::A0,
                    (0x44, 0x0) => CpuStepping::B0,
                    (0x44, 0x1) => CpuStepping::B1, // product
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(6)),
            },
            0x50..=0x5F => Self {
                codename: CpuCodename::Amd(AmdCodename::Cezanne_Barcelo),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
                step_info: match (m, s) {
                    (0x50, 0x0) => CpuStepping::A0,
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(7)),
            },
            /* Zen 4 */
            /* Genoa, Stones, RS */
            0x10..=0x1F => Self {
                codename: CpuCodename::Amd(AmdCodename::Genoa),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen4),
                step_info: match (m, s) {
                    (0x10, _) => CpuStepping::A0,
                    (0x11, 0x0) => CpuStepping::B0,
                    (0x11, 0x1) => CpuStepping::B1,
                    // (0x11, 0x2) => ?:
                    _ => CpuStepping::Unknown(s),
                },
                node: Some(ProcessNode::NM(5)),
            },
            0x60..=0x6F => Self {
                codename: CpuCodename::Amd(AmdCodename::Raphael),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen4),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(5)),
            },
            0x70..=0x7F => Self {
                /* https://review.coreboot.org/c/coreboot/+/72843/1 */
                codename: match m {
                    // 0x70 => CpuCodename::Amd(AmdCodename::Phoenix), // ES?
                    // 0x74 => CpuCodename::Amd(AmdCodename::Phoenix),
                    0x78 => CpuCodename::Amd(AmdCodename::Phoenix2),
                    _ => CpuCodename::Amd(AmdCodename::Phoenix),
                },
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen4),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(4)),
            },
            /* https://lore.kernel.org/linux-edac/20230720125425.3735538-2-muralimk@amd.com/ */
            /* https://lore.kernel.org/linux-edac/20230720125425.3735538-6-muralimk@amd.com/ */
            0x90..=0x9F => Self {
                codename: CpuCodename::Amd(AmdCodename::MI300),
                archname: CpuMicroArch::Amd(AmdMicroArch::Zen4),
                step_info: CpuStepping::Unknown(s),
                node: Some(ProcessNode::NM(5)),
            },
            _ => Self {
                codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x19, m),
                archname: CpuMicroArch::Unknown,
                step_info: CpuStepping::Unknown(s),
                node: None,
            },
        }
    }
}

/// List of AMD CPU (SoC) codenmaes
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[allow(non_camel_case_types)]
pub enum AmdCodename {
    /* Fam10h */
    Fam10h,
    DR,
    RB,
    BL,
    DA,
    HY,
    PH,
    // Barcelona,
    // Shanghai,
    // Istanbul,
    /* Fam11h */
    Griffin,
    /* Fam12h */
    Llano,
    /* Fam14h */
    Ontario_Zacate,
    /* Fam15h */
    Orochi,
    Trinity,
    Richland,
    Kaveri,
    Carrizo,
    Godavari,
    BristolRidge,
    StoneyRidge,
    /* Fam16h */
    Kabini_Temash,
    Cato,
    Beema_Mullins,
    /* Fam17h */
    Naples,
    RavenRidge,
    Raven2, /* Dali, Pollock */
    PinnacleRidge,
    Picasso,
    Rome,
    Renoir,
    Lucienne,
    Matisse,
    VanGogh,
    Mendocino,
    /* Fam19h */
    Milan,
    Chagall,
    Trento,
    Vermeer,
    Rembrandt,
    Cezanne_Barcelo,
    Genoa,
    Raphael,
    Phoenix,
    Phoenix2,
    MI300,
}

#[cfg(feature = "std")]
impl fmt::Display for AmdCodename {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Self::Ontario_Zacate => write!(f, "Ontario/Zacate"),
            Self::Kabini_Temash => write!(f, "Kabini/Temash"),
            Self::Beema_Mullins => write!(f, "Beema/Mullins"),
            Self::Cezanne_Barcelo => write!(f, "Cezanne/Barcelo"),
            _ => write!(f, "{:?}", self),
        }
    }
}

/// List of AMD micro-architectures
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum AmdMicroArch {
    Puma2008,
    K10,
    Barcelona,
    Shanghai,
    Istanbul,
    Bobcat,
    Bulldozer,
    Piledriver,
    Steamroller,
    Excavator,
    Jaguar,
    Puma2014,
    Zen,
    ZenPlus,
    Zen2,
    Zen3,
    Zen3Plus,
    Zen4,
    _Reserved,
}

#[cfg(feature = "std")]
impl fmt::Display for AmdMicroArch {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Self::ZenPlus => write!(f, "Zen+"),
            Self::Zen2 => write!(f, "Zen 2"),
            Self::Zen3 => write!(f, "Zen 3"),
            Self::Zen3Plus => write!(f, "Zen 3+"),
            Self::Zen4 => write!(f, "Zen 4"),
            _ => write!(f, "{:?}", self),
        }
    }
}