Economia de energia nos chips Athlon Como Fazer

Autor: Daniel Nofftz


daniel@nofftz.net.NOSPAM
(nota: para usar este email, retire a extensão .NOSPAM)

2003-12-18

Tradutor da versão Português do Brasil: Bruno Buys <brunobuys@terra.com.br>

Histórico de revisões

Revisão 1.1.1            18-12-2003            dn
Tradução para o japonês adicionada, e possível correção para problemas relativos ao audio.
Revisão 1.1.0            04-10-2003            dn
Um monte de novas informações e links.
Revisão 1.02            29-08-2003            dn
Novo website, novo endereço de email, links atualizados!
Revisão 1.01
Conserto de bug! O hack de linha de comando para chipset AMD estava errado!
Revisão 1.0            20-06-2003            dn
Lançamento inicial, revisto pelo LDP

Resumo

Este documento descreve como habilitar as funções de economia de energia em processadores Athlon/Duron/AthlonXP em algumas placas-mãe/chipsets. Isso é útil tanto para economia de energia quanto para reduzir a temperatura da sua cpu e do sistema. (E também irá reduzir o ruído, se você usa ventoinhas controladas por temperatura no seu gabinete ou na sua cpu).

Índice

1. Introdução

    1.1 Conceitos sobre o estado de economia de energia nos Athlon
    1.2 Direitos autorais e Licensa
    1.3 Recusa de responsabilidade
    1.4 Feedback
    1.5 Novas versões deste documento

2.0 As diferentes abordagens

    2.1 O hack de linha de comando
    2.2 O programa Athcool
    2.3 Atualizações de BIOS
    2.4 Meu patch do kernel
    2.5 A solução LVcool
    2.6 O programa FVcool
    2.7 Economia de energia em AMD 760MP

3. O que mais?

    3.1 Como testar se funciona
    3.2 Problemas e bugs conhecidos
    3.3 Possível conserto para problemas de audio e outros problemas
    3.4 ToDo
    3.5 Traduções

1. Introdução

Conceitos sobre economia de energia nos Athlon.

O sinal HLT usado pelo idle loop do kernel linux não produz nenhuma economia significante de energia em processadores da família Athlon/Duron (a partir de agora, referidos somente como "Athlon"). Para um Athlon conseguir entrar em estado de economia de energia, você deverá colocar o processador em modo STPGNT (Modo "stop grant"). Neste estado, o processador é desconectado do barramento frontal (FSB) e pode desligar certas partes da cpu, bem como reduzir o clock, para economizar energia.

Algumas placas-mãe modernas e chipsets também possuem uma função para comandar um STPGNT quando um sinal HLT é detectado.

1.2 Direitos autorais e Licensa

Este documento, "Gerenciamento de energia nos chips Athlon Como Fazer" tem direitos reservados para Daniel Nofftz (2003).

É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da GNU Licensa Livre de Documentação, versão 1.2 ou qualquer versão posterior publicada pela Free Software Foundation; sem seções invariantes, sem textos de capa e sem textos de contra-capa. Uma cópia da licensa está disponível em http://www.gnu.org/copyleft/fdl.html.

Linux é marca registrada de Linus Torvalds.

1.3 Recusa de responsabilidade

Nenhuma responsabilidade pelo conteúdo deste documento poderá ser aceita. Use os conceitos, exemplos e informações por conta própria. Pode haver erros e imprecisões capazes de danificar o seu sistema. Proceda com cautela, e, apesar disso ser altamente improvável, o autor(es) não aceita(m) nenhuma responsabilidade.

Todos os direitos autorais são mantidos pelos respectivos donos, a menos que especificamente declarado. O uso de algum termo neste documento não deve ser entendido como afetando a validade de qualquer outra marca patenteada ou serviço. Os nomes de determinados produtos ou marcas não deve ser visto como propaganda.

1.4 Feedback

Feedback é essencial para este documento.  Novas soluções para novos chipsets são especialmente requisitadas. Eu preciso também de comentários, mesmo se as soluções fornecidas funcionarem ou não. Mande suas sugestões, adições ou críticas para <daniel@nofftz.net.NOSPAM>.

Você pode escrever tanto em inglês quanto em alemão!

1.5 Novas versões deste documento

Novas versões deste documento serão sempre publicadas aqui: http://www.daniel.nofftz.net/linux/

2. As diferentes abordagens

Noas próximas seções eu apresento diferentes métodos de atingir o mesmo objetivo: economia de energia no seu sistema baseado em Athlon. Meu método recomendado no momento é o da linha de comando, porque o patch do kernel está desatualizado, e não vai ser mais desenvolvido. O patch do LVcool funciona apenas em uma única família de chipsets. O programa Athcool parece bom, mas eu ainda não testei.

Quase todos estes métodos vão setar o bit "Habilitar desconexão quando STPGNT for detectado" na ponte norte do chipset. O resto do trabalho é feito pelo subsistema ACPI do kernel, que envia um sinal STPGNT para o processador, quando este entra em modo idle acpi-c2.

Se você ainda não tem um kernel com suporte a ACPI, você deverá habilitá-lo no setup do kernel e depois reocmpilar o novo kernel. Você achará as opções ACPI em General setup+ Power Management Setup->ACPI. Você deve ter no mínimo as seguintes opções: ACPI Bus Manager, system e Processor.

Ou para o kernel 2.4.22: General setup + suporte a ACPI. Você deverá tem ao menos a seguinte opção: Processor.

Alguns chipsets já possuem a instrução STPGNT quando um sinal HLT é detectado. Essas plcas/chipsets não precisam de ACPI habilitado. Eu estou precisando de feedback sobre quais chipsets funcionam sem ACPI e quais não precisam de ACPI. Quem sabe você não pode testar na sua placa mãe e me mandar um email? (veja seção 3.1 "Como testar se funciona").

2.1 O hack da linha de comando

Para usar a linha de comando você normalmente tem que habilitar o ACPI no kernel. Não é necessário reiniciar. Você pode habilitar/desabilitar pela linha de comando com estes comandos:

Em KT133/133A, KX133, KL/KLE133, KM/KN133, ...: (sem dúvida precisa de ACPI habilitado)

    Habilitar: setpci -v -H1 -s 0:0.0 52=$(printf %x $((0x$(setpci -H1 -s 0:0.0 52) | 0x80)))

    Desabilitar: setpci -v -H1 -s 0:0.0 52=$(printf %x $((0x$(setpci -H1 -s 0:0.0 52) & 0x7f)))

Em KT266/266A/333, KM266/333, ...:

    Habilitar:

    setpci -v -H1 -s 0:0.0 92=$(printf %x $((0x$(setpci -H1 -s 0:0.0 92) | 0x80)))

    setpci -v -H1 -s 0:0.0 95=$(printf %x $((0x$(setpci -H1 -s 0:0.0 95) | 0x02)))

    Desabilitar:

    setpci -v -H1 -s 0:0.0 92=$(printf %x $((0x$(setpci -H1 -s 0:0.0 92) & 0x7f)))

    setpci -v -H1 -s 0:0.0 95=$(printf %x $((0x$(setpci -H1 -s 0:0.0 95) & 0xfd)))

Em KT400:

    Habilitar:

    setpci -v -H1 -s 0:0.0 D2=$(printf %x $((0x$(setpci -H1 -s 0:0.0 D2) | 0x80)))

    setpci -v -H1 -s 0:0.0 D5=$(printf %x $((0x$(setpci -H1 -s 0:0.0 D5) | 0x02)))

    Desabilitar:

    setpci -v -H1 -s 0:0.0 D2=$(printf %x $((0x$(setpci -H1 -s 0:0.0 D2) & 0x7f)))

    setpci -v -H1 -s 0:0.0 D5=$(printf %x $((0x$(setpci -H1 -s 0:0.0 D5) & 0xfd)))

Em SIS730/733: (experimental! Por favor, me digam se funcionar!!)

    enable: setpci -v -H1 -s 0:0.0 6B=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6B) | 0x01)))

    disable: setpci -v -H1 -s 0:0.0 6B=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6B) & 0xfe)))

on SIS735/740/745/746/755:

    Habilitar: setpci -v -H1 -s 0:0.0 6A=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6A) | 0x0001)))

    Desabilitar: setpci -v -H1 -s 0:0.0 6A=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6A) & 0xfffe)))

Em Nforce:

    Habilitar:

    setpci -v -H1 -s 0:0.0 E4=$(printf %x $((0x$(setpci -H1 -s 0:0.0 E7) | 0x06)))

    Desabilitar:

    setpci -v -H1 -s 0:0.0 E4=$(printf %x $((0x$(setpci -H1 -s 0:0.0 E7) & 0xf9)))

Em Nforce2: (Funciona sem ACPI)

    Habilitar: setpci -v -H1 -s 0:0.0 6F=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6F) | 0x10)))

    Desabilitar: setpci -v -H1 -s 0:0.0 6F=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6F) & 0xef)))

Em AMD751 and AMD760/761:(Funciona sem ACPI)

    Habilitar: setpci -v -s 0:0.0 0x62=$(printf %x $((0x$(setpci -H1 -s 0:0.0 62) | 0x06)))

    Desabilitar: setpci -v -s 0:0.0 0x62=$(printf %x $((0x$(setpci -H1 -s 0:0.0 62) & 0xf9)))

2.2 O programa Athcool

Athcool é um pequeno programa que faz o mesmo que as linhas de comando acima. Ele funciona nos mesmos chipsets e detecta qual chipset você tem, comandando as linhas corretas para cada um, para obter a economia de energia.

Você pode ler mais sobre ele (e baixá-lo) daqui: http://members.jcom.home.ne.jp/jacobi/linux/softwares.html

2.3 Atualizações de BIOS

Em algumas placas mãe mais recentes o fabricante provê uma atualização de BIOS que seta os bits necessários no chipset da placa (ou deixa você escolher no setup do BIOS se deve ser habilitado). Olhe o site do fabricante para saber se há uma atualização dessas disponível para você.

2.4 Meu patch do kernel

O meu patch é baseado em outro patch (do Jan Niehusmann) que eu encontrei no Newsnet. Eu modifiquei o patch para incluir suporte ao KT266/266A. A propósito, o meu patch faz o mesmo que a linha de comando, só que de dentro do kernel. Por isso eu recomendo usar a linha de comando, que é realmente simples de usar.

Passo 1. Ok, agora passo a passo, como aplicar o patch.

1. Primeiro, baixar o patch:

Patch para kernel 2.4.17: http://www.daniel.nofftz.net/linux/amd_cool.diff

Patch para kernel 2.4.21 (obrigado ao Thomas Reinhardt por portá-lo para o 2.4.21): http://www.daniel.nofftz.net/linux/amd_cool.linux-2.4.21.diff

2. Logar como root

3. cd /usr/src

4. Aplique o patch: cat $path-to-patch/amd_cool.diff | patch -p0

4. cd linux

6. Compile o novo kernel ('make')

7. Reinicie e no prompt de boot do kernel entre o parâmetro amd_disconnect=yes. Isso é assim porque existem bugs conhecidos do Athlon, que podem causar vários problemas em algumas placas mãe. Você deve testar o patch, e se funcionar, pode anexar o parâmetro amd_disconnect=yes ao arquivo /etc/lilo.conf.

2.5 A solução LVcool

LVcool é um pequeno port da versão para Windows, Vcool. Suporta apenas os chipsets KT133/133A e KX133. Eu não posso dar suporte para ele. Você pode baixá-lo aqui: http://vcool.occludo.net/VC_Linux.html. Esta solução não necessita de suporte a ACPI compilado no kernel.

2.6 O programa FVcool

Aqui (http://www.nt.phys.kyushu-u.ac.jp/shimizu/download/download.html) está outra solução de economia de energia que suporta vários chipsets. Há também um programa que vem junto e com o qual você pode usar os monitores onboard da sua placa (como no pacote lm_sensors).

2.7 Economia de energia em AMD 760MP

Há um módulo do kernel que habilita a economia de energia no chipset multiprocessador AMD 760MP. Você pode achá-lo aqui: http://www.muru.com/linux/amd-smp-idle/. Eu não sei se é bom, mas obtive pelo menos um email de alguém que disse que funcionou. Portanto, se quiser, verifique.

3. O que mais?

3.1 Como testar se funciona

Ok, você usa um dos métodos descritos e quer verificar se funciona. Aqui estão duas maneiras de checar:

Se você tem um cooler (ventoinha) controlada por temperatura, você pode observar o nível de ruído do cooler pra saber se funciona. Depois de alguns minutos ociosa, dê algum trabalho à cpu.

Passo 2. Normalmente eu faço assim:

1. Mudo para root.
2. cd /usr/src/linux
3. E dou ao computador algo para ele fazer: while true, do make clean, make BzImage, done

Depois de uns 20 ou 30 segundos você perceberá que o ruído do cooler ficará mais alto enquanto o cooler gira mais rápido. Não se esqueça de sair do loop while depois, com Ctrl+C.

O mesmo procedimento acima funciona com um programa de monitoramento para a temperatura da cpu (como o lm_sensors ou o xmbmon).

3.2 Bugs e problemas conhecidos

Há dois bugs conhecidos no processador Athlon/Duron. Estão listados como número 11 e número 14 no Guia de Revisão do Processador Athlon. Parece que o AthlonXP é significativamente menos afetado pelos bugs. Portanto, se você tem um AthlonXP, você está com sorte (como eu).

Pode ocorrer os seguintes problemas (por causa dos bugs):

- Pulos durante a execução de áudio.
- Pulos e/ou demora na execução de vídeo.
- Lentidão em transferências Ultra-DMA.
- Congelamento do sistema.
- Problemas com USB.
- Alguém também me indicou um ruído alto e agudo.

Eventualmente uma atualização de BIOS ajuda (existe uma com correção para o bug 11, que pode ser feita pelo BIOS). Mas até onde eu sei, poucas placas possuem esta correção no BIOS.

Para a Asus A7V133-C, sabe-se que a opção do BIOS "PCI master read caching" resolve a maioria dos problemas quando habilitada. Procure no seu BIOS se a função existe.

Sabe-se também que em alguns BIOS a opção "Delayed transaction" resolve alguns problemas também. Talvez você queira dar uma olhada.

AVISO: Em placas com KT133A, isso pode habilitar o famoso bug VIA-pontesul!

De um post no Newsnet, sobre a Asus A7V:

Sem Delayed transaction: pulos no som e falhas na TV.
Com Delayed transaction: sem pulos no som e apenas ligeiros problemas na TV.
Com Delayed transaction e Master read caching: quase nenhum problema com TV e nenhum problema com som.

Existem outras causas para os problemas:

A fonte pode não ser forte o suficiente para agüentar as flutuações de consumo de energia do processador.

Alguns reguladores de voltagem da placa mãe podem ter este mesmo problema.

Você tem uma K7S5A (até onde eu sei, essa placa pode ter comportamentos realmente estranhos, com a economia de energia habilitada).

Se você tiver alguns problemas com a economia de energia habilitada, e mesmo assim queiser usá-la, você pode habilitar a economia de energia por default, e depois desabilitá-la quando for ouvir música, assistir TV, etc...

3.3 Possível correção para os problemas de som e outros

Obrigado ao Michael Hamilton por submeter esta idéia.

Isso é somente experimental. O único sucesso verificado foi o da submissão inicial do Michael Hamilton. Por favor, acuse se funcionou para você.

Vamos lá: parece que pelo menos alguns pulos no som podem ser resolvidos maximizando a latência do dispositivo de áudio.

Prmeiro você deve encontrar o endereço pci do dispositivo. Isso pode ser feito com "lspci". Você deve procurar algo como "Multimedia audio controller" ou "AudioPCI". Pegue o endereço pci do dispositivo (que é algo como 01:06.0 -> significa barramento:slot.função) e maximize a latência para ele. Isso é feito pelo setpci:

setpci -v -s "pci-address" latency_timer=ff

Para informação adicional sobre isso olhe aqui: http://www-106.ibm.com/developerworks/linux/library/l-hw2.html

Talvez isso funcione também para outros problemas como USB e demoras em transferências do disco rígido, mas ainda não foi testado. Sinta-se à vontade para testar (mas não me culpe se não funcionar, ou tornar as coisas piores) e avise-me se funcionou. Eu não tenho nenhum destes problemas, então não posso testá-los.

Se funcionar, você deverá usar este comando setpci a cada reiniciação do seu sistema. Seria, então, inteligente colocá-lo num script de iniciação.

3.4 ToDo.

Adicionar mais chipsets e mais informação a este documento.

Talvez, fazer uma lista de placas mãe com os status "funciona" e "não funciona".

3.5 Traduções

Traduções em diferentes idiomas existem. Até o momento, são traduções da versão pré-XML do documento.

Espanhol, por Carlos Mayo (http://perso.wanadoo.es/cmayo/docs/Athlon-Powersaving-HOWTO-es.html)

Francês, por Mathieu Pillard
http://www.daniel.nofftz.net/linux/Athlon-Powersaving-HOWTO-fr.html

Italiano, por Maurizio Fantino
http://www.daniel.nofftz.net/linux/Athlon-Powersaving-HOWTO-it.html

Alemão (só partes), por Fabian Mohren
http://www.linuxwiki.de/PowersavingHowto

Japonês, por Senji Kaneko
http://www.linux.or.jp/JF/JFdocs/Athlon-Powersaving-HOWTO/index.html

Português do Brasil, por Bruno Dorfman Buys
http://br.tldp.org/projetos/howto/howtos.html (em implantação)