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
