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