sexta-feira, 25 de fevereiro de 2011

Gerar uma nova tabela DSDT

Beleza, pessoal?

Segundo o site acpi.sourceforge.net, DSDT significa Differentiated System Description Table, o que no português deve ser algo parecido com Tabela Diferenciada de Descrição de Sistema. Esta tabela contém o Bloco de Definição Diferenciada, que se encarrega de fornecer a informação e configuração a respeito da base do sistema. Essas informações e configurações são sempre inseridas ao ACPI durante o carregamento do Sistema Operacional. Infelizmente, muitos fabricantes e redistribuidores de hardware não são capazes de fornecer essas tabelas de forma adequada, 100% funcionais (nem mesmo são membros da ACPI SIG). Por isso existe a necessidade de PATCHES para essas tabelas, desenvolvidas por nós, simples usuários curiosos e com tempo sobrando, e por desenvolvedores profissionais.

Eu tenho um netbook Samsung Go (N310) que aparentemente roda bem qualquer sistema operacional, mas nem tudo são flores. O DSDT original não me atrapalhava, mas como forma de aprendizado corrigi os dois únicos erros do DSDT e as mensagens de erros e incosistências sumiram do processo de boot do Debian =)

EXECUTE OS COMANDOS ABAIXO COMO ROOT

Passo 1 - Instale o ACPI Source Language compiler/decompiler conhecido iasl
aptitude install iasl


Passo 2 - Extraia o dsdt original com o comando cat /proc/acpi/dsdt > ~/dsdt.dat

Passo 3 - Atraves do comando abaixo você irá "descompilar" o dsdt.dat (aml - binário) para o dsdt.dsl (código fonte)
iasl -d dsdt.dat

Passo 4 - Observando que agora existem DOIS arquivos (dsdt.dat e dsdt.dsl) rode o comando abaixo para recompilar (de código fonte DSL para binário AML) e verificar os possíveis ERROS (Errors) e os AVISOS (Warnings)
iasl -tc dsdt.dsl

Passo 5 - Agora existem QUATRO arquivos: dsdt.dat, dsdt.hex, dsdt.aml e dsdt.dsl e, no meu caso, apareceram DOIS erros (linhas 1375 e 1382) relacionados ao Length.



Intel ACPI Component Architecture
ASL Optimizing Compiler version 20100528 [Jul 2 2010]
Copyright (c) 2000 - 2010 Intel Corporation
Supports ACPI Specification Revision 4.0a

dsdt.dsl 1375: 0x00000000, // Length
Error 4122 - ^ Invalid combination of Length and Min/Max fixed flags

dsdt.dsl 1382: 0x00000000, // Length
Error 4122 - ^ Invalid combination of Length and Min/Max fixed flags

ASL Input: dsdt.dsl - 5184 lines, 169320 bytes, 1819 keywords
Compilation complete. 2 Errors, 0 Warnings, 0 Remarks, 692 Optimizations



Passo 6 - Abra o dsdt.dsl pelo editor de texto de sua preferência e vá até a linha referenciada pelo compilador.

Linha 1375

0x00000000, // Granularity
0x00000000, // Range Minimum
0xFEBFFFFF, // Range Maximum
0x00000000, // Translation Offset
0x00000000, // Length
,, _Y0E, AddressRangeMemory, TypeStatic)


Passo 7 - Agora vem a correção: Va no google, e subtraia o Range Maximun pelo Range Minimum + 1, ou seja,

(0xFEBFFFFF - 0x00000000) + 1

O resultado é 0xFEC00000

Pegue o resultado e coloque em Length. Ficará assim:

0x00000000, // Granularity
0x00000000, // Range Minimum
0xFEBFFFFF, // Range Maximum
0x00000000, // Translation Offset
0xFEC00000, // Length
,, _Y0E, AddressRangeMemory, TypeStatic)


Passo 8 - Repita o mesmo processo nas outras linhas com erro (no meu caso a 1382) e salve o arquivo. Execute novamente o comando iasl -tc dsdt.dsl

Passo 9 - Se estiver tudo certo, sem avisos de erro (Os WARNINGS não precisam de tanta preocupação dependendo do caso), guarde os arquivos em um diretório seguro,

Passo 10 - Siga para este post para integrar o arquivo dsdt.hex ao kernel.

Fontes:
http://acpi.sourceforge.net/dsdt/index.php
http://ohioloco.ubuntuforums.org/showthread.php?t=1036051&page=52
http://ubuntuforums.org/showthread.php?t=1036051
http://wiki.debian.org/OverridingDSDT
Share: