Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/modules/SMBiosGetters/smbios_getters.c

1/*
2 * Add (c) here
3 *
4 * Copyright .... All rights reserved.
5 *
6 */
7
8#include "smbios_getters.h"
9#include "modules.h"
10
11#ifndef DEBUG_SMBIOS
12#define DEBUG_SMBIOS 0
13#endif
14
15#if DEBUG_SMBIOS
16#define DBG(x...)printf(x)
17#else
18#define DBG(x...)
19#endif
20static uint16_t simpleGetSMBOemProcessorType(void);
21
22
23bool getProcessorInformationExternalClock(returnType *value)
24{
25value->word = (uint16_t)(get_env(envFSBFreq)/1000000);
26return true;
27}
28
29bool getProcessorInformationMaximumClock(returnType *value)
30{
31// Note: it seems that AppleSMBIOS use the maximum clock to set the cpu clock
32// that is showed in "About this mac" or in the System Information.
33// in my opinion the current clock should be used for this.
34// value->word = get_env(envTSCFreq)/1000000;
35
36value->word = (uint16_t)(get_env(envCPUFreq)/1000000);
37return true;
38}
39
40bool getProcessorInformationCurrentClock(returnType *value)
41{
42value->word = (uint16_t)(get_env(envCPUFreq)/1000000);
43return true;
44}
45
46bool getSMBOemProcessorBusSpeed(returnType *value)
47{
48if (get_env(envVendor) == CPUID_VENDOR_INTEL)
49{
50switch (get_env(envFamily))
51{
52case 0x06:
53{
54switch (get_env(envModel))
55{
56 case CPUID_MODEL_BANIAS:// Banias0x09
57 case CPUID_MODEL_DOTHAN:// Dothan0x0D
58case CPUID_MODEL_YONAH:// Yonah0x0E
59case CPUID_MODEL_MEROM:// Merom0x0F
60case CPUID_MODEL_PENRYN:// Penryn0x17
61case CPUID_MODEL_ATOM:// Atom 45nm0x1C
62return false;
63
64case 0x19:// Intel Core i5 650 @3.20 Ghz
65case CPUID_MODEL_NEHALEM:// Intel Core i7 LGA1366 (45nm)
66case CPUID_MODEL_FIELDS:// Intel Core i5, i7 LGA1156 (45nm)
67case CPUID_MODEL_DALES:// Intel Core i5, i7 LGA1156 (45nm) ???
68case CPUID_MODEL_DALES_32NM:// Intel Core i3, i5, i7 LGA1156 (32nm)
69case CPUID_MODEL_WESTMERE:// Intel Core i7 LGA1366 (32nm) 6 Core
70case CPUID_MODEL_NEHALEM_EX:// Intel Core i7 LGA1366 (45nm) 6 Core ???
71case CPUID_MODEL_WESTMERE_EX:// Intel Core i7 LGA1366 (45nm) 6 Core ???
72case CPUID_MODEL_SANDYBRIDGE:
73case CPUID_MODEL_JAKETOWN:
74{
75// thanks to dgobe for i3/i5/i7 bus speed detection
76int nhm_bus = 0x3F;
77static long possible_nhm_bus[] = {0xFF, 0x7F, 0x3F};
78unsigned long did, vid;
79unsigned int i;
80
81// Nehalem supports Scrubbing
82// First, locate the PCI bus where the MCH is located
83for(i = 0; i < sizeof(possible_nhm_bus); i++)
84{
85vid = pci_config_read16(PCIADDR(possible_nhm_bus[i], 3, 4), 0x00);
86did = pci_config_read16(PCIADDR(possible_nhm_bus[i], 3, 4), 0x02);
87vid &= 0xFFFF;
88did &= 0xFF00;
89
90if(vid == 0x8086 && did >= 0x2C00)
91nhm_bus = possible_nhm_bus[i];
92}
93
94unsigned long qpimult, qpibusspeed;
95qpimult = pci_config_read32(PCIADDR(nhm_bus, 2, 1), 0x50);
96qpimult &= 0x7F;
97DBG("qpimult %d\n", qpimult);
98qpibusspeed = (qpimult * 2 * (get_env(envFSBFreq)/1000000));
99// Rek: rounding decimals to match original mac profile info
100if (qpibusspeed%100 != 0)qpibusspeed = ((qpibusspeed+50)/100)*100;
101DBG("qpibusspeed %d\n", qpibusspeed);
102value->word = qpibusspeed;
103return true;
104}
105default:
106break; //Unsupported CPU type
107}
108}
109default:
110break;
111}
112}
113return false;
114}
115
116static uint16_t simpleGetSMBOemProcessorType(void)
117{
118 uint8_t ncores = (uint8_t)get_env(envNoCores);
119if (ncores >= 4)
120{
121return 0x0501;// Quad-Core Xeon
122}
123if (((ncores == 1) || (ncores == 2)) && !(get_env(envExtFeatures)& CPUID_EXTFEATURE_EM64T))
124{
125return 0x0201;// Core Solo / Duo
126};
127
128return 0x0301;// Core 2 Solo / Duo
129}
130
131bool getSMBOemProcessorType(returnType *value)
132{
133static bool done = false;
134
135value->word = simpleGetSMBOemProcessorType();
136
137 char * BrandString = (char*)get_env_ptr(envBrandString);
138
139if (get_env(envVendor) == CPUID_VENDOR_INTEL)
140{
141if (!done)
142{
143verbose("CPU is %s, family 0x%x, model 0x%x\n", BrandString, (uint32_t)get_env(envFamily), (uint32_t)get_env(envModel));
144done = true;
145}
146
147switch (get_env(envFamily))
148{
149case 0x06:
150{
151switch (get_env(envModel))
152{
153 case CPUID_MODEL_BANIAS:// Banias
154 case CPUID_MODEL_DOTHAN:// Dothan
155case CPUID_MODEL_YONAH:// Yonah
156case CPUID_MODEL_MEROM:// Merom
157case CPUID_MODEL_PENRYN:// Penryn
158case CPUID_MODEL_ATOM:// Intel Atom (45nm)
159return true;
160
161case CPUID_MODEL_NEHALEM:// Intel Core i7 LGA1366 (45nm)
162if (strstr(BrandString, "Core(TM) i7"))
163 value->word = 0x0701;// Core i7
164return true;
165
166case CPUID_MODEL_FIELDS:// Lynnfield, Clarksfield, Jasper
167if (strstr(BrandString, "Core(TM) i5"))
168value->word = 0x601;// Core i5
169else
170value->word = 0x701;// Core i7
171return true;
172
173case CPUID_MODEL_DALES:// Intel Core i5, i7 LGA1156 (45nm) (Havendale, Auburndale)
174if (strstr(BrandString, "Core(TM) i5"))
175value->word = 0x601;// Core i5
176else
177value->word = 0x0701;// Core i7
178return true;
179
180case CPUID_MODEL_SANDYBRIDGE:
181case CPUID_MODEL_DALES_32NM:// Intel Core i3, i5, i7 LGA1156 (32nm) (Clarkdale, Arrandale)
182if (strstr(BrandString, "Core(TM) i3"))
183 value->word = 0x901;// Core i3
184else if (strstr(BrandString, "Core(TM) i5"))
185 value->word = 0x601;// Core i5
186else if (strstr(BrandString, "Core(TM) i7"))
187 value->word = 0x0701;// Core i7
188/*else
189 value->word = simpleGetSMBOemProcessorType();*/
190return true;
191
192 case CPUID_MODEL_JAKETOWN:
193case CPUID_MODEL_WESTMERE:// Intel Core i7 LGA1366 (32nm) 6 Core (Gulftown, Westmere-EP, Westmere-WS)
194case CPUID_MODEL_WESTMERE_EX:// Intel Core i7 LGA1366 (45nm) 6 Core ???
195value->word = 0x0501;// Core i7
196return true;
197
198case 0x19:// Intel Core i5 650 @3.20 Ghz
199value->word = 0x601;// Core i5
200return true;
201default:
202break; //Unsupported CPU type
203}
204}
205default:
206break;
207}
208}
209
210return false;
211}
212
213bool getSMBMemoryDeviceMemoryType(returnType *value)
214{
215static int idx = -1;
216if (execute_hook("isMemoryRegistred", NULL, NULL, NULL, NULL, NULL, NULL) == EFI_SUCCESS) {
217intmap;
218
219 int * DmiDimm = (int*)get_env_ptr(envDmiDimm);
220 RamSlotInfo_t * RamDimm = (RamSlotInfo_t*)get_env_ptr(envRamDimm);
221
222idx++;
223if (idx < MAX_RAM_SLOTS)
224{
225map = DmiDimm[idx];
226if (RamDimm[map].InUse && RamDimm[map].Type != 0)
227{
228DBG("RAM Detected Type = %d\n", RamDimm[map].Type);
229value->byte = RamDimm[map].Type;
230return true;
231}
232}
233}
234value->byte = SMB_MEM_TYPE_DDR2;
235return true;
236}
237
238bool getSMBMemoryDeviceMemorySpeed(returnType *value)
239{
240static int idx = -1;
241if (execute_hook("isMemoryRegistred", NULL, NULL, NULL, NULL, NULL, NULL) == EFI_SUCCESS) {
242intmap;
243
244 int * DmiDimm = (int*)get_env_ptr(envDmiDimm);
245 RamSlotInfo_t * RamDimm = (RamSlotInfo_t*)get_env_ptr(envRamDimm);
246
247idx++;
248if (idx < MAX_RAM_SLOTS)
249{
250map = DmiDimm[idx];
251if (RamDimm[map].InUse && RamDimm[map].Frequency != 0)
252{
253DBG("RAM Detected Freq = %d Mhz\n", RamDimm[map].Frequency);
254value->dword = RamDimm[map].Frequency;
255return true;
256}
257}
258}
259value->dword = 800;
260return true;
261}
262
263bool getSMBMemoryDeviceManufacturer(returnType *value)
264{
265static int idx = -1;
266if (execute_hook("isMemoryRegistred", NULL, NULL, NULL, NULL, NULL, NULL) == EFI_SUCCESS) {
267intmap;
268
269 int * DmiDimm = (int*)get_env_ptr(envDmiDimm);
270 RamSlotInfo_t * RamDimm = (RamSlotInfo_t*)get_env_ptr(envRamDimm);
271
272idx++;
273if (idx < MAX_RAM_SLOTS)
274{
275map = DmiDimm[idx];
276if (RamDimm[map].InUse && strlen(RamDimm[map].Vendor) > 0)
277{
278DBG("RAM Detected Vendor[%d]='%s'\n", idx, RamDimm[map].Vendor);
279value->string = RamDimm[map].Vendor;
280return true;
281}
282}
283}
284value->string = "N/A";
285return true;
286}
287
288bool getSMBMemoryDeviceSerialNumber(returnType *value)
289{
290static int idx = -1;
291if (execute_hook("isMemoryRegistred", NULL, NULL, NULL, NULL, NULL, NULL) == EFI_SUCCESS) {
292intmap;
293
294 int * DmiDimm = (int*)get_env_ptr(envDmiDimm);
295 RamSlotInfo_t * RamDimm = (RamSlotInfo_t*)get_env_ptr(envRamDimm);
296
297idx++;
298if (idx < MAX_RAM_SLOTS)
299{
300map = DmiDimm[idx];
301if (RamDimm[map].InUse && strlen(RamDimm[map].SerialNo) > 0)
302{
303DBG("name = %s, map=%d, RAM Detected SerialNo[%d]='%s'\n", name ? name : "",
304 map, idx, RamDimm[map].SerialNo);
305value->string = RamDimm[map].SerialNo;
306return true;
307}
308}
309}
310value->string = "N/A";
311return true;
312}
313
314bool getSMBMemoryDevicePartNumber(returnType *value)
315{
316static int idx = -1;
317if (execute_hook("isMemoryRegistred", NULL, NULL, NULL, NULL, NULL, NULL) == EFI_SUCCESS) {
318intmap;
319
320 int * DmiDimm = (int*)get_env_ptr(envDmiDimm);
321 RamSlotInfo_t * RamDimm = (RamSlotInfo_t*)get_env_ptr(envRamDimm);
322
323idx++;
324if (idx < MAX_RAM_SLOTS)
325{
326map = DmiDimm[idx];
327if (RamDimm[map].InUse && strlen(RamDimm[map].PartNo) > 0)
328{
329DBG("Ram Detected PartNo[%d]='%s'\n", idx, RamDimm[map].PartNo);
330value->string = RamDimm[map].PartNo;
331return true;
332}
333}
334}
335value->string = "N/A";
336return true;
337}
338

Archive Download this file

Revision: 2006