summaryrefslogtreecommitdiff
path: root/util/superiotool/ite.c
diff options
context:
space:
mode:
authorUwe Hermann <uwe@hermann-uwe.de>2007-09-20 22:13:48 +0000
committerUwe Hermann <uwe@hermann-uwe.de>2007-09-20 22:13:48 +0000
commit0702469f163e69257a7cf079eb40ae99f53c815b (patch)
tree949fecf3840017efa0a52b7f254961b200ebf71c /util/superiotool/ite.c
parent42670a75ef557db9b93e7dc5dc1d9e1cef246ff5 (diff)
downloadcoreboot-0702469f163e69257a7cf079eb40ae99f53c815b.tar.xz
Fix up and generalize the ITE IT8708F code. It was only working out of
pure luck (and broken code elsewhere). Needs some more fixing. Add more LDN descriptions to various Super I/Os. 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@2793 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'util/superiotool/ite.c')
-rw-r--r--util/superiotool/ite.c131
1 files changed, 58 insertions, 73 deletions
diff --git a/util/superiotool/ite.c b/util/superiotool/ite.c
index fc7c4137d8..610516a980 100644
--- a/util/superiotool/ite.c
+++ b/util/superiotool/ite.c
@@ -21,44 +21,49 @@
#include "superiotool.h"
+#define CHIP_ID_BYTE1_REG 0x20
+#define CHIP_ID_BYTE2_REG 0x21
+#define CHIP_VERSION_REG 0x22
+
+/* Note: IT8726F has ID 0x8726 (datasheet wrongly says 0x8716). */
const static struct superio_registers reg_table[] = {
- {0x8702, "IT8702", {
+ {0x8702, "IT8702F", {
{EOT}}},
- {0x8705, "IT8705 or IT8700", {
+ {0x8705, "IT8705F or IT8700F", {
{EOT}}},
- {0x8708, "IT8708", {
+ {0x8708, "IT8708F", {
{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, NULL,
+ {0x0, "Floppy",
{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
{0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
- {0x1, NULL,
+ {0x1, "COM1",
{0x30,0x60,0x61,0x70,0xf0,EOT},
{0x00,0x03,0xf8,0x04,0x00,EOT}},
- {0x2, NULL,
+ {0x2, "COM2",
{0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
{0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
- {0x3, NULL,
+ {0x3, "Parallel port",
{0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
0xf0,EOT},
{0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
0x03,EOT}},
- {0x4, NULL,
+ {0x4, "SWC",
{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, NULL,
+ {0x5, "Keyboard",
/* 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, NULL,
+ {0x6, "Mouse",
{0x30,0x70,0x71,0xf0,EOT},
{0x00,0x0c,0x02,0x00,EOT}},
- {0x7, NULL,
+ {0x7, "GPIO",
{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,
@@ -71,46 +76,47 @@ 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, NULL,
+ {0x8, "Game port",
{0x30,0x60,0x61,EOT},
{0x00,0x02,0x01,EOT}},
- {0x9, NULL,
+ {0x9, "Consumer IR",
{0x30,0x60,0x61,0x70,0xf0,EOT},
{0x00,0x03,0x10,0x0b,0x00,EOT}},
- {0xa, NULL,
+ {0xa, "MIDI port",
{0x30,0x60,0x61,0x70,0xf0,EOT},
{0x00,0x03,0x00,0x0a,0x00,EOT}},
{EOT}}},
- {0x8710, "IT8710", {
+ {0x8710, "IT8710F", {
{EOT}}},
- {0x8712, "IT8712", {
+ {0x8712, "IT8712F", {
{NOLDN, NULL,
{0x07,0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
{NANA,0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
- {0x0, NULL,
+ {0x0, "Floppy",
{0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
{0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
- {0x1, NULL,
+ {0x1, "COM1",
{0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
{0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
- {0x2, NULL,
+ {0x2, "COM2",
{0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
{0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
- {0x3, NULL,
+ {0x3, "Parallel port",
{0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
{0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
- {0x4, NULL,
+ {0x4, "Environment controller",
{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, NULL,
+ {0x5, "Keyboard",
+ /* TODO: 0xf0: Error in datasheet? */
{0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
{0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
- {0x6, NULL,
+ {0x6, "Mouse",
{0x30,0x70,0x71,0xf0,EOT},
{0x00,0x0c,0x02,0x00,EOT}},
- {0x7, NULL,
+ {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
{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,
@@ -118,22 +124,22 @@ const static struct superio_registers reg_table[] = {
0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
{0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x30,0x38,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
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, NULL,
+ {0x8, "MIDI port",
{0x30,0x60,0x61,0x70,0xf0,EOT},
{0x00,0x03,0x00,0x0a,0x00,EOT}},
- {0x9, NULL,
+ {0x9, "Game port",
{0x30,0x60,0x61,EOT},
{0x00,0x02,0x01,EOT}},
- {0xa, NULL,
+ {0xa, "Consumer IR",
{0x30,0x60,0x61,0x70,0xf0,EOT},
{0x00,0x03,0x10,0x0b,0x00,EOT}},
{EOT}}},
- {0x8716, "IT8716", {
+ {0x8716, "IT8716F", {
{NOLDN, NULL,
{0x07,0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
{NANA,0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
@@ -183,52 +189,36 @@ const static struct superio_registers reg_table[] = {
{0x30,0x60,0x61,0x70,0xf0,EOT},
{0x00,0x03,0x10,0x0b,0x00,EOT}},
{EOT}}},
- {0x8718, "IT8718", {
+ {0x8718, "IT8718F", {
{EOT}}},
{EOT}
};
+/* TODO: Drop this function later. */
void dump_ite(uint16_t port, uint16_t id)
{
- int i;
-
- /* TODO: Get datasheets for IT8711 and IT8712. */
- switch (id) {
- case 0x8702:
- case 0x8705: /* IT8700F or IT8705F */
- case 0x8708:
- case 0x8710:
- case 0x8712:
- case 0x8716:
- /* Note: IT8726F has ID 0x8726 (datasheet wrongly says 0x8716). */
- case 0x8718:
- dump_superio("ITE", reg_table, port, id);
- break;
- default:
- printf("Unknown ITE chip, id=%04x\n", id);
- for (i = 0x20; i <= 0x24; i++)
- printf("index %02x=%02x\n", i, regval(port, i));
- break;
- }
+ dump_superio("ITE", reg_table, port, id);
}
+/**
+ * Enable configuration sequence (ITE uses this for newer IT87[012]xF).
+ *
+ * IT871[01]F uses 0x87, 0x87 -> Fintek detection should handle it
+ * IT8708F uses 0x87, 0x87 -> Fintek detection should handle it
+ * IT8761F uses 0x87, 0x61, 0x55, 0x55/0xaa
+ * IT86xxF series uses different ports
+ * IT8661F uses 0x86, 0x61, 0x55/0xaa, 0x55/0xaa and 32 more writes
+ * IT8673F uses 0x86, 0x80, 0x55/0xaa, 0x55/0xaa and 32 more writes
+ */
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
- * IT8708 uses 0x87, 0x87 -> fintek detection should handle it
- * IT8761 uses 0x87, 0x61, 0x55, 0x55/0xaa
- * IT86xx series uses different ports
- * IT8661 uses 0x86, 0x61, 0x55/0xaa, 0x55/0xaa and 32 more writes
- * IT8673 uses 0x86, 0x80, 0x55/0xaa, 0x55/0xaa and 32 more writes
- */
outb(0x87, port);
outb(0x01, port);
outb(0x55, port);
if (port == 0x2e)
outb(0x55, port);
else
- outb(0xAA, port);
+ outb(0xaa, port);
}
static void exit_conf_mode_ite(uint16_t port)
@@ -242,25 +232,20 @@ void probe_idregs_ite(uint16_t port)
enter_conf_mode_ite(port);
- /* Read Chip ID Byte 1. */
- id = regval(port, 0x20);
- if (id != 0x87) {
+ id = regval(port, CHIP_ID_BYTE1_REG) << 8;
+ id |= regval(port, CHIP_ID_BYTE2_REG);
+ chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
+
+ if (superio_unknown(reg_table, id)) {
no_superio_found(port);
+ exit_conf_mode_ite(port);
return;
}
- id <<= 8;
-
- /* Read Chip ID Byte 2. */
- id |= regval(port, 0x21);
-
- /* Read chip version, only bits 3..0 for all IT87xx. */
- chipver = regval(port, 0x22) & 0x0f;
-
- printf("Super I/O found at 0x%02x: id=0x%04x, chipver=0x%01x\n",
- port, id, chipver);
+ printf("Found ITE %s (id=0x%04x, rev=0x%01x) at port=0x%x\n",
+ get_superio_name(reg_table, id), id, chipver, port);
- dump_ite(port, id);
+ dump_superio("ITE", reg_table, port, id);
exit_conf_mode_ite(port);
}