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 {0x8512, "IT8512E/F/G", {
38 {0x8513, "IT8513E/F/G", {
40 {0x8661, "IT8661F/IT8770F", {
42 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
44 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
47 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
48 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
50 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
51 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
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,
58 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
61 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
63 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
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}},
75 {0x8681, "IT8671F/IT8687R", {
77 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
78 0x23,0x24,0x25,0x26,0x2e,0x2f,EOT},
79 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x81,0x00,
80 0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
82 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
83 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
85 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
86 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
88 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
89 0x74,0x75,0xf0,0xf1,EOT},
90 {0x00,0x00,0x02,0xf8,0x03,0x00,0x03,0x02,0x0a,0x02,
91 0x00,0x01,0x00,0x00,EOT}},
92 {0x3, "Parallel port",
93 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
95 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
98 {0x30,0xf0,0xf1,0xf2,0xf4,0xf5,0xf6,EOT},
99 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
101 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
102 {MISC,0x00,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
104 {0x30,0x70,0x71,0xf0,EOT},
105 {0x00,0x0c,0x02,0x00,EOT}},
107 {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
108 0x70,0x71,0x72,0x73,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,
109 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
110 0xe0,0xe1,0xe2,0xe3,0xe4,EOT},
111 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
112 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
113 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
114 0x00,0x00,0x00,0x00,0x00,EOT}},
116 {0x8701, "IT8703F", {
118 {0x20,0x21,0x23,0x24,0x26,0x29,0x2a,0x2b,EOT},
119 {0x87,0x00,0x00,0x80,0x00,0x00,0x7c,0xc0,EOT}},
121 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf3,0xf4,
123 {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
125 {0x1, "Parallel port",
126 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
127 {0x00,0x03,0x78,0x00,0x80,0x07,0x03,0x03,EOT}},
129 {0x30,0x60,0x61,0x70,0xf0,EOT},
130 {0x00,0x03,0xf8,0x04,0x00,EOT}},
132 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
133 {0x00,0x02,0xf8,0x03,0x00,0x00,0x00,0x7f,EOT}},
135 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
136 {0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x80,EOT}},
138 {0x30,0x60,0x61,0x70,EOT},
139 {0x00,0x00,0x00,0x00,EOT}},
140 {0x7, "Game port, MIDI, GPIO set 1",
141 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,EOT},
142 {0x00,0x02,0x01,0x03,0x30,0x00,0xff,0x00,0x00,EOT}},
144 {0x30,0xf0,0xf1,0xf2,0xf3,0xf5,EOT},
145 {0x00,0xff,0x00,0x00,0x00,0x00,EOT}},
146 {0x9, "GPIO set 3 and 4",
147 {0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,EOT},
148 {0x00,0x02,0x90,0xff,0x00,0x00,0x00,0x00,EOT}},
150 {0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
151 0xf3,0xf4,0xf6,0xf7,0xf9,EOT},
152 {0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
153 NANA,NANA,0x00,0x00,0x00,EOT}},
154 {0xc, "GPIO set 5, 6 and 7",
155 {0x30,0x60,0x61,0xf0,0xf3,0xf6,EOT},
156 {0x00,0x03,0x70,0x00,0xff,0xff,EOT}},
158 {0x8702, "IT8702F", {
160 {0x8705, "IT8705F/AF / IT8700F", {
162 {0x20,0x21,0x22,0x23,0x24,EOT},
163 {0x87,0x05,0x00,0x00,NANA,EOT}},
165 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
166 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
168 {0x30,0x60,0x61,0x70,0xf0,EOT},
169 {0x00,0x03,0xf8,0x04,0x00,EOT}},
171 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
172 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
173 {0x3, "Parallel port",
174 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
176 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
178 {0x4, "Environment controller",
179 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
180 0xf3,0xf4,0xf5,0xf6,EOT},
181 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
182 0x00,0x00,NANA,NANA,EOT}},
184 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
185 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
186 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
187 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
188 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
189 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
191 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
192 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
193 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
194 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
195 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
196 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
197 0x00,NANA,0x00,EOT}},
199 {0x30,0x60,0x61,EOT},
200 {0x00,0x02,0x01,EOT}},
202 {0x30,0x60,0x61,0x70,0xf0,EOT},
203 {0x00,0x03,0x10,0x0b,0x00,EOT}},
205 {0x30,0x60,0x61,0x70,0xf0,EOT},
206 {0x00,0x03,0x00,0x0a,0x00,EOT}},
208 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
209 /* This is a "Special General Purpose I/O chip". */
211 {0x8708, "IT8708F", {
213 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
215 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
216 0xff,0x00,0x00,EOT}},
218 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
219 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
221 {0x30,0x60,0x61,0x70,0xf0,EOT},
222 {0x00,0x03,0xf8,0x04,0x00,EOT}},
224 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
225 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
226 {0x3, "Parallel port",
227 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
229 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
232 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
233 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
234 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
235 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
237 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
238 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
239 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
241 {0x30,0x70,0x71,0xf0,EOT},
242 {0x00,0x0c,0x02,0x00,EOT}},
244 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
245 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
246 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
247 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
248 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
250 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
251 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
252 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
253 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
254 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
257 {0x30,0x60,0x61,EOT},
258 {0x00,0x02,0x01,EOT}},
260 {0x30,0x60,0x61,0x70,0xf0,EOT},
261 {0x00,0x03,0x10,0x0b,0x00,EOT}},
263 {0x30,0x60,0x61,0x70,0xf0,EOT},
264 {0x00,0x03,0x00,0x0a,0x00,EOT}},
266 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
268 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
270 {0x8712, "IT8712F", {
272 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
273 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
275 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
276 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
278 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
279 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
281 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
282 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
283 {0x3, "Parallel port",
284 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
285 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
286 {0x4, "Environment controller",
287 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
289 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
290 0x00,NANA,NANA,EOT}},
292 /* TODO: 0xf0: Error in datasheet? */
293 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
294 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
296 {0x30,0x70,0x71,0xf0,EOT},
297 {0x00,0x0c,0x02,0x00,EOT}},
298 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
299 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
300 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
301 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
302 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
303 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
304 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
305 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
306 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
307 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
308 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
309 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
310 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
312 {0x30,0x60,0x61,0x70,0xf0,EOT},
313 {0x00,0x03,0x00,0x0a,0x00,EOT}},
315 {0x30,0x60,0x61,EOT},
316 {0x00,0x02,0x01,EOT}},
318 {0x30,0x60,0x61,0x70,0xf0,EOT},
319 {0x00,0x03,0x10,0x0b,0x00,EOT}},
321 {0x8716, "IT8716F", {
323 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
324 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
326 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
327 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
329 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
330 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
332 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
333 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
334 {0x3, "Parallel port",
335 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
336 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
337 {0x4, "Environment controller",
338 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
340 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
341 0x00,NANA,NANA,EOT}},
343 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
344 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
346 {0x30,0x70,0x71,0xf0,EOT},
347 {0x00,0x0c,0x02,0x00,EOT}},
349 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
350 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
351 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
352 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
353 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
354 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
355 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
356 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
357 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
358 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
359 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
360 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
362 {0x30,0x60,0x61,0x70,0xf0,EOT},
363 {0x00,0x03,0x00,0x0a,0x00,EOT}},
365 {0x30,0x60,0x61,EOT},
366 {0x00,0x02,0x01,EOT}},
368 {0x30,0x60,0x61,0x70,0xf0,EOT},
369 {0x00,0x03,0x10,0x0b,0x00,EOT}},
371 {0x8718, "IT8718F", {
373 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
374 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
376 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
377 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
379 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
380 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
382 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
383 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
384 {0x3, "Parallel port",
385 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
386 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
387 {0x4, "Environment controller",
388 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
390 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
391 0x00,NANA,NANA,EOT}},
393 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
394 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
395 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
397 {0x30,0x70,0x71,0xf0,EOT},
398 {0x00,0x0c,0x02,0x00,EOT}},
400 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
401 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
402 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
403 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
404 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
405 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
406 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
407 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
408 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
409 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
410 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
411 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
412 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
413 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
414 0x00,NANA,0x00,0x00,0x00,EOT}},
416 {0x30,0x60,0x61,0x70,0xf0,EOT},
417 {0x00,0x03,0x10,0x0b,0x00,EOT}},
419 {0x8720, "IT8720F", { /* From sensors-detect */
421 {0x8722, "IT8722F", {
423 {0x8726, "IT8726F", {
424 /* Datasheet wrongly says that the ID is 0x8716. */
426 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
427 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
429 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
430 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
432 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
433 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
435 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
436 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
437 {0x3, "Parallel port",
438 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
439 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
440 {0x4, "Environment controller",
441 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
443 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
444 0x00,MISC,MISC,EOT}},
446 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
447 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
448 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
450 {0x30,0x70,0x71,0xf0,EOT},
451 {0x00,0x0c,0x02,0x00,EOT}},
453 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
454 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
455 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
456 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
457 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
458 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
459 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
460 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
461 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
462 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
463 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
464 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
465 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
467 {0x30,0x60,0x61,0x70,0xf0,EOT},
468 {0x00,0x03,0x00,0x0a,0x00,EOT}},
470 {0x30,0x60,0x61,EOT},
471 {0x00,0x02,0x01,EOT}},
473 {0x30,0x60,0x61,0x70,0xf0,EOT},
474 {0x00,0x03,0x10,0x0b,0x00,EOT}},
476 {0x8761, "IT8761E", {
478 {0x8780, "IT8780F", {
483 static const struct superio_registers ec_table[] = {
484 {0x8716, "IT8716F", {
486 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
487 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
488 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
489 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
490 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
492 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
493 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
494 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
495 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
497 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
498 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
499 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
500 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
501 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
503 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
504 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
505 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
506 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
507 0x00,0x00,0x7f,EOT}},
509 {0x8718, "IT8718F", {
511 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
512 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
513 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
514 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
515 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
516 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
517 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
518 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
519 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
520 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
521 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
522 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
524 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
525 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
526 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
527 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
528 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
529 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
530 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
531 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
532 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
533 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
534 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
535 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
541 /* Works for: IT8661F/IT8770F */
542 static const uint8_t initkey_it8661f[][4] = {
543 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
544 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
545 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
548 /* Works for: IT8671F/IT8687R, IT8673F */
549 static const uint8_t initkey_it8671f[][4] = {
550 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
551 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
552 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
555 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
556 static const uint8_t initkey_mbpnp[] = {
557 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
558 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
559 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
562 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
563 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
567 /* Determine Super I/O config port. */
568 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
569 for (i = 0; i < 4; i++)
570 OUTB(init[idx][i], ISA_PNP_ADDR);
572 /* Sequentially write the 32 MB PnP init values. */
573 for (i = 0; i < 32; i++)
574 OUTB(initkey_mbpnp[i], port);
577 static void enter_conf_mode_ite(uint16_t port)
582 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
585 static void enter_conf_mode_ite_it8761e(uint16_t port)
590 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
593 static void enter_conf_mode_ite_it8228e(uint16_t port)
598 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
601 static void exit_conf_mode_ite(uint16_t port)
603 regwrite(port, 0x02, 0x02);
606 static void probe_idregs_ite_helper(const char *init, uint16_t port)
608 uint16_t id, chipver, ecport;
610 probing_for("ITE", init, port);
612 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
613 id |= regval(port, CHIP_ID_BYTE2_REG);
614 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
616 if (superio_unknown(reg_table, id)) {
618 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
622 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
623 get_superio_name(reg_table, id), id, chipver, port);
626 dump_superio("ITE", reg_table, port, id, LDN_SEL);
629 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
631 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
632 ecport = regval(port, 0x60) << 8;
633 ecport |= regval(port, 0x61);
635 /* EC address register = EC base address + 5. */
638 printf("Environment controller (0x%04x)\n", ecport);
639 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
643 void probe_idregs_ite(uint16_t port)
645 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
646 enter_conf_mode_ite_legacy(port, initkey_it8661f);
647 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
648 exit_conf_mode_ite(port);
650 enter_conf_mode_ite_legacy(port, initkey_it8671f);
651 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
652 exit_conf_mode_ite(port);
654 enter_conf_mode_ite(port);
655 probe_idregs_ite_helper("(init=standard) ", port);
656 exit_conf_mode_ite(port);
658 enter_conf_mode_ite_it8761e(port);
659 probe_idregs_ite_helper("(init=it8761e) ", port);
660 exit_conf_mode_ite(port);
662 enter_conf_mode_ite_it8228e(port);
663 probe_idregs_ite_helper("(init=it8228e) ", port);
664 exit_conf_mode_ite(port);
666 enter_conf_mode_winbond_fintek_ite_8787(port);
667 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
668 exit_conf_mode_winbond_fintek_ite_8787(port);
672 void print_ite_chips(void)
674 print_vendor_chips("ITE", reg_table);
675 print_vendor_chips("ITE-EC", ec_table);