Jump to content

Recommended Posts

Posted

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).


pstates.png


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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now


×
×
  • Create New...