diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/superiotool/fintek.c | 9 | ||||
-rw-r--r-- | util/superiotool/ite.c | 12 | ||||
-rw-r--r-- | util/superiotool/nsc.c | 5 | ||||
-rw-r--r-- | util/superiotool/smsc.c | 29 | ||||
-rw-r--r-- | util/superiotool/superiotool.c | 66 | ||||
-rw-r--r-- | util/superiotool/superiotool.h | 17 |
6 files changed, 89 insertions, 49 deletions
diff --git a/util/superiotool/fintek.c b/util/superiotool/fintek.c index 3e7bf9fd36..8b5fa5b93c 100644 --- a/util/superiotool/fintek.c +++ b/util/superiotool/fintek.c @@ -89,7 +89,7 @@ void dump_fintek(uint16_t port, uint16_t did) regval(port, 0xf6), regval(port, 0xf7), regval(port, 0xf8)); } -void enter_conf_mode_fintek(uint16_t port) +static void enter_conf_mode_fintek(uint16_t port) { /* Enable configuration sequence (Fintek uses this for example) * Older ITE chips have the same enable sequence. @@ -98,7 +98,7 @@ void enter_conf_mode_fintek(uint16_t port) outb(0x87, port); } -void exit_conf_mode_fintek(uint16_t port) +static void exit_conf_mode_fintek(uint16_t port) { /* Exit MB PnP mode (for Fintek, doesn't hurt ITE). */ outb(0xaa, port); @@ -112,10 +112,7 @@ void probe_idregs_fintek(uint16_t port) outb(0x20, port); if (inb(port) != 0x20) { - if (inb(port) == 0xff) - printf("No Super I/O chip found at 0x%04x\n", port); - else - printf("Probing 0x%04x, failed (0x%02x), data returns 0x%02x\n", port, inb(port), inb(port + 1)); + no_superio_found(port); return; } did = inb(port + 1); diff --git a/util/superiotool/ite.c b/util/superiotool/ite.c index 8b0fc53b4b..e042fb7862 100644 --- a/util/superiotool/ite.c +++ b/util/superiotool/ite.c @@ -211,7 +211,7 @@ void dump_ite(uint16_t port, uint16_t id) } } -void enter_conf_mode_ite(uint16_t port) +static void enter_conf_mode_ite(uint16_t port) { /* Enable configuration sequence (ITE uses this for newer IT87[012]x) * IT871[01] uses 0x87, 0x87 -> fintek detection should handle it @@ -230,7 +230,7 @@ void enter_conf_mode_ite(uint16_t port) outb(0xAA, port); } -void exit_conf_mode_ite(uint16_t port) +static void exit_conf_mode_ite(uint16_t port) { regwrite(port, 0x02, 0x02); } @@ -244,10 +244,7 @@ void probe_idregs_ite(uint16_t port) /* Read Chip ID Byte 1. */ id = regval(port, 0x20); if (id != 0x87) { - if (inb(port) == 0xff) - printf("No Super I/O chip found at 0x%04x\n", port); - else - printf("Probing 0x%04x, failed (0x%02x), data returns 0x%02x\n", port, inb(port), inb(port + 1)); + no_superio_found(port); return; } @@ -262,7 +259,8 @@ void probe_idregs_ite(uint16_t port) printf("Super I/O found at 0x%02x: id=0x%04x, chipver=0x%01x\n", port, id, chipver); - dump_ite(port, id); + if (dump) + dump_ite(port, id); exit_conf_mode_ite(port); } diff --git a/util/superiotool/nsc.c b/util/superiotool/nsc.c index 691ce13967..c308256e7f 100644 --- a/util/superiotool/nsc.c +++ b/util/superiotool/nsc.c @@ -62,10 +62,7 @@ void probe_idregs_simple(uint16_t port) outb(0x20, port); if (inb(port) != 0x20) { - if (inb(port) == 0xff) - printf("No Super I/O chip found at 0x%04x\n", port); - else - printf("Probing 0x%04x, failed (0x%02x), data returns 0x%02x\n", port, inb(port), inb(port + 1)); + no_superio_found(port); return; } id = inb(port + 1); diff --git a/util/superiotool/smsc.c b/util/superiotool/smsc.c index e583471bac..acbb4773b0 100644 --- a/util/superiotool/smsc.c +++ b/util/superiotool/smsc.c @@ -40,29 +40,16 @@ const static struct superio_registers reg_table[] = { {EOT} }; -void enter_conf_mode_smsc(uint16_t port) +static void enter_conf_mode_smsc(uint16_t port) { outb(0x55, port); } -void exit_conf_mode_smsc(uint16_t port) +static void exit_conf_mode_smsc(uint16_t port) { outb(0xaa, port); } -/* Note: The actual SMSC ID is 16 bits, but we must pass 32 bits here. */ -void dump_smsc(uint16_t port, uint16_t id) -{ - switch (id) { - case 0x28: - dump_superio("SMSC", reg_table, port, id); - break; - default: - printf("Unknown SMSC chip, id=0x%02x\n", id); - break; - } -} - void probe_idregs_smsc(uint16_t port) { uint16_t id, rev; @@ -72,20 +59,18 @@ void probe_idregs_smsc(uint16_t port) /* Read device ID. */ id = regval(port, DEVICE_ID_REG); if (id != 0x28) { /* TODO: Support for other SMSC chips. */ - if (inb(port) != 0xff) - printf("No Super I/O chip found at 0x%04x\n", port); - else - printf("Probing 0x%04x, failed (0x%02x), data returns 0x%02x\n", port, inb(port), inb(port + 1)); + no_superio_found(port); return; } /* Read chip revision. */ rev = regval(port, DEVICE_REV_REG); - printf("Super I/O found at 0x%04x: id=0x%02x, rev=0x%02x\n", - port, id, rev); + printf("Found SMSC %s Super I/O (id=0x%02x, rev=0x%02x) at port=0x%04x\n", + get_superio_name(reg_table, id), id, rev, port); - dump_smsc(port, id ); + if (dump) + dump_superio("SMSC", reg_table, port, id); exit_conf_mode_smsc(port); } diff --git a/util/superiotool/superiotool.c b/util/superiotool/superiotool.c index fd49c309ee..de512486e6 100644 --- a/util/superiotool/superiotool.c +++ b/util/superiotool/superiotool.c @@ -22,6 +22,9 @@ #include "superiotool.h" +/* Command line options. */ +int dump = 0, verbose = 0; + uint8_t regval(uint16_t port, uint8_t reg) { outb(reg, port); @@ -34,6 +37,24 @@ void regwrite(uint16_t port, uint8_t reg, uint8_t val) outb(val, port + 1); } +const char *get_superio_name(const struct superio_registers reg_table[], + uint16_t id) +{ + int i; + + for (i = 0; /* Nothing */; i++) { + if (reg_table[i].superio_id == EOT) + break; + + if ((uint16_t)reg_table[i].superio_id != id) + continue; + + return reg_table[i].name; + } + + return "<unknown>"; +} + void dump_superio(const char *vendor, const struct superio_registers reg_table[], uint16_t port, uint16_t id) { @@ -53,7 +74,6 @@ void dump_superio(const char *vendor, const struct superio_registers reg_table[] if (reg_table[i].ldn[j].ldn == EOT) break; - printf("%s %s\n", vendor, reg_table[i].name); nodump = 0; if (reg_table[i].ldn[j].ldn != NOLDN) { @@ -98,9 +118,51 @@ void dump_superio(const char *vendor, const struct superio_registers reg_table[] } } +void no_superio_found(uint16_t port) { + if (!verbose) + return; + + if (inb(port) == 0xff) + printf("No Super I/O chip found at 0x%04x\n", port); + else + printf("Probing 0x%04x, failed (0x%02x), data returns 0x%02x\n", port, inb(port), inb(port + 1)); +} + int main(int argc, char *argv[]) { - int i, j; + int i, j, opt, option_index; + + const static struct option long_options[] = { + {"dump", no_argument, NULL, 'd'}, + {"verbose", no_argument, NULL, 'V'}, + {"version", no_argument, NULL, 'v'}, + {"help", no_argument, NULL, 'h'}, + {0, 0, 0, 0} + }; + + while ((opt = getopt_long(argc, argv, "dVvh", + long_options, &option_index)) != EOF) { + switch (opt) { + case 'd': + dump = 1; + break; + case 'V': + verbose = 1; + break; + case 'v': + printf("superiotool %s\n", SUPERIOTOOL_VERSION); + exit(0); + break; + case 'h': + printf("Usage: superiotool [-d] [-V] [-v] [-h]\n"); + exit(0); + break; + default: + /* Unknown option. */ + exit(1); + break; + } + } if (iopl(3) < 0) { perror("iopl"); diff --git a/util/superiotool/superiotool.h b/util/superiotool/superiotool.h index 0dcc2fa261..bcd8d5c2ff 100644 --- a/util/superiotool/superiotool.h +++ b/util/superiotool/superiotool.h @@ -25,8 +25,11 @@ #include <stdio.h> #include <stdlib.h> #include <stdint.h> +#include <getopt.h> #include <sys/io.h> +#define SUPERIOTOOL_VERSION "0.1" + #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define EOT -1 /* End Of Table */ @@ -40,6 +43,9 @@ #define IDXSIZE (MAXNUMIDX + 1) #define MAXNUMPORTS (2 + 1) /* Maximum number of Super I/O ports */ +/* Command line parameters. */ +extern int dump, verbose; + struct superio_registers { int32_t superio_id; /* Signed, as we need EOT. */ const char name[MAXNAMELEN]; @@ -53,19 +59,17 @@ struct superio_registers { /* superiotool.c */ uint8_t regval(uint16_t port, uint8_t reg); void regwrite(uint16_t port, uint8_t reg, uint8_t val); +const char *get_superio_name(const struct superio_registers reg_table[], + uint16_t id); void dump_superio(const char *name, const struct superio_registers reg_table[], uint16_t port, uint16_t id); -void probe_superio(uint16_t port); +void no_superio_found(uint16_t port); /* fintek.c */ -void enter_conf_mode_fintek(uint16_t port); -void exit_conf_mode_fintek(uint16_t port); void dump_fintek(uint16_t port, uint16_t did); void probe_idregs_fintek(uint16_t port); /* ite.c */ -void enter_conf_mode_ite(uint16_t port); -void exit_conf_mode_ite(uint16_t port); void dump_ite(uint16_t port, uint16_t id); void probe_idregs_ite(uint16_t port); @@ -74,9 +78,6 @@ void dump_ns8374(uint16_t port); void probe_idregs_simple(uint16_t port); /* smsc.c */ -void enter_conf_mode_smsc(uint16_t port); -void exit_conf_mode_smsc(uint16_t port); -void dump_smsc(uint16_t port, uint16_t id); void probe_idregs_smsc(uint16_t port); /** Table of which config ports to probe on each Super I/O. */ |