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