Make the code a bit more generic (trivial). Different Super I/Os
authorUwe Hermann <uwe@hermann-uwe.de>
Tue, 18 Sep 2007 23:30:24 +0000 (23:30 +0000)
committerUwe Hermann <uwe@hermann-uwe.de>
Tue, 18 Sep 2007 23:30:24 +0000 (23:30 +0000)
use different config ports.

Signed-off-by: Uwe Hermann <uwe@hermann-uwe.de>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2782 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

util/superiotool/Makefile
util/superiotool/smsc.c
util/superiotool/superiotool.c
util/superiotool/superiotool.h

index c416f93a7e6d66c2f9fa048bec4846a524a3997f..6e86d01352346445a311b775dca28de0e61563c6 100644 (file)
@@ -32,7 +32,7 @@ OBJS = superiotool.o fintek.o ite.o nsc.o smsc.o
 
 all: $(PROGRAM)
 
-$(PROGRAM): $(OBJS)
+$(PROGRAM): $(OBJS) superiotool.h
        $(CC) $(CFLAGS) -o $(PROGRAM) $(OBJS)
 
 install: $(PROGRAM)
index 805756f7cdd51903e594af2bfab4e9fc36cc2d14..f836b94a99e05f646e22db0a29623e09c5c5897e 100644 (file)
@@ -53,7 +53,7 @@ void dump_smsc(uint32_t port, uint32_t id)
        }
 }
 
-void probe_idregs_smsc(uint32_t port)
+void probe_idregs_smsc(unsigned short port)
 {
        uint16_t id, rev;
 
index a5dcb2e7531820a70a4674e73e97a75d7485423a..3514b2441598a206882fb2b700203d3480ac8f2d 100644 (file)
@@ -97,22 +97,18 @@ void dump_superio(const char *name, const struct superio_registers reg_table[],
 
 int main(int argc, char *argv[])
 {
+       int i, j;
+
        if (iopl(3) < 0) {
                perror("iopl");
                exit(1);
        }
 
-       probe_idregs_simple(0x2e);
-       probe_idregs_simple(0x4e);
-
-       probe_idregs_fintek(0x2e);
-       probe_idregs_fintek(0x4e);
-
-       probe_idregs_ite(0x2e);
-       probe_idregs_ite(0x4e);
-
-       probe_idregs_smsc(0x3f0);
-       probe_idregs_smsc(0x370);
+       for (i = 0; i < ARRAY_SIZE(superio_ports_table); i++) {
+               for (j = 0; superio_ports_table[i].ports[j] != EOT; j++)
+                       superio_ports_table[i].probe_idregs(
+                               superio_ports_table[i].ports[j]);
+       }
 
        return 0;
 }
index 229c0d5982878098aa6bc8a0b80cbdaf5ad7898e..4986ff167c26ccc312cf30e43d39008cc63d65fc 100644 (file)
@@ -27,6 +27,8 @@
 #include <stdint.h>
 #include <sys/io.h>
 
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
 #define EOT            -1              /* End Of Table */
 #define NOLDN          -2              /* NO LDN needed */
 #define NANA           -3              /* Not Available */
@@ -36,6 +38,7 @@
 #define LDNSIZE                (MAXLDN + 3)    /* Biggest LDN + 0 + NOLDN + EOT */
 #define MAXNUMIDX      70              /* Maximum number of indexes */
 #define IDXSIZE        (MAXNUMIDX + 1)
+#define MAXNUMPORTS    (2 + 1)         /* Maximum number of Super I/O ports */
 
 struct superio_registers {
        /* Yes, superio_id should be unsigned, but EOT has to be negative. */
@@ -69,6 +72,17 @@ void probe_idregs_simple(unsigned short port);
 
 /* smsc.c */
 void dump_smsc(uint32_t port, uint32_t id);
-void probe_idregs_smsc(uint32_t port);
+void probe_idregs_smsc(unsigned short port);
+
+/** Table of which config ports to probe on each Super I/O. */
+const static struct {
+       void (*probe_idregs) (unsigned short port);
+       signed short ports[MAXNUMPORTS]; /* Signed, as we need EOT. */
+} superio_ports_table[] = {
+       {probe_idregs_simple,   {0x2e,  0x4e,   EOT}},
+       {probe_idregs_fintek,   {0x2e,  0x4e,   EOT}},
+       {probe_idregs_ite,      {0x2e,  0x4e,   EOT}},
+       {probe_idregs_smsc,     {0x3f0, 0x370,  EOT}},
+};
 
 #endif