Reparando la tabla DSDT
Hoy me decidí a meterle mano al ACPI del servidor, el cual me está dando problemas con el CPU frequency scaling. Se empeña en decir que la máxima frecuencia de la CPU son 3Ghz en vez de 3.16Ghz.
En mi ignorancia, creía que podía arreglarlo reparando la tabla DSDT del ACPI de la BIOS de mi placa base (una Gigabyte P35-DS3R).
Lo primero que hice fue obtener un volcado de la tabla DSDT con el siguiente comando: cat /sys/firmware/tables/DSDT > dsdt.dat
Una vez que tuve el volcado disponible lo desensamblé para poder echarle un ojo a las tripas del mismo. Para esto se utiliza el iasl, un compilador de tablas ACPI de Intel: iasl -d dsdt.dat. Esto genera un fichero llamado dsdt.dsl con el código de la tabla, si fuese correcto al compilarlo de nuevo no debería darnos ningún error, pero como podéis ver el mío me daba 2 errores y 1 advertencia:
Intel ACPI Component Architecture ASL Optimizing Compiler version 20090123 [Feb 15 2009] Copyright (C) 2000 - 2009 Intel Corporation Supports ACPI Specification Revision 3.0a dsdt.dsl 221: Method (\_WAK, 1, NotSerialized) Warning 1080 - ^ Reserved method must return a value (_WAK) dsdt.dsl 284: Store (Local0, Local0) Error 4050 - ^ Method local variable is not initialized (Local0) dsdt.dsl 289: Store (Local0, Local0) Error 4050 - ^ Method local variable is not initialized (Local0) ASL Input: dsdt.dsl - 5588 lines, 187085 bytes, 2337 keywords Compilation complete. 2 Errors, 1 Warnings, 0 Remarks, 641 Optimizations
Después de echarle un ojo a las especificaciones ACPI y manual de referencia de ASL decidí hacer lo siguiente:
- Añadir Return (Package(0×02){0×00, 0×00}) al final del método _WAK para evitar la advertencia en la línea 221. Según la especificación ACPI, _WAK debe devolver un Package con 2 campos DWORD, el primero indicando 0 en caso de éxito, cualquier otro valor para indicar error, y un segundo parámetro indicando el motivo del error si lo hubiese. Así que devolviendo {0×00, 0×00} le indicamos que todo ha ido bien.
- En cuanto a las líneas de los errores, son las 2 iguales: Store (Local0, Local0). La función Store almacena el valor del primer argumento en el segundo, lo cual en este caso no tiene mucho sentido, porque básicamente lo que hace es igualar Local0 a Local0, así que simplemente comenté ese par de líneas y adiós a los errores.
Una vez modificado el código fuente, se compila con iasl -tc dsdt.dsl obteniendo un fichero .hex que debemos pasarle como parámetro (a la hora de compilarlo) al kernel, concretamente la opción CONFIG_ACPI_CUSTOM_DSDT_FILE.
Con la tabla DSDT reparada y el kernel actualizado reinicié el sistema, esperando que todo estuviese arreglado, pero sigo en las mismas
Por lo que he visto, uno de los E8500 solo está soportado por una versión beta de la BIOS de mi placa base, no sé si ese será el problema, pero no sé que prefiero, si usar una BIOS beta o prescindir del escalado de frecuencia de la CPU.
¿Alguno ha tenido un problema similar con un E8500 y una P35-DS3R de Gigabyte?



