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 {0x8500, "IT8500B/E", {
34 {0x20,0x21,0x22,0x23,0x25,0x2d,0x2e,0x2f,0x30,EOT},
35 {0x85,0x00,0x01,0x01,0x00,0x00,NANA,NANA,0x00,EOT}},
36 {0x04, "System Wake-Up Control (SWUC)",
37 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
38 {0x00,0x00,0x00,0x00,0x00,0x00,0x01,EOT}},
39 {0x05, "KBC/Mouse Interface",
40 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
41 {0x00,0x00,0x00,0x00,0x00,0x0c,0x01,EOT}},
42 {0x06, "KBC/Keyboard Interface",
43 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
44 {0x00,0x00,0x60,0x00,0x64,0x01,0x01,EOT}},
45 {0x0f, "Shared Memory/Flash Interface (SMFI)",
46 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,EOT},
47 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,EOT}},
49 {0x30,0x62,0x63,0x70,0x71,0xf3,0xf4,0xf5,EOT},
50 {0x00,0x00,0x72,0x08,0x01,NANA,NANA,NANA,EOT}},
51 {0x11, "Power Management I/F Channel 1 (PMC1)",
52 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
53 {0x00,0x00,0x62,0x00,0x66,0x01,0x01,EOT}},
54 {0x12, "Power Management I/F Channel 2 (PMC2)",
55 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x71,0xf0,EOT},
56 {0x00,0x00,0x68,0x00,0x6c,0x00,0x00,0x01,0x01,NANA,EOT}},
58 {0x8502, "IT8502E/TE/G", {
60 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
61 0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
62 {0x85,0x02,0x71,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
63 NANA,NANA,NANA,0x00,NANA,EOT}},
65 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
66 {0x00,0x03,0xf8,0x00,0x00,0x04,0x02,0x00,EOT}},
67 {0x4, "System Wake-Up",
68 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
69 {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,EOT}},
71 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
72 {0x01,0x00,0x00,0x00,0x00,0x0C,0x01,NANA,EOT}},
74 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
75 {0x01,0x00,0x60,0x00,0x64,0x01,0x01,NANA,EOT}},
76 {0xf, "Shared Memory/Flash",
77 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
79 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
82 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf3,0xf4,
84 {0x00,0x00,0x70,0x00,0x72,0x08,0x01,NANA,NANA,
86 {0x11, "Power Channel 1",
87 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
89 {0x00,0x00,0x62,0x00,0x66,0x01,0x01,EOT}},
90 {0x12, "Power Channel 2",
91 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
92 {0x00,0x00,0x68,0x00,0x6c,0x01,0x01,EOT}},
93 {0x17, "Power Channel 3",
94 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
95 {0x00,0x00,0x6a,0x00,0x6e,0x01,0x01,EOT}},
97 {0x8510, "IT8510E/TE/G", {
99 {0x8511, "IT8511E/TE/G", {
101 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
102 0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
103 {0x85,0x11,0x10,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
104 NANA,NANA,NANA,0x00,NANA,EOT}},
105 {0x4, "System Wake-Up",
106 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
107 {0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,EOT}},
109 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
110 {0x01,0x00,0x00,0x00,0x00,0x0C,0x03,NANA,EOT}},
112 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
113 {0x01,0x00,0x60,0x00,0x64,0x01,0x03,NANA,EOT}},
114 {0xf, "Shared Memory/Flash",
115 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
117 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
119 {0x10, "Real-Time Clock",
120 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,0xf1,
121 0xf2,0xf3,0xf4,0xf5,EOT},
122 {0x00,0x00,0x70,0x00,0x72,0x08,0x00,0x00,0x49,
123 0x4A,NANA,NANA,NANA,EOT}},
124 {0x11, "Power Channel 1",
125 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
126 {0x00,0x00,0x62,0x00,0x66,0x01,0x03,EOT}},
127 {0x12, "Power Channel 2",
128 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
129 {0x00,0x00,0x68,0x00,0x6c,0x01,0x03,EOT}},
131 {0x8512, "IT8512E/F/G", {
133 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
134 0x2A,0x2B,0x2C,0x2D,0x2E,EOT},
135 {0x85,0x12,0x22,0x01,NANA,0x00,0x00,NANA,NANA,NANA,
136 NANA,NANA,NANA,0x00,NANA,EOT}},
137 {0x4, "System Wake-Up",
138 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
139 {0x00,0x00,0x00,0x00,0x00,0x00,0x03,EOT}},
141 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
142 {0x00,0x00,0x00,0x00,0x00,0x0C,0x03,NANA,EOT}},
144 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
145 {0x00,0x00,0x60,0x00,0x64,0x01,0x03,NANA,EOT}},
146 {0xf, "Shared Memory/Flash",
147 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf4,0xf5,
149 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
152 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf3,0xf4,
154 {0x00,0x00,0x70,0x00,0x72,0x08,0x00,NANA,NANA,
156 {0x11, "Power Channel 1",
157 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
158 {0x00,0x00,0x62,0x00,0x66,0x01,0x03,EOT}},
159 {0x12, "Power Channel 2",
160 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,EOT},
161 {0x00,0x00,0x68,0x00,0x6c,0x01,0x03,EOT}},
163 {0x8513, "IT8513E/F/G", {
165 {0x8661, "IT8661F/IT8770F", {
167 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
169 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
172 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
173 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
175 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
176 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
178 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
179 {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
180 {0x3, "Parallel port",
181 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
183 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
186 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
188 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
189 0x01,0x00,0x00,EOT}},
191 {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
192 0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
193 0xf9,0xfa,0xfb,0xfc,EOT},
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,EOT}},
198 {0x8673, "IT8673F", {
200 {0x8681, "IT8671F/IT8687R", {
202 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
203 0x23,0x24,0x25,0x26,0x2e,0x2f,EOT},
204 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x81,0x00,
205 0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
207 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
208 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
210 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
211 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
213 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
214 0x74,0x75,0xf0,0xf1,EOT},
215 {0x00,0x00,0x02,0xf8,0x03,0x00,0x03,0x02,0x0a,0x02,
216 0x00,0x01,0x00,0x00,EOT}},
217 {0x3, "Parallel port",
218 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
220 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
223 {0x30,0xf0,0xf1,0xf2,0xf4,0xf5,0xf6,EOT},
224 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
226 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
227 {MISC,0x00,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
229 {0x30,0x70,0x71,0xf0,EOT},
230 {0x00,0x0c,0x02,0x00,EOT}},
232 {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
233 0x70,0x71,0x72,0x73,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,
234 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
235 0xe0,0xe1,0xe2,0xe3,0xe4,EOT},
236 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
237 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
238 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
239 0x00,0x00,0x00,0x00,0x00,EOT}},
241 {0x8701, "IT8703F", {
243 {0x20,0x21,0x23,0x24,0x26,0x29,0x2a,0x2b,EOT},
244 {0x87,0x00,0x00,0x80,0x00,0x00,0x7c,0xc0,EOT}},
246 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,0xf2,0xf3,0xf4,
248 {0x00,0x03,0xf0,0x06,0x02,0x0e,0x00,0xff,0x00,0x00,
250 {0x1, "Parallel port",
251 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
252 {0x00,0x03,0x78,0x00,0x80,0x07,0x03,0x03,EOT}},
254 {0x30,0x60,0x61,0x70,0xf0,EOT},
255 {0x00,0x03,0xf8,0x04,0x00,EOT}},
257 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
258 {0x00,0x02,0xf8,0x03,0x00,0x00,0x00,0x7f,EOT}},
260 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
261 {0x01,0x00,0x60,0x00,0x64,0x01,0x0c,0x80,EOT}},
263 {0x30,0x60,0x61,0x70,EOT},
264 {0x00,0x00,0x00,0x00,EOT}},
265 {0x7, "Game port, MIDI, GPIO set 1",
266 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,EOT},
267 {0x00,0x02,0x01,0x03,0x30,0x00,0xff,0x00,0x00,EOT}},
269 {0x30,0xf0,0xf1,0xf2,0xf3,0xf5,EOT},
270 {0x00,0xff,0x00,0x00,0x00,0x00,EOT}},
271 {0x9, "GPIO set 3 and 4",
272 {0x30,0x60,0x61,0xf0,0xf1,0xf2,0xf3,0xf4,EOT},
273 {0x00,0x02,0x90,0xff,0x00,0x00,0x00,0x00,EOT}},
275 {0x30,0x70,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
276 0xf3,0xf4,0xf6,0xf7,0xf9,EOT},
277 {0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
278 NANA,NANA,0x00,0x00,0x00,EOT}},
279 {0xc, "GPIO set 5, 6 and 7",
280 {0x30,0x60,0x61,0xf0,0xf3,0xf6,EOT},
281 {0x00,0x03,0x70,0x00,0xff,0xff,EOT}},
283 {0x8702, "IT8702F", {
285 {0x8705, "IT8705F/AF / IT8700F", {
287 {0x20,0x21,0x22,0x23,0x24,EOT},
288 {0x87,0x05,0x00,0x00,NANA,EOT}},
290 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
291 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
293 {0x30,0x60,0x61,0x70,0xf0,EOT},
294 {0x00,0x03,0xf8,0x04,0x00,EOT}},
296 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
297 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
298 {0x3, "Parallel port",
299 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
301 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
303 {0x4, "Environment controller",
304 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
305 0xf3,0xf4,0xf5,0xf6,EOT},
306 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
307 0x00,0x00,NANA,NANA,EOT}},
309 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
310 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
311 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
312 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
313 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
314 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
316 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
317 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
318 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
319 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
320 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
321 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
322 0x00,NANA,0x00,EOT}},
324 {0x30,0x60,0x61,EOT},
325 {0x00,0x02,0x01,EOT}},
327 {0x30,0x60,0x61,0x70,0xf0,EOT},
328 {0x00,0x03,0x10,0x0b,0x00,EOT}},
330 {0x30,0x60,0x61,0x70,0xf0,EOT},
331 {0x00,0x03,0x00,0x0a,0x00,EOT}},
333 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
334 /* This is a "Special General Purpose I/O chip". */
336 {0x8707, "IT8707F", {
338 {0x8708, "IT8708F", {
340 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
342 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
343 0xff,0x00,0x00,EOT}},
345 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
346 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
348 {0x30,0x60,0x61,0x70,0xf0,EOT},
349 {0x00,0x03,0xf8,0x04,0x00,EOT}},
351 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
352 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
353 {0x3, "Parallel port",
354 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
356 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
359 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
360 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
361 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
362 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
364 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
365 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
366 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
368 {0x30,0x70,0x71,0xf0,EOT},
369 {0x00,0x0c,0x02,0x00,EOT}},
371 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
372 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
373 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
374 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
375 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
377 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
378 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
379 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
380 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
381 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
384 {0x30,0x60,0x61,EOT},
385 {0x00,0x02,0x01,EOT}},
387 {0x30,0x60,0x61,0x70,0xf0,EOT},
388 {0x00,0x03,0x10,0x0b,0x00,EOT}},
390 {0x30,0x60,0x61,0x70,0xf0,EOT},
391 {0x00,0x03,0x00,0x0a,0x00,EOT}},
393 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
395 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
397 {0x8712, "IT8712F", {
399 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
400 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
402 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
403 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
405 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
406 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
408 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
409 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
410 {0x3, "Parallel port",
411 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
412 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
413 {0x4, "Environment controller",
414 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
416 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
417 0x00,NANA,NANA,EOT}},
419 /* TODO: 0xf0: Error in datasheet? */
420 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
421 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
423 {0x30,0x70,0x71,0xf0,EOT},
424 {0x00,0x0c,0x02,0x00,EOT}},
425 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
426 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
427 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
428 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
429 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
430 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
431 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
432 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
433 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
434 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
435 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
436 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
437 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
439 {0x30,0x60,0x61,0x70,0xf0,EOT},
440 {0x00,0x03,0x00,0x0a,0x00,EOT}},
442 {0x30,0x60,0x61,EOT},
443 {0x00,0x02,0x01,EOT}},
445 {0x30,0x60,0x61,0x70,0xf0,EOT},
446 {0x00,0x03,0x10,0x0b,0x00,EOT}},
448 {0x8716, "IT8716F", {
450 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
451 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
453 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
454 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
456 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
457 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
459 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
460 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
461 {0x3, "Parallel port",
462 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
463 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
464 {0x4, "Environment controller",
465 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
467 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
468 0x00,NANA,NANA,EOT}},
470 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
471 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
473 {0x30,0x70,0x71,0xf0,EOT},
474 {0x00,0x0c,0x02,0x00,EOT}},
476 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
477 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
478 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
479 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
480 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
481 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
482 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
483 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
484 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
485 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
486 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
487 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
489 {0x30,0x60,0x61,0x70,0xf0,EOT},
490 {0x00,0x03,0x00,0x0a,0x00,EOT}},
492 {0x30,0x60,0x61,EOT},
493 {0x00,0x02,0x01,EOT}},
495 {0x30,0x60,0x61,0x70,0xf0,EOT},
496 {0x00,0x03,0x10,0x0b,0x00,EOT}},
498 {0x8718, "IT8718F", {
500 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
501 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
503 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
504 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
506 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
507 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
509 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
510 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
511 {0x3, "Parallel port",
512 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
513 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
514 {0x4, "Environment controller",
515 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
517 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
518 0x00,NANA,NANA,EOT}},
520 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
521 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
522 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
524 {0x30,0x70,0x71,0xf0,EOT},
525 {0x00,0x0c,0x02,0x00,EOT}},
527 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
528 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
529 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
530 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
531 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
532 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
533 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
534 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
535 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
536 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
537 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
538 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
539 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
540 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
541 0x00,NANA,0x00,0x00,0x00,EOT}},
543 {0x30,0x60,0x61,0x70,0xf0,EOT},
544 {0x00,0x03,0x10,0x0b,0x00,EOT}},
546 {0x8720, "IT8720F", { /* From sensors-detect */
548 {0x8722, "IT8722F", {
550 {0x8726, "IT8726F", {
551 /* Datasheet wrongly says that the ID is 0x8716. */
553 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
554 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
556 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
557 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
559 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
560 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
562 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
563 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
564 {0x3, "Parallel port",
565 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
566 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
567 {0x4, "Environment controller",
568 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
570 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
571 0x00,MISC,MISC,EOT}},
573 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
574 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
575 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
577 {0x30,0x70,0x71,0xf0,EOT},
578 {0x00,0x0c,0x02,0x00,EOT}},
580 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
581 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
582 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
583 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
584 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
585 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
586 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
587 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
588 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
589 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
590 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
591 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
592 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
594 {0x30,0x60,0x61,0x70,0xf0,EOT},
595 {0x00,0x03,0x00,0x0a,0x00,EOT}},
597 {0x30,0x60,0x61,EOT},
598 {0x00,0x02,0x01,EOT}},
600 {0x30,0x60,0x61,0x70,0xf0,EOT},
601 {0x00,0x03,0x10,0x0b,0x00,EOT}},
603 {0x8761, "IT8761E", {
605 {0x8780, "IT8780F", {
610 static const struct superio_registers ec_table[] = {
611 {0x8716, "IT8716F", {
613 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
614 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
615 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
616 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
617 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
619 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
620 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
621 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
622 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
624 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
625 NANA,NANA,0x07,0x50,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,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
630 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
631 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
632 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
633 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
634 0x00,0x00,0x7f,EOT}},
636 {0x8718, "IT8718F", {
638 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
639 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
640 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
641 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
642 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
643 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
644 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
645 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
646 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
647 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
648 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
649 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
651 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
652 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
653 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
654 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
655 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
656 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
657 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
658 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
659 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
660 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
661 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
662 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
668 /* Works for: IT8661F/IT8770F */
669 static const uint8_t initkey_it8661f[][4] = {
670 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
671 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
672 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
675 /* Works for: IT8671F/IT8687R, IT8673F */
676 static const uint8_t initkey_it8671f[][4] = {
677 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
678 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
679 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
682 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
683 static const uint8_t initkey_mbpnp[] = {
684 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
685 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
686 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
689 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
690 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
694 /* Determine Super I/O config port. */
695 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
696 for (i = 0; i < 4; i++)
697 OUTB(init[idx][i], ISA_PNP_ADDR);
699 /* Sequentially write the 32 MB PnP init values. */
700 for (i = 0; i < 32; i++)
701 OUTB(initkey_mbpnp[i], port);
704 static void enter_conf_mode_ite(uint16_t port)
709 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
712 static void enter_conf_mode_ite_it8502e(uint16_t port)
717 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
720 static void enter_conf_mode_ite_it8761e(uint16_t port)
725 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
728 static void enter_conf_mode_ite_it8228e(uint16_t port)
733 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
736 static void exit_conf_mode_ite(uint16_t port)
738 regwrite(port, 0x02, 0x02);
741 static void probe_idregs_ite_helper(const char *init, uint16_t port)
743 uint16_t id, chipver, ecport;
745 probing_for("ITE", init, port);
747 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
748 id |= regval(port, CHIP_ID_BYTE2_REG);
749 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
751 if (superio_unknown(reg_table, id)) {
753 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
757 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
758 get_superio_name(reg_table, id), id, chipver, port);
761 dump_superio("ITE", reg_table, port, id, LDN_SEL);
764 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
766 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
767 ecport = regval(port, 0x60) << 8;
768 ecport |= regval(port, 0x61);
770 /* EC address register = EC base address + 5. */
773 printf("Environment controller (0x%04x)\n", ecport);
774 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
778 void probe_idregs_ite(uint16_t port)
780 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
781 enter_conf_mode_ite_legacy(port, initkey_it8661f);
782 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
783 exit_conf_mode_ite(port);
784 if (chip_found) return;
786 enter_conf_mode_ite_legacy(port, initkey_it8671f);
787 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
788 exit_conf_mode_ite(port);
789 if (chip_found) return;
791 enter_conf_mode_ite(port);
792 probe_idregs_ite_helper("(init=standard) ", port);
793 exit_conf_mode_ite(port);
794 if (chip_found) return;
796 enter_conf_mode_ite_it8502e(port);
797 probe_idregs_ite_helper("(init=it8502e) ", port);
798 exit_conf_mode_ite(port);
799 if (chip_found) return;
801 enter_conf_mode_ite_it8761e(port);
802 probe_idregs_ite_helper("(init=it8761e) ", port);
803 exit_conf_mode_ite(port);
804 if (chip_found) return;
806 enter_conf_mode_ite_it8228e(port);
807 probe_idregs_ite_helper("(init=it8228e) ", port);
808 exit_conf_mode_ite(port);
809 if (chip_found) return;
811 enter_conf_mode_winbond_fintek_ite_8787(port);
812 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
813 exit_conf_mode_winbond_fintek_ite_8787(port);
814 if (chip_found) return;
818 void print_ite_chips(void)
820 print_vendor_chips("ITE", reg_table);
821 print_vendor_chips("ITE-EC", ec_table);