oldnapalm Posted December 24, 2010 Posted December 24, 2010 Tópico original: http://www.insanelymac.com/forum/index.php?showtopic=181631 Recomendo a leitura do tópico Dicas sobre gerenciamento de energia Para que a kext AppleIntelCPUPowerManagement funcione corretamente, é necessário que sua BIOS tenha os objetos _CST (C States), _PSS (Performance Supported States) e _PSD (P-State Dependency) na tabela SSDT. Certamente não é regra, mas nas poucas placas mãe que observei, percebi as seguintes coincidências: [table=600][trf][tdf][/tdf] [td]BIOS[/td] [td]_CST[/td] [td]_PSS[/td] [td]_PSD[/td] [td]Primeiro CPU[/td] [tdl]LPC compatível[/tdl][/trf] [tr][tdf]ASUS P5*[/tdf] [td]AMI[/td] [td]não[/td] [td]sim[/td] [td]sim[/td] [td]CPU1[/td] [tdl]sim[/tdl][/tr] [trl][tdf]Gigabyte[/tdf] [td]AWARD[/td] [td]não[/td] [td]não[/td] [td]não[/td] [td]CPU0[/td] [tdl]não[/tdl][/trl][/table] Para confirmar quais métodos sua placa possui, você pode usar tentativa e erro, inserindo um objeto por vez na tabela DSDT e verificando se funciona, ou fazer o procedimento explicado abaixo, utilizando o Linux. Observe que não tem problema se adicionar um objeto na tabela DSDT que já exista na SSDT. Os P-States, por exemplo, em algumas placas ASUS já estão presentes, basta adicionar os C States para que o SpeedStep funcione. Porém funciona com apenas 2 P-States (o máximo e o mínimo), então se quiser pode adicionar mais P-States no DSDT. O seguinte comando pode ser executado no Linux para extrair todas as tabelas ACPI mkdir ACPI && dmesg | perl -we '$n=0; while (<>) { if (($t,$a,$l,$o) = (/^[^a-zA-Z]*ACPI: ([-._A-Z0-9]{4,4}) +([0-9A-F]{8,8}), ([0-9A-F]{4,4})+(?:\s*\(([^)]+))?/)) { $o && $o=~s/[^-._a-zA-Z0-9]+/-/g; ($cmd="acpidump -a $a -l $l > \"ACPI/${t}".($o?"_$o":"").".aml\""); print "Running command: \"$cmd\"\n"; system($cmd); ++$n; } } die("No match") unless $n;' && zip -r ACPI-Tables.zip ACPI Se o SpeedStep não funciona nativamente, é provável que sua BIOS não tenha os C States, então você precisa adicionar os seguintes métodos: No primeiro CPU (pode ser CPU0 ou CPU1, dependendo da BIOS) Method (_CST, 0, NotSerialized) { Return (Package (0x02) { One, Package (0x04) { ResourceTemplate () { Register (FFixedHW, 0x01, // Bit Width 0x02, // Bit Offset 0x0000000000000000, // Address 0x01, // Access Size ) }, One, 0x9D, 0x03E8 } }) } No segundo CPU (pode ser CPU1 ou CPU2, dependendo da BIOS) Method (_CST, 0, NotSerialized) { Return (Package (0x04) { 0x03, Package (0x04) { ResourceTemplate () { Register (FFixedHW, 0x01, // Bit Width 0x02, // Bit Offset 0x0000000000000000, // Address ,) }, One, Zero, 0x03E8 }, Package (0x04) { ResourceTemplate () { Register (FFixedHW, 0x08, // Bit Width 0x00, // Bit Offset 0x0000000000000414, // Address ,) }, 0x02, One, 0x01F4 }, Package (0x04) { ResourceTemplate () { Register (FFixedHW, 0x08, // Bit Width 0x00, // Bit Offset 0x0000000000000415, // Address ,) }, 0x03, 0x55, 0xFA } }) } Nos demais CPUs (se existirem) adicione uma referência ao _CST do segundo CPU (lembre que pode ser CPU1 ou CPU2, dependendo da BIOS) Method (_CST, 0, NotSerialized) { Return (^^CPU1._CST ()) } Adicione o método _PSD apenas no primeiro CPU Method (_PSD, 0, NotSerialized) { Return (Package (0x05) { 0x05, Zero, Zero, 0xFC, 0x04 }) } Nos demais CPUs, adicione uma referência ao _PSD do primeiro CPU Method (_PSD, 0, NotSerialized) { Return (^^CPU0._PSD ()) } Para o método _PSS você precisa saber o número de P-States do seu CPU e os valores de FID e VID de cada P-State. Para obter estes dados você pode usar o programa PStateChanger (link para download no tópico original, veja no início do post). Adicione apenas no primeiro CPU Method (_PSS, 0, NotSerialized) { Return (Package (0x0N) // N = número de P-States { Package (0x06) { Zero, Zero, 0x10, 0x10, 0xFFVV, // FF = FID, VV = VID Zero // primeiro P-State }, Package (0x06) { Zero, Zero, 0x10, 0x10, 0xFFVV, // FF = FID, VV = VID One // segundo P-State }, Package (0x06) { Zero, Zero, 0x10, 0x10, 0xFFVV, // FF = FID, VV = VID 0x02 // terceiro P-State }, Package (0x06) { Zero, Zero, 0x10, 0x10, 0xFFVV, // FF = FID, VV = VID 0x03 // quarto P-State } }) } Nos demais CPUs, adicione uma referência ao _PSS do primeiro CPU Method (_PSS, 0, NotSerialized) { Return (^^CPU0._PSS ()) } Outra coisa necessária para que o gerenciamento de energia nativo funcione, é que a kext AppleLPC esteja carregada. Se a sua placa mãe tem um dispositivo LPC com ID compatível, a kext será carregada normalmente. Caso contrário, use o zhell's trick para mudar o ID. Adicione no device LPC (endereço 0x001F0000) Method (_DSM, 4, NotSerialized) { Store (Package (0x02) { "device-id", Buffer (0x04) { 0x18, 0x3A, 0x00, 0x00 } }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } Para finalizar, configure o SMproductname de acordo com o CPU. -Guides and Tutorials HERE -Hackintosh Tutorial Database - HERE -The largest EFI folder collection for Hackintosh HERE -Support Olarila Vanilla Hackintosh by making a donation HERE -Professional Consulting for macOS Hackintosh since 2006 HERE
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now