2 * This file is part of the superiotool project.
4 * Copyright (C) 2007 Carl-Daniel Hailfinger
5 * Copyright (C) 2007-2008 Uwe Hermann <uwe@hermann-uwe.de>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "superiotool.h"
24 #define CHIP_ID_BYTE1_REG 0x20
25 #define CHIP_ID_BYTE2_REG 0x21
26 #define CHIP_VERSION_REG 0x22
27 #define ISA_PNP_ADDR 0x279
29 static const struct superio_registers reg_table[] = {
32 {0x8510, "IT8510E/TE/G", {
34 {0x8511, "IT8511E/TE/G", {
36 {0x8661, "IT8661F/IT8770F", {
38 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
40 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
43 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
44 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
46 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
47 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
49 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
50 {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
51 {0x3, "Parallel port",
52 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
54 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
57 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
59 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
62 {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
63 0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
64 0xf9,0xfa,0xfb,0xfc,EOT},
65 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
66 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
67 0x00,0x00,0x00,0x00,EOT}},
71 {0x8681, "IT8671F/IT8687R", {
73 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x2E,0x2F,EOT},
74 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,NANA,0x86,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
75 {0x0, "Floppy disk controller",
76 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xF0,EOT},
77 {0x00,0x00,0x03,0xF0,0x06,0x02,0x02,0x00,EOT}},
79 {0x30,0x31,0x60,0x61,0x70,0x71,0xF0,EOT},
80 {0x00,0x00,0x03,0xF8,0x04,0x02,0x00,EOT}},
82 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,0x74,0x75,0xF0,0xF1,EOT},
83 {0x00,0x00,0x02,0xF8,0x03,0x00,0x03,0x02,0x0A,0x02,0x00,0x01,0x00,0x00,EOT}},
84 {0x3, "Parallel port",
85 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,0xF0,EOT},
86 {0x00,0x00,0x01,0x78,0x07,0x78,0x07,0x02,0x03,0x03,EOT}},
88 {0x30,0xF0,0xF1,0xF2,0xF4,0xF5,0xF6,EOT},
89 {0x00,0x00,0x00,0x00,0x00,0x00,NANA,EOT}},
91 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0xF0,EOT},
92 {0x01,0x00,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
94 {0x30,0x70,0x71,0xF0,EOT},
95 {0x00,0x0C,0x02,0x00,EOT}},
96 {0x7, "GPIO and Alternative function",
97 {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71,0x72,0x73,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0xE0,0xE1,0xE2,0xE3,0xE4,EOT},
98 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
100 {0x8701, "IT8703F", {
102 {0x20,0x21,0x23,0x24,0x26,0x29,0x2A,0x2B,EOT},
103 {0x87,0x00,0x00,0x80,0x00,0x00,0x7C,0xC0,EOT}},
104 {0x0, "Floppy disk controller",
105 {0x30,0x60,0x61,0x70,0x74,0xF0,0xF1,0xF2,0xF3,0xF4,
107 {0x00,0x03,0xf0,0x06,0x02,0x0E,0x00,0xFF,0x00,0x00,
109 {0x1, "Parallel port",
110 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
111 {0x00,0x03,0x78,0x00,0x80,0x07,0x03,0x03,EOT}},
112 {0x2, "Serial port 1",
113 {0x30,0x60,0x61,0x70,0xf0,EOT},
114 {0x00,0x03,0xf8,0x04,0x00,EOT}},
115 {0x3, "Serial port 2",
116 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
117 {0x00,0x02,0xf8,0x03,0x00,0x00,0x00,0x7f,EOT}},
118 {0x5, "Keyboard controller",
119 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
120 {0x01,0x00,0x60,0x00,0x64,0x01,0x0C,0x80,EOT}},
122 {0x30,0x60,0x61,0x70,EOT},
123 {0x00,0x00,0x00,0x00,EOT}},
124 {0x7, "Game port, MIDI, GPIO set 1",
125 {0x30,0x60,0x61,0x62,0x63,0x70,0xF0,0xF1,0xF2,EOT},
126 {0x00,0x02,0x01,0x03,0x30,0x00,0xFF,0x00,0x00,EOT}},
128 {0x30,0xF0,0xF1,0xF2,0xF3,0xF5,EOT},
129 {0x00,0xFF,0x00,0x00,0x00,0x00,EOT}},
130 {0x9, "GPIO set 3 and 4",
131 {0x30,0x60,0x61,0xF0,0xF1,0xF2,0xF3,0xF4,EOT},
132 {0x00,0x02,0x90,0xFF,0x00,0x00,0x00,0x00,EOT}},
134 {0x30,0x70,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,
135 0xF3,0xF4,0xF6,0xF7,0xF9,EOT},
136 {0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
137 NANA,NANA,0x00,0x00,0x00,EOT}},
138 {0xC, "GPIO set 5, 6 and 7",
139 {0x30,0x60,0x61,0xF0,0xF3,0xF6,EOT},
140 {0x00,0x03,0x70,0x00,0xFF,0xFF,EOT}},
142 {0x8702, "IT8702F", {
144 {0x8705, "IT8705F/AF / IT8700F", {
146 {0x20,0x21,0x22,0x23,0x24,EOT},
147 {0x87,0x05,0x00,0x00,NANA,EOT}},
149 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
150 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
152 {0x30,0x60,0x61,0x70,0xf0,EOT},
153 {0x00,0x03,0xf8,0x04,0x00,EOT}},
155 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
156 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
157 {0x3, "Parallel port",
158 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
160 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
162 {0x4, "Environment controller",
163 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
164 0xf3,0xf4,0xf5,0xf6,EOT},
165 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
166 0x00,0x00,NANA,NANA,EOT}},
168 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
169 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
170 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
171 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
172 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
173 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
175 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
176 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
177 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
178 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
179 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
180 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
181 0x00,NANA,0x00,EOT}},
183 {0x30,0x60,0x61,EOT},
184 {0x00,0x02,0x01,EOT}},
186 {0x30,0x60,0x61,0x70,0xf0,EOT},
187 {0x00,0x03,0x10,0x0b,0x00,EOT}},
189 {0x30,0x60,0x61,0x70,0xf0,EOT},
190 {0x00,0x03,0x00,0x0a,0x00,EOT}},
192 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
193 /* This is a "Special General Purpose I/O chip". */
195 {0x8708, "IT8708F", {
197 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
199 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
200 0xff,0x00,0x00,EOT}},
202 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
203 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
205 {0x30,0x60,0x61,0x70,0xf0,EOT},
206 {0x00,0x03,0xf8,0x04,0x00,EOT}},
208 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
209 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
210 {0x3, "Parallel port",
211 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
213 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
216 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
217 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
218 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
219 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
221 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
222 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
223 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
225 {0x30,0x70,0x71,0xf0,EOT},
226 {0x00,0x0c,0x02,0x00,EOT}},
228 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
229 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
230 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
231 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
232 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
234 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
235 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
236 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
237 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
238 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
241 {0x30,0x60,0x61,EOT},
242 {0x00,0x02,0x01,EOT}},
244 {0x30,0x60,0x61,0x70,0xf0,EOT},
245 {0x00,0x03,0x10,0x0b,0x00,EOT}},
247 {0x30,0x60,0x61,0x70,0xf0,EOT},
248 {0x00,0x03,0x00,0x0a,0x00,EOT}},
250 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
252 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
254 {0x8712, "IT8712F", {
256 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
257 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
259 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
260 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
262 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
263 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
265 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
266 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
267 {0x3, "Parallel port",
268 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
269 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
270 {0x4, "Environment controller",
271 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
273 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
274 0x00,NANA,NANA,EOT}},
276 /* TODO: 0xf0: Error in datasheet? */
277 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
278 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
280 {0x30,0x70,0x71,0xf0,EOT},
281 {0x00,0x0c,0x02,0x00,EOT}},
282 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
283 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
284 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
285 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
286 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
287 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
288 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
289 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
290 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
291 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
292 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
293 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
294 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
296 {0x30,0x60,0x61,0x70,0xf0,EOT},
297 {0x00,0x03,0x00,0x0a,0x00,EOT}},
299 {0x30,0x60,0x61,EOT},
300 {0x00,0x02,0x01,EOT}},
302 {0x30,0x60,0x61,0x70,0xf0,EOT},
303 {0x00,0x03,0x10,0x0b,0x00,EOT}},
305 {0x8716, "IT8716F", {
307 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
308 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
310 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
311 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
313 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
314 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
316 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
317 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
318 {0x3, "Parallel port",
319 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
320 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
321 {0x4, "Environment controller",
322 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
324 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
325 0x00,NANA,NANA,EOT}},
327 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
328 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
330 {0x30,0x70,0x71,0xf0,EOT},
331 {0x00,0x0c,0x02,0x00,EOT}},
333 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
334 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
335 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
336 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
337 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
338 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
339 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
340 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
341 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
342 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
343 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
344 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
346 {0x30,0x60,0x61,0x70,0xf0,EOT},
347 {0x00,0x03,0x00,0x0a,0x00,EOT}},
349 {0x30,0x60,0x61,EOT},
350 {0x00,0x02,0x01,EOT}},
352 {0x30,0x60,0x61,0x70,0xf0,EOT},
353 {0x00,0x03,0x10,0x0b,0x00,EOT}},
355 {0x8718, "IT8718F", {
357 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
358 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
360 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
361 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
363 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
364 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
366 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
367 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
368 {0x3, "Parallel port",
369 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
370 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
371 {0x4, "Environment controller",
372 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
374 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
375 0x00,NANA,NANA,EOT}},
377 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
378 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
379 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
381 {0x30,0x70,0x71,0xf0,EOT},
382 {0x00,0x0c,0x02,0x00,EOT}},
384 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
385 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
386 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
387 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
388 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
389 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
390 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
391 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
392 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
393 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
394 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
395 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
396 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
397 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
398 0x00,NANA,0x00,0x00,0x00,EOT}},
400 {0x30,0x60,0x61,0x70,0xf0,EOT},
401 {0x00,0x03,0x10,0x0b,0x00,EOT}},
403 {0x8720, "IT8720F", { /* From sensors-detect */
405 {0x8722, "IT8722F", {
407 {0x8726, "IT8726F", {
408 /* Datasheet wrongly says that the ID is 0x8716. */
410 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
411 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
413 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
414 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
416 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
417 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
419 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
420 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
421 {0x3, "Parallel port",
422 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
423 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
424 {0x4, "Environment controller",
425 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
427 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
428 0x00,MISC,MISC,EOT}},
430 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
431 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
432 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
434 {0x30,0x70,0x71,0xf0,EOT},
435 {0x00,0x0c,0x02,0x00,EOT}},
437 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
438 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
439 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
440 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
441 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
442 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
443 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
444 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
445 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
446 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
447 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
448 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
449 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
451 {0x30,0x60,0x61,0x70,0xf0,EOT},
452 {0x00,0x03,0x00,0x0a,0x00,EOT}},
454 {0x30,0x60,0x61,EOT},
455 {0x00,0x02,0x01,EOT}},
457 {0x30,0x60,0x61,0x70,0xf0,EOT},
458 {0x00,0x03,0x10,0x0b,0x00,EOT}},
460 {0x8761, "IT8761E", {
462 {0x8780, "IT8780F", {
467 static const struct superio_registers ec_table[] = {
468 {0x8716, "IT8716F", {
470 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
471 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
472 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
473 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
474 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
476 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
477 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
478 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
479 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
481 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
482 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
483 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
484 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
485 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
487 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
488 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
489 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
490 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
491 0x00,0x00,0x7f,EOT}},
493 {0x8718, "IT8718F", {
495 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
496 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
497 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
498 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
499 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
500 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
501 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
502 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
503 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
504 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
505 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
506 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
508 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
509 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
510 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
511 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
512 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
513 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
514 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
515 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
516 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
517 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
518 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
519 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
525 /* Works for: IT8661F/IT8770F */
526 static const uint8_t initkey_it8661f[][4] = {
527 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
528 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
529 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
532 /* Works for: IT8671F/IT8687R, IT8673F */
533 static const uint8_t initkey_it8671f[][4] = {
534 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
535 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
536 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
539 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
540 static const uint8_t initkey_mbpnp[] = {
541 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
542 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
543 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
546 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
547 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
551 /* Determine Super I/O config port. */
552 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
553 for (i = 0; i < 4; i++)
554 OUTB(init[idx][i], ISA_PNP_ADDR);
556 /* Sequentially write the 32 MB PnP init values. */
557 for (i = 0; i < 32; i++)
558 OUTB(initkey_mbpnp[i], port);
561 static void enter_conf_mode_ite(uint16_t port)
566 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
569 static void enter_conf_mode_ite_it8761e(uint16_t port)
574 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
577 static void enter_conf_mode_ite_it8228e(uint16_t port)
582 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
585 static void exit_conf_mode_ite(uint16_t port)
587 regwrite(port, 0x02, 0x02);
590 static void probe_idregs_ite_helper(const char *init, uint16_t port)
592 uint16_t id, chipver, ecport;
594 probing_for("ITE", init, port);
596 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
597 id |= regval(port, CHIP_ID_BYTE2_REG);
598 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
600 if (superio_unknown(reg_table, id)) {
602 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
606 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
607 get_superio_name(reg_table, id), id, chipver, port);
610 dump_superio("ITE", reg_table, port, id, LDN_SEL);
613 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
615 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
616 ecport = regval(port, 0x60) << 8;
617 ecport |= regval(port, 0x61);
619 /* EC address register = EC base address + 5. */
622 printf("Environment controller (0x%04x)\n", ecport);
623 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
627 void probe_idregs_ite(uint16_t port)
629 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
630 enter_conf_mode_ite_legacy(port, initkey_it8661f);
631 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
632 exit_conf_mode_ite(port);
634 enter_conf_mode_ite_legacy(port, initkey_it8671f);
635 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
636 exit_conf_mode_ite(port);
638 enter_conf_mode_ite(port);
639 probe_idregs_ite_helper("(init=standard) ", port);
640 exit_conf_mode_ite(port);
642 enter_conf_mode_ite_it8761e(port);
643 probe_idregs_ite_helper("(init=it8761e) ", port);
644 exit_conf_mode_ite(port);
646 enter_conf_mode_ite_it8228e(port);
647 probe_idregs_ite_helper("(init=it8228e) ", port);
648 exit_conf_mode_ite(port);
650 enter_conf_mode_winbond_fintek_ite_8787(port);
651 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
652 exit_conf_mode_winbond_fintek_ite_8787(port);
656 void print_ite_chips(void)
658 print_vendor_chips("ITE", reg_table);
659 print_vendor_chips("ITE-EC", ec_table);