Oct 03

Con la instalación de openSuSe 11.1 me tope con un error en la Tabla de Descripción del Sistema Diferenciada o DSDT por sus siglas en ingles. El error en esta tabla causaba que el proceso de encendido o apagado de mi laptop DV6921la fuera muy lento, casi interminable si esta se encontraba desconectada de la corriente.

Voy a documentar paso a paso el procedimiento para corregir esta tabla con openSuSe 11.1 a 32 bits, funciona también a 64 e incluso en ubuntu, señalare las diferencias de esta última.

Lo primero será obtener la DSDT actual (linea 1) y desensamblarlo (linea 2) lo que nos dará como resultado un archivo :

hackob@itzpapalotl:~/temp/dsdt> sudo cat /proc/acpi/dsdt > dsdt.dat
hackob@itzpapalotl:~/temp/dsdt> iasl -d dsdt.dat 
 
Intel ACPI Component Architecture
AML Disassembler version 20081031 [Dec  3 2008]
Copyright (C) 2000 - 2008 Intel Corporation
Supports ACPI Specification Revision 3.0a
 
Loading Acpi table from file dsdt.dat
Acpi table [DSDT] successfully installed and loaded
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
..............................................................................................................
..............................................................................................................
..............................................................................................................
..............................................................................................................
..........................................
Parsing completed
Disassembly completed, written to "dsdt.dsl"
hackob@itzpapalotl:~/temp/dsdt>

Después de haberlo desensamblado inicia lo realmente interesante, ya que para encontrar los errores en nuestra DSDT en necesario compilarlo :

hackob@itzpapalotl:~/temp/dsdt> iasl -tc dsdt.dsl 
 
Intel ACPI Component Architecture
ASL Optimizing Compiler version 20081031 [Dec  3 2008]
Copyright (C) 2000 - 2008 Intel Corporation
Supports ACPI Specification Revision 3.0a
 
dsdt.dsl   104:     Method (\_WAK, 1, NotSerialized)
Warning  1080 -                 ^ Reserved method must return a value (_WAK)
 
dsdt.dsl  3540:                 Method (_Q16, 0, NotSerialized)
Warning  1087 -                            ^ Not all control paths return a value (_Q16)
 
dsdt.dsl  7714:                 Method (_HOT, 0, Serialized)
Warning  1087 -                            ^ Not all control paths return a value (_HOT)
 
dsdt.dsl  7714:                 Method (_HOT, 0, Serialized)
Warning  1080 -                            ^ Reserved method must return a value (_HOT)
 
dsdt.dsl  7716:                     Zero
Error    4095 -                        ^ syntax error, unexpected PARSEOP_ZERO
 
dsdt.dsl  7723:                 Method (_CRT, 0, Serialized)
Warning  1087 -                            ^ Not all control paths return a value (_CRT)
 
dsdt.dsl  7723:                 Method (_CRT, 0, Serialized)
Warning  1080 -                            ^ Reserved method must return a value (_CRT)
 
dsdt.dsl  7725:                     Zero
Error    4095 -                        ^ syntax error, unexpected PARSEOP_ZERO
 
ASL Input:  dsdt.dsl - 8137 lines, 278758 bytes, 4173 keywords
Compilation complete. 2 Errors, 6 Warnings, 0 Remarks, 1127 Optimizations
hackob@itzpapalotl:~/temp/dsdt>

Entre la línea 8 y la 30 se muestran los problemas y advertencias que encontró la compilación del archivo dsdt.dsl ahora vamos a infocarnos en solucionar 1 a 1. Para esto, indicaré el error o advertencia, el código original y como debe quedar. la edición del archivo dsdt.dsl puede ser con su editor favorito, las líneas indicadas a la derecha corresponden al número aproximado de línea del archivo:

Method (\_WAK, 1, NotSerialized)
Original:

            Store (0x0D, \_SB.PCI0.SMIS)
            Store (0x86, \_SB.PCI0.SMIC)
            Store (\_SB.PCI0.SMIS, CTK3)
            Release (\_SB.PCI0.PSMX)
        }
    }
 
    Method (Z000, 0, NotSerialized)
    {

Corregido:

           Store (0x0D, \_SB.PCI0.SMIS)
           Store (0x86, \_SB.PCI0.SMIC)
           Store (\_SB.PCI0.SMIS, CTK3)
           Release (\_SB.PCI0.PSMX)
       }
       Return(Package(0x02){0x00, 0x00})
   }
 
   Method (Z000, 0, NotSerialized)
   {

Method (_Q16, 0, NotSerialized)
Original:

                    Store (0x04, \_SB.WMID.Z013)
                    Store (0x00, \_SB.WMID.Z014)
                    Notify (\_SB.WMID, 0x80)
                }
 
                Method (_Q80, 0, NotSerialized)
                {

Corregido:

                    Store (0x04, \_SB.WMID.Z013)
                    Store (0x00, \_SB.WMID.Z014)
                    Notify (\_SB.WMID, 0x80)
 
                    Return (0x00)
                }
 
                Method (_Q80, 0, NotSerialized)
                {

Method (_HOT, 0, Serialized) y Method (_CRT, 0, Serialized)
Original:

                Method (_HOT, 0, Serialized)
                {
                    Zero
                    If (LEqual (OSYS, 0x07D6))
                    {
                        Return (Add (0x0AAC, Multiply (TPC, 0x0A)))
                    }
                }
 
                Method (_CRT, 0, Serialized)
                {
                    Zero
                    If (LLess (OSYS, 0x07D6))
                    {
                        Return (Add (0x0AAC, Multiply (TPC, 0x0A)))
                    }
                }

Corregido:

                Method (_HOT, 0, Serialized)
                {
//                  Zero
//                  If (LEqual (OSYS, 0x07D6))
//                  {
                        Return (Add (0x0AAC, Multiply (TPC, 0x0A)))
//                  }
//              }
 
                Method (_CRT, 0, Serialized)
                {
//                  Zero
//                  If (LLess (OSYS, 0x07D6))
//                  {
                        Return (Add (0x0AAC, Multiply (TPC, 0x0A)))
//                  }
                }

Una vez corregidos los problemas y advertencias compilamos de nuevo nuestro archivo dsdt.dsl y listo, al parecer todo está correcto:

hackob@itzpapalotl:~/temp/dsdt> iasl -tc dsdt.dsl 
 
Intel ACPI Component Architecture
ASL Optimizing Compiler version 20081031 [Dec  3 2008]
Copyright (C) 2000 - 2008 Intel Corporation
Supports ACPI Specification Revision 3.0a
 
ASL Input:  dsdt.dsl - 8140 lines, 278814 bytes, 4171 keywords
AML Output: dsdt.aml - 31924 bytes, 821 named objects, 3350 executable opcodes
 
Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, 1130 Optimizations
hackob@itzpapalotl:~/temp/dsdt>

Ahora solo resta hacer la instalación para que la tabla sea tomada el próximo reinicio, para esto es necesario tener instalado el paquete kernel-source y seguir los siguientes pasos :

:~/temp/dsdt> cd /usr/src/linux/Documentation/acpi/
:/usr/src/linux/Documentation/acpi> sudo chmod +x initramfs-add-dsdt.sh
:/usr/src/linux/Documentation/acpi> sudo ./initramfs-add-dsdt.sh /boot/initrd-`uname -r` ~/temp/dsdt/dsdt.aml
:/usr/src/linux/Documentation/acpi>

En la línea 3 se debe indicar la ruta en donde tienes el archivo dsdt.aml, comento que deliberadamente omití la cadena “hackob@itzpapalotl” del prompt del shell para mejorar la lectura. Una vez terminado esto nos queda reiniciar.

Después de reiniciar y para ver si los cambios fueron efectivos debemos buscar las lineas que contengan ACPI en los mensajes del kernel de la siguiente forma:

hackob@itzpapalotl:~> dmesg | grep ACPI
...
Using ACPI (MADT) for SMP configuration information
ACPI: Core revision 20080609
ACPI: Checking initramfs for custom DSDT
ACPI: Found DSDT in DSDT.aml.
ACPI: Override [DSDT-   MCP67], this is unsafe: tainting kernel
ACPI: Table DSDT replaced by host OS
ACPI: DSDT 00000000, 7CB4 (r1 NVIDIA    MCP67  6040000 INTL 20081031)
ACPI: DSDT override uses original SSDTs unless "acpi_no_auto_ssdt"
 tbxface-0596 [00] tb_load_namespace     : ACPI Tables successfully acquired
evxfevnt-0091 [00] enable                : Transition to ACPI mode successful
ACPI: bus type pci registered
ACPI: EC: Look up EC in DSDT
...

Si encontramos la línea “ACPI: Found DSDT in DSDT.aml.” quiere decir que la nueva DSDT fue instalada con éxito, ahora sólo basta que pruebes reiniciando o apagando tu máquina sin que este conectada.

Para aquellos no quieran seguir todo el procedimiento aquí les dejo el archivo dsdt.aml que me resultó a mi pero que les debe funcionar sin problemas, sólo descarguenlo y sigan los pasos de instalación.

dsdt.aml

Nota para usuarios de ubuntu: Para instalar el archivo dsdt.aml en su sistema basta con ejecutar el comando:

hackob@itzpapalotl:~> sudo cp ~/temp/dsdt/dsdt.aml /etc/initramfs-tools/DSDT.aml
hackob@itzpapalotl:~> sudo update-initramfs -u -k `uname -r`

Para buscadores:
Linux y HP Pavilion DV6921la
No inicia a menos que se mantenga presionado el botón de poder
Inicio y apagado muy lento si ni esta conectado a la corriente

One Response to “DV6921la – Errores en la DSDT / ACPI”

  1. lady dice:

    gracias
    me sacaste d un apuro muy grande
    q bno q ai gente inteligente en ste mundo
    bno muchas gracias……xD
    sigue asi
    ayadaras a mucha gente
    bno otra vez gracias….
    bye

Leave a Reply

preload preload preload