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 {0x8661, "IT8661F/IT8770F", {
34 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
36 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
39 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
40 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
42 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
43 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
45 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
46 {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
47 {0x3, "Parallel port",
48 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
50 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
53 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
55 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
58 {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
59 0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
60 0xf9,0xfa,0xfb,0xfc,EOT},
61 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
62 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
63 0x00,0x00,0x00,0x00,EOT}},
67 {0x8681, "IT8671F/IT8687R", {
71 {0x8705, "IT8705F/AF / IT8700F", {
73 {0x20,0x21,0x22,0x23,0x24,EOT},
74 {0x87,0x05,0x00,0x00,NANA,EOT}},
76 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
77 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
79 {0x30,0x60,0x61,0x70,0xf0,EOT},
80 {0x00,0x03,0xf8,0x04,0x00,EOT}},
82 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
83 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
84 {0x3, "Parallel port",
85 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
87 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
89 {0x4, "Environment controller",
90 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
91 0xf3,0xf4,0xf5,0xf6,EOT},
92 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
93 0x00,0x00,NANA,NANA,EOT}},
95 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
96 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
97 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
98 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
99 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
100 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
102 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
103 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
104 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
105 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
106 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
107 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
108 0x00,NANA,0x00,EOT}},
110 {0x30,0x60,0x61,EOT},
111 {0x00,0x02,0x01,EOT}},
113 {0x30,0x60,0x61,0x70,0xf0,EOT},
114 {0x00,0x03,0x10,0x0b,0x00,EOT}},
116 {0x30,0x60,0x61,0x70,0xf0,EOT},
117 {0x00,0x03,0x00,0x0a,0x00,EOT}},
119 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
120 /* This is a "Special General Purpose I/O chip". */
122 {0x8708, "IT8708F", {
124 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
126 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
127 0xff,0x00,0x00,EOT}},
129 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
130 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
132 {0x30,0x60,0x61,0x70,0xf0,EOT},
133 {0x00,0x03,0xf8,0x04,0x00,EOT}},
135 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
136 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
137 {0x3, "Parallel port",
138 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
140 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
143 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
144 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
145 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
146 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
148 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
149 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
150 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
152 {0x30,0x70,0x71,0xf0,EOT},
153 {0x00,0x0c,0x02,0x00,EOT}},
155 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
156 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
157 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
158 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
159 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
161 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
162 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
163 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
164 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
165 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
168 {0x30,0x60,0x61,EOT},
169 {0x00,0x02,0x01,EOT}},
171 {0x30,0x60,0x61,0x70,0xf0,EOT},
172 {0x00,0x03,0x10,0x0b,0x00,EOT}},
174 {0x30,0x60,0x61,0x70,0xf0,EOT},
175 {0x00,0x03,0x00,0x0a,0x00,EOT}},
177 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
179 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
181 {0x8712, "IT8712F", {
183 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
184 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
186 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
187 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
189 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
190 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
192 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
193 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
194 {0x3, "Parallel port",
195 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
196 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
197 {0x4, "Environment controller",
198 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
200 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
201 0x00,NANA,NANA,EOT}},
203 /* TODO: 0xf0: Error in datasheet? */
204 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
205 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
207 {0x30,0x70,0x71,0xf0,EOT},
208 {0x00,0x0c,0x02,0x00,EOT}},
209 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
210 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
211 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
212 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
213 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
214 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
215 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
216 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
217 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
218 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
219 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
220 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
221 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
223 {0x30,0x60,0x61,0x70,0xf0,EOT},
224 {0x00,0x03,0x00,0x0a,0x00,EOT}},
226 {0x30,0x60,0x61,EOT},
227 {0x00,0x02,0x01,EOT}},
229 {0x30,0x60,0x61,0x70,0xf0,EOT},
230 {0x00,0x03,0x10,0x0b,0x00,EOT}},
232 {0x8716, "IT8716F", {
234 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
235 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
237 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
238 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
240 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
241 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
243 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
244 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
245 {0x3, "Parallel port",
246 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
247 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
248 {0x4, "Environment controller",
249 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
251 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
252 0x00,NANA,NANA,EOT}},
254 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
255 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
257 {0x30,0x70,0x71,0xf0,EOT},
258 {0x00,0x0c,0x02,0x00,EOT}},
260 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
261 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
262 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
263 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
264 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
265 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
266 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
267 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
268 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
269 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
270 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
271 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
273 {0x30,0x60,0x61,0x70,0xf0,EOT},
274 {0x00,0x03,0x00,0x0a,0x00,EOT}},
276 {0x30,0x60,0x61,EOT},
277 {0x00,0x02,0x01,EOT}},
279 {0x30,0x60,0x61,0x70,0xf0,EOT},
280 {0x00,0x03,0x10,0x0b,0x00,EOT}},
282 {0x8718, "IT8718F", {
284 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
285 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
287 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
288 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
290 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
291 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
293 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
294 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
295 {0x3, "Parallel port",
296 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
297 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
298 {0x4, "Environment controller",
299 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
301 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
302 0x00,NANA,NANA,EOT}},
304 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
305 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
306 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
308 {0x30,0x70,0x71,0xf0,EOT},
309 {0x00,0x0c,0x02,0x00,EOT}},
311 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
312 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
313 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
314 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
315 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
316 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
317 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
318 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
319 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
320 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
321 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
322 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
323 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
324 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
325 0x00,NANA,0x00,0x00,0x00,EOT}},
327 {0x30,0x60,0x61,0x70,0xf0,EOT},
328 {0x00,0x03,0x10,0x0b,0x00,EOT}},
330 {0x8720, "IT8720F", { /* From sensors-detect */
332 {0x8722, "IT8722F", {
334 {0x8726, "IT8726F", {
335 /* Datasheet wrongly says that the ID is 0x8716. */
337 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
338 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
340 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
341 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
343 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
344 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
346 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
347 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
348 {0x3, "Parallel port",
349 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
350 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
351 {0x4, "Environment controller",
352 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
354 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
355 0x00,MISC,MISC,EOT}},
357 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
358 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
359 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
361 {0x30,0x70,0x71,0xf0,EOT},
362 {0x00,0x0c,0x02,0x00,EOT}},
364 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
365 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
366 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
367 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
368 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
369 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
370 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
371 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
372 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
373 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
374 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
375 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
376 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
378 {0x30,0x60,0x61,0x70,0xf0,EOT},
379 {0x00,0x03,0x00,0x0a,0x00,EOT}},
381 {0x30,0x60,0x61,EOT},
382 {0x00,0x02,0x01,EOT}},
384 {0x30,0x60,0x61,0x70,0xf0,EOT},
385 {0x00,0x03,0x10,0x0b,0x00,EOT}},
387 {0x8761, "IT8761E", {
389 {0x8780, "IT8780F", {
394 static const struct superio_registers ec_table[] = {
395 {0x8716, "IT8716F", {
397 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
398 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
399 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
400 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
401 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
403 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
404 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
405 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
406 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
408 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
409 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
410 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
411 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
412 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
414 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
415 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
416 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
417 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
418 0x00,0x00,0x7f,EOT}},
420 {0x8718, "IT8718F", {
422 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
423 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
424 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
425 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
426 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
427 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
428 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
429 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
430 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
431 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
432 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
433 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
435 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
436 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
437 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
438 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
439 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
440 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
441 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
442 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
443 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
444 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
445 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
446 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
452 /* Works for: IT8661F/IT8770F */
453 static const uint8_t initkey_it8661f[][4] = {
454 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
455 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
456 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
459 /* Works for: IT8671F/IT8687R, IT8673F */
460 static const uint8_t initkey_it8671f[][4] = {
461 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
462 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
463 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
466 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
467 static const uint8_t initkey_mbpnp[] = {
468 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
469 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
470 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
473 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
474 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
478 /* Determine Super I/O config port. */
479 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
480 for (i = 0; i < 4; i++)
481 OUTB(init[idx][i], ISA_PNP_ADDR);
483 /* Sequentially write the 32 MB PnP init values. */
484 for (i = 0; i < 32; i++)
485 OUTB(initkey_mbpnp[i], port);
488 static void enter_conf_mode_ite(uint16_t port)
493 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
496 static void enter_conf_mode_ite_it8761e(uint16_t port)
501 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
504 static void enter_conf_mode_ite_it8228e(uint16_t port)
509 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
512 static void exit_conf_mode_ite(uint16_t port)
514 regwrite(port, 0x02, 0x02);
517 static void probe_idregs_ite_helper(const char *init, uint16_t port)
519 uint16_t id, chipver, ecport;
521 probing_for("ITE", init, port);
523 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
524 id |= regval(port, CHIP_ID_BYTE2_REG);
525 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
527 if (superio_unknown(reg_table, id)) {
529 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
533 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
534 get_superio_name(reg_table, id), id, chipver, port);
537 dump_superio("ITE", reg_table, port, id, LDN_SEL);
540 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
542 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
543 ecport = regval(port, 0x60) << 8;
544 ecport |= regval(port, 0x61);
546 /* EC address register = EC base address + 5. */
549 printf("Environment controller (0x%04x)\n", ecport);
550 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
554 void probe_idregs_ite(uint16_t port)
556 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
557 enter_conf_mode_ite_legacy(port, initkey_it8661f);
558 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
559 exit_conf_mode_ite(port);
561 enter_conf_mode_ite_legacy(port, initkey_it8671f);
562 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
563 exit_conf_mode_ite(port);
565 enter_conf_mode_ite(port);
566 probe_idregs_ite_helper("(init=standard) ", port);
567 exit_conf_mode_ite(port);
569 enter_conf_mode_ite_it8761e(port);
570 probe_idregs_ite_helper("(init=it8761e) ", port);
571 exit_conf_mode_ite(port);
573 enter_conf_mode_ite_it8228e(port);
574 probe_idregs_ite_helper("(init=it8228e) ", port);
575 exit_conf_mode_ite(port);
577 enter_conf_mode_winbond_fintek_ite_8787(port);
578 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
579 exit_conf_mode_winbond_fintek_ite_8787(port);
583 void print_ite_chips(void)
585 print_vendor_chips("ITE", reg_table);
586 print_vendor_chips("ITE-EC", ec_table);