libpayload: Add function to fix CMOS checksum.
authorStefan Reinauer <stepan@coresystems.de>
Tue, 17 Aug 2010 10:14:50 +0000 (10:14 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Tue, 17 Aug 2010 10:14:50 +0000 (10:14 +0000)
Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Myles Watson <mylesgw@gmail.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5711 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

payloads/libpayload/drivers/options.c
payloads/libpayload/include/libpayload.h

index 51173004271d078aa541868bea97c028082bf25c..1c692f46e0dd89eee06a30c8f24e9280efd83ea9 100644 (file)
@@ -48,6 +48,23 @@ static int options_checksum_valid(void)
        return (checksum_old == checksum);
 }
 
+void fix_options_checksum(void)
+{
+       int i;
+       int range_start = lib_sysinfo.cmos_range_start / 8;
+       int range_end = lib_sysinfo.cmos_range_end / 8;
+       int checksum_location = lib_sysinfo.cmos_checksum_location / 8;
+       u16 checksum = 0;
+
+       for(i = range_start; i <= range_end; i++) {
+               checksum += nvram_read(i);
+       }
+       checksum = (~checksum)&0xffff;
+
+       nvram_write((checksum >> 8), checksum_location);
+       nvram_write((checksum & 0xff), checksum_location + 1);
+}
+
 static int get_cmos_value(u32 bitnum, u32 len, void *valptr)
 {
        u8 *value = (u8 *)valptr;
index f3da228933fce0f438c3bcc51da00fc26638403b..43e138fd7d59a4b807ea7000dd4745476730258e 100644 (file)
@@ -194,6 +194,7 @@ void video_console_set_cursor(unsigned int cursorx, unsigned int cursory);
 /** @} */
 
 /* drivers/option.c */
+void fix_options_checksum(void);
 int get_option(void *dest, char *name);
 
 /**