2 * This file is part of the superiotool project.
4 * Copyright (C) 2007 Carl-Daniel Hailfinger
5 * Copyright (C) 2007-2008 Uwe Hermann <uwe@hermann-uwe.de>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "superiotool.h"
24 #define CHIP_ID_BYTE1_REG 0x20
25 #define CHIP_ID_BYTE2_REG 0x21
26 #define CHIP_VERSION_REG 0x22
27 #define ISA_PNP_ADDR 0x279
29 static const struct superio_registers reg_table[] = {
32 {0x8661, "IT8661F/IT8770F", {
34 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
36 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
39 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
40 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
42 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
43 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
45 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
46 {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
47 {0x3, "Parallel port",
48 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
50 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
53 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
55 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
58 {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
59 0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
60 0xf9,0xfa,0xfb,0xfc,EOT},
61 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
62 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
63 0x00,0x00,0x00,0x00,EOT}},
67 {0x8681, "IT8671F/IT8687R", {
71 {0x20,0x21,0x23,0x24,0x26,0x29,0x2A,0x2B,EOT},
72 {0x87,0x00,0x00,0x80,0x00,0x00,0x7C,0xC0,EOT}},
73 {0x0, "Floppy disk controller",
74 {0x30,0x60,0x61,0x70,0x74,0xF0,0xF1,0xF2,0xF3,0xF4,
76 {0x00,0x03,0xf0,0x06,0x02,0x0E,0x00,0xFF,0x00,0x00,
78 {0x1, "Parallel port",
79 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
80 {0x00,0x03,0x78,0x00,0x80,0x07,0x03,0x03,EOT}},
81 {0x2, "Serial port 1",
82 {0x30,0x60,0x61,0x70,0xf0,EOT},
83 {0x00,0x03,0xf8,0x04,0x00,EOT}},
84 {0x3, "Serial port 2",
85 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
86 {0x00,0x02,0xf8,0x03,0x00,0x00,0x00,0x7f,EOT}},
87 {0x5, "Keyboard controller",
88 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
89 {0x01,0x00,0x60,0x00,0x64,0x01,0x0C,0x80,EOT}},
91 {0x30,0x60,0x61,0x70,EOT},
92 {0x00,0x00,0x00,0x00,EOT}},
93 {0x7, "Game port, MIDI, GPIO set 1",
94 {0x30,0x60,0x61,0x62,0x63,0x70,0xF0,0xF1,0xF2,EOT},
95 {0x00,0x02,0x01,0x03,0x30,0x00,0xFF,0x00,0x00,EOT}},
97 {0x30,0xF0,0xF1,0xF2,0xF3,0xF5,EOT},
98 {0x00,0xFF,0x00,0x00,0x00,0x00,EOT}},
99 {0x9, "GPIO set 3 and 4",
100 {0x30,0x60,0x61,0xF0,0xF1,0xF2,0xF3,0xF4,EOT},
101 {0x00,0x02,0x90,0xFF,0x00,0x00,0x00,0x00,EOT}},
103 {0x30,0x70,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,
104 0xF3,0xF4,0xF6,0xF7,0xF9,EOT},
105 {0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
106 NANA,NANA,0x00,0x00,0x00,EOT}},
107 {0xC, "GPIO set 5, 6 and 7",
108 {0x30,0x60,0x61,0xF0,0xF3,0xF6,EOT},
109 {0x00,0x03,0x70,0x00,0xFF,0xFF,EOT}},
111 {0x8702, "IT8702F", {
113 {0x8705, "IT8705F/AF / IT8700F", {
115 {0x20,0x21,0x22,0x23,0x24,EOT},
116 {0x87,0x05,0x00,0x00,NANA,EOT}},
118 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
119 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
121 {0x30,0x60,0x61,0x70,0xf0,EOT},
122 {0x00,0x03,0xf8,0x04,0x00,EOT}},
124 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
125 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
126 {0x3, "Parallel port",
127 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
129 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
131 {0x4, "Environment controller",
132 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
133 0xf3,0xf4,0xf5,0xf6,EOT},
134 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
135 0x00,0x00,NANA,NANA,EOT}},
137 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
138 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
139 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
140 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
141 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
142 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
144 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
145 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
146 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
147 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
148 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
149 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
150 0x00,NANA,0x00,EOT}},
152 {0x30,0x60,0x61,EOT},
153 {0x00,0x02,0x01,EOT}},
155 {0x30,0x60,0x61,0x70,0xf0,EOT},
156 {0x00,0x03,0x10,0x0b,0x00,EOT}},
158 {0x30,0x60,0x61,0x70,0xf0,EOT},
159 {0x00,0x03,0x00,0x0a,0x00,EOT}},
161 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
162 /* This is a "Special General Purpose I/O chip". */
164 {0x8708, "IT8708F", {
166 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
168 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
169 0xff,0x00,0x00,EOT}},
171 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
172 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
174 {0x30,0x60,0x61,0x70,0xf0,EOT},
175 {0x00,0x03,0xf8,0x04,0x00,EOT}},
177 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
178 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
179 {0x3, "Parallel port",
180 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
182 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
185 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
186 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
187 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
188 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
190 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
191 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
192 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
194 {0x30,0x70,0x71,0xf0,EOT},
195 {0x00,0x0c,0x02,0x00,EOT}},
197 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
198 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
199 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
200 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
201 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
203 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
204 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
205 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
206 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
207 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
210 {0x30,0x60,0x61,EOT},
211 {0x00,0x02,0x01,EOT}},
213 {0x30,0x60,0x61,0x70,0xf0,EOT},
214 {0x00,0x03,0x10,0x0b,0x00,EOT}},
216 {0x30,0x60,0x61,0x70,0xf0,EOT},
217 {0x00,0x03,0x00,0x0a,0x00,EOT}},
219 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
221 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
223 {0x8712, "IT8712F", {
225 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
226 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
228 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
229 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
231 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
232 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
234 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
235 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
236 {0x3, "Parallel port",
237 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
238 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
239 {0x4, "Environment controller",
240 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
242 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
243 0x00,NANA,NANA,EOT}},
245 /* TODO: 0xf0: Error in datasheet? */
246 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
247 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
249 {0x30,0x70,0x71,0xf0,EOT},
250 {0x00,0x0c,0x02,0x00,EOT}},
251 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
252 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
253 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
254 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
255 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
256 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
257 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
258 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
259 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
260 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
261 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
262 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
263 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
265 {0x30,0x60,0x61,0x70,0xf0,EOT},
266 {0x00,0x03,0x00,0x0a,0x00,EOT}},
268 {0x30,0x60,0x61,EOT},
269 {0x00,0x02,0x01,EOT}},
271 {0x30,0x60,0x61,0x70,0xf0,EOT},
272 {0x00,0x03,0x10,0x0b,0x00,EOT}},
274 {0x8716, "IT8716F", {
276 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
277 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
279 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
280 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
282 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
283 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
285 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
286 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
287 {0x3, "Parallel port",
288 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
289 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
290 {0x4, "Environment controller",
291 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
293 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
294 0x00,NANA,NANA,EOT}},
296 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
297 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
299 {0x30,0x70,0x71,0xf0,EOT},
300 {0x00,0x0c,0x02,0x00,EOT}},
302 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
303 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
304 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
305 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
306 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
307 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
308 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
309 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
310 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
311 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
312 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
313 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
315 {0x30,0x60,0x61,0x70,0xf0,EOT},
316 {0x00,0x03,0x00,0x0a,0x00,EOT}},
318 {0x30,0x60,0x61,EOT},
319 {0x00,0x02,0x01,EOT}},
321 {0x30,0x60,0x61,0x70,0xf0,EOT},
322 {0x00,0x03,0x10,0x0b,0x00,EOT}},
324 {0x8718, "IT8718F", {
326 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
327 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
329 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
330 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
332 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
333 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
335 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
336 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
337 {0x3, "Parallel port",
338 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
339 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
340 {0x4, "Environment controller",
341 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
343 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
344 0x00,NANA,NANA,EOT}},
346 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
347 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
348 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
350 {0x30,0x70,0x71,0xf0,EOT},
351 {0x00,0x0c,0x02,0x00,EOT}},
353 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
354 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
355 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
356 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
357 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
358 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
359 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
360 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
361 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
362 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
363 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
364 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
365 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
366 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
367 0x00,NANA,0x00,0x00,0x00,EOT}},
369 {0x30,0x60,0x61,0x70,0xf0,EOT},
370 {0x00,0x03,0x10,0x0b,0x00,EOT}},
372 {0x8720, "IT8720F", { /* From sensors-detect */
374 {0x8722, "IT8722F", {
376 {0x8726, "IT8726F", {
377 /* Datasheet wrongly says that the ID is 0x8716. */
379 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
380 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
382 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
383 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
385 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
386 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
388 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
389 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
390 {0x3, "Parallel port",
391 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
392 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
393 {0x4, "Environment controller",
394 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
396 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
397 0x00,MISC,MISC,EOT}},
399 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
400 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
401 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
403 {0x30,0x70,0x71,0xf0,EOT},
404 {0x00,0x0c,0x02,0x00,EOT}},
406 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
407 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
408 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
409 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
410 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
411 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
412 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
413 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
414 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
415 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
416 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
417 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
418 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
420 {0x30,0x60,0x61,0x70,0xf0,EOT},
421 {0x00,0x03,0x00,0x0a,0x00,EOT}},
423 {0x30,0x60,0x61,EOT},
424 {0x00,0x02,0x01,EOT}},
426 {0x30,0x60,0x61,0x70,0xf0,EOT},
427 {0x00,0x03,0x10,0x0b,0x00,EOT}},
429 {0x8761, "IT8761E", {
431 {0x8780, "IT8780F", {
436 static const struct superio_registers ec_table[] = {
437 {0x8716, "IT8716F", {
439 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
440 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
441 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
442 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
443 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
445 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
446 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
447 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
448 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
450 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
451 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
452 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
453 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
454 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
456 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
457 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
458 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
459 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
460 0x00,0x00,0x7f,EOT}},
462 {0x8718, "IT8718F", {
464 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
465 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
466 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
467 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
468 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
469 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
470 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
471 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
472 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
473 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
474 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
475 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
477 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
478 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
479 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
480 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
481 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
482 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
483 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
484 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
485 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
486 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
487 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
488 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
494 /* Works for: IT8661F/IT8770F */
495 static const uint8_t initkey_it8661f[][4] = {
496 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
497 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
498 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
501 /* Works for: IT8671F/IT8687R, IT8673F */
502 static const uint8_t initkey_it8671f[][4] = {
503 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
504 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
505 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
508 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
509 static const uint8_t initkey_mbpnp[] = {
510 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
511 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
512 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
515 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
516 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
520 /* Determine Super I/O config port. */
521 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
522 for (i = 0; i < 4; i++)
523 OUTB(init[idx][i], ISA_PNP_ADDR);
525 /* Sequentially write the 32 MB PnP init values. */
526 for (i = 0; i < 32; i++)
527 OUTB(initkey_mbpnp[i], port);
530 static void enter_conf_mode_ite(uint16_t port)
535 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
538 static void enter_conf_mode_ite_it8761e(uint16_t port)
543 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
546 static void enter_conf_mode_ite_it8228e(uint16_t port)
551 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
554 static void exit_conf_mode_ite(uint16_t port)
556 regwrite(port, 0x02, 0x02);
559 static void probe_idregs_ite_helper(const char *init, uint16_t port)
561 uint16_t id, chipver, ecport;
563 probing_for("ITE", init, port);
565 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
566 id |= regval(port, CHIP_ID_BYTE2_REG);
567 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
569 if (superio_unknown(reg_table, id)) {
571 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
575 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
576 get_superio_name(reg_table, id), id, chipver, port);
579 dump_superio("ITE", reg_table, port, id, LDN_SEL);
582 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
584 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
585 ecport = regval(port, 0x60) << 8;
586 ecport |= regval(port, 0x61);
588 /* EC address register = EC base address + 5. */
591 printf("Environment controller (0x%04x)\n", ecport);
592 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
596 void probe_idregs_ite(uint16_t port)
598 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
599 enter_conf_mode_ite_legacy(port, initkey_it8661f);
600 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
601 exit_conf_mode_ite(port);
603 enter_conf_mode_ite_legacy(port, initkey_it8671f);
604 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
605 exit_conf_mode_ite(port);
607 enter_conf_mode_ite(port);
608 probe_idregs_ite_helper("(init=standard) ", port);
609 exit_conf_mode_ite(port);
611 enter_conf_mode_ite_it8761e(port);
612 probe_idregs_ite_helper("(init=it8761e) ", port);
613 exit_conf_mode_ite(port);
615 enter_conf_mode_ite_it8228e(port);
616 probe_idregs_ite_helper("(init=it8228e) ", port);
617 exit_conf_mode_ite(port);
619 enter_conf_mode_winbond_fintek_ite_8787(port);
620 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
621 exit_conf_mode_winbond_fintek_ite_8787(port);
625 void print_ite_chips(void)
627 print_vendor_chips("ITE", reg_table);
628 print_vendor_chips("ITE-EC", ec_table);