Jump to content
oldnapalm

SpeedStep vanilla

Recommended Posts

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.





×
  • Create New...