Author: uwe Date: 2008-03-31 22:21:49 +0200 (Mon, 31 Mar 2008) New Revision: 3202
Modified: trunk/payloads/libpayload/Config.in trunk/payloads/libpayload/curses/Makefile.inc trunk/payloads/libpayload/drivers/nvram.c Log: Fix the NVRAM access functions to work correctly for the upper 128 bytes of NVRAM (if enabled).
For most chipsets this means using I/O ports 0x72/0x73, but at least on some VIA chipsets (I tested the VIA VT8237R on actual hardware) these ports won't work and you have to use 0x74/0x75. Thus, make this a Kconfig option for now.
Signed-off-by: Uwe Hermann uwe@hermann-uwe.de Acked-by: Jordan Crouse jordan.crouse@amd.com
Modified: trunk/payloads/libpayload/Config.in =================================================================== --- trunk/payloads/libpayload/Config.in 2008-03-31 15:21:24 UTC (rev 3201) +++ trunk/payloads/libpayload/Config.in 2008-03-31 20:21:49 UTC (rev 3202) @@ -72,6 +72,22 @@ bool "Support for reading/writing NVRAM bytes" default y
+config RTC_PORT_EXTENDED_VIA + bool "Extended RTC ports are 0x74/0x75" + default n + help + For recent chipsets with 256 NVRAM bytes, you have to access the + upper 128 bytes (128-255) using two different I/O ports, + usually 0x72/0x73. + + On some chipsets this can be a different set of ports, though. + The VIA VT8237R for example only recognizes the ports 0x74/0x75 + for accessing the high 128 NVRAM bytes (as seems to be the case for + multiple VIA chipsets). + + If you want to read or write CMOS bytes on computers with one of + these chipsets, say 'y' here. + endmenu
menu "Build Options"
Modified: trunk/payloads/libpayload/curses/Makefile.inc =================================================================== --- trunk/payloads/libpayload/curses/Makefile.inc 2008-03-31 15:21:24 UTC (rev 3201) +++ trunk/payloads/libpayload/curses/Makefile.inc 2008-03-31 20:21:49 UTC (rev 3202) @@ -27,7 +27,7 @@ ## SUCH DAMAGE. ##
-TARGETS-$(CONFIG_TINYCURSES) += curses/keyboard.o +TARGETS-$(CONFIG_TINYCURSES) += curses/keyboard.o TARGETS-$(CONFIG_TINYCURSES) += curses/tinycurses.o TARGETS-$(CONFIG_TINYCURSES) += curses/speaker.o TARGETS-$(CONFIG_TINYCURSES) += curses/colors.o
Modified: trunk/payloads/libpayload/drivers/nvram.c =================================================================== --- trunk/payloads/libpayload/drivers/nvram.c 2008-03-31 15:21:24 UTC (rev 3201) +++ trunk/payloads/libpayload/drivers/nvram.c 2008-03-31 20:21:49 UTC (rev 3202) @@ -42,9 +42,31 @@
#include <libpayload.h>
-#define RTC_PORT 0x70
/** + * PCs can have either 64 (very old ones), 128, or 256 bytes of CMOS RAM. + * + * Usually you access the lower 128 CMOS bytes via I/O port 0x70/0x71. + * For more recent chipsets with 256 bytes, you have to access the upper + * 128 bytes (128-255) using two different registers, usually 0x72/0x73. + * + * On some chipsets this can be different, though. The VIA VT8237R for example + * only recognizes the ports 0x74/0x75 for accessing the high 128 CMOS bytes + * (as seems to be the case for multiple VIA chipsets). + * + * It's very chipset-specific if and how the upper 128 bytes are enabled at + * all, but this work should be done in coreboot anyway. Libpayload assumes + * that coreboot has properly enabled access to the upper 128 bytes and + * doesn't try to do this on its own. + */ +#define RTC_PORT_STANDARD 0x70 +#ifdef CONFIG_RTC_PORT_EXTENDED_VIA +#define RTC_PORT_EXTENDED 0x74 +#else +#define RTC_PORT_EXTENDED 0x72 +#endif + +/** * Read a byte from the specified NVRAM address. * * @param addr The NVRAM address to read a byte from. @@ -52,8 +74,10 @@ */ u8 nvram_read(u8 addr) { - outb(addr, RTC_PORT); - return inb(RTC_PORT + 1); + u16 rtc_port = addr < 128 ? RTC_PORT_STANDARD : RTC_PORT_EXTENDED; + + outb(addr, rtc_port); + return inb(rtc_port + 1); }
/** @@ -64,6 +88,8 @@ */ void nvram_write(u8 val, u8 addr) { - outb(addr, RTC_PORT); - outb(val, RTC_PORT + 1); + u16 rtc_port = addr < 128 ? RTC_PORT_STANDARD : RTC_PORT_EXTENDED; + + outb(addr, rtc_port); + outb(val, rtc_port + 1); }