Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/Chameleon/i386/libsaio/smbios_getters.c

Source at commit 307 created 12 years 11 months ago.
By ifabio, merge changes from trunk (929). Also merge the module changes from Azimutz branche (fix compile error) Also edited the info.plist into AHCIPortInjector.kext: http://forum.voodooprojects.org/index.php/topic,1170.0.html
1/*
2 * Add (c) here
3 *
4 * Copyright .... All rights reserved.
5 *
6 */
7
8#include "smbios_getters.h"
9
10#ifndef DEBUG_SMBIOS
11#define DEBUG_SMBIOS 0
12#endif
13
14#if DEBUG_SMBIOS
15#define DBG(x...)printf(x)
16#else
17#define DBG(x...)
18#endif
19
20
21bool getProcessorInformationExternalClock(returnType *value)
22{
23value->word = Platform.CPU.FSBFrequency/1000000;
24return true;
25}
26
27bool getProcessorInformationMaximumClock(returnType *value)
28{
29value->word = Platform.CPU.CPUFrequency/1000000;
30return true;
31}
32
33bool getSMBOemProcessorBusSpeed(returnType *value)
34{
35if (Platform.CPU.Vendor == 0x756E6547) // Intel
36{
37switch (Platform.CPU.Family)
38{
39case 0x06:
40{
41switch (Platform.CPU.Model)
42{
43case 0x0D:// ?
44case CPU_MODEL_YONAH:// Yonah0x0E
45case CPU_MODEL_MEROM:// Merom0x0F
46case CPU_MODEL_PENRYN:// Penryn0x17
47case CPU_MODEL_ATOM:// Atom 45nm0x1C
48return false;
49
50case 0x19:// Intel Core i5 650 @3.20 Ghz
51case CPU_MODEL_NEHALEM:// Intel Core i7 LGA1366 (45nm)
52case CPU_MODEL_FIELDS:// Intel Core i5, i7 LGA1156 (45nm)
53case CPU_MODEL_DALES:// Intel Core i5, i7 LGA1156 (45nm) ???
54case CPU_MODEL_DALES_32NM:// Intel Core i3, i5, i7 LGA1156 (32nm)
55case CPU_MODEL_WESTMERE:// Intel Core i7 LGA1366 (32nm) 6 Core
56case CPU_MODEL_NEHALEM_EX:// Intel Core i7 LGA1366 (45nm) 6 Core ???
57case CPU_MODEL_WESTMERE_EX:// Intel Core i7 LGA1366 (45nm) 6 Core ???
58{
59// thanks to dgobe for i3/i5/i7 bus speed detection
60int nhm_bus = 0x3F;
61static long possible_nhm_bus[] = {0xFF, 0x7F, 0x3F};
62unsigned long did, vid;
63int i;
64
65// Nehalem supports Scrubbing
66// First, locate the PCI bus where the MCH is located
67for(i = 0; i < sizeof(possible_nhm_bus); i++)
68{
69vid = pci_config_read16(PCIADDR(possible_nhm_bus[i], 3, 4), 0x00);
70did = pci_config_read16(PCIADDR(possible_nhm_bus[i], 3, 4), 0x02);
71vid &= 0xFFFF;
72did &= 0xFF00;
73
74if(vid == 0x8086 && did >= 0x2C00)
75nhm_bus = possible_nhm_bus[i];
76}
77
78unsigned long qpimult, qpibusspeed;
79qpimult = pci_config_read32(PCIADDR(nhm_bus, 2, 1), 0x50);
80qpimult &= 0x7F;
81DBG("qpimult %d\n", qpimult);
82qpibusspeed = (qpimult * 2 * (Platform.CPU.FSBFrequency/1000000));
83// Rek: rounding decimals to match original mac profile info
84if (qpibusspeed%100 != 0)qpibusspeed = ((qpibusspeed+50)/100)*100;
85DBG("qpibusspeed %d\n", qpibusspeed);
86value->word = qpibusspeed;
87return true;
88}
89}
90}
91}
92}
93return false;
94}
95
96uint16_t simpleGetSMBOemProcessorType(void)
97{
98if (Platform.CPU.NoCores >= 4)
99{
100return 0x0501;// Quad-Core Xeon
101}
102else if (Platform.CPU.NoCores == 1)
103{
104return 0x0201;// Core Solo
105};
106
107return 0x0301;// Core 2 Duo
108}
109
110bool getSMBOemProcessorType(returnType *value)
111{
112static bool done = false;
113
114value->word = simpleGetSMBOemProcessorType();
115
116if (Platform.CPU.Vendor == 0x756E6547) // Intel
117{
118if (!done)
119{
120verbose("CPU is %s, family 0x%x, model 0x%x\n", Platform.CPU.BrandString, Platform.CPU.Family, Platform.CPU.Model);
121done = true;
122}
123
124switch (Platform.CPU.Family)
125{
126case 0x06:
127{
128switch (Platform.CPU.Model)
129{
130case 0x0D:// ?
131case CPU_MODEL_YONAH:// Yonah
132case CPU_MODEL_MEROM:// Merom
133case CPU_MODEL_PENRYN:// Penryn
134case CPU_MODEL_ATOM:// Intel Atom (45nm)
135return true;
136
137case CPU_MODEL_NEHALEM:// Intel Core i7 LGA1366 (45nm)
138if (strstr(Platform.CPU.BrandString, "Xeon(R)"))
139value->word = 0x0501;// Xeon
140else
141value->word = 0x0701;// Core i7
142
143return true;
144
145case CPU_MODEL_FIELDS:// Lynnfield, Clarksfield, Jasper
146if (strstr(Platform.CPU.BrandString, "Core(TM) i5"))
147value->word = 0x601;// Core i5
148else
149value->word = 0x0701;// Core i7
150return true;
151
152case CPU_MODEL_DALES:// Intel Core i5, i7 LGA1156 (45nm) (Havendale, Auburndale)
153if (strstr(Platform.CPU.BrandString, "Core(TM) i5"))
154value->word = 0x601;// Core i5
155else
156value->word = 0x0701;// Core i7
157return true;
158
159case CPU_MODEL_SANDY:// Intel Core i3, i5, i7 LGA1155 sandy bridge
160 case CPU_MODEL_SANDY_XEON:
161case CPU_MODEL_DALES_32NM:// Intel Core i3, i5, i7 LGA1156 (32nm) (Clarkdale, Arrandale)
162if (strstr(Platform.CPU.BrandString, "Core(TM) i3"))
163value->word = 0x901;// Core i3
164else
165if (strstr(Platform.CPU.BrandString, "Core(TM) i5"))
166value->word = 0x601;// Core i5
167else
168value->word = 0x0701;// Core i7
169return true;
170
171case CPU_MODEL_WESTMERE:// Intel Core i7 LGA1366 (32nm) 6 Core (Gulftown, Westmere-EP, Westmere-WS)
172case CPU_MODEL_WESTMERE_EX:// Intel Core i7 LGA1366 (45nm) 6 Core ???
173value->word = 0x0501;// Core i7
174return true;
175
176case 0x19:// Intel Core i5 650 @3.20 Ghz
177value->word = 0x601;// Core i5
178return true;
179}
180}
181}
182}
183
184return false;
185}
186
187bool getSMBMemoryDeviceMemoryType(returnType *value)
188{
189static int idx = -1;
190intmap;
191
192idx++;
193if (idx < MAX_RAM_SLOTS)
194{
195map = Platform.DMI.DIMM[idx];
196if (Platform.RAM.DIMM[map].InUse && Platform.RAM.DIMM[map].Type != 0)
197{
198DBG("RAM Detected Type = %d\n", Platform.RAM.DIMM[map].Type);
199value->byte = Platform.RAM.DIMM[map].Type;
200return true;
201}
202}
203
204return false;
205//value->byte = SMB_MEM_TYPE_DDR2;
206//return true;
207}
208
209bool getSMBMemoryDeviceMemorySpeed(returnType *value)
210{
211static int idx = -1;
212intmap;
213
214idx++;
215if (idx < MAX_RAM_SLOTS)
216{
217map = Platform.DMI.DIMM[idx];
218if (Platform.RAM.DIMM[map].InUse && Platform.RAM.DIMM[map].Frequency != 0)
219{
220DBG("RAM Detected Freq = %d Mhz\n", Platform.RAM.DIMM[map].Frequency);
221value->dword = Platform.RAM.DIMM[map].Frequency;
222return true;
223}
224}
225
226return false;
227//value->dword = 800;
228//return true;
229}
230
231bool getSMBMemoryDeviceManufacturer(returnType *value)
232{
233static int idx = -1;
234intmap;
235
236idx++;
237if (idx < MAX_RAM_SLOTS)
238{
239map = Platform.DMI.DIMM[idx];
240if (Platform.RAM.DIMM[map].InUse && strlen(Platform.RAM.DIMM[map].Vendor) > 0)
241{
242DBG("RAM Detected Vendor[%d]='%s'\n", idx, Platform.RAM.DIMM[map].Vendor);
243value->string = Platform.RAM.DIMM[map].Vendor;
244return true;
245}
246}
247
248return false;
249//value->string = NOT_AVAILABLE;
250//return true;
251}
252
253bool getSMBMemoryDeviceSerialNumber(returnType *value)
254{
255static int idx = -1;
256intmap;
257
258idx++;
259if (idx < MAX_RAM_SLOTS)
260{
261map = Platform.DMI.DIMM[idx];
262if (Platform.RAM.DIMM[map].InUse && strlen(Platform.RAM.DIMM[map].SerialNo) > 0)
263{
264DBG("map=%d, RAM Detected SerialNo[%d]='%s'\n", map, idx, Platform.RAM.DIMM[map].SerialNo);
265value->string = Platform.RAM.DIMM[map].SerialNo;
266return true;
267}
268}
269
270return false;
271//value->string = NOT_AVAILABLE;
272//return true;
273}
274
275bool getSMBMemoryDevicePartNumber(returnType *value)
276{
277static int idx = -1;
278intmap;
279
280idx++;
281if (idx < MAX_RAM_SLOTS)
282{
283map = Platform.DMI.DIMM[idx];
284if (Platform.RAM.DIMM[map].InUse && strlen(Platform.RAM.DIMM[map].PartNo) > 0)
285{
286DBG("map=%d, RAM Detected PartNo[%d]='%s'\n", map, idx, Platform.RAM.DIMM[map].PartNo);
287value->string = Platform.RAM.DIMM[map].PartNo;
288return true;
289}
290}
291
292return false;
293//value->string = NOT_AVAILABLE;
294//return true;
295}
296
297
298// getting smbios addr with fast compare ops, late checksum testing ...
299#define COMPARE_DWORD(a,b) ( *((uint32_t *) a) == *((uint32_t *) b) )
300static const char * const SMTAG = "_SM_";
301static const char* const DMITAG = "_DMI_";
302
303SMBEntryPoint *getAddressOfSmbiosTable(void)
304{
305SMBEntryPoint*smbios;
306/*
307 * The logic is to start at 0xf0000 and end at 0xfffff iterating 16 bytes at a time looking
308 * for the SMBIOS entry-point structure anchor (literal ASCII "_SM_").
309 */
310smbios = (SMBEntryPoint*)SMBIOS_RANGE_START;
311while (smbios <= (SMBEntryPoint *)SMBIOS_RANGE_END) {
312if (COMPARE_DWORD(smbios->anchor, SMTAG) &&
313COMPARE_DWORD(smbios->dmi.anchor, DMITAG) &&
314smbios->dmi.anchor[4] == DMITAG[4] &&
315checksum8(smbios, sizeof(SMBEntryPoint)) == 0)
316 {
317return smbios;
318 }
319smbios = (SMBEntryPoint*)(((char*)smbios) + 16);
320}
321printf("ERROR: Unable to find SMBIOS!\n");
322pause();
323return NULL;
324}
325
326

Archive Download this file

Revision: 307