From 2c290e3362337feffd2086994f5f720d9332d38e Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Thu, 20 Sep 2007 00:00:49 +0000 Subject: [PATCH] Superiotool: Add dump support to the Winbond W83697HF/F. Minor coding style changes and code simplifications. Signed-off-by: Uwe Hermann Acked-by: Uwe Hermann git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2791 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- util/superiotool/ite.c | 73 +++++++++++----------- util/superiotool/smsc.c | 2 +- util/superiotool/superiotool.c | 107 ++++++++++++++++++--------------- util/superiotool/superiotool.h | 1 + util/superiotool/winbond.c | 74 +++++++++++++++++------ 5 files changed, 154 insertions(+), 103 deletions(-) diff --git a/util/superiotool/ite.c b/util/superiotool/ite.c index f02f846c7f..fc7c4137d8 100644 --- a/util/superiotool/ite.c +++ b/util/superiotool/ite.c @@ -27,37 +27,38 @@ const static struct superio_registers reg_table[] = { {0x8705, "IT8705 or IT8700", { {EOT}}}, {0x8708, "IT8708", { - {NOLDN, + {NOLDN, NULL, {0x07,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, 0x29,0x2a,0x2e,0x2f,EOT}, {NANA,0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff, 0xff,0xff,0x00,0x00,EOT}}, - {0x0, + {0x0, NULL, {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT}, {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}}, - {0x1, + {0x1, NULL, {0x30,0x60,0x61,0x70,0xf0,EOT}, {0x00,0x03,0xf8,0x04,0x00,EOT}}, - {0x2, + {0x2, NULL, {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT}, {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}}, - {0x3, + {0x3, NULL, {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74, 0xf0,EOT}, {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03, 0x03,EOT}}, - {0x4, + {0x4, NULL, {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT}, {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}}, - {0x5, /* Note: 0x30 can actually be 0x00 _or_ 0x01. */ + {0x5, NULL, + /* Note: 0x30 can actually be 0x00 _or_ 0x01. */ {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT}, {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}}, - {0x6, + {0x6, NULL, {0x30,0x70,0x71,0xf0,EOT}, {0x00,0x0c,0x02,0x00,EOT}}, - {0x7, + {0x7, NULL, {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba, 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8, 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4, @@ -70,46 +71,46 @@ const static struct superio_registers reg_table[] = { 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA, 0x00,EOT}}, - {0x8, + {0x8, NULL, {0x30,0x60,0x61,EOT}, {0x00,0x02,0x01,EOT}}, - {0x9, + {0x9, NULL, {0x30,0x60,0x61,0x70,0xf0,EOT}, {0x00,0x03,0x10,0x0b,0x00,EOT}}, - {0xa, + {0xa, NULL, {0x30,0x60,0x61,0x70,0xf0,EOT}, {0x00,0x03,0x00,0x0a,0x00,EOT}}, {EOT}}}, {0x8710, "IT8710", { {EOT}}}, {0x8712, "IT8712", { - {NOLDN, + {NOLDN, NULL, {0x07,0x20,0x21,0x22,0x23,0x24,0x2b,EOT}, {NANA,0x87,0x12,0x08,0x00,0x00,0x00,EOT}}, - {0x0, + {0x0, NULL, {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT}, {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}}, - {0x1, + {0x1, NULL, {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT}, {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}}, - {0x2, + {0x2, NULL, {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT}, {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}}, - {0x3, + {0x3, NULL, {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT}, {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}}, - {0x4, + {0x4, NULL, {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3, 0xf4,0xf5,0xf6,EOT}, {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00, 0x00,NANA,NANA,EOT}}, - {0x5, + {0x5, NULL, {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT}, {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}}, - {0x6, + {0x6, NULL, {0x30,0x70,0x71,0xf0,EOT}, {0x00,0x0c,0x02,0x00,EOT}}, - {0x7, + {0x7, NULL, {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62, 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1, 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd, @@ -122,44 +123,44 @@ const static struct superio_registers reg_table[] = { 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}}, - {0x8, + {0x8, NULL, {0x30,0x60,0x61,0x70,0xf0,EOT}, {0x00,0x03,0x00,0x0a,0x00,EOT}}, - {0x9, + {0x9, NULL, {0x30,0x60,0x61,EOT}, {0x00,0x02,0x01,EOT}}, - {0xa, + {0xa, NULL, {0x30,0x60,0x61,0x70,0xf0,EOT}, {0x00,0x03,0x10,0x0b,0x00,EOT}}, {EOT}}}, {0x8716, "IT8716", { - {NOLDN, + {NOLDN, NULL, {0x07,0x20,0x21,0x22,0x23,0x24,0x2b,EOT}, {NANA,0x87,0x16,0x01,0x00,0x00,0x00,EOT}}, - {0x0, + {0x0, NULL, {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT}, {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}}, - {0x1, + {0x1, NULL, {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT}, {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}}, - {0x2, + {0x2, NULL, {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT}, {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}}, - {0x3, + {0x3, NULL, {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT}, {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}}, - {0x4, + {0x4, NULL, {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3, 0xf4,0xf5,0xf6,EOT}, {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00, 0x00,NANA,NANA,EOT}}, - {0x5, + {0x5, NULL, {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT}, {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}}, - {0x6, + {0x6, NULL, {0x30,0x70,0x71,0xf0,EOT}, {0x00,0x0c,0x02,0x00,EOT}}, - {0x7, + {0x7, NULL, {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62, 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1, 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd, @@ -172,13 +173,13 @@ const static struct superio_registers reg_table[] = { 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}}, - {0x8, + {0x8, NULL, {0x30,0x60,0x61,0x70,0xf0,EOT}, {0x00,0x03,0x00,0x0a,0x00,EOT}}, - {0x9, + {0x9, NULL, {0x30,0x60,0x61,EOT}, {0x00,0x02,0x01,EOT}}, - {0xa, + {0xa, NULL, {0x30,0x60,0x61,0x70,0xf0,EOT}, {0x00,0x03,0x10,0x0b,0x00,EOT}}, {EOT}}}, diff --git a/util/superiotool/smsc.c b/util/superiotool/smsc.c index 4d64a9632b..3bfc53661f 100644 --- a/util/superiotool/smsc.c +++ b/util/superiotool/smsc.c @@ -25,7 +25,7 @@ const static struct superio_registers reg_table[] = { {0x28, "FDC37N769", { - {NOLDN, + {NOLDN, NULL, {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13, 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d, diff --git a/util/superiotool/superiotool.c b/util/superiotool/superiotool.c index 479c47f7cc..8aea0a02d9 100644 --- a/util/superiotool/superiotool.c +++ b/util/superiotool/superiotool.c @@ -60,11 +60,58 @@ const char *get_superio_name(const struct superio_registers reg_table[], return ""; } -void dump_superio(const char *vendor, const struct superio_registers reg_table[], +static void dump_regs(const struct superio_registers reg_table[], + int i, int j, uint16_t port) +{ + int k, *idx; + + if (reg_table[i].ldn[j].ldn != NOLDN) { + printf("LDN 0x%02x ", reg_table[i].ldn[j].ldn); + if (reg_table[i].ldn[j].name != NULL) + printf("(%s)", reg_table[i].ldn[j].name); + regwrite(port, 0x07, reg_table[i].ldn[j].ldn); + } else { + printf("Register dump:"); + } + + idx = reg_table[i].ldn[j].idx; + + printf("\nidx "); + for (k = 0; /* Nothing */; k++) { + if (idx[k] == EOT) + break; + printf("%02x ", idx[k]); + } + + printf("\nval "); + for (k = 0; /* Nothing */; k++) { + if (idx[k] == EOT) + break; + printf("%02x ", regval(port, idx[k])); + } + + printf("\ndef "); + idx = reg_table[i].ldn[j].def; + for (k = 0; /* Nothing */; k++) { + if (idx[k] == EOT) + break; + else if (idx[k] == NANA) + printf("NA "); + else if (idx[k] == RSVD) + printf("RR "); + else if (idx[k] == MISC) /* TODO */ + printf("MM "); + else + printf("%02x ", idx[k]); + } + printf("\n"); +} + +void dump_superio(const char *vendor, + const struct superio_registers reg_table[], uint16_t port, uint16_t id) { - int i, j, k, nodump; - int *idx; + int i, j, no_dump_available = 1; if (!dump) return; @@ -76,66 +123,28 @@ void dump_superio(const char *vendor, const struct superio_registers reg_table[] if ((uint16_t)reg_table[i].superio_id != id) continue; - nodump = 1; - for (j = 0; /* Nothing */; j++) { if (reg_table[i].ldn[j].ldn == EOT) break; - - nodump = 0; - - if (reg_table[i].ldn[j].ldn != NOLDN) { - printf("Switching to LDN 0x%02x\n", - reg_table[i].ldn[j].ldn); - regwrite(port, 0x07, reg_table[i].ldn[j].ldn); - } - - idx = reg_table[i].ldn[j].idx; - - printf("idx "); - for (k = 0; /* Nothing */; k++) { - if (idx[k] == EOT) - break; - printf("%02x ", idx[k]); - } - - printf("\nval "); - for (k = 0; /* Nothing */; k++) { - if (idx[k] == EOT) - break; - printf("%02x ", regval(port, idx[k])); - } - - printf("\ndef "); - idx = reg_table[i].ldn[j].def; - for (k = 0; /* Nothing */; k++) { - if (idx[k] == EOT) - break; - else if (idx[k] == NANA) - printf("NA "); - else if (idx[k] == RSVD) - printf("RR "); - else if (idx[k] == MISC) /* TODO */ - printf("MM "); - else - printf("%02x ", idx[k]); - } - printf("\n"); + no_dump_available = 0; + dump_regs(reg_table, i, j, port); } - if (nodump) - printf("No dump for %s %s\n", vendor, reg_table[i].name); + if (no_dump_available) + printf("No dump available for this Super I/O\n"); } } -void no_superio_found(uint16_t port) { +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)); + printf("Probing 0x%04x, failed (0x%02x), data returns 0x%02x\n", + port, inb(port), inb(port + 1)); } int main(int argc, char *argv[]) diff --git a/util/superiotool/superiotool.h b/util/superiotool/superiotool.h index 7b6ef904ae..b0d12cd0dd 100644 --- a/util/superiotool/superiotool.h +++ b/util/superiotool/superiotool.h @@ -61,6 +61,7 @@ struct superio_registers { const char name[MAXNAMELEN]; struct { int ldn; + const char *name; int idx[IDXSIZE]; int def[IDXSIZE]; } ldn[LDNSIZE]; diff --git a/util/superiotool/winbond.c b/util/superiotool/winbond.c index 0058c33ee9..709e7f329f 100644 --- a/util/superiotool/winbond.c +++ b/util/superiotool/winbond.c @@ -30,57 +30,97 @@ */ const static struct superio_registers reg_table[] = { {0x601, "W83697HF/F", { - /* - {NOLDN, - {0x20,0x21,EOT}, - {0x60,NANA,EOT}}, - */ + {NOLDN, NULL, + /* TODO: 0x02, 0x07. */ + {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29, + 0x2a,EOT}, + {0x60,NANA,0xff,0x00,0x00,0x00,0x00,0x00,0x00, + MISC,EOT}}, + /* Some register defaults depend on the value of PNPCSV. */ + {0x0, "Floppy", + {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4, + 0xf5,EOT}, + {0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00, + 0x00,EOT}}, + {0x1, "Parallel port", + {0x30,0x60,0x61,0x70,0x74,0xf0,EOT}, + {0x01,0x03,0x78,0x07,0x04,0x3f,EOT}}, + {0x2, "COM1", + {0x30,0x60,0x61,0x70,0xf0,EOT}, + {0x01,0x03,0xf8,0x04,0x00,EOT}}, + {0x3, "COM2", + {0x30,0x60,0x61,0x70,0xf0,0xf1,EOT}, + {0x01,0x02,0xf8,0x03,0x00,0x00,EOT}}, + {0x6, "CIR", + {0x30,0x60,0x61,0x70,EOT}, + {0x00,0x00,0x00,0x00,EOT}}, + {0x7, "Game port, GPIO port 1", + {0x30,0x60,0x61,0x62,0x63,0xf0,0xf1,0xf2,EOT}, + {0x00,0x02,0x01,0x00,0x00,0xff,0x00,0x00,EOT}}, + {0x8, "MIDI port, GPIO port 5", + {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3, + 0xf4,0xf5,EOT}, + {0x00,0x03,0x30,0x00,0x00,0x09,0xff,0x00,0x00,0x00, + 0x00,0x00,EOT}}, + {0x9, "GPIO port 2, 3, and 4", + {0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6, + 0xf7,0xf8,0xf5,EOT}, + {0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xff, + 0x00,0x00,0x00,EOT}}, + {0xa, "ACPI", + {0x30,0x70,0xe0,0xe1,0xe2,0xe5,0xe6,0xe7, + 0xf0,0xf1,0xf3,0xf4,0xf6,0xf7,0xf9,EOT}, + {0x00,0x00,0x00,0x00,NANA,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}}, + {0xb, "Hardware monitor", + {0x30,0x60,0x61,0x70,EOT}, + {0x00,0x00,0x00,0x00,EOT}}, {EOT}}}, {0x886, "W83627EHF/EF/EHG/EG", { - {NOLDN, + {NOLDN, NULL, {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT}, {0x88,NANA,0xff,0x00,MISC,0x00,MISC,RSVD,0x50, 0x04,0x00,RSVD,0x00,0x21,0x00,0x00,EOT}}, - {0x0, + {0x0, NULL, {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4, 0xf5,EOT}, {0x01,0x03,0xf0,0x06,0x02,0x8e,0x00,0xff,0x00, 0x00,EOT}}, - {0x1, + {0x1, NULL, {0x30,0x60,0x61,0x70,0x74,0xf0,EOT}, {0x01,0x03,0x78,0x07,0x04,0x3f,EOT}}, - {0x2, + {0x2, NULL, {0x30,0x60,0x61,0x70,0xf0,EOT}, {0x01,0x03,0xf8,0x04,0x00,EOT}}, - {0x3, + {0x3, NULL, {0x30,0x60,0x61,0x70,0xf0,0xf1,EOT}, {0x01,0x02,0xf8,0x03,0x00,0x00,EOT}}, - {0x5, + {0x5, NULL, {0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT}, {0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}}, - {0x6, + {0x6, NULL, {0x30,0x62,0x63,EOT}, {0x00,0x00,0x00,EOT}}, - {0x7, + {0x7, NULL, {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3, 0xf4,0xf5,0xf6,0xf7,EOT}, {0x00,0x02,0x01,0x03,0x30,0x09,0xff,0x00,0x00,0x00, 0xff,0x00,0x00,0x00,EOT}}, - {0x8, + {0x8, NULL, {0x30,0xf5,0xf6,0xf7,EOT}, {0x00,0x00,0x00,0x00,EOT}}, - {0x9, + {0x9, NULL, {0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xf0,0xf1,0xf2, 0xf3,0xf4,0xf5,0xf6,0xf7,EOT}, {0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00, 0x00,0xff,0x00,0x00,0x00,EOT}}, - {0xa, + {0xa, NULL, {0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, 0xe8,0xf2,0xf3,0xf4,0xf6,0xf7,EOT}, {0x00,0x00,0x01,0x00,0xff,0x08,0x00,RSVD,0x00,0x00, RSVD,0x7c,0x00,0x00,0x00,0x00,EOT}}, - {0xb, + {0xb, NULL, {0x30,0x60,0x61,0x70,0xf0,0xf1,EOT}, {0x00,0x00,0x00,0x00,0xc1,0x00,EOT}}, {EOT}}},