Various superiotool fixes.
[coreboot.git] / util / superiotool / ite.c
1 /*
2  * This file is part of the superiotool project.
3  *
4  * Copyright (C) 2007 Carl-Daniel Hailfinger
5  * Copyright (C) 2007-2008 Uwe Hermann <uwe@hermann-uwe.de>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
20  */
21
22 #include "superiotool.h"
23
24 #define CHIP_ID_BYTE1_REG       0x20
25 #define CHIP_ID_BYTE2_REG       0x21
26 #define CHIP_VERSION_REG        0x22
27 #define ISA_PNP_ADDR            0x279
28
29 static const struct superio_registers reg_table[] = {
30         {0x8228, "IT8228E", {
31                 {EOT}}},
32         {0x8510, "IT8510E/TE/G", {
33                 {EOT}}},
34         {0x8511, "IT8511E/TE/G", {
35                 {EOT}}},
36         {0x8512, "IT8512E/F/G", {
37                 {EOT}}},
38         {0x8513, "IT8513E/F/G", {
39                 {EOT}}},
40         {0x8661, "IT8661F/IT8770F", {
41                 {NOLDN, NULL,
42                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
43                          0x23,0x24,EOT},
44                         {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
45                          0x00,0x00,EOT}},
46                 {0x0, "Floppy",
47                         {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
48                         {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
49                 {0x1, "COM1",
50                         {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
51                         {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
52                 {0x2, "COM2",
53                         {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
54                         {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
55                 {0x3, "Parallel port",
56                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
57                          0xf0,EOT},
58                         {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
59                          0x03,EOT}},
60                 {0x4, "IR",
61                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
62                          0x74,0x75,0xf0,EOT},
63                         {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
64                          0x01,0x00,0x00,EOT}},
65                 {0x5, "GPIO",
66                         {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
67                          0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
68                          0xf9,0xfa,0xfb,0xfc,EOT},
69                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
70                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
71                          0x00,0x00,0x00,0x00,EOT}},
72                 {EOT}}},
73         {0x8673, "IT8673F", {
74                 {EOT}}},
75         {0x8681, "IT8671F/IT8687R", {
76                 {NOLDN, NULL,
77                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
78                          0x23,0x24,0x25,0x26,0x2e,0x2f,EOT},
79                         {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x81,0x00,
80                          0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
81                 {0x0, "Floppy",
82                         {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
83                         {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
84                 {0x1, "COM1",
85                         {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
86                         {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
87                 {0x2, "COM2",
88                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
89                          0x74,0x75,0xf0,0xf1,EOT},
90                         {0x00,0x00,0x02,0xf8,0x03,0x00,0x03,0x02,0x0a,0x02,
91                          0x00,0x01,0x00,0x00,EOT}},
92                 {0x3, "Parallel port",
93                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
94                          0xf0,EOT},
95                         {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
96                          0x03,EOT}},
97                 {0x4, "APC",
98                         {0x30,0xf0,0xf1,0xf2,0xf4,0xf5,0xf6,EOT},
99                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
100                 {0x5, "Keyboard",
101                         {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
102                         {MISC,0x00,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
103                 {0x6, "Mouse",
104                         {0x30,0x70,0x71,0xf0,EOT},
105                         {0x00,0x0c,0x02,0x00,EOT}},
106                 {0x7, "GPIO",
107                         {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
108                          0x70,0x71,0x72,0x73,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,
109                          0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
110                          0xe0,0xe1,0xe2,0xe3,0xe4,EOT},
111                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
112                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
113                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
114                          0x00,0x00,0x00,0x00,0x00,EOT}},
115                 {EOT}}},
116         {0x8701, "IT8703F", {
117                 {NOLDN, NULL,
118                         {0x20,0x21,0x23,0x24,0x26,0x29,0x2a,0x2b,EOT},
119                         {0x87,0x00,0x00,0x80,0x00,0x00,0x7c,0xc0,EOT}},
120                 {0x0, "Floppy",
121                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf3,0xf4,
122                          0xf5,EOT},
123                         {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
124                          0x00,EOT}},
125                 {0x1, "Parallel port",
126                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
127                         {0x00,0x03,0x78,0x00,0x80,0x07,0x03,0x03,EOT}},
128                 {0x2, "COM1",
129                         {0x30,0x60,0x61,0x70,0xf0,EOT},
130                         {0x00,0x03,0xf8,0x04,0x00,EOT}},
131                 {0x3, "COM2",
132                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
133                         {0x00,0x02,0xf8,0x03,0x00,0x00,0x00,0x7f,EOT}},
134                 {0x5, "Keyboard",
135                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
136                         {0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x80,EOT}},
137                 {0x6, "Consumer IR",
138                         {0x30,0x60,0x61,0x70,EOT},
139                         {0x00,0x00,0x00,0x00,EOT}},
140                 {0x7, "Game port, MIDI, GPIO set 1",
141                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,EOT},
142                         {0x00,0x02,0x01,0x03,0x30,0x00,0xff,0x00,0x00,EOT}},
143                 {0x8, "GPIO set 2",
144                         {0x30,0xf0,0xf1,0xf2,0xf3,0xf5,EOT},
145                         {0x00,0xff,0x00,0x00,0x00,0x00,EOT}},
146                 {0x9, "GPIO set 3 and 4",
147                         {0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,EOT},
148                         {0x00,0x02,0x90,0xff,0x00,0x00,0x00,0x00,EOT}},
149                 {0xa, "ACPI",
150                         {0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
151                          0xf3,0xf4,0xf6,0xf7,0xf9,EOT},
152                         {0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
153                          NANA,NANA,0x00,0x00,0x00,EOT}},
154                 {0xc, "GPIO set 5, 6 and 7",
155                         {0x30,0x60,0x61,0xf0,0xf3,0xf6,EOT},
156                         {0x00,0x03,0x70,0x00,0xff,0xff,EOT}},
157                 {EOT}}},
158         {0x8702, "IT8702F", {
159                 {EOT}}},
160         {0x8705, "IT8705F/AF / IT8700F", {
161                 {NOLDN, NULL,
162                         {0x20,0x21,0x22,0x23,0x24,EOT},
163                         {0x87,0x05,0x00,0x00,NANA,EOT}},
164                 {0x0, "Floppy",
165                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
166                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
167                 {0x1, "COM1",
168                         {0x30,0x60,0x61,0x70,0xf0,EOT},
169                         {0x00,0x03,0xf8,0x04,0x00,EOT}},
170                 {0x2, "COM2",
171                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
172                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
173                 {0x3, "Parallel port",
174                         {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
175                          0xf0,EOT},
176                         {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
177                          0x03,EOT}},
178                 {0x4, "Environment controller",
179                         {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
180                          0xf3,0xf4,0xf5,0xf6,EOT},
181                         {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
182                          0x00,0x00,NANA,NANA,EOT}},
183                 {0x5, "GPIO",
184                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
185                          0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
186                          0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
187                          0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
188                          0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
189                          0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
190                          0xfd,0xfe,0xff,EOT},
191                         {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
192                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
193                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
194                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
195                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
196                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
197                          0x00,NANA,0x00,EOT}},
198                 {0x6, "Game port",
199                         {0x30,0x60,0x61,EOT},
200                         {0x00,0x02,0x01,EOT}},
201                 {0x7, "Consumer IR",
202                         {0x30,0x60,0x61,0x70,0xf0,EOT},
203                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
204                 {0x8, "MIDI port",
205                         {0x30,0x60,0x61,0x70,0xf0,EOT},
206                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
207                 {EOT}}},
208         {0x8706, "IT8706R", {   /* TODO: Not yet in sensors-detect */
209                 /* This is a "Special General Purpose I/O chip". */
210                 {EOT}}},
211         {0x8708, "IT8708F", {
212                 {NOLDN, NULL,
213                         {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
214                          0x2a,0x2e,0x2f,EOT},
215                         {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
216                          0xff,0x00,0x00,EOT}},
217                 {0x0, "Floppy",
218                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
219                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
220                 {0x1, "COM1",
221                         {0x30,0x60,0x61,0x70,0xf0,EOT},
222                         {0x00,0x03,0xf8,0x04,0x00,EOT}},
223                 {0x2, "COM2",
224                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
225                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
226                 {0x3, "Parallel port",
227                         {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
228                          0xf0,EOT},
229                         {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
230                          0x03,EOT}},
231                 {0x4, "SWC",
232                         {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
233                          0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
234                         {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
235                          0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
236                 {0x5, "Keyboard",
237                         /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
238                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
239                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
240                 {0x6, "Mouse",
241                         {0x30,0x70,0x71,0xf0,EOT},
242                         {0x00,0x0c,0x02,0x00,EOT}},
243                 {0x7, "GPIO",
244                         {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
245                          0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
246                          0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
247                          0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
248                          0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
249                          0xfc,EOT},
250                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
251                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
252                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
253                          0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
254                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
255                          0x00,EOT}},
256                 {0x8, "Game port",
257                         {0x30,0x60,0x61,EOT},
258                         {0x00,0x02,0x01,EOT}},
259                 {0x9, "Consumer IR",
260                         {0x30,0x60,0x61,0x70,0xf0,EOT},
261                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
262                 {0xa, "MIDI port",
263                         {0x30,0x60,0x61,0x70,0xf0,EOT},
264                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
265                 {EOT}}},
266         {0x8710, "IT8710F", {   /* TODO: Not yet in sensors-detect */
267                 {EOT}}},
268         {0x8711, "IT8711F", {   /* 0x8711 is a guess, not found in datasheet. */
269                 {EOT}}},
270         {0x8712, "IT8712F", {
271                 {NOLDN, NULL,
272                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
273                         {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
274                 {0x0, "Floppy",
275                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
276                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
277                 {0x1, "COM1",
278                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
279                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
280                 {0x2, "COM2",
281                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
282                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
283                 {0x3, "Parallel port",
284                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
285                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
286                 {0x4, "Environment controller",
287                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
288                          0xf4,0xf5,0xf6,EOT},
289                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
290                          0x00,NANA,NANA,EOT}},
291                 {0x5, "Keyboard",
292                         /* TODO: 0xf0: Error in datasheet? */
293                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
294                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
295                 {0x6, "Mouse",
296                         {0x30,0x70,0x71,0xf0,EOT},
297                         {0x00,0x0c,0x02,0x00,EOT}},
298                 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
299                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
300                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
301                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
302                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
303                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
304                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
305                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
306                          0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
307                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
308                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
309                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
310                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
311                 {0x8, "MIDI port",
312                         {0x30,0x60,0x61,0x70,0xf0,EOT},
313                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
314                 {0x9, "Game port",
315                         {0x30,0x60,0x61,EOT},
316                         {0x00,0x02,0x01,EOT}},
317                 {0xa, "Consumer IR",
318                         {0x30,0x60,0x61,0x70,0xf0,EOT},
319                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
320                 {EOT}}},
321         {0x8716, "IT8716F", {
322                 {NOLDN, NULL,
323                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
324                         {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
325                 {0x0, "Floppy",
326                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
327                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
328                 {0x1, "COM1",
329                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
330                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
331                 {0x2, "COM2",
332                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
333                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
334                 {0x3, "Parallel port",
335                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
336                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
337                 {0x4, "Environment controller",
338                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
339                          0xf4,0xf5,0xf6,EOT},
340                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
341                          0x00,NANA,NANA,EOT}},
342                 {0x5, "Keyboard",
343                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
344                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
345                 {0x6, "Mouse",
346                         {0x30,0x70,0x71,0xf0,EOT},
347                         {0x00,0x0c,0x02,0x00,EOT}},
348                 {0x7, "GPIO",
349                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
350                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
351                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
352                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
353                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
354                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
355                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
356                          0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
357                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
358                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
359                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
360                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
361                 {0x8, "MIDI port",
362                         {0x30,0x60,0x61,0x70,0xf0,EOT},
363                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
364                 {0x9, "Game port",
365                         {0x30,0x60,0x61,EOT},
366                         {0x00,0x02,0x01,EOT}},
367                 {0xa, "Consumer IR",
368                         {0x30,0x60,0x61,0x70,0xf0,EOT},
369                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
370                 {EOT}}},
371         {0x8718, "IT8718F", {
372                 {NOLDN, NULL,
373                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
374                         {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
375                 {0x0, "Floppy",
376                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
377                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
378                 {0x1, "COM1",
379                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
380                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
381                 {0x2, "COM2",
382                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
383                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
384                 {0x3, "Parallel port",
385                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
386                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
387                 {0x4, "Environment controller",
388                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
389                          0xf4,0xf5,0xf6,EOT},
390                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
391                          0x00,NANA,NANA,EOT}},
392                 {0x5, "Keyboard",
393                         /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
394                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
395                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
396                 {0x6, "Mouse",
397                         {0x30,0x70,0x71,0xf0,EOT},
398                         {0x00,0x0c,0x02,0x00,EOT}},
399                 {0x7, "GPIO",
400                         /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
401                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
402                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
403                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
404                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
405                          0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
406                          0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
407                          0xfb,0xfc,0xfd,0xfe,0xff,EOT},
408                         {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
409                          0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
410                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
411                          0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
412                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
413                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
414                          0x00,NANA,0x00,0x00,0x00,EOT}},
415                 {0xa, "Consumer IR",
416                         {0x30,0x60,0x61,0x70,0xf0,EOT},
417                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
418                 {EOT}}},
419         {0x8720, "IT8720F", {   /* From sensors-detect */
420                 {EOT}}},
421         {0x8722, "IT8722F", {
422                 {EOT}}},
423         {0x8726, "IT8726F", {
424                 /* Datasheet wrongly says that the ID is 0x8716. */
425                 {NOLDN, NULL,
426                         {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
427                         {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
428                 {0x0, "Floppy",
429                         {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
430                         {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
431                 {0x1, "COM1",
432                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
433                         {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
434                 {0x2, "COM2",
435                         {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
436                         {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
437                 {0x3, "Parallel port",
438                         {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
439                         {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
440                 {0x4, "Environment controller",
441                         {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
442                          0xf4,0xf5,0xf6,EOT},
443                         {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
444                          0x00,MISC,MISC,EOT}},
445                 {0x5, "Keyboard",
446                         /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
447                         {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
448                         {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
449                 {0x6, "Mouse",
450                         {0x30,0x70,0x71,0xf0,EOT},
451                         {0x00,0x0c,0x02,0x00,EOT}},
452                 {0x7, "GPIO",
453                         /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
454                         {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
455                          0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
456                          0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
457                          0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
458                          0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
459                          0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
460                         {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
461                          0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
462                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
463                          0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
464                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
465                          0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
466                 {0x8, "MIDI port",
467                         {0x30,0x60,0x61,0x70,0xf0,EOT},
468                         {0x00,0x03,0x00,0x0a,0x00,EOT}},
469                 {0x9, "Game port",
470                         {0x30,0x60,0x61,EOT},
471                         {0x00,0x02,0x01,EOT}},
472                 {0xa, "Consumer IR",
473                         {0x30,0x60,0x61,0x70,0xf0,EOT},
474                         {0x00,0x03,0x10,0x0b,0x00,EOT}},
475                 {EOT}}},
476         {0x8761, "IT8761E", {
477                 {EOT}}},
478         {0x8780, "IT8780F", {
479                 {EOT}}},
480         {EOT}
481 };
482
483 static const struct superio_registers ec_table[] = {
484         {0x8716, "IT8716F", {
485                 {NOLDN, NULL,
486                         {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
487                          0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
488                          0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
489                          0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
490                          0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
491                          0x59,0x5c,
492                          0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
493                          0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
494                          0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
495                          0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
496                          0x9b,0x9c,0x9d,EOT},
497                         {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
498                          NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
499                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
500                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
501                          NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
502                          0x00,0x00,
503                          0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
504                          0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
505                          0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
506                          0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
507                          0x00,0x00,0x7f,EOT}},
508                 {EOT}}},
509         {0x8718, "IT8718F", {
510                 {NOLDN, NULL,
511                         {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
512                          0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
513                          0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
514                          0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
515                          0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
516                          0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
517                          0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
518                          0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
519                          0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
520                          0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
521                          0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
522                          0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
523                          0xa6,EOT},
524                         {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
525                          0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
526                          0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
527                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
528                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
529                          NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
530                          NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
531                          0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
532                          0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
533                          0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
534                          0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
535                          0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
536                          0x00,EOT}},
537                 {EOT}}},
538         {EOT}
539 };
540
541 /* Works for: IT8661F/IT8770F */
542 static const uint8_t initkey_it8661f[][4] = {
543         {0x86, 0x61, 0x55, 0x55},       /* 0x3f0 */
544         {0x86, 0x61, 0x55, 0xaa},       /* 0x3bd */
545         {0x86, 0x61, 0xaa, 0x55},       /* 0x370 */
546 };
547
548 /* Works for: IT8671F/IT8687R, IT8673F */
549 static const uint8_t initkey_it8671f[][4] = {
550         {0x86, 0x80, 0x55, 0x55},       /* 0x3f0 */
551         {0x86, 0x80, 0x55, 0xaa},       /* 0x3bd */
552         {0x86, 0x80, 0xaa, 0x55},       /* 0x370 */
553 };
554
555 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
556 static const uint8_t initkey_mbpnp[] = {
557         0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
558         0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
559         0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
560 };
561
562 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
563 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
564 {
565         int i, idx;
566
567         /* Determine Super I/O config port. */
568         idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
569         for (i = 0; i < 4; i++)
570                 OUTB(init[idx][i], ISA_PNP_ADDR);
571
572         /* Sequentially write the 32 MB PnP init values. */
573         for (i = 0; i < 32; i++)
574                 OUTB(initkey_mbpnp[i], port);
575 }
576
577 static void enter_conf_mode_ite(uint16_t port)
578 {
579         OUTB(0x87, port);
580         OUTB(0x01, port);
581         OUTB(0x55, port);
582         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
583 }
584
585 static void enter_conf_mode_ite_it8761e(uint16_t port)
586 {
587         OUTB(0x87, port);
588         OUTB(0x61, port);
589         OUTB(0x55, port);
590         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
591 }
592
593 static void enter_conf_mode_ite_it8228e(uint16_t port)
594 {
595         OUTB(0x82, port);
596         OUTB(0x28, port);
597         OUTB(0x55, port);
598         OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
599 }
600
601 static void exit_conf_mode_ite(uint16_t port)
602 {
603         regwrite(port, 0x02, 0x02);
604 }
605
606 static void probe_idregs_ite_helper(const char *init, uint16_t port)
607 {
608         uint16_t id, chipver, ecport;
609
610         probing_for("ITE", init, port);
611
612         id = regval(port, CHIP_ID_BYTE1_REG) << 8;
613         id |= regval(port, CHIP_ID_BYTE2_REG);
614         chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
615
616         if (superio_unknown(reg_table, id)) {
617                 if (verbose)
618                         printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
619                 return;
620         }
621
622         printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
623                get_superio_name(reg_table, id), id, chipver, port);
624         chip_found = 1;
625
626         dump_superio("ITE", reg_table, port, id, LDN_SEL);
627
628         if (extra_dump) {
629                 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
630
631                 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
632                 ecport = regval(port, 0x60) << 8;
633                 ecport |= regval(port, 0x61);
634
635                 /* EC address register = EC base address + 5. */
636                 ecport += 5;
637
638                 printf("Environment controller (0x%04x)\n", ecport);
639                 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
640         }
641 }
642
643 void probe_idregs_ite(uint16_t port)
644 {
645         if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
646                 enter_conf_mode_ite_legacy(port, initkey_it8661f);
647                 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
648                 exit_conf_mode_ite(port);
649
650                 enter_conf_mode_ite_legacy(port, initkey_it8671f);
651                 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
652                 exit_conf_mode_ite(port);
653         } else {
654                 enter_conf_mode_ite(port);
655                 probe_idregs_ite_helper("(init=standard) ", port);
656                 exit_conf_mode_ite(port);
657
658                 enter_conf_mode_ite_it8761e(port);
659                 probe_idregs_ite_helper("(init=it8761e) ", port);
660                 exit_conf_mode_ite(port);
661
662                 enter_conf_mode_ite_it8228e(port);
663                 probe_idregs_ite_helper("(init=it8228e) ", port);
664                 exit_conf_mode_ite(port);
665
666                 enter_conf_mode_winbond_fintek_ite_8787(port);
667                 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
668                 exit_conf_mode_winbond_fintek_ite_8787(port);
669         }
670 }
671
672 void print_ite_chips(void)
673 {
674         print_vendor_chips("ITE", reg_table);
675         print_vendor_chips("ITE-EC", ec_table);
676 }