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 {0x8502, "IT8502E/TE/G", {
34 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
35 0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
36 {0x85,0x02,0x71,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
37 NANA,NANA,NANA,0x00,NANA,EOT}},
39 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
40 {0x00,0x03,0xf8,0x00,0x00,0x04,0x02,0x00,EOT}},
41 {0x4, "System Wake-Up",
42 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
43 {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,EOT}},
45 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
46 {0x01,0x00,0x00,0x00,0x00,0x0C,0x01,NANA,EOT}},
48 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
49 {0x01,0x00,0x60,0x00,0x64,0x01,0x01,NANA,EOT}},
50 {0xf, "Shared Memory/Flash",
51 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
53 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
56 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf3,0xf4,
58 {0x00,0x00,0x70,0x00,0x72,0x08,0x01,NANA,NANA,
60 {0x11, "Power Channel 1",
61 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
63 {0x00,0x00,0x62,0x00,0x66,0x01,0x01,EOT}},
64 {0x12, "Power Channel 2",
65 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
66 {0x00,0x00,0x68,0x00,0x6c,0x01,0x01,EOT}},
67 {0x17, "Power Channel 3",
68 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
69 {0x00,0x00,0x6a,0x00,0x6e,0x01,0x01,EOT}},
71 {0x8510, "IT8510E/TE/G", {
73 {0x8511, "IT8511E/TE/G", {
75 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
76 0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
77 {0x85,0x11,0x10,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
78 NANA,NANA,NANA,0x00,NANA,EOT}},
79 {0x4, "System Wake-Up",
80 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
81 {0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,EOT}},
83 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
84 {0x01,0x00,0x00,0x00,0x00,0x0C,0x03,NANA,EOT}},
86 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
87 {0x01,0x00,0x60,0x00,0x64,0x01,0x03,NANA,EOT}},
88 {0xf, "Shared Memory/Flash",
89 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
91 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
93 {0x10, "Real-Time Clock",
94 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,0xf1,
95 0xf2,0xf3,0xf4,0xf5,EOT},
96 {0x00,0x00,0x70,0x00,0x72,0x08,0x00,0x00,0x49,
97 0x4A,NANA,NANA,NANA,EOT}},
98 {0x11, "Power Channel 1",
99 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
100 {0x00,0x00,0x62,0x00,0x66,0x01,0x03,EOT}},
101 {0x12, "Power Channel 2",
102 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
103 {0x00,0x00,0x68,0x00,0x6c,0x01,0x03,EOT}},
105 {0x8512, "IT8512E/F/G", {
107 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
108 0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
109 {0x85,0x12,0x22,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
110 NANA,NANA,NANA,0x00,NANA,EOT}},
111 {0x4, "System Wake-Up",
112 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
113 {0x00,0x00,0x00,0x00,0x00,0x00,0x03,EOT}},
115 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
116 {0x00,0x00,0x00,0x00,0x00,0x0C,0x03,NANA,EOT}},
118 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
119 {0x00,0x00,0x60,0x00,0x64,0x01,0x03,NANA,EOT}},
120 {0xf, "Shared Memory/Flash",
121 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
123 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
126 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf3,0xf4,
128 {0x00,0x00,0x70,0x00,0x72,0x08,0x00,NANA,NANA,
130 {0x11, "Power Channel 1",
131 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
132 {0x00,0x00,0x62,0x00,0x66,0x01,0x03,EOT}},
133 {0x12, "Power Channel 2",
134 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
135 {0x00,0x00,0x68,0x00,0x6c,0x01,0x03,EOT}},
137 {0x8513, "IT8513E/F/G", {
139 {0x8661, "IT8661F/IT8770F", {
141 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
143 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
146 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
147 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
149 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
150 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
152 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
153 {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
154 {0x3, "Parallel port",
155 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
157 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
160 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
162 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
163 0x01,0x00,0x00,EOT}},
165 {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
166 0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
167 0xf9,0xfa,0xfb,0xfc,EOT},
168 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
169 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
170 0x00,0x00,0x00,0x00,EOT}},
172 {0x8673, "IT8673F", {
174 {0x8681, "IT8671F/IT8687R", {
176 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
177 0x23,0x24,0x25,0x26,0x2e,0x2f,EOT},
178 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x81,0x00,
179 0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
181 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
182 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
184 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
185 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
187 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
188 0x74,0x75,0xf0,0xf1,EOT},
189 {0x00,0x00,0x02,0xf8,0x03,0x00,0x03,0x02,0x0a,0x02,
190 0x00,0x01,0x00,0x00,EOT}},
191 {0x3, "Parallel port",
192 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
194 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
197 {0x30,0xf0,0xf1,0xf2,0xf4,0xf5,0xf6,EOT},
198 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
200 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
201 {MISC,0x00,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
203 {0x30,0x70,0x71,0xf0,EOT},
204 {0x00,0x0c,0x02,0x00,EOT}},
206 {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
207 0x70,0x71,0x72,0x73,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,
208 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
209 0xe0,0xe1,0xe2,0xe3,0xe4,EOT},
210 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
211 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
212 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
213 0x00,0x00,0x00,0x00,0x00,EOT}},
215 {0x8701, "IT8703F", {
217 {0x20,0x21,0x23,0x24,0x26,0x29,0x2a,0x2b,EOT},
218 {0x87,0x00,0x00,0x80,0x00,0x00,0x7c,0xc0,EOT}},
220 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf3,0xf4,
222 {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
224 {0x1, "Parallel port",
225 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
226 {0x00,0x03,0x78,0x00,0x80,0x07,0x03,0x03,EOT}},
228 {0x30,0x60,0x61,0x70,0xf0,EOT},
229 {0x00,0x03,0xf8,0x04,0x00,EOT}},
231 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
232 {0x00,0x02,0xf8,0x03,0x00,0x00,0x00,0x7f,EOT}},
234 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
235 {0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x80,EOT}},
237 {0x30,0x60,0x61,0x70,EOT},
238 {0x00,0x00,0x00,0x00,EOT}},
239 {0x7, "Game port, MIDI, GPIO set 1",
240 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,EOT},
241 {0x00,0x02,0x01,0x03,0x30,0x00,0xff,0x00,0x00,EOT}},
243 {0x30,0xf0,0xf1,0xf2,0xf3,0xf5,EOT},
244 {0x00,0xff,0x00,0x00,0x00,0x00,EOT}},
245 {0x9, "GPIO set 3 and 4",
246 {0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,EOT},
247 {0x00,0x02,0x90,0xff,0x00,0x00,0x00,0x00,EOT}},
249 {0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
250 0xf3,0xf4,0xf6,0xf7,0xf9,EOT},
251 {0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
252 NANA,NANA,0x00,0x00,0x00,EOT}},
253 {0xc, "GPIO set 5, 6 and 7",
254 {0x30,0x60,0x61,0xf0,0xf3,0xf6,EOT},
255 {0x00,0x03,0x70,0x00,0xff,0xff,EOT}},
257 {0x8702, "IT8702F", {
259 {0x8705, "IT8705F/AF / IT8700F", {
261 {0x20,0x21,0x22,0x23,0x24,EOT},
262 {0x87,0x05,0x00,0x00,NANA,EOT}},
264 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
265 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
267 {0x30,0x60,0x61,0x70,0xf0,EOT},
268 {0x00,0x03,0xf8,0x04,0x00,EOT}},
270 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
271 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
272 {0x3, "Parallel port",
273 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
275 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
277 {0x4, "Environment controller",
278 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
279 0xf3,0xf4,0xf5,0xf6,EOT},
280 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
281 0x00,0x00,NANA,NANA,EOT}},
283 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
284 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
285 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
286 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
287 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
288 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
290 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
291 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
292 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
293 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
294 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
295 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
296 0x00,NANA,0x00,EOT}},
298 {0x30,0x60,0x61,EOT},
299 {0x00,0x02,0x01,EOT}},
301 {0x30,0x60,0x61,0x70,0xf0,EOT},
302 {0x00,0x03,0x10,0x0b,0x00,EOT}},
304 {0x30,0x60,0x61,0x70,0xf0,EOT},
305 {0x00,0x03,0x00,0x0a,0x00,EOT}},
307 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
308 /* This is a "Special General Purpose I/O chip". */
310 {0x8707, "IT8707F", {
312 {0x8708, "IT8708F", {
314 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
316 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
317 0xff,0x00,0x00,EOT}},
319 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
320 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
322 {0x30,0x60,0x61,0x70,0xf0,EOT},
323 {0x00,0x03,0xf8,0x04,0x00,EOT}},
325 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
326 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
327 {0x3, "Parallel port",
328 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
330 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
333 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
334 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
335 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
336 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
338 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
339 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
340 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
342 {0x30,0x70,0x71,0xf0,EOT},
343 {0x00,0x0c,0x02,0x00,EOT}},
345 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
346 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
347 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
348 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
349 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
351 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
352 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
353 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
354 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
355 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
358 {0x30,0x60,0x61,EOT},
359 {0x00,0x02,0x01,EOT}},
361 {0x30,0x60,0x61,0x70,0xf0,EOT},
362 {0x00,0x03,0x10,0x0b,0x00,EOT}},
364 {0x30,0x60,0x61,0x70,0xf0,EOT},
365 {0x00,0x03,0x00,0x0a,0x00,EOT}},
367 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
369 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
371 {0x8712, "IT8712F", {
373 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
374 {0x87,0x12,0x08,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 /* TODO: 0xf0: Error in datasheet? */
394 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
395 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
397 {0x30,0x70,0x71,0xf0,EOT},
398 {0x00,0x0c,0x02,0x00,EOT}},
399 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
400 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
401 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
402 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
403 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
404 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
405 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
406 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
407 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
408 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
409 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
410 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
411 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
413 {0x30,0x60,0x61,0x70,0xf0,EOT},
414 {0x00,0x03,0x00,0x0a,0x00,EOT}},
416 {0x30,0x60,0x61,EOT},
417 {0x00,0x02,0x01,EOT}},
419 {0x30,0x60,0x61,0x70,0xf0,EOT},
420 {0x00,0x03,0x10,0x0b,0x00,EOT}},
422 {0x8716, "IT8716F", {
424 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
425 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
427 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
428 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
430 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
431 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
433 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
434 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
435 {0x3, "Parallel port",
436 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
437 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
438 {0x4, "Environment controller",
439 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
441 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
442 0x00,NANA,NANA,EOT}},
444 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
445 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
447 {0x30,0x70,0x71,0xf0,EOT},
448 {0x00,0x0c,0x02,0x00,EOT}},
450 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
451 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
452 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
453 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
454 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
455 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
456 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
457 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
458 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
459 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
460 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
461 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
463 {0x30,0x60,0x61,0x70,0xf0,EOT},
464 {0x00,0x03,0x00,0x0a,0x00,EOT}},
466 {0x30,0x60,0x61,EOT},
467 {0x00,0x02,0x01,EOT}},
469 {0x30,0x60,0x61,0x70,0xf0,EOT},
470 {0x00,0x03,0x10,0x0b,0x00,EOT}},
472 {0x8718, "IT8718F", {
474 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
475 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
477 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
478 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
480 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
481 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
483 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
484 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
485 {0x3, "Parallel port",
486 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
487 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
488 {0x4, "Environment controller",
489 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
491 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
492 0x00,NANA,NANA,EOT}},
494 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
495 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
496 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
498 {0x30,0x70,0x71,0xf0,EOT},
499 {0x00,0x0c,0x02,0x00,EOT}},
501 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
502 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
503 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
504 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
505 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
506 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
507 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
508 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
509 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
510 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
511 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
512 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
513 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
514 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
515 0x00,NANA,0x00,0x00,0x00,EOT}},
517 {0x30,0x60,0x61,0x70,0xf0,EOT},
518 {0x00,0x03,0x10,0x0b,0x00,EOT}},
520 {0x8720, "IT8720F", { /* From sensors-detect */
522 {0x8722, "IT8722F", {
524 {0x8726, "IT8726F", {
525 /* Datasheet wrongly says that the ID is 0x8716. */
527 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
528 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
530 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
531 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
533 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
534 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
536 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
537 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
538 {0x3, "Parallel port",
539 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
540 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
541 {0x4, "Environment controller",
542 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
544 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
545 0x00,MISC,MISC,EOT}},
547 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
548 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
549 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
551 {0x30,0x70,0x71,0xf0,EOT},
552 {0x00,0x0c,0x02,0x00,EOT}},
554 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
555 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
556 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
557 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
558 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
559 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
560 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
561 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
562 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
563 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
564 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
565 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
566 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
568 {0x30,0x60,0x61,0x70,0xf0,EOT},
569 {0x00,0x03,0x00,0x0a,0x00,EOT}},
571 {0x30,0x60,0x61,EOT},
572 {0x00,0x02,0x01,EOT}},
574 {0x30,0x60,0x61,0x70,0xf0,EOT},
575 {0x00,0x03,0x10,0x0b,0x00,EOT}},
577 {0x8761, "IT8761E", {
579 {0x8780, "IT8780F", {
584 static const struct superio_registers ec_table[] = {
585 {0x8716, "IT8716F", {
587 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
588 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
589 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
590 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
591 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
593 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
594 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
595 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
596 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
598 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
599 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
600 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
601 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
602 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
604 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
605 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
606 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
607 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
608 0x00,0x00,0x7f,EOT}},
610 {0x8718, "IT8718F", {
612 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
613 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
614 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
615 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
616 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
617 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
618 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
619 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
620 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
621 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
622 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
623 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
625 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
626 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
627 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
628 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
629 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
630 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
631 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
632 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
633 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
634 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
635 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
636 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
642 /* Works for: IT8661F/IT8770F */
643 static const uint8_t initkey_it8661f[][4] = {
644 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
645 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
646 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
649 /* Works for: IT8671F/IT8687R, IT8673F */
650 static const uint8_t initkey_it8671f[][4] = {
651 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
652 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
653 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
656 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
657 static const uint8_t initkey_mbpnp[] = {
658 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
659 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
660 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
663 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
664 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
668 /* Determine Super I/O config port. */
669 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
670 for (i = 0; i < 4; i++)
671 OUTB(init[idx][i], ISA_PNP_ADDR);
673 /* Sequentially write the 32 MB PnP init values. */
674 for (i = 0; i < 32; i++)
675 OUTB(initkey_mbpnp[i], port);
678 static void enter_conf_mode_ite(uint16_t port)
683 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
686 static void enter_conf_mode_ite_it8502e(uint16_t port)
691 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
694 static void enter_conf_mode_ite_it8761e(uint16_t port)
699 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
702 static void enter_conf_mode_ite_it8228e(uint16_t port)
707 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
710 static void exit_conf_mode_ite(uint16_t port)
712 regwrite(port, 0x02, 0x02);
715 static void probe_idregs_ite_helper(const char *init, uint16_t port)
717 uint16_t id, chipver, ecport;
719 probing_for("ITE", init, port);
721 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
722 id |= regval(port, CHIP_ID_BYTE2_REG);
723 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
725 if (superio_unknown(reg_table, id)) {
727 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
731 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
732 get_superio_name(reg_table, id), id, chipver, port);
735 dump_superio("ITE", reg_table, port, id, LDN_SEL);
738 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
740 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
741 ecport = regval(port, 0x60) << 8;
742 ecport |= regval(port, 0x61);
744 /* EC address register = EC base address + 5. */
747 printf("Environment controller (0x%04x)\n", ecport);
748 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
752 void probe_idregs_ite(uint16_t port)
754 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
755 enter_conf_mode_ite_legacy(port, initkey_it8661f);
756 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
757 exit_conf_mode_ite(port);
759 enter_conf_mode_ite_legacy(port, initkey_it8671f);
760 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
761 exit_conf_mode_ite(port);
763 enter_conf_mode_ite(port);
764 probe_idregs_ite_helper("(init=standard) ", port);
765 exit_conf_mode_ite(port);
767 enter_conf_mode_ite_it8502e(port);
768 probe_idregs_ite_helper("(init=it8502e) ", port);
769 exit_conf_mode_ite(port);
771 enter_conf_mode_ite_it8761e(port);
772 probe_idregs_ite_helper("(init=it8761e) ", port);
773 exit_conf_mode_ite(port);
775 enter_conf_mode_ite_it8228e(port);
776 probe_idregs_ite_helper("(init=it8228e) ", port);
777 exit_conf_mode_ite(port);
779 enter_conf_mode_winbond_fintek_ite_8787(port);
780 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
781 exit_conf_mode_winbond_fintek_ite_8787(port);
785 void print_ite_chips(void)
787 print_vendor_chips("ITE", reg_table);
788 print_vendor_chips("ITE-EC", ec_table);