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 {0x8708, "IT8708F", {
312 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
314 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
315 0xff,0x00,0x00,EOT}},
317 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
318 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
320 {0x30,0x60,0x61,0x70,0xf0,EOT},
321 {0x00,0x03,0xf8,0x04,0x00,EOT}},
323 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
324 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
325 {0x3, "Parallel port",
326 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
328 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
331 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
332 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
333 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
334 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
336 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
337 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
338 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
340 {0x30,0x70,0x71,0xf0,EOT},
341 {0x00,0x0c,0x02,0x00,EOT}},
343 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
344 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
345 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
346 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
347 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
349 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
350 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
351 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
352 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
353 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
356 {0x30,0x60,0x61,EOT},
357 {0x00,0x02,0x01,EOT}},
359 {0x30,0x60,0x61,0x70,0xf0,EOT},
360 {0x00,0x03,0x10,0x0b,0x00,EOT}},
362 {0x30,0x60,0x61,0x70,0xf0,EOT},
363 {0x00,0x03,0x00,0x0a,0x00,EOT}},
365 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
367 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
369 {0x8712, "IT8712F", {
371 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
372 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
374 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
375 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
377 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
378 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
380 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
381 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
382 {0x3, "Parallel port",
383 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
384 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
385 {0x4, "Environment controller",
386 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
388 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
389 0x00,NANA,NANA,EOT}},
391 /* TODO: 0xf0: Error in datasheet? */
392 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
393 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
395 {0x30,0x70,0x71,0xf0,EOT},
396 {0x00,0x0c,0x02,0x00,EOT}},
397 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
398 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
399 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
400 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
401 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
402 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
403 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
404 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
405 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
406 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
407 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
408 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
409 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
411 {0x30,0x60,0x61,0x70,0xf0,EOT},
412 {0x00,0x03,0x00,0x0a,0x00,EOT}},
414 {0x30,0x60,0x61,EOT},
415 {0x00,0x02,0x01,EOT}},
417 {0x30,0x60,0x61,0x70,0xf0,EOT},
418 {0x00,0x03,0x10,0x0b,0x00,EOT}},
420 {0x8716, "IT8716F", {
422 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
423 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
425 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
426 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
428 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
429 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
431 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
432 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
433 {0x3, "Parallel port",
434 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
435 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
436 {0x4, "Environment controller",
437 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
439 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
440 0x00,NANA,NANA,EOT}},
442 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
443 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
445 {0x30,0x70,0x71,0xf0,EOT},
446 {0x00,0x0c,0x02,0x00,EOT}},
448 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
449 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
450 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
451 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
452 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
453 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
454 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
455 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
456 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
457 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
458 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
459 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
461 {0x30,0x60,0x61,0x70,0xf0,EOT},
462 {0x00,0x03,0x00,0x0a,0x00,EOT}},
464 {0x30,0x60,0x61,EOT},
465 {0x00,0x02,0x01,EOT}},
467 {0x30,0x60,0x61,0x70,0xf0,EOT},
468 {0x00,0x03,0x10,0x0b,0x00,EOT}},
470 {0x8718, "IT8718F", {
472 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
473 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
475 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
476 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
478 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
479 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
481 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
482 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
483 {0x3, "Parallel port",
484 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
485 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
486 {0x4, "Environment controller",
487 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
489 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
490 0x00,NANA,NANA,EOT}},
492 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
493 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
494 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
496 {0x30,0x70,0x71,0xf0,EOT},
497 {0x00,0x0c,0x02,0x00,EOT}},
499 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
500 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
501 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
502 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
503 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
504 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
505 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
506 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
507 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
508 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
509 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
510 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
511 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
512 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
513 0x00,NANA,0x00,0x00,0x00,EOT}},
515 {0x30,0x60,0x61,0x70,0xf0,EOT},
516 {0x00,0x03,0x10,0x0b,0x00,EOT}},
518 {0x8720, "IT8720F", { /* From sensors-detect */
520 {0x8722, "IT8722F", {
522 {0x8726, "IT8726F", {
523 /* Datasheet wrongly says that the ID is 0x8716. */
525 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
526 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
528 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
529 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
531 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
532 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
534 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
535 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
536 {0x3, "Parallel port",
537 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
538 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
539 {0x4, "Environment controller",
540 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
542 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
543 0x00,MISC,MISC,EOT}},
545 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
546 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
547 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
549 {0x30,0x70,0x71,0xf0,EOT},
550 {0x00,0x0c,0x02,0x00,EOT}},
552 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
553 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
554 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
555 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
556 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
557 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
558 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
559 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
560 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
561 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
562 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
563 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
564 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
566 {0x30,0x60,0x61,0x70,0xf0,EOT},
567 {0x00,0x03,0x00,0x0a,0x00,EOT}},
569 {0x30,0x60,0x61,EOT},
570 {0x00,0x02,0x01,EOT}},
572 {0x30,0x60,0x61,0x70,0xf0,EOT},
573 {0x00,0x03,0x10,0x0b,0x00,EOT}},
575 {0x8761, "IT8761E", {
577 {0x8780, "IT8780F", {
582 static const struct superio_registers ec_table[] = {
583 {0x8716, "IT8716F", {
585 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
586 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
587 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
588 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
589 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
591 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
592 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
593 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
594 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
596 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
597 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
598 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
599 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
600 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
602 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
603 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
604 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
605 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
606 0x00,0x00,0x7f,EOT}},
608 {0x8718, "IT8718F", {
610 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
611 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
612 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
613 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
614 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
615 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
616 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
617 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
618 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
619 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
620 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
621 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
623 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
624 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
625 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
626 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
627 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
628 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
629 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
630 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
631 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
632 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
633 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
634 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
640 /* Works for: IT8661F/IT8770F */
641 static const uint8_t initkey_it8661f[][4] = {
642 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
643 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
644 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
647 /* Works for: IT8671F/IT8687R, IT8673F */
648 static const uint8_t initkey_it8671f[][4] = {
649 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
650 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
651 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
654 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
655 static const uint8_t initkey_mbpnp[] = {
656 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
657 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
658 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
661 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
662 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
666 /* Determine Super I/O config port. */
667 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
668 for (i = 0; i < 4; i++)
669 OUTB(init[idx][i], ISA_PNP_ADDR);
671 /* Sequentially write the 32 MB PnP init values. */
672 for (i = 0; i < 32; i++)
673 OUTB(initkey_mbpnp[i], port);
676 static void enter_conf_mode_ite(uint16_t port)
681 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
684 static void enter_conf_mode_ite_it8502e(uint16_t port)
689 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
692 static void enter_conf_mode_ite_it8761e(uint16_t port)
697 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
700 static void enter_conf_mode_ite_it8228e(uint16_t port)
705 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
708 static void exit_conf_mode_ite(uint16_t port)
710 regwrite(port, 0x02, 0x02);
713 static void probe_idregs_ite_helper(const char *init, uint16_t port)
715 uint16_t id, chipver, ecport;
717 probing_for("ITE", init, port);
719 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
720 id |= regval(port, CHIP_ID_BYTE2_REG);
721 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
723 if (superio_unknown(reg_table, id)) {
725 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
729 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
730 get_superio_name(reg_table, id), id, chipver, port);
733 dump_superio("ITE", reg_table, port, id, LDN_SEL);
736 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
738 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
739 ecport = regval(port, 0x60) << 8;
740 ecport |= regval(port, 0x61);
742 /* EC address register = EC base address + 5. */
745 printf("Environment controller (0x%04x)\n", ecport);
746 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
750 void probe_idregs_ite(uint16_t port)
752 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
753 enter_conf_mode_ite_legacy(port, initkey_it8661f);
754 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
755 exit_conf_mode_ite(port);
757 enter_conf_mode_ite_legacy(port, initkey_it8671f);
758 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
759 exit_conf_mode_ite(port);
761 enter_conf_mode_ite(port);
762 probe_idregs_ite_helper("(init=standard) ", port);
763 exit_conf_mode_ite(port);
765 enter_conf_mode_ite_it8502e(port);
766 probe_idregs_ite_helper("(init=it8502e) ", port);
767 exit_conf_mode_ite(port);
769 enter_conf_mode_ite_it8761e(port);
770 probe_idregs_ite_helper("(init=it8761e) ", port);
771 exit_conf_mode_ite(port);
773 enter_conf_mode_ite_it8228e(port);
774 probe_idregs_ite_helper("(init=it8228e) ", port);
775 exit_conf_mode_ite(port);
777 enter_conf_mode_winbond_fintek_ite_8787(port);
778 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
779 exit_conf_mode_winbond_fintek_ite_8787(port);
783 void print_ite_chips(void)
785 print_vendor_chips("ITE", reg_table);
786 print_vendor_chips("ITE-EC", ec_table);