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