Chameleon

Chameleon Commit Details

Date:2010-12-31 17:12:51 (13 years 3 months ago)
Author:valv
Commit:698
Parents: 697
Message:latest commit of the year ;) with some improvements here and there. More to come next year
Changes:
M/branches/valv/i386/libsaio/cpu.c
M/branches/valv/i386/libsaio/dram_controllers.c
M/branches/valv/i386/libsaio/platform.h
M/branches/valv/i386/libsaio/nvidia.c
M/branches/valv/i386/libsaio/cpu.h
M/branches/valv/i386/libsaio/hfs.c
M/branches/valv/i386/libsaio/acpi_patcher.c
M/branches/valv/i386/libsaio/smbios_patcher.c
M/branches/valv/revision
M/branches/valv/i386/boot2/boot.c

File differences

branches/valv/i386/libsaio/hfs.c
303303
304304
305305
306
306
307
308
309
310
311
312
313
314
307315
308316
309317
/*if (strstr(filePath, ".plist")) verbose("LoadConfig: [%s/%s] %d bytes.\n", devStr, filePath, (uint32_t)length);*/
if (strstr(filePath, "com.apple.Boot.plist")) verbose("Config: [%s/%s] %d bytes.\n", devStr, filePath, (uint32_t)length);
if (strstr(filePath, "theme.plist")) verbose("Theme: [%s].\n", devStr);
if (strstr(filePath, "theme.plist"))
{
//valv: inspired from toitione's rtrim
int t_len = strlen(filePath) - 12;
char *themePath = strncpy(malloc(t_len + 1), filePath, t_len);
themePath[t_len+1] = '\0';
verbose("Theme: [%s]/%s\n", devStr, themePath);
}
// if (strstr(filePath, "theme.plist")) verbose("Theme: [%s].\n", devStr);
if (strstr(filePath, "smbios.plist")) verbose("SMBios: [%s/%s] %d bytes.\n", devStr, filePath, (uint32_t)length);
if (strstr(filePath, ".aml")) verbose("ACPI: [%s/%s] %d bytes.\n", devStr, filePath, (uint32_t)length);
return length;
branches/valv/i386/libsaio/acpi_patcher.c
318318
319319
320320
321
322
323
324
325
326
327
328
329
330
321331
322332
323333
......
368378
369379
370380
371
381
372382
373383
374384
375385
376
386
387
377388
378389
379390
......
430441
431442
432443
433
444
434445
435446
436447
......
492503
493504
494505
495
506
496507
497508
498509
......
521532
522533
523534
535
524536
525537
526538
527539
528
529
530540
531541
532542
......
788798
789799
790800
791
801
802
792803
793804
794
795805
796806
797807
......
808818
809819
810820
811
821
812822
813823
814824
815825
816826
827
817828
818829
819830
......
821832
822833
823834
824
835
825836
826
837
827838
828839
829840
......
838849
839850
840851
841
852
842853
843854
844855
845856
846857
847858
848
859
849860
850861
862
851863
852864
853865
854866
855
867
856868
857
869
858870
859871
860872
......
884896
885897
886898
887
888
889
890
891899
900
901
902
892903
893904
894905
......
952963
953964
954965
966
967
955968
956
969
970
971
972
957973
958974
959975
960976
961977
962
978
979
980
981
982
983
984
985
986
987
988
963989
964990
965
991
966992
967
968
969
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
9701009
9711010
972
1011
1012
1013
9731014
974
975
9761015
9771016
9781017
......
10201059
10211060
10221061
1023
1062
10241063
10251064
10261065
......
10451084
10461085
10471086
1048
1049
1050
1051
1087
1088
1089
1090
10521091
10531092
10541093
......
11141153
11151154
11161155
1117
1156
11181157
11191158
11201159
......
18021841
18031842
18041843
1805
1844
18061845
18071846
18081847
......
21542193
21552194
21562195
2157
2196
21582197
21592198
21602199
struct aml_chunk* root = aml_create_node(NULL);
aml_add_buffer(root, ssdt_header, sizeof(ssdt_header)); // SSDT header
struct aml_chunk* scop = aml_add_scope(root, "\\_PR_");
struct aml_chunk* name_csd = aml_add_name(scop, "CSD_");
struct aml_chunk* pack_csd = aml_add_package(name_csd);
struct aml_chunk* csd = aml_add_package(pack_csd);
aml_add_byte(csd, 0x05);
aml_add_byte(csd, 0x00);
aml_add_dword(csd, 0x00);
aml_add_dword(csd, 0xfd);
aml_add_dword(csd, Platform.CPU.NoCores);
struct aml_chunk* name = aml_add_name(scop, "CST_");
struct aml_chunk* pack = aml_add_package(name);
aml_add_byte(pack, cstates_count);
aml_add_word(tmpl, 0x015e); // Power
verbose ("C6");
}
verbose("\n");
//verbose("\n");
break;
case 0x1C: // Atom (45nm)
case 0x26: // Atom Lincroft
//valv: was 0x26 ??? rely on cpu.c & smbios_patcher.c
case 0x27: // Atom Lincroft
// C1
cstate_resource_template[11] = 0x00; // C1-Atom
aml_add_word(tmpl, 0x0096); // Power
verbose ("C6 ");
}
verbose("\n");
//verbose("\n");
break;
aml_add_word(tmpl, 0x0096); // Power 150
verbose ("C6");
}
verbose("\n");
//verbose("\n");
break;
}
ssdt->Checksum = 0;
ssdt->Checksum = 256 - checksum8(ssdt, ssdt->Length);
verbose (" @ %x\n", ssdt);
aml_destroy_node(root);
//dumpPhysAddr("C-States SSDT content: ", ssdt, ssdt->Length);
//verbose ("SSDT with CPU C-States generated successfully\n");
return ssdt;
}
else
if (p_states_count > 0)
{
int i;
//valv: fix p-states number issue for some models. TODO: move to top
//valv: fix p-states number issue on some models.
verbose("Model detected: %s\n", MacProduct);
if(!strstr(MacProduct, "applemac2010"))
{
verbose("Model detected: %s\n", MacProduct);
if(strstr(MacProduct, "MacBookPro4,1") && ((p_states_count > 9) && ((pstart == 0) && (pstates == 0)))) pstates = 8;
if(strstr(MacProduct, "MacBookAir1,1") && ((p_states_count > 4) && ((pstart == 0) && (pstates == 0)))) pstates = 3;
}
aml_add_byte(psd, 0x05);
aml_add_byte(psd, 0x00);
aml_add_dword(psd, 0x00);
aml_add_dword(psd, 0xfc);
aml_add_dword(psd, 0xfd);
aml_add_dword(psd, Platform.CPU.NoCores);
struct aml_chunk* name_pss = aml_add_name(scop, "PSS_");
struct aml_chunk* pack_pss = aml_add_package(name_pss);
uint8_t p_states_num = 0;
for (i = pstart; i < p_states_count; i++)
{
if ((p_states[i].Frequency <= freq_max) && (p_states[i].Frequency >= freq_min))
//valv: inspired from cparm's pss-drop; coded by me ;)
if ((i > pstates) && (pstates > 0))
{
if(Platform.CPU.ISerie) verbose("P-State: [Frequency %d MHz, FID 0x%x] is the %dth state. Removed!\n",
if(Platform.CPU.ISerie) verbose("P-State: [Frequency %d MHz\tFID 0x%x] is the %dth state. Removed!\n",
p_states[i].Frequency, p_states[i].FID, (i+1));
else verbose("P-State: [Frequency %d MHz, FID 0x%x, VID 0x%x] is the %dth state. Removed!\n",
else verbose("P-State: [Frequency %d MHz\tFID 0x%x \tVID 0x%x] is the %dth state. Removed!\n",
p_states[i].Frequency, p_states[i].FID, p_states[i].VID, (i+1));
}
else
{
aml_add_dword(pstt, p_states[i].FID);
aml_add_dword(pstt, p_states[i].FID);
verbose("P-State: Added [Frequency %d MHz, FID 0x%x]\n", p_states[i].Frequency, p_states[i].FID);
verbose("P-State: Added [Frequency %d MHz\tFID 0x%x]\n", p_states[i].Frequency, p_states[i].FID);
}
else
{
aml_add_dword(pstt, p_states[i].Control);
aml_add_dword(pstt, p_states[i].Control);
//aml_add_dword(pstt, i+1); // Status
verbose("P-State: Added [Frequency %d MHz, FID 0x%x, VID 0x%x]\n",
verbose("P-State: Added [Frequency %d MHz\tFID 0x%x \tVID 0x%x]\n",
p_states[i].Frequency, p_states[i].FID, p_states[i].VID);
}
p_states_num++;
}
}
else
{
if(Platform.CPU.ISerie) verbose("P-State: [Frequency %d MHz, FID 0x%x] is over the limit. Removed!\n",
if(Platform.CPU.ISerie) verbose("P-State: [Frequency %d MHz\tFID 0x%x] is over the limit. Removed!\n",
p_states[i].Frequency, p_states[i].FID);
else verbose("P-State: [Frequency %d MHz, FID 0x%x, VID 0x%x] is over the limit. Removed!\n",
else verbose("P-State: [Frequency %d MHz\tFID 0x%x \tVID 0x%x] is over the limit. Removed!\n",
p_states[i].Frequency, p_states[i].FID, p_states[i].VID);
}
}
ssdt->Length = root->Size;
ssdt->Checksum = 0;
ssdt->Checksum = 256 - checksum8(ssdt, ssdt->Length);
aml_destroy_node(root);
//verbose ("SSDT with CPU P-States generated successfully\n");
verbose ("P-States: %d states were succefully generated @ %x\n", p_states_num, ssdt);
aml_destroy_node(root);
return ssdt;
}
}
struct t_state t_states[32];
uint8_t t_states_count = 0, ctrl0 = 0x10, j = 0x01;
int i, step;
uint64_t msr;
uint32_t ext_mod; // *ret = 0;
if(!fadt->DUTY_WIDTH)
do_cpuid(6, Platform.CPU.CPUID[CPUID_81]);
ext_mod = bitfield(Platform.CPU.CPUID[CPUID_81][0], 5, 5);
if(ext_mod == 1)
{
verbose("T-States: Unsupported CPU !!!\n");
return NULL;
}
verbose("T-States: duty_offset=%d, duty_width=%d", fadt->DUTY_OFFSET, fadt->DUTY_WIDTH);
msr = rdmsr64(MSR_IA32_CLOCK_MODULATION);
t_states_count = msr & 0xE;
//if(!fadt->DUTY_WIDTH)
if(t_states_count == 0)
{
verbose("T-States: Unsupported CPU !!!\n");
return NULL;
}
/*
verbose("T-States: duty_offset=%d, duty_width=%d\n", fadt->DUTY_OFFSET, fadt->DUTY_WIDTH);
uint8_t duty_cycle = fadt->DUTY_WIDTH + fadt->DUTY_OFFSET;
if (duty_cycle > 4)
if(duty_cycle > 4)
{
verbose(", Spanning bit 4");
//return NULL;
t_states_count = 8;
verbose("T-States: Spanning bit 4\n");
for (i=2; i<21; i++)
{
if(duty_cycle > 4)
{
verbose("duty_cycle: %d\n", duty_cycle);
sleep(i);
i++;
}
//return NULL;
else
{
t_states_count = 8;
goto nrx;
}
}
}
else t_states_count = 1 << fadt->DUTY_WIDTH;
nrx:
*/
step = (1000 / t_states_count);
verbose("\nT-States: step=%d\n", step);
for (i = 1; i < t_states_count; i++)
{
t_states[i].perf = (1000 - (step * i)) / 10;
aml_add_byte(tsd, 0x05);
aml_add_byte(tsd, 0x00);
aml_add_dword(tsd, 0x00);
aml_add_dword(tsd, 0xfc);
aml_add_dword(tsd, 0xfd);
aml_add_dword(tsd, Platform.CPU.NoCores);
// Add aliaces
ssdt->Length = root->Size;
ssdt->Checksum = 0;
ssdt->Checksum = 256 - checksum8(ssdt, ssdt->Length);
aml_destroy_node(root);
verbose ("T-States: %d states were succefully generated\n");
verbose ("T-States: step=%d, %d states were succefully generated @ %x\n", step, t_states_count, ssdt);
aml_destroy_node(root);
return ssdt;
}
return NULL;
}
DBG("Table %s read and stored at: %x\n", dirspec, tableAddr);
verbose("Table %s read and stored at: %x\n", dirspec, tableAddr);
close (fd);
return tableAddr;
}
else
{
rsdp_mod->RsdtAddress=0;
printf("RSDT not found or RSDT incorrect\n");
printf("RSDT not found or incorrect\n");
}
if (version)
*/
rsdp_mod->XsdtAddress=0xffffffffffffffffLL;
verbose("XSDT not found or XSDT incorrect\n");
verbose("XSDT not found or incorrect\n");
}
}
branches/valv/i386/libsaio/smbios_patcher.c
319319
320320
321321
322
322
323
323324
324325
325326
......
445446
446447
447448
448
449
450
449451
450452
451453
case 0x0e:// Core Solo/Duo, "Yonah", 65nm
case 0x0f:// Pentium 4, Core 2, Xeon, "Merom", "Conroe", 65nm
case 0x17:// Core 2 Extreme, Xeon, "Penryn", "Wolfdale", 45nm
case 0x1c:// Intel Atom, 45nm
case 0x1c:// Intel Atom
case 0x27:// Intel Atom, "Lincroft", 45nm
return 0; // TODO: populate bus speed for these processors
break;
case 0x2f:// Core i7, "Westmere-Ex", 45nm, Hexa-Core
break;
case 0x0f:// Pentium 4, Core 2, Xeon, "Merom", "Conroe", 65nm
case 0x17:// Core 2 Extreme, Xeon, "Penryn", "Wolfdale", 45nm
case 0x1c:// Intel Atom, 45nm
case 0x1c:// Intel Atom
case 0x27:// Intel Atom, "Lincroft", 45nm
default:
return sm_get_cores();
}
branches/valv/i386/libsaio/dram_controllers.c
159159
160160
161161
162
162
163163
164164
165165
......
231231
232232
233233
234
234
235235
236236
237237
......
245245
246246
247247
248
248
249249
250250
251251
DBG("mch_ratio %d\n", mch_ratio);
// Compute RAM Frequency
Platform.RAM.Frequency = (Platform.CPU.FSBFrequency * mch_ratio) / 100000;
Platform.RAM.Frequency = (Platform.CPU.FSBIFrequency * mch_ratio) / 100000;
DBG("ram_fsb %d\n", Platform.RAM.Frequency);
}
// Compute RAM Frequency
Platform.RAM.Frequency = (Platform.CPU.FSBFrequency * mch_ratio) / 100000;
Platform.RAM.Frequency = (Platform.CPU.FSBIFrequency * mch_ratio) / 100000;
}
mch_ratio = (mc_dimm_clk_ratio & 0x1F);
// Compute RAM Frequency
Platform.RAM.Frequency = Platform.CPU.FSBFrequency * mch_ratio / 2;
Platform.RAM.Frequency = Platform.CPU.FSBIFrequency * mch_ratio / 2;
}
/*
branches/valv/i386/libsaio/nvidia.c
335335
336336
337337
338
338339
339340
340341
......
359360
360361
361362
363
364
362365
363366
364367
368
365369
366370
367371
......
375379
376380
377381
382
378383
384
385
386
379387
380388
381389
382390
383391
384392
393
394
395
396
397
398
399
400
401
385402
386403
387404
......
399416
400417
401418
419
402420
403421
404422
405423
406424
407425
426
427
408428
409429
410430
......
416436
417437
418438
439
440
419441
420442
443
444
421445
422446
423447
424448
449
450
451
425452
453
454
426455
427456
428457
......
430459
431460
432461
462
433463
434464
465
435466
467
468
469
436470
471
472
437473
438474
439475
440476
441477
442478
479
480
481
482
483
484
485
486
487
488
489
443490
491
444492
493
445494
446495
447496
......
449498
450499
451500
452
453
454
455
456
457
458
459
460
461
501
502
503
504
505
462506
463507
464508
{ 0x10DE060B, "GeForce 9800M GT" },
{ 0x10DE060C, "GeForce 8800M GTX" },
{ 0x10DE060D, "GeForce 8800 GS" },
{ 0x10DE060F, "GeForce GTX 285M" },
{ 0x10DE0610, "GeForce 9600 GSO" },
{ 0x10DE0611, "GeForce 8800 GT" },
{ 0x10DE0612, "GeForce 9800 GTX" },
{ 0x10DE062C, "GeForce 9800M GTS" },
{ 0x10DE062D, "GeForce 9600 GT" },
{ 0x10DE062E, "GeForce 9600 GT" },
{ 0x10DE0631, "GeForce GTS 160M" },
{ 0x10DE0632, "GeForce GTS 150M" },
{ 0x10DE0635, "GeForce 9600 GSO" },
{ 0x10DE0637, "GeForce 9600 GT" },
{ 0x10DE0638, "Quadro FX 1800" },
{ 0x10DE063A, "Quadro FX 2700M" },
{ 0x10DE0640, "GeForce 9500 GT" },
{ 0x10DE0641, "GeForce 9400 GT" },
{ 0x10DE0642, "GeForce 8400 GS" },
{ 0x10DE064A, "GeForce 9700M GT" },
{ 0x10DE064B, "GeForce 9500M G" },
{ 0x10DE064C, "GeForce 9650M GT" },
{ 0x10DE0651, "GeForce G 110M" },
{ 0x10DE0652, "GeForce GT 130M" },
{ 0x10DE0653, "GeForce GT 120M" },
{ 0x10DE0654, "GeForce GT 220M" },
{ 0x10DE0656, "GeForce 9650 S" },
{ 0x10DE0658, "Quadro FX 380" },
{ 0x10DE0659, "Quadro FX 580" },
{ 0x10DE065A, "Quadro FX 1700M" },
{ 0x10DE065B, "GeForce 9400 GT" },
{ 0x10DE065C, "Quadro FX 770M" },
{ 0x10DE065F, "GeForce G210" },
{ 0x10DE06C0, "GeForce GTX 480" },
{ 0x10DE06C4, "GeForce GTX 465" },
{ 0x10DE06CA, "GeForce GTX 480M" },
{ 0x10DE06CD, "GeForce GTX 470" },
{ 0x10DE06D1, "Tesla C2050" },// TODO: sub-device id: 0x0771
{ 0x10DE06D1, "Tesla C2070" },// TODO: sub-device id: 0x0772
{ 0x10DE06DD, "Quadro 4000" },
{ 0x10DE06DE, "Tesla M2050" },// TODO: sub-device id: 0x0846
{ 0x10DE06DE, "Tesla M2070" },// TODO: sub-device id: ?
{ 0x10DE06E0, "GeForce 9300 GE" },
{ 0x10DE06E1, "GeForce 9300 GS" },
{ 0x10DE06E2, "GeForce 8400" },
{ 0x10DE06F8, "Quadro NVS 420" },
{ 0x10DE06F9, "Quadro FX 370 LP" },
{ 0x10DE06FA, "Quadro NVS 450" },
{ 0x10DE06FB, "Quadro FX 370M" },
{ 0x10DE06FD, "Quadro NVS 295" },
{ 0x10DE07E0, "GeForce 7150 / nForce 630i" },
{ 0x10DE07E1, "GeForce 7100 / nForce 630i" },
{ 0x10DE07E2, "GeForce 7050 / nForce 630i" },
{ 0x10DE07E3, "GeForce 7050 / nForce 610i" },
{ 0x10DE07E5, "GeForce 7050 / nForce 620i" },
{ 0x10DE0844, "GeForce 9100M G" },
{ 0x10DE0845, "GeForce 8200M G" },
{ 0x10DE0846, "GeForce 9200" },
{ 0x10DE0847, "GeForce 9100" },
{ 0x10DE0848, "GeForce 8300" },
{ 0x10DE084F, "GeForce 8100 / nForce 720a" },
{ 0x10DE0860, "GeForce 9400" },
{ 0x10DE0861, "GeForce 9400" },
{ 0x10DE0862, "GeForce 9400M G" },
{ 0x10DE0863, "GeForce 9400M" },
{ 0x10DE0864, "GeForce 9300" },
{ 0x10DE0865, "ION" },
{ 0x10DE0866, "GeForce 9400M G" },
{ 0x10DE0867, "GeForce 9400" },
{ 0x10DE0868, "nForce 760i SLI" },
{ 0x10DE086A, "GeForce 9400" },
{ 0x10DE086C, "GeForce 9300 / nForce 730i" },
{ 0x10DE086D, "GeForce 9200" },
{ 0x10DE086E, "GeForce 9100M G" },
{ 0x10DE086F, "GeForce 8200M G" },
{ 0x10DE0870, "GeForce 9400M" },
{ 0x10DE0871, "GeForce 9200" },
{ 0x10DE0872, "GeForce G102M" },
{ 0x10DE0873, "GeForce G102M" },
{ 0x10DE0874, "ION" },
{ 0x10DE0876, "ION" },
{ 0x10DE087A, "GeForce 9400" },
{ 0x10DE087E, "ION LE" },
{ 0x10DE087F, "ION LE" },
{ 0x10DE0A20, "GeForce GT220" },
{ 0x10DE0A22, "GeForce 315" },
{ 0x10DE0A23, "GeForce 210" },
{ 0x10DE0A28, "GeForce GT 230M" },
{ 0x10DE0A29, "GeForce GT 330M" },
{ 0x10DE0A2A, "GeForce GT 230M" },
{ 0x10DE0A2B, "GeForce GT 330M" },
{ 0x10DE0A2C, "NVS 5100M" },
{ 0x10DE0A2D, "GeForce GT 320M" },
{ 0x10DE0A34, "GeForce GT 240M" },
{ 0x10DE0A35, "GeForce GT 325M" },
{ 0x10DE0A3C, "Quadro FX 880M" },
{ 0x10DE0A60, "GeForce G210" },
{ 0x10DE0A62, "GeForce 205" },
{ 0x10DE0A63, "GeForce 310" },
{ 0x10DE0A64, "ION" },
{ 0x10DE0A65, "GeForce 210" },
{ 0x10DE0A66, "GeForce 310" },
{ 0x10DE0A67, "GeForce 315" },
{ 0x10DE0A68, "GeForce G105M" },
{ 0x10DE0A69, "GeForce G105M" },
{ 0x10DE0A6A, "NVS 2100M" },
{ 0x10DE0A6C, "NVS 3100M" },
{ 0x10DE0A6E, "GeForce 305M" },
{ 0x10DE0A6F, "ION" },
{ 0x10DE0A70, "GeForce 310M" },
{ 0x10DE0A71, "GeForce 305M" },
{ 0x10DE0A72, "GeForce 310M" },
{ 0x10DE0A73, "GeForce 305M" },
{ 0x10DE0A74, "GeForce G210M" },
{ 0x10DE0A75, "GeForce G310M" },
{ 0x10DE0A78, "Quadro FX 380 LP" },
{ 0x10DE0A7C, "Quadro FX 380M" },
{ 0x10DE0CA0, "GeForce GT 330 " },
{ 0x10DE0CA2, "GeForce GT 320" },
{ 0x10DE0CA3, "GeForce GT 240" },
{ 0x10DE0CA7, "GeForce GT 330" },
{ 0x10DE0CA8, "GeForce GTS 260M" },
{ 0x10DE0CA9, "GeForce GTS 250M" },
{ 0x10DE0CA3, "GeForce GT240" },
{ 0x10DE06C0, "GeForce GTX 480" },
{ 0x10DE06C4, "GeForce GTX 465" },
{ 0x10DE06CA, "GeForce GTX 480M" },
{ 0x10DE06CD, "GeForce GTX 470" },
{ 0x10DE06D1, "Tesla C2050" },// TODO: sub-device id: 0x0771
{ 0x10DE06D1, "Tesla C2070" },// TODO: sub-device id: 0x0772
{ 0x10DE06DD, "Quadro 4000" },
{ 0x10DE06DE, "Tesla M2050" },// TODO: sub-device id: 0x0846
{ 0x10DE06DE, "Tesla M2070" },// TODO: sub-device id: ?
{ 0x10DE0CAC, "GeForce 315" },
{ 0x10DE0CAF, "GeForce GT 335M" },
{ 0x10DE0CB0, "GeForce GTS 350M" },
{ 0x10DE0CB1, "GeForce GT 360M" },
{ 0x10DE0CBC, "Quadro FX 1800M" },
{ 0x10DE0DC4, "GeForce GTS 450" },
{ 0x10DE0DE1, "GeForce GT 430" },
{ 0x10DE0DF0, "GeForce GT 425M" },
branches/valv/i386/libsaio/cpu.c
9898
9999
100100
101
101
102102
103
103
104104
105105
106106
......
187187
188188
189189
190
190191
191192
192193
......
197198
198199
199200
200
201
201202
202203
203204
......
277278
278279
279280
281
280282
281283
284
282285
283286
284287
......
329332
330333
331334
332
335
336
333337
334338
335339
336340
337341
342
338343
339344
345
346
340347
341348
349
342350
343351
344352
......
358366
359367
360368
361
369
362370
363371
364372
......
368376
369377
370378
379
380
381
382
371383
372384
373385
......
490502
491503
492504
505
506
507
508
509
493510
494511
495512
......
586603
587604
588605
589
606
590607
591608
592609
593610
594611
595
596
612
613
597614
598
615
616
617
599618
600
601
602
619
620
621
622
623
624
625
603626
604
627
628
605629
606
607
608
609
610
611
612
613
614
615
616
617
618
630
619631
620
621
632
622633
623
624
625
626
627
628
629
630634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
631688
632689
633690
......
636693
637694
638695
639
640696
697
698
641699
642700
643701
......
646704
647705
648706
707
708
709
649710
650711
651712
{
const char*newratio, *newfsb;
intlen, myfsb, i;
uint64_ttscFrequency, fsbFrequency, cpuFrequency;
uint64_ttscFrequency, fsbFrequency, cpuFrequency, fsbi;
uint64_tmsr, flex_ratio = 0;
uint32_ttms, ida, max_ratio, min_ratio;
uint32_ttms, ida, amo, max_ratio, min_ratio;
uint8_tbus_ratio_max, maxdiv, bus_ratio_min, currdiv;
boolfix_fsb, did, core_i, turbo;
tscFrequency = measure_tsc_frequency();
fsbFrequency = 0;
cpuFrequency = 0;
fsbi = 0;
fix_fsb = false;
did = false;
core_i = false;
verbose("CPU: ");
int tjmax = 0;
msr = rdmsr64(MSR_IA32_PLATFORM_ID);
if (((msr >> 50) & 0x01) == 1)
if((((msr >> 50) & 0x01) == 1) || (rdmsr64(0x17) & (1<<28)))
{
p->CPU.Features |= CPU_FEATURE_MOBILE;
verbose("Mobile ");
p->CPU.MaxRatio = max_ratio;
p->CPU.MinRatio = min_ratio;
fsbi = fsbFrequency;
if(getIntForKey(kForceFSB, &myfsb, &bootInfo->bootConfig)) goto forcefsb;
break;
case 0xd:// Pentium D; valv: is this the right place ?
case 0xe:// Core Duo/Solo, Pentium M DC
goto teleport;
case 0xf:// Core Xeon, Core 2 DC, 65nm
case 0x16:// Celeron, Core 2 SC, 65nm
case 0x27:// Atom Lincroft, 45nm
core_i = false;
//valv: todo: msr_therm2_ctl (0x19d) bit 16 (mode of automatic thermal monitor): 0=tm1, 1=tm2
//also, if bit 3 of misc_enable is cleared the above would have no effect
if(platformCPUFeature(CPU_FEATURE_TM1))
{
msr_t msr32;
msr32 = rdmsr(MSR_IA32_MISC_ENABLE);
//thermally-initiated on-die modulation of the stop-clock duty cycle
if(!(rdmsr64(MSR_IA32_MISC_ENABLE) & (1 << 3))) msr32.lo |= (1 << 3);
verbose("CPU: Thermal Monitor: TM, ");
//BIOS must enable this feature if the TM2 feature flag (CPUID.1:ECX[8]) is set
if(platformCPUFeature(CPU_FEATURE_TM2))
{
//thermally-initiated frequency transitions
msr32.lo |= (1 << 13);
verbose("TM2, ");
}
getBoolForKey(kC2EEnable, &c2e, &bootInfo->bootConfig);
if(c2e) msr32.lo |= (1 << 26);
getBoolForKey(kC4EEnable, &c4e, &bootInfo->bootConfig);
if((c4e) && platformCPUFeature(CPU_FEATURE_MOBILE)) msr32.hi |= (1 << (32 - 32));
getBoolForKey(kHardC4EEnable, &hc4e, &bootInfo->bootConfig);
msr32.hi |= (1 << (36 - 32)); // EMTTM
wrmsr(MSR_IA32_MISC_ENABLE, msr32);
msr32 = rdmsr(PIC_SENS_CFG);
msr32.lo |= (1 << 21);
wrmsr(PIC_SENS_CFG, msr32);
}
if (rdmsr64(MSR_IA32_EXT_CONFIG) & (1 << 27))
if(fix_fsb)
{
if (bus_ratio_max)
{
if (maxdiv) fsbi = ((tscFrequency * 2) / ((bus_ratio_max * 2) + 1));
else fsbi = (tscFrequency / bus_ratio_max);
}
ratio_gn:
if ((getValueForKey(kbusratio, &newratio, &len, &bootInfo->bootConfig)) && (len <= 4))
{
msr.hi |= (0 << (38-32));
wrmsr(MSR_IA32_MISC_ENABLE, msr);
delay(1);
if(bitfield(p->CPU.CPUID[CPUID_81][0], 0, 1) == 0) verbose("Failed!\n");
if(bitfield(p->CPU.CPUID[CPUID_81][0], 1, 1) == 0) verbose("Failed!\n");
else verbose("Succeded!\n");
}
else verbose("CPU: IDA: Enabled!\n");
}
}
#if 0
else if((p->CPU.Vendor == 0x68747541 /* AMD */) && (p->CPU.Family == 0x0f))
//#if 0
else if(p->CPU.Vendor == 0x68747541 /* AMD */) // valv: work in progress
{
if(p->CPU.ExtFamily == 0x00 /* K8 */)
verbose("CPU: ");
// valv: very experimental mobility check
if (p->CPU.CPUID[0x80000000][0] >= 0x80000007)
{
msr = rdmsr64(K8_FIDVID_STATUS);
bus_ratio_max = (msr & 0x3f) / 2 + 4;
currdiv = (msr & 0x01) * 2;
do_cpuid(0x80000007, p->CPU.CPUID[CPUID_MAX]);
amo = bitfield(p->CPU.CPUID[CPUID_MAX][0], 6, 6);
if (amo == 1)
{
p->CPU.Features |= CPU_FEATURE_MOBILE;
if (!strstr(p->CPU.BrandString, "obile")) verbose("Mobile ");
}
}
else if(p->CPU.ExtFamily >= 0x01 /* K10+ */)
//valv: 2nd attemp; just in case
if (!platformCPUFeature(CPU_FEATURE_MOBILE))
{
msr = rdmsr64(K10_COFVID_STATUS);
if(p->CPU.ExtFamily == 0x01 /* K10 */)
bus_ratio_max = (msr & 0x3f) + 0x10;
else /* K11+ */
bus_ratio_max = (msr & 0x3f) + 0x08;
currdiv = (2 << ((msr >> 6) & 0x07));
}
p->CPU.MaxRatio = bus_ratio_max * 10;
if (bus_ratio_max)
{
if (currdiv)
if (strstr(p->CPU.BrandString, "obile"))
{
fsbFrequency = ((tscFrequency * currdiv) / bus_ratio_max);
DBG("%d.%d\n", bus_ratio_max / currdiv, ((bus_ratio_max % currdiv) * 100) / currdiv);
p->CPU.Features |= CPU_FEATURE_MOBILE;
}
else
{
fsbFrequency = (tscFrequency / bus_ratio_max);
DBG("%d\n", bus_ratio_max);
}
fsbFrequency = (tscFrequency / bus_ratio_max);
cpuFrequency = tscFrequency;
}
verbose("%s\n", p->CPU.BrandString);
int amdCPU = p->CPU.Family;
switch (amdCPU)
{
case 0x0f:
if(p->CPU.ExtFamily == 0x00 /* K8 */)
{
msr = rdmsr64(K8_FIDVID_STATUS);
bus_ratio_max = (msr & 0x3f) / 2 + 4;
currdiv = (msr & 0x01) * 2;
}
else if(p->CPU.ExtFamily >= 0x01 /* K10+ */)
{
msr = rdmsr64(K10_COFVID_STATUS);
if(p->CPU.ExtFamily == 0x01 /* K10 */)
bus_ratio_max = (msr & 0x3f) + 0x10;
else /* K11+ */
bus_ratio_max = (msr & 0x3f) + 0x08;
currdiv = (2 << ((msr >> 6) & 0x07));
}
p->CPU.MaxRatio = bus_ratio_max * 10;
if (bus_ratio_max)
{
if (currdiv)
{
fsbFrequency = ((tscFrequency * currdiv) / bus_ratio_max); // ?
DBG("%d.%d\n", bus_ratio_max / currdiv, ((bus_ratio_max % currdiv) * 100) / currdiv);
}
else
{
fsbFrequency = (tscFrequency / bus_ratio_max);
DBG("%d\n", bus_ratio_max);
}
fsbFrequency = (tscFrequency / bus_ratio_max); // ?
cpuFrequency = tscFrequency; // ?
}
break;
case 0x10:// phenom
msr = rdmsr64(AMD_10H_11H_CONFIG);
bus_ratio_max = ((msr) & 0x3F);
currdiv = (((msr) >> 6) & 0x07);
cpuFrequency = 100 * (bus_ratio_max + 0x08) / (1 << currdiv);
break;
case 0x11:// shangai
msr = rdmsr64(AMD_10H_11H_CONFIG);
bus_ratio_max = ((msr) & 0x3F);
currdiv = (((msr) >> 6) & 0x07);
cpuFrequency = 100 * (bus_ratio_max + 0x10) / (1 << currdiv);
break;
}
}
if (!fsbFrequency)
cpuFrequency = tscFrequency;
DBG("0 ! using the default value for FSB !\n");
}
#endif
//#endif
p->CPU.MaxDiv = maxdiv;
p->CPU.CurrDiv = currdiv;
p->CPU.TSCFrequency = tscFrequency;
p->CPU.ISerie = false;
p->CPU.Turbo = false;
if(fsbi == 0) p->CPU.FSBIFrequency = fsbFrequency;
else p->CPU.FSBIFrequency = fsbi;
if (platformCPUFeature(CPU_FEATURE_EST))
{
msr_t msr32;
branches/valv/i386/libsaio/platform.h
124124
125125
126126
127
127128
128129
129130
uint8_tCurrDiv;// Current Halving ID
uint64_tTSCFrequency;// TSC Frequency Hz
uint64_tFSBFrequency;// FSB Frequency Hz
uint64_tFSBIFrequency;// FSB Frequency Hz (initial)
uint64_tCPUFrequency;// CPU Frequency Hz
uint32_tMaxRatio;// Max Bus Ratio
uint32_tMinRatio;// Min Bus Ratio
branches/valv/i386/libsaio/cpu.h
1717
1818
1919
20
21
22
23
24
25
26
27
28
29
30
31
32
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
3336
3437
3538
#define CPU_STRING_UNKNOWN"Unknown CPU Typ"
#define MSR_FSB_FREQ 0xCD
#define MSR_TURBO_RATIO_LIMIT 0x1AD
#define MSR_IA32_PLATFORM_ID 0x17
#defineMSR_IA32_PERF_STATUS 0x198
#define MSR_IA32_PERF_CONTROL 0x199
#define MSR_IA32_EXT_CONFIG 0xEE
#define MSR_FLEX_RATIO 0x194
#defineMSR_PLATFORM_INFO 0xCE
#define MSR_IA32_MISC_ENABLE 0x1A0
#define MSR_THERMAL_STATUS 0x19C
#define MSR_THERMAL_TARGET 0x01A2
#define K8_FIDVID_STATUS 0xC0010042
#define K10_COFVID_STATUS 0xC0010071
#define MSR_FSB_FREQ 0xCD
#define MSR_TURBO_RATIO_LIMIT 0x1AD
#define MSR_IA32_PLATFORM_ID 0x17
#defineMSR_IA32_PERF_STATUS 0x198
#define MSR_IA32_PERF_CONTROL 0x199
#define MSR_IA32_EXT_CONFIG 0xEE
#define MSR_FLEX_RATIO 0x194
#defineMSR_PLATFORM_INFO 0xCE
#define MSR_IA32_MISC_ENABLE 0x1A0
#define MSR_THERMAL_STATUS 0x19C
#define MSR_IA32_CLOCK_MODULATION 0x19A
#define MSR_THERMAL_TARGET 0x01A2
#define PIC_SENS_CFG 0x1aa
#define K8_FIDVID_STATUS 0xC0010042
#defineAMD_10H_11H_CONFIG 0xc0010064
#define K10_COFVID_STATUS 0xC0010071
#define DEFAULT_FSB100000 /* for now, hardcoding 100MHz for old CPUs */
branches/valv/i386/boot2/boot.c
477477
478478
479479
480
480
481481
482482
483483
closeVbios(map);
}
// Find out which version mac os we're booting.
// Find out which mac os version we're booting.
getOSVersion(gMacOSVersion);
if (platformCPUFeature(CPU_FEATURE_EM64T)) {
branches/valv/revision
1
1
665:684
665:688

Archive Download the corresponding diff file

Revision: 698