Detection support for the Winbond W83627HF (trivial).
[coreboot.git] / util / superiotool / winbond.c
1 /*
2  * This file is part of the LinuxBIOS project.
3  *
4  * Copyright (C) 2007 Uwe Hermann <uwe@hermann-uwe.de>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19  */
20
21 #include "superiotool.h"
22
23 #define DEVICE_ID_REG   0x20
24 #define DEVICE_REV_REG  0x21
25
26 /**
27  * The ID entries must be in 0xYYZ format, where YY is the device ID,
28  * and Z is bits 7..4 of the device revision register. We do not match
29  * bits 3..0 of the device revision here.
30  */
31 const static struct superio_registers reg_table[] = {
32         {0x601, "W83697HF/F", {
33                 {NOLDN, NULL,
34                         {0x07,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,
35                          0x2a,EOT},
36                         {NANA,0x60,NANA,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
37                          MISC,EOT}},
38                 /* Some register defaults depend on the value of PNPCSV. */
39                 {0x0, "Floppy",
40                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
41                          0xf5,EOT},
42                         {0x01,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,
43                          0x00,EOT}},
44                 {0x1, "Parallel port",
45                         {0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
46                         {0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
47                 {0x2, "COM1",
48                         {0x30,0x60,0x61,0x70,0xf0,EOT},
49                         {0x01,0x03,0xf8,0x04,0x00,EOT}},
50                 {0x3, "COM2",
51                         {0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
52                         {0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
53                 {0x6, "Consumer IR",
54                         {0x30,0x60,0x61,0x70,EOT},
55                         {0x00,0x00,0x00,0x00,EOT}},
56                 {0x7, "Game port, GPIO 1",
57                         {0x30,0x60,0x61,0x62,0x63,0xf0,0xf1,0xf2,EOT},
58                         {0x00,0x02,0x01,0x00,0x00,0xff,0x00,0x00,EOT}},
59                 {0x8, "MIDI port, GPIO 5",
60                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
61                          0xf4,0xf5,EOT},
62                         {0x00,0x03,0x30,0x00,0x00,0x09,0xff,0x00,0x00,0x00,
63                          0x00,0x00,EOT}},
64                 {0x9, "GPIO 2, GPIO 3, GPIO 4",
65                         {0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,
66                          0xf7,0xf8,0xf5,EOT},
67                         {0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xff,
68                          0x00,0x00,0x00,EOT}},
69                 {0xa, "ACPI",
70                         {0x30,0x70,0xe0,0xe1,0xe2,0xe5,0xe6,0xe7,
71                          0xf0,0xf1,0xf3,0xf4,0xf6,0xf7,0xf9,EOT},
72                         {0x00,0x00,0x00,0x00,NANA,0x00,0x00,0x00,
73                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
74                 {0xb, "Hardware monitor",
75                         {0x30,0x60,0x61,0x70,EOT},
76                         {0x00,0x00,0x00,0x00,EOT}},
77                 {EOT}}},
78         {0x886, "W83627EHF/EF/EHG/EG", {
79                 {NOLDN, NULL,
80                         {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
81                          0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,EOT},
82                         {0x88,MISC,0xff,0x00,MISC,0x00,MISC,RSVD,0x50,
83                          0x04,0x00,RSVD,0x00,0x21,0x00,0x00,EOT}},
84                 {0x0, "Floppy",
85                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf4,
86                          0xf5,EOT},
87                         {0x01,0x03,0xf0,0x06,0x02,0x8e,0x00,0xff,0x00,
88                          0x00,EOT}},
89                 {0x1, "Parallel port",
90                         {0x30,0x60,0x61,0x70,0x74,0xf0,EOT},
91                         {0x01,0x03,0x78,0x07,0x04,0x3f,EOT}},
92                 {0x2, "COM1",
93                         {0x30,0x60,0x61,0x70,0xf0,EOT},
94                         {0x01,0x03,0xf8,0x04,0x00,EOT}},
95                 {0x3, "COM2",
96                         {0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
97                         {0x01,0x02,0xf8,0x03,0x00,0x00,EOT}},
98                 {0x5, "Keyboard",
99                         {0x30,0x60,0x61,0x62,0x63,0x70,0x72,0xf0,EOT},
100                         {0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x83,EOT}},
101                 {0x6, "Serial flash interface",
102                         {0x30,0x62,0x63,EOT},
103                         {0x00,0x00,0x00,EOT}},
104                 {0x7, "GPIO 1, GPIO 6, game port, MIDI port",
105                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
106                          0xf4,0xf5,0xf6,0xf7,EOT},
107                         {0x00,0x02,0x01,0x03,0x30,0x09,0xff,0x00,0x00,0x00,
108                          0xff,0x00,0x00,0x00,EOT}},
109                 {0x8, "WDTO#, PLED",
110                         {0x30,0xf5,0xf6,0xf7,EOT},
111                         {0x00,0x00,0x00,0x00,EOT}},
112                 {0x9, "GPIO 2, GPIO 3, GPIO 4, GPIO 5, SUSLED",
113                         {0x30,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xf0,0xf1,0xf2,
114                          0xf3,0xf4,0xf5,0xf6,0xf7,EOT},
115                         {0x00,0xff,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,
116                          0x00,0xff,0x00,0x00,0x00,EOT}},
117                 {0xa, "ACPI",
118                         {0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
119                          0xe8,0xf2,0xf3,0xf4,0xf6,0xf7,EOT},
120                         {0x00,0x00,0x01,0x00,0xff,0x08,0x00,RSVD,0x00,0x00,
121                          RSVD,0x7c,0x00,0x00,0x00,0x00,EOT}},
122                 {0xb, "Hardware monitor",
123                         {0x30,0x60,0x61,0x70,0xf0,0xf1,EOT},
124                         {0x00,0x00,0x00,0x00,0xc1,0x00,EOT}},
125                 {EOT}}},
126         {0x52, "W83627HF", {
127                 {EOT}}},
128         {EOT}
129 };
130
131 void probe_idregs_winbond(uint16_t port)
132 {
133         uint16_t id;
134         uint8_t devid, rev;
135
136         enter_conf_mode_winbond_fintek_ite_8787(port);
137
138         devid = regval(port, DEVICE_ID_REG);
139         rev = regval(port, DEVICE_REV_REG);
140
141         if (devid != 0x52)
142                 /* Bits 3..0 of 'rev' == IC version, we don't match that. */
143                 id = (devid << 4) | ((rev & 0xf0) >> 4);
144         else
145                 id = devid;
146
147         if (superio_unknown(reg_table, id)) {
148                 no_superio_found(port);
149                 exit_conf_mode_winbond_fintek_ite_8787(port);
150                 return;
151         }
152
153         printf("Found Winbond %s (id=0x%02x, rev=0x%02x) at 0x%x\n",
154                get_superio_name(reg_table, id), devid, rev, port);
155
156         /* TODO: Special notes in dump output for the MISC entries. */
157         dump_superio("Winbond", reg_table, port, id);
158         dump_superio_readable(port); /* TODO */
159
160         exit_conf_mode_winbond_fintek_ite_8787(port);
161 }
162