[coreboot] r3202 - in trunk/payloads/libpayload: . curses drivers

svn at coreboot.org svn at coreboot.org
Mon Mar 31 22:21:49 CEST 2008


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 at hermann-uwe.de>
Acked-by: Jordan Crouse <jordan.crouse at 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);
 }





More information about the coreboot mailing list