xref: /aosp_15_r20/external/cpuinfo/src/x86/vendor.c (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li #include <stdint.h>
2*2b54f0dbSXin Li 
3*2b54f0dbSXin Li #include <cpuinfo.h>
4*2b54f0dbSXin Li #include <x86/api.h>
5*2b54f0dbSXin Li 
6*2b54f0dbSXin Li 
7*2b54f0dbSXin Li /* Intel vendor string: "GenuineIntel" */
8*2b54f0dbSXin Li #define Genu UINT32_C(0x756E6547)
9*2b54f0dbSXin Li #define ineI UINT32_C(0x49656E69)
10*2b54f0dbSXin Li #define ntel UINT32_C(0x6C65746E)
11*2b54f0dbSXin Li 
12*2b54f0dbSXin Li /* AMD vendor strings: "AuthenticAMD", "AMDisbetter!", "AMD ISBETTER" */
13*2b54f0dbSXin Li #define Auth UINT32_C(0x68747541)
14*2b54f0dbSXin Li #define enti UINT32_C(0x69746E65)
15*2b54f0dbSXin Li #define cAMD UINT32_C(0x444D4163)
16*2b54f0dbSXin Li #define AMDi UINT32_C(0x69444D41)
17*2b54f0dbSXin Li #define sbet UINT32_C(0x74656273)
18*2b54f0dbSXin Li #define ter  UINT32_C(0x21726574)
19*2b54f0dbSXin Li #define AMD  UINT32_C(0x20444D41)
20*2b54f0dbSXin Li #define ISBE UINT32_C(0x45425349)
21*2b54f0dbSXin Li #define TTER UINT32_C(0x52455454)
22*2b54f0dbSXin Li 
23*2b54f0dbSXin Li /* VIA (Centaur) vendor strings: "CentaurHauls", "VIA VIA VIA " */
24*2b54f0dbSXin Li #define Cent UINT32_C(0x746E6543)
25*2b54f0dbSXin Li #define aurH UINT32_C(0x48727561)
26*2b54f0dbSXin Li #define auls UINT32_C(0x736C7561)
27*2b54f0dbSXin Li #define VIA  UINT32_C(0x20414956)
28*2b54f0dbSXin Li 
29*2b54f0dbSXin Li /* Hygon vendor string: "HygonGenuine" */
30*2b54f0dbSXin Li #define Hygo UINT32_C(0x6F677948)
31*2b54f0dbSXin Li #define nGen UINT32_C(0x6E65476E)
32*2b54f0dbSXin Li #define uine UINT32_C(0x656E6975)
33*2b54f0dbSXin Li 
34*2b54f0dbSXin Li /* Transmeta vendor strings: "GenuineTMx86", "TransmetaCPU" */
35*2b54f0dbSXin Li #define ineT UINT32_C(0x54656E69)
36*2b54f0dbSXin Li #define Mx86 UINT32_C(0x3638784D)
37*2b54f0dbSXin Li #define Tran UINT32_C(0x6E617254)
38*2b54f0dbSXin Li #define smet UINT32_C(0x74656D73)
39*2b54f0dbSXin Li #define aCPU UINT32_C(0x55504361)
40*2b54f0dbSXin Li 
41*2b54f0dbSXin Li /* Cyrix vendor string: "CyrixInstead" */
42*2b54f0dbSXin Li #define Cyri UINT32_C(0x69727943)
43*2b54f0dbSXin Li #define xIns UINT32_C(0x736E4978)
44*2b54f0dbSXin Li #define tead UINT32_C(0x64616574)
45*2b54f0dbSXin Li 
46*2b54f0dbSXin Li /* Rise vendor string: "RiseRiseRise" */
47*2b54f0dbSXin Li #define Rise UINT32_C(0x65736952)
48*2b54f0dbSXin Li 
49*2b54f0dbSXin Li /* NSC vendor string: "Geode by NSC" */
50*2b54f0dbSXin Li #define Geod UINT32_C(0x646F6547)
51*2b54f0dbSXin Li #define e_by UINT32_C(0x79622065)
52*2b54f0dbSXin Li #define NSC  UINT32_C(0x43534E20)
53*2b54f0dbSXin Li 
54*2b54f0dbSXin Li /* SiS vendor string: "SiS SiS SiS " */
55*2b54f0dbSXin Li #define SiS  UINT32_C(0x20536953)
56*2b54f0dbSXin Li 
57*2b54f0dbSXin Li /* NexGen vendor string: "NexGenDriven" */
58*2b54f0dbSXin Li #define NexG UINT32_C(0x4778654E)
59*2b54f0dbSXin Li #define enDr UINT32_C(0x72446E65)
60*2b54f0dbSXin Li #define iven UINT32_C(0x6E657669)
61*2b54f0dbSXin Li 
62*2b54f0dbSXin Li /* UMC vendor string: "UMC UMC UMC " */
63*2b54f0dbSXin Li #define UMC  UINT32_C(0x20434D55)
64*2b54f0dbSXin Li 
65*2b54f0dbSXin Li /* RDC vendor string: "Genuine  RDC" */
66*2b54f0dbSXin Li #define ine  UINT32_C(0x20656E69)
67*2b54f0dbSXin Li #define RDC  UINT32_C(0x43445220)
68*2b54f0dbSXin Li 
69*2b54f0dbSXin Li /* D&MP vendor string: "Vortex86 SoC" */
70*2b54f0dbSXin Li #define Vort UINT32_C(0x74726F56)
71*2b54f0dbSXin Li #define ex86 UINT32_C(0x36387865)
72*2b54f0dbSXin Li #define SoC  UINT32_C(0x436F5320)
73*2b54f0dbSXin Li 
74*2b54f0dbSXin Li 
cpuinfo_x86_decode_vendor(uint32_t ebx,uint32_t ecx,uint32_t edx)75*2b54f0dbSXin Li enum cpuinfo_vendor cpuinfo_x86_decode_vendor(uint32_t ebx, uint32_t ecx, uint32_t edx) {
76*2b54f0dbSXin Li 	switch (ebx) {
77*2b54f0dbSXin Li 		case Genu:
78*2b54f0dbSXin Li 			switch (edx) {
79*2b54f0dbSXin Li 				case ineI:
80*2b54f0dbSXin Li 					if (ecx == ntel) {
81*2b54f0dbSXin Li 						/* "GenuineIntel" */
82*2b54f0dbSXin Li 						return cpuinfo_vendor_intel;
83*2b54f0dbSXin Li 					}
84*2b54f0dbSXin Li 					break;
85*2b54f0dbSXin Li #if CPUINFO_ARCH_X86
86*2b54f0dbSXin Li 				case ineT:
87*2b54f0dbSXin Li 					if (ecx == Mx86) {
88*2b54f0dbSXin Li 						/* "GenuineTMx86" */
89*2b54f0dbSXin Li 						return cpuinfo_vendor_transmeta;
90*2b54f0dbSXin Li 					}
91*2b54f0dbSXin Li 					break;
92*2b54f0dbSXin Li 				case ine:
93*2b54f0dbSXin Li 					if (ecx == RDC) {
94*2b54f0dbSXin Li 						/* "Genuine  RDC" */
95*2b54f0dbSXin Li 						return cpuinfo_vendor_rdc;
96*2b54f0dbSXin Li 					}
97*2b54f0dbSXin Li 					break;
98*2b54f0dbSXin Li #endif
99*2b54f0dbSXin Li 			}
100*2b54f0dbSXin Li 			break;
101*2b54f0dbSXin Li 		case Auth:
102*2b54f0dbSXin Li 			if (edx == enti && ecx == cAMD) {
103*2b54f0dbSXin Li 				/* "AuthenticAMD" */
104*2b54f0dbSXin Li 				return cpuinfo_vendor_amd;
105*2b54f0dbSXin Li 			}
106*2b54f0dbSXin Li 			break;
107*2b54f0dbSXin Li 		case Cent:
108*2b54f0dbSXin Li 			if (edx == aurH && ecx == auls) {
109*2b54f0dbSXin Li 				/* "CentaurHauls" */
110*2b54f0dbSXin Li 				return cpuinfo_vendor_via;
111*2b54f0dbSXin Li 			}
112*2b54f0dbSXin Li 			break;
113*2b54f0dbSXin Li 		case Hygo:
114*2b54f0dbSXin Li 			if (edx == nGen && ecx == uine) {
115*2b54f0dbSXin Li 				/* "HygonGenuine" */
116*2b54f0dbSXin Li 				return cpuinfo_vendor_hygon;
117*2b54f0dbSXin Li 			}
118*2b54f0dbSXin Li 			break;
119*2b54f0dbSXin Li #if CPUINFO_ARCH_X86
120*2b54f0dbSXin Li 		case AMDi:
121*2b54f0dbSXin Li 			if (edx == sbet && ecx == ter) {
122*2b54f0dbSXin Li 				/* "AMDisbetter!" */
123*2b54f0dbSXin Li 				return cpuinfo_vendor_amd;
124*2b54f0dbSXin Li 			}
125*2b54f0dbSXin Li 			break;
126*2b54f0dbSXin Li 		case AMD:
127*2b54f0dbSXin Li 			if (edx == ISBE && ecx == TTER) {
128*2b54f0dbSXin Li 				/* "AMD ISBETTER" */
129*2b54f0dbSXin Li 				return cpuinfo_vendor_amd;
130*2b54f0dbSXin Li 			}
131*2b54f0dbSXin Li 			break;
132*2b54f0dbSXin Li 		case VIA:
133*2b54f0dbSXin Li 			if (edx == VIA && ecx == VIA) {
134*2b54f0dbSXin Li 				/* "VIA VIA VIA " */
135*2b54f0dbSXin Li 				return cpuinfo_vendor_via;
136*2b54f0dbSXin Li 			}
137*2b54f0dbSXin Li 			break;
138*2b54f0dbSXin Li 		case Tran:
139*2b54f0dbSXin Li 			if (edx == smet && ecx == aCPU) {
140*2b54f0dbSXin Li 				/* "TransmetaCPU" */
141*2b54f0dbSXin Li 				return cpuinfo_vendor_transmeta;
142*2b54f0dbSXin Li 			}
143*2b54f0dbSXin Li 			break;
144*2b54f0dbSXin Li 		case Cyri:
145*2b54f0dbSXin Li 			if (edx == xIns && ecx == tead) {
146*2b54f0dbSXin Li 				/* "CyrixInstead" */
147*2b54f0dbSXin Li 				return cpuinfo_vendor_cyrix;
148*2b54f0dbSXin Li 			}
149*2b54f0dbSXin Li 			break;
150*2b54f0dbSXin Li 		case Rise:
151*2b54f0dbSXin Li 			if (edx == Rise && ecx == Rise) {
152*2b54f0dbSXin Li 				/* "RiseRiseRise" */
153*2b54f0dbSXin Li 				return cpuinfo_vendor_rise;
154*2b54f0dbSXin Li 			}
155*2b54f0dbSXin Li 			break;
156*2b54f0dbSXin Li 		case Geod:
157*2b54f0dbSXin Li 			if (edx == e_by && ecx == NSC) {
158*2b54f0dbSXin Li 				/* "Geode by NSC" */
159*2b54f0dbSXin Li 				return cpuinfo_vendor_nsc;
160*2b54f0dbSXin Li 			}
161*2b54f0dbSXin Li 			break;
162*2b54f0dbSXin Li 		case SiS:
163*2b54f0dbSXin Li 			if (edx == SiS && ecx == SiS) {
164*2b54f0dbSXin Li 				/* "SiS SiS SiS " */
165*2b54f0dbSXin Li 				return cpuinfo_vendor_sis;
166*2b54f0dbSXin Li 			}
167*2b54f0dbSXin Li 			break;
168*2b54f0dbSXin Li 		case NexG:
169*2b54f0dbSXin Li 			if (edx == enDr && ecx == iven) {
170*2b54f0dbSXin Li 				/* "NexGenDriven" */
171*2b54f0dbSXin Li 				return cpuinfo_vendor_nexgen;
172*2b54f0dbSXin Li 			}
173*2b54f0dbSXin Li 			break;
174*2b54f0dbSXin Li 		case UMC:
175*2b54f0dbSXin Li 			if (edx == UMC && ecx == UMC) {
176*2b54f0dbSXin Li 				/* "UMC UMC UMC " */
177*2b54f0dbSXin Li 				return cpuinfo_vendor_umc;
178*2b54f0dbSXin Li 			}
179*2b54f0dbSXin Li 			break;
180*2b54f0dbSXin Li 		case Vort:
181*2b54f0dbSXin Li 			if (edx == ex86 && ecx == SoC) {
182*2b54f0dbSXin Li 				/* "Vortex86 SoC" */
183*2b54f0dbSXin Li 				return cpuinfo_vendor_dmp;
184*2b54f0dbSXin Li 			}
185*2b54f0dbSXin Li 			break;
186*2b54f0dbSXin Li #endif
187*2b54f0dbSXin Li 	}
188*2b54f0dbSXin Li 	return cpuinfo_vendor_unknown;
189*2b54f0dbSXin Li }
190