Como agregar tu CPU VIA C7 a la lista de procesadores conocidos

De NetBSD Mexico Wiki, la enciclopedia libre.

Información del kernel


En el dmesg me aparecen estos letreros:

cpu0: Enhanced SpeedStep (1004 mV) 800 MHz
cpu0: unknown Enhanced SpeedStep CPU.
cpu0: Enhanced SpeedStep frequencies available (MHz): 1000 900 800

La primera línea me dice que el CPU corre a 800 MHz y su voltaje es de 1004 mV. Eso es cierto, en el setup yo puse la velocidad de 800 MHz para el arranque. Otras opciones eran 900 y 1000 MHz. En la parte de la temperatura del setup, veo que en caso de llegar a la temperatura límite, mi CPU puede bajar el voltaje. Los valores válidos son 956, 972, 988 y 1004 mV. Esto es sólo para problemas térmicos, el voltaje default es de 1004 mV.

La segunda línea dice que mi CPU es desconocido para NetBSD.

En la tercera línea, veo que el kernel calcula las frecuencias intermedias de operación sin embargo no calcula voltajes. Significa que puedo bajar o subir la velocidad pero el voltaje se conserva.

Información de los registros del CPU


La función x86_cpuid(0xc0000002, salida) me arroja esta información:

ecx = 08100a13
08 = 08 Velocidad mínima (800 MHz)
10 = 10 Voltaje mínimo de entrada (956 mV)
0a = 0a Velocidad máxima (1000 MHz)
13 = 13 Voltaje máximo de entrada (1004 mV)

Esto me indica que puedo usar los códigos 08, 09 y 0a para las velocidades de 800, 900 y 1000 MHz respectivamente. Tambien que puedo usar los códigos 10, 11, 12 y 13 para 956, 972, 988 y 1004 mV respectivamente.


Yo quisiera que NetBSD reconozca a mi CPU con la siguiente especificación:

1000 MHz con 1004 mV
 900 MHz con  972 mV
 800 MHz con  956 mV

Para ello, debo buscar en el programa x86/x86/est.c la lista de procesadores similares.

El programa est.c


Me gusta esta definición porque se parece a mi procesador.

/* 1.00GHz Centaur C7-M ULV */
static const uint16_t C7M_770_ULV[] = {
       ID16(1000,  844, BUS100),
       ID16( 800,  796, BUS100),
       ID16( 600,  796, BUS100),
       ID16( 400,  796, BUS100),
};

La copiaré y le hare los cambios pertinentes, de modo que me quede lo siguiente:

/*
* VIA C7 Esther 533 MHz FSB, 400 MHz FSB, not Mobile
*/
/* 1.00GHz Centaur C7 Esther 400 FSB */
static const uint16_t C7_100_1000[] = {
       ID16(1000, 1004, BUS100),
       ID16( 900,  972, BUS100),
       ID16( 800,  956, BUS100),
};

Ahora la daré de alta en la lista de procesadores

       ENTRY(IDT, BUS100, C7M_794),
       ENTRY(IDT, BUS133, C7M_795),
       ENTRY(IDT, BUS100, C7_100_1000), /* este es mi chip */
       ENTRY(IDT, BUS100, eden90_1000)

Salvo el programa est.c, compilo e instalo el kernel.

Tip


No hagas cambios en est.c directamente, por si acaso algo sale mal. Te sugiero lo siguiente:

mv est.c est.c.orig
cp est.c.orig est.c

Ahora, ya que conservas el est,c original, ya puedes hacer cambios en el est.c

El nuevo reboot


Con los cambios hechos, ahora tengo estos mensajes:

cpu0: Enhanced SpeedStep (1004 mV) 800 MHz
cpu0: Enhanced SpeedStep frequencies available (MHz): 1000 900 800

Mi CPU ya no es un chip desconocido y trabaja con los voltajes asociados a cada velocidad.

sysctl.conf


Ya he puesto en el setup que mi maquina trabaje a velocidad máxima en el arranque, pero añadí una línea al /etc/sysctl.conf

#!/sbin/sysctl -f
#
# $NetBSD: sysctl.conf,v 1.5 2003/11/03 15:12:06 briggs Exp $
#
# sysctl(8) variables to set at boot time.
machdep.est.frequency.target=800

Con esta linea bajo la velocidad y el voltaje del CPU al mínimo en el arranque. Ahora sólo subiré la velocidad cuando sea necesario.

Pruebas de operación


Revisar el estatus actual

server# sysctl machdep.est
machdep.est.frequency.target = 800
machdep.est.frequency.current = 800
machdep.est.frequency.available = 1000 900 800
server#

Ahora subo la velocidad

server# sysctl -w machdep.est.frequency.target=1000
machdep.est.frequency.target: 800 -> 1000
server#

Reviso nuevamente el estatus

server# sysctl machdep.est
machdep.est.frequency.target = 1000
machdep.est.frequency.current = 1000
machdep.est.frequency.available = 1000 900 800
server#

Ahora bajo al mínimo la velocidad

server# sysctl -w machdep.est.frequency.target=800
machdep.est.frequency.target: 1000 -> 800
server#

Reviso nuevamente

server# sysctl machdep.est
machdep.est.frequency.target = 800
machdep.est.frequency.current = 800
machdep.est.frequency.available = 1000 900 800
server#

Malditron

Personal tools