===================================================================
@@ -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;
===================================================================
@@ -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 */
===================================================================
@@ -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
===================================================================
@@ -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
===================================================================
@@ -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);
===================================================================
@@ -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)
===================================================================
@@ -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. */
===================================================================
@@ -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. */
===================================================================
@@ -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)
===================================================================
@@ -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)
===================================================================
@@ -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)
===================================================================
@@ -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)
===================================================================
@@ -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)
===================================================================
@@ -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)
===================================================================
@@ -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)
===================================================================
@@ -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. */
===================================================================
@@ -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. */
===================================================================
@@ -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 */
===================================================================
@@ -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);
+}
+