Index: src/include/device/device.h
===================================================================
--- src/include/device/device.h	(revision 6411)
+++ src/include/device/device.h	(working copy)
@@ -7,7 +7,15 @@
 
 
 struct device;
+
+// In ramstage, device_t will be a structure.
+#if defined(__PRE_RAM__) && !defined(__ROMCC__)
+typedef unsigned device_t;
+#else
+// Code compiled with ROMCC should not include this file.
 typedef struct device * device_t;
+#endif
+
 struct pci_operations;
 struct pci_bus_operations;
 struct smbus_bus_operations;
Index: src/include/device/pnp_def.h
===================================================================
--- src/include/device/pnp_def.h	(revision 6411)
+++ src/include/device/pnp_def.h	(working copy)
@@ -13,4 +13,8 @@
 #define PNP_IDX_MSC0 0xf0
 #define PNP_IDX_MSC1 0xf1
 
+#ifndef PNP_DEV
+#define PNP_DEV(PORT, FUNC) ((PORT << 8) | (FUNC))
+#endif
+
 #endif /* DEVICE_PNP_DEF_H */
Index: src/superio/winbond/w83977tf/Makefile.inc
===================================================================
--- src/superio/winbond/w83977tf/Makefile.inc	(revision 6411)
+++ src/superio/winbond/w83977tf/Makefile.inc	(working copy)
@@ -22,3 +22,5 @@
 
 ramstage-$(CONFIG_SUPERIO_WINBOND_W83977TF) += superio.c
 
+romstage-$(CONFIG_SUPERIO_WINBOND_W83977TF) += early_serial.c
+romstage-$(CONFIG_SUPERIO_WINBOND_W83977TF) += ../../../arch/x86/lib/pnp.c
Index: src/superio/winbond/w83977tf/w83977tf.h
===================================================================
--- src/superio/winbond/w83977tf/w83977tf.h	(revision 6411)
+++ src/superio/winbond/w83977tf/w83977tf.h	(working copy)
@@ -34,4 +34,8 @@
 #define W83977TF_GPIO3            9
 #define W83977TF_ACPI            10
 
+#if defined(__PRE_RAM__) && !defined(__ROMCC__)
+void w83977tf_enable_serial(device_t dev, u16 iobase);
 #endif
+
+#endif
Index: src/superio/winbond/w83977tf/early_serial.c
===================================================================
--- src/superio/winbond/w83977tf/early_serial.c	(revision 6411)
+++ src/superio/winbond/w83977tf/early_serial.c	(working copy)
@@ -20,7 +20,12 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#if defined(__ROMCC__)
 #include <arch/romcc_io.h>
+#else
+#include <device/pnp.h>
+#include <arch/io.h>
+#endif
 #include "w83977tf.h"
 
 static void pnp_enter_ext_func_mode(device_t dev)
@@ -36,7 +41,10 @@
 	outb(0xaa, port);
 }
 
-static void w83977tf_enable_serial(device_t dev, u16 iobase)
+#if defined(__ROMCC__)
+static 
+#endif
+void w83977tf_enable_serial(device_t dev, u16 iobase)
 {
 	pnp_enter_ext_func_mode(dev);
 	pnp_set_logical_device(dev);
Index: src/mainboard/a-trend/atc-6220/romstage.c
===================================================================
--- src/mainboard/a-trend/atc-6220/romstage.c	(revision 6411)
+++ src/mainboard/a-trend/atc-6220/romstage.c	(working copy)
@@ -21,8 +21,7 @@
 #include <stdint.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <stdlib.h>
 #include <console/console.h>
@@ -31,7 +30,7 @@
 #include "pc80/udelay_io.c"
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 #define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
Index: src/mainboard/azza/pt-6ibd/romstage.c
===================================================================
--- src/mainboard/azza/pt-6ibd/romstage.c	(revision 6411)
+++ src/mainboard/azza/pt-6ibd/romstage.c	(working copy)
@@ -21,8 +21,7 @@
 #include <stdint.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <stdlib.h>
 #include <console/console.h>
@@ -32,7 +31,7 @@
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
 /* FIXME: It's a Winbond W83977EF, actually. */
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 /* FIXME: It's a Winbond W83977EF, actually. */
Index: src/mainboard/abit/be6-ii_v2_0/romstage.c
===================================================================
--- src/mainboard/abit/be6-ii_v2_0/romstage.c	(revision 6411)
+++ src/mainboard/abit/be6-ii_v2_0/romstage.c	(working copy)
@@ -22,8 +22,7 @@
 #include <stdlib.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <console/console.h>
 #include "southbridge/intel/i82371eb/i82371eb.h"
@@ -32,7 +31,7 @@
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
 /* FIXME: It's a Winbond W83977EF, actually. */
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 /* FIXME: It's a Winbond W83977EF, actually. */
Index: src/mainboard/msi/ms6119/romstage.c
===================================================================
--- src/mainboard/msi/ms6119/romstage.c	(revision 6411)
+++ src/mainboard/msi/ms6119/romstage.c	(working copy)
@@ -22,8 +22,7 @@
 #include <stdlib.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <console/console.h>
 #include "southbridge/intel/i82371eb/i82371eb.h"
@@ -31,7 +30,7 @@
 #include "pc80/udelay_io.c"
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 #define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
Index: src/mainboard/msi/ms6147/romstage.c
===================================================================
--- src/mainboard/msi/ms6147/romstage.c	(revision 6411)
+++ src/mainboard/msi/ms6147/romstage.c	(working copy)
@@ -22,8 +22,7 @@
 #include <stdlib.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <console/console.h>
 #include "southbridge/intel/i82371eb/i82371eb.h"
@@ -31,7 +30,7 @@
 #include "pc80/udelay_io.c"
 #include "lib/delay.c"
 #include <cpu/x86/bist.h>
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 #define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
Index: src/mainboard/msi/ms6156/romstage.c
===================================================================
--- src/mainboard/msi/ms6156/romstage.c	(revision 6411)
+++ src/mainboard/msi/ms6156/romstage.c	(working copy)
@@ -22,8 +22,7 @@
 #include <stdlib.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <console/console.h>
 #include "southbridge/intel/i82371eb/i82371eb.h"
@@ -31,7 +30,7 @@
 #include "pc80/udelay_io.c"
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 #define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
Index: src/mainboard/asus/p2b/romstage.c
===================================================================
--- src/mainboard/asus/p2b/romstage.c	(revision 6411)
+++ src/mainboard/asus/p2b/romstage.c	(working copy)
@@ -21,8 +21,7 @@
 #include <stdint.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <stdlib.h>
 #include <console/console.h>
@@ -31,7 +30,7 @@
 #include "pc80/udelay_io.c"
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 #define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
Index: src/mainboard/asus/p2b-ds/romstage.c
===================================================================
--- src/mainboard/asus/p2b-ds/romstage.c	(revision 6411)
+++ src/mainboard/asus/p2b-ds/romstage.c	(working copy)
@@ -21,8 +21,7 @@
 #include <stdint.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <stdlib.h>
 #include <console/console.h>
@@ -31,7 +30,7 @@
 #include "pc80/udelay_io.c"
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 #define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
Index: src/mainboard/asus/p2b-ls/romstage.c
===================================================================
--- src/mainboard/asus/p2b-ls/romstage.c	(revision 6411)
+++ src/mainboard/asus/p2b-ls/romstage.c	(working copy)
@@ -21,8 +21,7 @@
 #include <stdint.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <stdlib.h>
 #include <console/console.h>
@@ -31,8 +30,8 @@
 #include "pc80/udelay_io.c"
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
 /* FIXME: The ASUS P2B-LS has a Winbond W83977EF, actually. */
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 #define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
Index: src/mainboard/asus/p2b-d/romstage.c
===================================================================
--- src/mainboard/asus/p2b-d/romstage.c	(revision 6411)
+++ src/mainboard/asus/p2b-d/romstage.c	(working copy)
@@ -21,8 +21,7 @@
 #include <stdint.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <stdlib.h>
 #include <console/console.h>
@@ -31,7 +30,7 @@
 #include "pc80/udelay_io.c"
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 #define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
Index: src/mainboard/asus/p2b-f/romstage.c
===================================================================
--- src/mainboard/asus/p2b-f/romstage.c	(revision 6411)
+++ src/mainboard/asus/p2b-f/romstage.c	(working copy)
@@ -21,8 +21,7 @@
 #include <stdint.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <stdlib.h>
 #include <console/console.h>
@@ -32,7 +31,7 @@
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
 /* FIXME: The ASUS P2B-F has a Winbond W83977EF, actually. */
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 /* FIXME: The ASUS P2B-F has a Winbond W83977EF, actually. */
Index: src/mainboard/asus/p3b-f/romstage.c
===================================================================
--- src/mainboard/asus/p3b-f/romstage.c	(revision 6411)
+++ src/mainboard/asus/p3b-f/romstage.c	(working copy)
@@ -21,8 +21,7 @@
 #include <stdint.h>
 #include <device/pci_def.h>
 #include <arch/io.h>
-#include <device/pnp_def.h>
-#include <arch/romcc_io.h>
+#include <device/pnp.h>
 #include <arch/hlt.h>
 #include <stdlib.h>
 #include <console/console.h>
@@ -32,7 +31,7 @@
 #include "lib/delay.c"
 #include "cpu/x86/bist.h"
 /* FIXME: The ASUS P3B-F has a Winbond W83977EF, actually. */
-#include "superio/winbond/w83977tf/early_serial.c"
+#include "superio/winbond/w83977tf/w83977tf.h"
 #include <lib.h>
 
 /* FIXME: The ASUS P3B-F has a Winbond W83977EF, actually. */
Index: src/arch/x86/include/arch/romcc_io.h
===================================================================
--- src/arch/x86/include/arch/romcc_io.h	(revision 6411)
+++ src/arch/x86/include/arch/romcc_io.h	(working copy)
@@ -52,8 +52,9 @@
 #define PCI_ID(VENDOR_ID, DEVICE_ID) \
 	((((DEVICE_ID) & 0xFFFF) << 16) | ((VENDOR_ID) & 0xFFFF))
 
-
+#ifndef PNP_DEV
 #define PNP_DEV(PORT, FUNC) (((PORT) << 8) | (FUNC))
+#endif
 
 typedef unsigned device_t; /* pci and pci_mmio need to have different ways to have dev */
 
Index: src/arch/x86/lib/pnp.c
===================================================================
--- src/arch/x86/lib/pnp.c	(revision 0)
+++ src/arch/x86/lib/pnp.c	(revision 0)
@@ -0,0 +1,57 @@
+#include <stddef.h>
+#include <console/console.h>
+#include <arch/io.h>
+#include <device/pnp.h>
+
+/* Generic functions for pnp devices */
+void pnp_write_config(device_t dev, u8 reg, u8 value)
+{
+	unsigned port = dev >> 8;
+	outb(reg, port );
+	outb(value, port +1);
+}
+
+u8 pnp_read_config(device_t dev, u8 reg)
+{
+	unsigned port = dev >> 8;
+	outb(reg, port);
+	return inb(port +1);
+}
+
+void pnp_set_logical_device(device_t dev)
+{
+	unsigned device = dev & 0xff;
+	pnp_write_config(dev, 0x07, device);
+}
+
+void pnp_set_enable(device_t dev, int enable)
+{
+	pnp_write_config(dev, 0x30, enable?0x1:0x0);
+}
+
+int pnp_read_enable(device_t dev)
+{
+	return !!pnp_read_config(dev, 0x30);
+}
+
+void pnp_set_iobase(device_t dev, u8 index, u16 iobase)
+{
+	pnp_write_config(dev, index + 0, (iobase >> 8) & 0xff);
+	pnp_write_config(dev, index + 1, iobase & 0xff);
+}
+/*
+u16 pnp_read_iobase(device_t dev, unsigned index)
+{
+	return ((u16)(pnp_read_config(dev, index)) << 8) | pnp_read_config(dev, index + 1);
+}
+*/
+void pnp_set_irq(device_t dev, u8 index, u8 irq)
+{
+	pnp_write_config(dev, index, irq);
+}
+
+void pnp_set_drq(device_t dev, u8 index, u8 drq)
+{
+	pnp_write_config(dev, index, drq);
+}
+
