See http://openbios.org/pipermail/linuxbios/2005-August/012255.html for an explanation of the issue that spawned this patch. I've run out of time for a complete solution, so as a compromise I propose a patch that prevents LB from modifying CMOS when HAVE_OPTION_TABLE = 0:
PATCH:
Don't write to CMOS when HAVE_OPTION_TABLE = 0. This allows single-image (normal) LinuxBIOS to co-exist with factory BIOSs whose CMOS usage is incompatible (i.e. Intel XE7501DevKit).
--- src/pc80/mc146818rtc.c.orig 2005-09-08 13:35:36.312500000 -0500 +++ src/pc80/mc146818rtc.c 2005-09-08 14:10:06.187500000 -0500 @@ -127,6 +127,8 @@ int cmos_invalid, checksum_invalid;
printk_debug("RTC Init\n"); + +#if HAVE_OPTION_TABLE /* See if there has been a CMOS power problem. */ x = CMOS_READ(RTC_VALID); cmos_invalid = !(x & RTC_VRT); @@ -160,19 +162,25 @@ } #endif } +#endif + + /* Setup the real time clock */ + CMOS_WRITE(RTC_CONTROL_DEFAULT, RTC_CONTROL); + /* Setup the frequency it operates at */ + CMOS_WRITE(RTC_FREQ_SELECT_DEFAULT, RTC_FREQ_SELECT); + +#if HAVE_OPTION_TABLE /* See if there is a LB CMOS checksum error */ checksum_invalid = !rtc_checksum_valid(LB_CKS_RANGE_START, LB_CKS_RANGE_END,LB_CKS_LOC); if(checksum_invalid) printk_debug("Invalid CMOS LB checksum\n");
- /* Setup the real time clock */ - CMOS_WRITE(RTC_CONTROL_DEFAULT, RTC_CONTROL); - /* Setup the frequency it operates at */ - CMOS_WRITE(RTC_FREQ_SELECT_DEFAULT, RTC_FREQ_SELECT); /* Make certain we have a valid checksum */ rtc_set_checksum(PC_CKS_RANGE_START, PC_CKS_RANGE_END,PC_CKS_LOC); +#endif + /* Clear any pending interrupts */ (void) CMOS_READ(RTC_INTR_FLAGS); } ------------------------------------------------------------------------ Steven J. Magnani "I claim this network for MARS! www.digidescorp.com Earthling, return my space modulator!"
#include <standard.disclaimer>