2 * This file is part of the superiotool project.
4 * Copyright (C) 2007 Carl-Daniel Hailfinger
5 * Copyright (C) 2007-2008 Uwe Hermann <uwe@hermann-uwe.de>
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.
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.
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
22 #include "superiotool.h"
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
29 static const struct superio_registers reg_table[] = {
32 {0x8510, "IT8510E/TE/G", {
34 {0x8511, "IT8511E/TE/G", {
36 {0x8661, "IT8661F/IT8770F", {
38 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
40 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
43 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
44 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
46 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
47 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
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,
54 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
57 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
59 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
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}},
71 {0x8681, "IT8671F/IT8687R", {
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,
80 {0x00,0x03,0xf0,0x06,0x02,0x0E,0x00,0xFF,0x00,0x00,
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}},
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}},
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}},
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}},
115 {0x8702, "IT8702F", {
117 {0x8705, "IT8705F/AF / IT8700F", {
119 {0x20,0x21,0x22,0x23,0x24,EOT},
120 {0x87,0x05,0x00,0x00,NANA,EOT}},
122 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
123 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
125 {0x30,0x60,0x61,0x70,0xf0,EOT},
126 {0x00,0x03,0xf8,0x04,0x00,EOT}},
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,
133 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
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}},
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,
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}},
156 {0x30,0x60,0x61,EOT},
157 {0x00,0x02,0x01,EOT}},
159 {0x30,0x60,0x61,0x70,0xf0,EOT},
160 {0x00,0x03,0x10,0x0b,0x00,EOT}},
162 {0x30,0x60,0x61,0x70,0xf0,EOT},
163 {0x00,0x03,0x00,0x0a,0x00,EOT}},
165 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
166 /* This is a "Special General Purpose I/O chip". */
168 {0x8708, "IT8708F", {
170 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
172 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
173 0xff,0x00,0x00,EOT}},
175 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
176 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
178 {0x30,0x60,0x61,0x70,0xf0,EOT},
179 {0x00,0x03,0xf8,0x04,0x00,EOT}},
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,
186 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
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}},
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}},
198 {0x30,0x70,0x71,0xf0,EOT},
199 {0x00,0x0c,0x02,0x00,EOT}},
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,
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,
214 {0x30,0x60,0x61,EOT},
215 {0x00,0x02,0x01,EOT}},
217 {0x30,0x60,0x61,0x70,0xf0,EOT},
218 {0x00,0x03,0x10,0x0b,0x00,EOT}},
220 {0x30,0x60,0x61,0x70,0xf0,EOT},
221 {0x00,0x03,0x00,0x0a,0x00,EOT}},
223 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
225 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
227 {0x8712, "IT8712F", {
229 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
230 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
232 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
233 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
235 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
236 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
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,
246 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
247 0x00,NANA,NANA,EOT}},
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}},
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}},
269 {0x30,0x60,0x61,0x70,0xf0,EOT},
270 {0x00,0x03,0x00,0x0a,0x00,EOT}},
272 {0x30,0x60,0x61,EOT},
273 {0x00,0x02,0x01,EOT}},
275 {0x30,0x60,0x61,0x70,0xf0,EOT},
276 {0x00,0x03,0x10,0x0b,0x00,EOT}},
278 {0x8716, "IT8716F", {
280 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
281 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
283 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
284 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
286 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
287 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
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,
297 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
298 0x00,NANA,NANA,EOT}},
300 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
301 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
303 {0x30,0x70,0x71,0xf0,EOT},
304 {0x00,0x0c,0x02,0x00,EOT}},
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}},
319 {0x30,0x60,0x61,0x70,0xf0,EOT},
320 {0x00,0x03,0x00,0x0a,0x00,EOT}},
322 {0x30,0x60,0x61,EOT},
323 {0x00,0x02,0x01,EOT}},
325 {0x30,0x60,0x61,0x70,0xf0,EOT},
326 {0x00,0x03,0x10,0x0b,0x00,EOT}},
328 {0x8718, "IT8718F", {
330 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
331 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
333 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
334 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
336 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
337 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
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,
347 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
348 0x00,NANA,NANA,EOT}},
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}},
354 {0x30,0x70,0x71,0xf0,EOT},
355 {0x00,0x0c,0x02,0x00,EOT}},
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}},
373 {0x30,0x60,0x61,0x70,0xf0,EOT},
374 {0x00,0x03,0x10,0x0b,0x00,EOT}},
376 {0x8720, "IT8720F", { /* From sensors-detect */
378 {0x8722, "IT8722F", {
380 {0x8726, "IT8726F", {
381 /* Datasheet wrongly says that the ID is 0x8716. */
383 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
384 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
386 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
387 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
389 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
390 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
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,
400 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
401 0x00,MISC,MISC,EOT}},
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}},
407 {0x30,0x70,0x71,0xf0,EOT},
408 {0x00,0x0c,0x02,0x00,EOT}},
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}},
424 {0x30,0x60,0x61,0x70,0xf0,EOT},
425 {0x00,0x03,0x00,0x0a,0x00,EOT}},
427 {0x30,0x60,0x61,EOT},
428 {0x00,0x02,0x01,EOT}},
430 {0x30,0x60,0x61,0x70,0xf0,EOT},
431 {0x00,0x03,0x10,0x0b,0x00,EOT}},
433 {0x8761, "IT8761E", {
435 {0x8780, "IT8780F", {
440 static const struct superio_registers ec_table[] = {
441 {0x8716, "IT8716F", {
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,
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,
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,
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}},
466 {0x8718, "IT8718F", {
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,
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,
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 */
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 */
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,
519 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
520 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
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);
529 /* Sequentially write the 32 MB PnP init values. */
530 for (i = 0; i < 32; i++)
531 OUTB(initkey_mbpnp[i], port);
534 static void enter_conf_mode_ite(uint16_t port)
539 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
542 static void enter_conf_mode_ite_it8761e(uint16_t port)
547 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
550 static void enter_conf_mode_ite_it8228e(uint16_t port)
555 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
558 static void exit_conf_mode_ite(uint16_t port)
560 regwrite(port, 0x02, 0x02);
563 static void probe_idregs_ite_helper(const char *init, uint16_t port)
565 uint16_t id, chipver, ecport;
567 probing_for("ITE", init, port);
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 */
573 if (superio_unknown(reg_table, id)) {
575 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
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);
583 dump_superio("ITE", reg_table, port, id, LDN_SEL);
586 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
588 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
589 ecport = regval(port, 0x60) << 8;
590 ecport |= regval(port, 0x61);
592 /* EC address register = EC base address + 5. */
595 printf("Environment controller (0x%04x)\n", ecport);
596 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
600 void probe_idregs_ite(uint16_t port)
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);
607 enter_conf_mode_ite_legacy(port, initkey_it8671f);
608 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
609 exit_conf_mode_ite(port);
611 enter_conf_mode_ite(port);
612 probe_idregs_ite_helper("(init=standard) ", port);
613 exit_conf_mode_ite(port);
615 enter_conf_mode_ite_it8761e(port);
616 probe_idregs_ite_helper("(init=it8761e) ", port);
617 exit_conf_mode_ite(port);
619 enter_conf_mode_ite_it8228e(port);
620 probe_idregs_ite_helper("(init=it8228e) ", port);
621 exit_conf_mode_ite(port);
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);
629 void print_ite_chips(void)
631 print_vendor_chips("ITE", reg_table);
632 print_vendor_chips("ITE-EC", ec_table);