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