22// SPDX-License-Identifier: Apache-2.0 
33
44use  std:: arch:: x86_64:: __cpuid as  host_cpuid; 
5- use  std:: cmp:: { Eq ,  Ordering ,   PartialEq ,   PartialOrd } ; 
5+ use  std:: cmp:: { Eq ,  PartialEq } ; 
66
77/// Structure representing x86_64 CPU model. 
88#[ derive( Debug ,  Eq ,  PartialEq ) ]  
@@ -19,6 +19,42 @@ pub struct CpuModel {
1919     pub  stepping :  u8 , 
2020} 
2121
22+ /// Family / Model / Stepping for Intel Skylake 
23+ pub  const  SKYLAKE_FMS :  CpuModel  = CpuModel  { 
24+     extended_family :  0x0 , 
25+     extended_model :  0x5 , 
26+     family :  0x6 , 
27+     model :  0x5 , 
28+     stepping :  0x4 , 
29+ } ; 
30+ 
31+ /// Family / Model / Stepping for Intel Cascade Lake 
32+ pub  const  CASCADE_LAKE_FMS :  CpuModel  = CpuModel  { 
33+     extended_family :  0x0 , 
34+     extended_model :  0x5 , 
35+     family :  0x6 , 
36+     model :  0x5 , 
37+     stepping :  0x7 , 
38+ } ; 
39+ 
40+ /// Family / Model / Stepping for Intel Ice Lake 
41+ pub  const  ICE_LAKE_FMS :  CpuModel  = CpuModel  { 
42+     extended_family :  0x0 , 
43+     extended_model :  0x6 , 
44+     family :  0x6 , 
45+     model :  0xa , 
46+     stepping :  0x6 , 
47+ } ; 
48+ 
49+ /// Family / Model / Stepping for AMD Milan 
50+ pub  const  MILAN_FMS :  CpuModel  = CpuModel  { 
51+     extended_family :  0xa , 
52+     extended_model :  0x0 , 
53+     family :  0xf , 
54+     model :  0x1 , 
55+     stepping :  0x1 , 
56+ } ; 
57+ 
2258impl  CpuModel  { 
2359    /// Get CPU model from current machine. 
2460     pub  fn  get_cpu_model ( )  -> Self  { 
@@ -27,19 +63,6 @@ impl CpuModel {
2763        let  eax = unsafe  {  host_cpuid ( 0x1 )  } . eax ; 
2864        CpuModel :: from ( & eax) 
2965    } 
30- 
31-     /// Check if the current CPU model is Intel Cascade Lake or later. 
32-      pub  fn  is_at_least_cascade_lake ( & self )  -> bool  { 
33-         let  cascade_lake = CpuModel  { 
34-             extended_family :  0 , 
35-             extended_model :  5 , 
36-             family :  6 , 
37-             model :  5 , 
38-             stepping :  7 , 
39-         } ; 
40- 
41-         self  >= & cascade_lake
42-     } 
4366} 
4467
4568impl  From < & u32 >  for  CpuModel  { 
@@ -54,59 +77,22 @@ impl From<&u32> for CpuModel {
5477    } 
5578} 
5679
57- impl  From < & CpuModel >  for  u32  { 
58-     fn  from ( cpu_model :  & CpuModel )  -> Self  { 
59-         ( u32:: from ( cpu_model. extended_family )  << 20 ) 
60-             | ( u32:: from ( cpu_model. extended_model )  << 16 ) 
61-             | ( u32:: from ( cpu_model. family )  << 8 ) 
62-             | ( u32:: from ( cpu_model. model )  << 4 ) 
63-             | u32:: from ( cpu_model. stepping ) 
64-     } 
65- } 
66- 
67- impl  PartialOrd  for  CpuModel  { 
68-     fn  partial_cmp ( & self ,  other :  & Self )  -> Option < Ordering >  { 
69-         Some ( u32:: from ( self ) . cmp ( & u32:: from ( other) ) ) 
70-     } 
71- } 
72- 
73- impl  Ord  for  CpuModel  { 
74-     fn  cmp ( & self ,  other :  & Self )  -> Ordering  { 
75-         u32:: from ( self ) . cmp ( & u32:: from ( other) ) 
76-     } 
77- } 
78- 
7980#[ cfg( test) ]  
8081mod  tests { 
8182    use  super :: * ; 
8283
83-     const  SKYLAKE :  CpuModel  = CpuModel  { 
84-         extended_family :  0 , 
85-         extended_model :  5 , 
86-         family :  6 , 
87-         model :  5 , 
88-         stepping :  4 , 
89-     } ; 
90- 
91-     const  CASCADE_LAKE :  CpuModel  = CpuModel  { 
92-         extended_family :  0 , 
93-         extended_model :  5 , 
94-         family :  6 , 
95-         model :  5 , 
96-         stepping :  7 , 
97-     } ; 
98- 
9984    #[ test]  
10085    fn  cpu_model_from ( )  { 
10186        let  skylake_eax = 0x00050654 ; 
102-         assert_eq ! ( u32 :: from( & SKYLAKE ) ,  skylake_eax) ; 
103-         assert_eq ! ( CpuModel :: from( & skylake_eax) ,  SKYLAKE ) ; 
104-     } 
87+         assert_eq ! ( CpuModel :: from( & skylake_eax) ,  SKYLAKE_FMS ) ; 
10588
106-     #[ test]  
107-     fn  cpu_model_ord ( )  { 
108-         assert_eq ! ( SKYLAKE ,  SKYLAKE ) ; 
109-         assert ! ( SKYLAKE  < CASCADE_LAKE ) ; 
110-         assert ! ( CASCADE_LAKE  > SKYLAKE ) ; 
89+         let  cascade_lake_eax = 0x00050657 ; 
90+         assert_eq ! ( CpuModel :: from( & cascade_lake_eax) ,  CASCADE_LAKE_FMS ) ; 
91+ 
92+         let  ice_lake_eax = 0x000606a6 ; 
93+         assert_eq ! ( CpuModel :: from( & ice_lake_eax) ,  ICE_LAKE_FMS ) ; 
94+ 
95+         let  milan_eax = 0x00a00f11 ; 
96+         assert_eq ! ( CpuModel :: from( & milan_eax) ,  MILAN_FMS ) ; 
11197    } 
11298} 
0 commit comments