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