Imported Upstream version 1.30
[platform/upstream/x86info.git] / identify.c
1 /*
2  *  (C) 2001 Dave Jones.
3  *
4  *  Licensed under the terms of the GNU GPL License version 2.
5  */
6
7 #include <stdio.h>
8 #include "x86info.h"
9
10 void get_cpu_info_basics(struct cpudata *cpu)
11 {
12         unsigned int maxi, maxei, vendor, address_bits;
13         unsigned int eax;
14
15         cpuid(cpu->number, 0, &maxi, &vendor, NULL, NULL);
16         maxi &= 0xffff;         /* The high-order word is non-zero on some Cyrix CPUs */
17         cpu->cpuid_level = maxi;
18         if (maxi < 1)
19                 return;
20
21         /* Everything that supports cpuid supports these. */
22         cpuid(cpu->number, 1, &eax, NULL, NULL, NULL);
23         cpu->stepping = eax & 0xf;
24         cpu->model = (eax >> 4) & 0xf;
25         cpu->family = (eax >> 8) & 0xf;
26
27         cpuid(cpu->number, 0x80000000, &maxei, NULL, NULL, NULL);
28         cpu->maxei = maxei;
29
30         cpuid(cpu->number, 0xC0000000, &maxei, NULL, NULL, NULL);
31         cpu->maxei2 = maxei;
32
33         cpuid(cpu->number, 0x80000008,&address_bits, NULL, NULL, NULL);
34         cpu->phyaddr_bits = address_bits & 0xFF;
35         cpu->viraddr_bits = (address_bits >> 8) & 0xFF;
36
37         switch (vendor) {
38         case 0x756e6547:
39                 cpu->vendor = VENDOR_INTEL;
40                 break;
41         case 0x68747541:
42                 cpu->vendor = VENDOR_AMD;
43                 break;
44         case 0x69727943:
45                 cpu->vendor = VENDOR_CYRIX;
46                 break;
47         case 0x746e6543:
48                 cpu->vendor = VENDOR_CENTAUR;
49                 break;
50         case 0x646f6547:
51                 cpu->vendor = VENDOR_NATSEMI;
52                 break;
53         case 0x52697365:
54         case 0x65736952:
55                 cpu->vendor = VENDOR_RISE;
56                 break;
57         case 0x20536953:
58                 cpu->vendor = VENDOR_SIS;
59                 break;
60         default:
61                 printf("Unknown vendor (%x)\n", vendor);
62                 return;
63         }
64 }
65
66 void identify(struct cpudata *cpu)
67 {
68         switch (cpu->vendor) {
69         case VENDOR_INTEL:
70                 Identify_Intel(cpu);
71                 break;
72         case VENDOR_AMD:
73                 Identify_AMD(cpu);
74                 break;
75         case VENDOR_CYRIX:
76                 Identify_Cyrix(cpu);
77                 break;
78         case VENDOR_CENTAUR:
79                 identify_centaur(cpu);
80                 break;
81         case VENDOR_NATSEMI:
82                 identify_natsemi(cpu);
83                 break;
84         case VENDOR_RISE:
85                 identify_RiSE(cpu);
86                 break;
87         case VENDOR_SIS:
88                 identify_sis(cpu);
89                 break;
90         case VENDOR_TRANSMETA:
91         case VENDOR_UNKNOWN:
92                 break;
93         }
94 }
95
96 void show_info(struct cpudata *cpu)
97 {
98         if ((cpu->efamily != 0) || (cpu->emodel != 0))
99                 printf("Extended Family: %u Extended Model: %u ",
100                         cpu->efamily, cpu->emodel);
101         printf("Family: %u Model: %u Stepping: %u\n",
102                cpu->family, model(cpu), cpu->stepping);
103         if (cpu->vendor == VENDOR_INTEL)
104                 display_basic_Intel_info(cpu);
105         printf("CPU Model (x86info's best guess): %s\n", cpu->name);
106         get_model_name(cpu);
107         printf("\n");
108
109
110         switch (cpu->vendor) {
111         case VENDOR_AMD:
112                 display_AMD_info(cpu);
113                 break;
114
115         case VENDOR_CYRIX:
116                 display_Cyrix_info(cpu);
117                 break;
118
119         case VENDOR_CENTAUR:
120                 display_centaur_info(cpu);
121                 break;
122
123         case VENDOR_INTEL:
124                 display_extended_Intel_info(cpu);
125                 break;
126
127         default:
128                 break;
129         }
130 }