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 {0x8512, "IT8512E/F/G", {
38 {0x8513, "IT8513E/F/G", {
40 {0x8661, "IT8661F/IT8770F", {
42 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
44 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
47 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
48 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
50 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
51 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
53 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
54 {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
55 {0x3, "Parallel port",
56 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
58 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
61 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
63 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
66 {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
67 0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
68 0xf9,0xfa,0xfb,0xfc,EOT},
69 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
70 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
71 0x00,0x00,0x00,0x00,EOT}},
75 {0x8681, "IT8671F/IT8687R", {
77 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x2E,0x2F,EOT},
78 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,NANA,0x86,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,EOT}},
79 {0x0, "Floppy disk controller",
80 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xF0,EOT},
81 {0x00,0x00,0x03,0xF0,0x06,0x02,0x02,0x00,EOT}},
83 {0x30,0x31,0x60,0x61,0x70,0x71,0xF0,EOT},
84 {0x00,0x00,0x03,0xF8,0x04,0x02,0x00,EOT}},
86 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,0x74,0x75,0xF0,0xF1,EOT},
87 {0x00,0x00,0x02,0xF8,0x03,0x00,0x03,0x02,0x0A,0x02,0x00,0x01,0x00,0x00,EOT}},
88 {0x3, "Parallel port",
89 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,0xF0,EOT},
90 {0x00,0x00,0x01,0x78,0x07,0x78,0x07,0x02,0x03,0x03,EOT}},
92 {0x30,0xF0,0xF1,0xF2,0xF4,0xF5,0xF6,EOT},
93 {0x00,0x00,0x00,0x00,0x00,0x00,NANA,EOT}},
95 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0xF0,EOT},
96 {0x01,0x00,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
98 {0x30,0x70,0x71,0xF0,EOT},
99 {0x00,0x0C,0x02,0x00,EOT}},
100 {0x7, "GPIO and Alternative function",
101 {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},
102 {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}},
104 {0x8701, "IT8703F", {
106 {0x20,0x21,0x23,0x24,0x26,0x29,0x2A,0x2B,EOT},
107 {0x87,0x00,0x00,0x80,0x00,0x00,0x7C,0xC0,EOT}},
108 {0x0, "Floppy disk controller",
109 {0x30,0x60,0x61,0x70,0x74,0xF0,0xF1,0xF2,0xF3,0xF4,
111 {0x00,0x03,0xf0,0x06,0x02,0x0E,0x00,0xFF,0x00,0x00,
113 {0x1, "Parallel port",
114 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
115 {0x00,0x03,0x78,0x00,0x80,0x07,0x03,0x03,EOT}},
116 {0x2, "Serial port 1",
117 {0x30,0x60,0x61,0x70,0xf0,EOT},
118 {0x00,0x03,0xf8,0x04,0x00,EOT}},
119 {0x3, "Serial port 2",
120 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
121 {0x00,0x02,0xf8,0x03,0x00,0x00,0x00,0x7f,EOT}},
122 {0x5, "Keyboard controller",
123 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
124 {0x01,0x00,0x60,0x00,0x64,0x01,0x0C,0x80,EOT}},
126 {0x30,0x60,0x61,0x70,EOT},
127 {0x00,0x00,0x00,0x00,EOT}},
128 {0x7, "Game port, MIDI, GPIO set 1",
129 {0x30,0x60,0x61,0x62,0x63,0x70,0xF0,0xF1,0xF2,EOT},
130 {0x00,0x02,0x01,0x03,0x30,0x00,0xFF,0x00,0x00,EOT}},
132 {0x30,0xF0,0xF1,0xF2,0xF3,0xF5,EOT},
133 {0x00,0xFF,0x00,0x00,0x00,0x00,EOT}},
134 {0x9, "GPIO set 3 and 4",
135 {0x30,0x60,0x61,0xF0,0xF1,0xF2,0xF3,0xF4,EOT},
136 {0x00,0x02,0x90,0xFF,0x00,0x00,0x00,0x00,EOT}},
138 {0x30,0x70,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,
139 0xF3,0xF4,0xF6,0xF7,0xF9,EOT},
140 {0x00,0x00,0x00,0x00,NANA,NANA,0x00,0x00,0x00,0x00,
141 NANA,NANA,0x00,0x00,0x00,EOT}},
142 {0xC, "GPIO set 5, 6 and 7",
143 {0x30,0x60,0x61,0xF0,0xF3,0xF6,EOT},
144 {0x00,0x03,0x70,0x00,0xFF,0xFF,EOT}},
146 {0x8702, "IT8702F", {
148 {0x8705, "IT8705F/AF / IT8700F", {
150 {0x20,0x21,0x22,0x23,0x24,EOT},
151 {0x87,0x05,0x00,0x00,NANA,EOT}},
153 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
154 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
156 {0x30,0x60,0x61,0x70,0xf0,EOT},
157 {0x00,0x03,0xf8,0x04,0x00,EOT}},
159 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
160 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
161 {0x3, "Parallel port",
162 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
164 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
166 {0x4, "Environment controller",
167 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
168 0xf3,0xf4,0xf5,0xf6,EOT},
169 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
170 0x00,0x00,NANA,NANA,EOT}},
172 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
173 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
174 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
175 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
176 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
177 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
179 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
180 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
181 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
182 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
183 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
184 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
185 0x00,NANA,0x00,EOT}},
187 {0x30,0x60,0x61,EOT},
188 {0x00,0x02,0x01,EOT}},
190 {0x30,0x60,0x61,0x70,0xf0,EOT},
191 {0x00,0x03,0x10,0x0b,0x00,EOT}},
193 {0x30,0x60,0x61,0x70,0xf0,EOT},
194 {0x00,0x03,0x00,0x0a,0x00,EOT}},
196 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
197 /* This is a "Special General Purpose I/O chip". */
199 {0x8708, "IT8708F", {
201 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
203 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
204 0xff,0x00,0x00,EOT}},
206 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
207 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
209 {0x30,0x60,0x61,0x70,0xf0,EOT},
210 {0x00,0x03,0xf8,0x04,0x00,EOT}},
212 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
213 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
214 {0x3, "Parallel port",
215 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
217 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
220 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
221 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
222 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
223 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
225 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
226 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
227 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
229 {0x30,0x70,0x71,0xf0,EOT},
230 {0x00,0x0c,0x02,0x00,EOT}},
232 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
233 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
234 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
235 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
236 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
238 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
239 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
240 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
241 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
242 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
245 {0x30,0x60,0x61,EOT},
246 {0x00,0x02,0x01,EOT}},
248 {0x30,0x60,0x61,0x70,0xf0,EOT},
249 {0x00,0x03,0x10,0x0b,0x00,EOT}},
251 {0x30,0x60,0x61,0x70,0xf0,EOT},
252 {0x00,0x03,0x00,0x0a,0x00,EOT}},
254 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
256 {0x8711, "IT8711F", { /* 0x8711 is a guess, not found in datasheet. */
258 {0x8712, "IT8712F", {
260 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
261 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
263 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
264 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
266 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
267 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
269 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
270 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
271 {0x3, "Parallel port",
272 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
273 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
274 {0x4, "Environment controller",
275 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
277 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
278 0x00,NANA,NANA,EOT}},
280 /* TODO: 0xf0: Error in datasheet? */
281 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
282 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
284 {0x30,0x70,0x71,0xf0,EOT},
285 {0x00,0x0c,0x02,0x00,EOT}},
286 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
287 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
288 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
289 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
290 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
291 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
292 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
293 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
294 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
295 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
296 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
297 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
298 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
300 {0x30,0x60,0x61,0x70,0xf0,EOT},
301 {0x00,0x03,0x00,0x0a,0x00,EOT}},
303 {0x30,0x60,0x61,EOT},
304 {0x00,0x02,0x01,EOT}},
306 {0x30,0x60,0x61,0x70,0xf0,EOT},
307 {0x00,0x03,0x10,0x0b,0x00,EOT}},
309 {0x8716, "IT8716F", {
311 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
312 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
314 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
315 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
317 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
318 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
320 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
321 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
322 {0x3, "Parallel port",
323 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
324 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
325 {0x4, "Environment controller",
326 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
328 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
329 0x00,NANA,NANA,EOT}},
331 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
332 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
334 {0x30,0x70,0x71,0xf0,EOT},
335 {0x00,0x0c,0x02,0x00,EOT}},
337 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
338 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
339 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
340 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
341 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
342 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
343 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
344 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
345 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
346 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
347 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
348 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
350 {0x30,0x60,0x61,0x70,0xf0,EOT},
351 {0x00,0x03,0x00,0x0a,0x00,EOT}},
353 {0x30,0x60,0x61,EOT},
354 {0x00,0x02,0x01,EOT}},
356 {0x30,0x60,0x61,0x70,0xf0,EOT},
357 {0x00,0x03,0x10,0x0b,0x00,EOT}},
359 {0x8718, "IT8718F", {
361 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
362 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
364 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
365 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
367 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
368 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
370 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
371 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
372 {0x3, "Parallel port",
373 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
374 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
375 {0x4, "Environment controller",
376 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
378 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
379 0x00,NANA,NANA,EOT}},
381 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
382 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
383 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
385 {0x30,0x70,0x71,0xf0,EOT},
386 {0x00,0x0c,0x02,0x00,EOT}},
388 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
389 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
390 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
391 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
392 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
393 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
394 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
395 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
396 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
397 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
398 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
399 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
400 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
401 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
402 0x00,NANA,0x00,0x00,0x00,EOT}},
404 {0x30,0x60,0x61,0x70,0xf0,EOT},
405 {0x00,0x03,0x10,0x0b,0x00,EOT}},
407 {0x8720, "IT8720F", { /* From sensors-detect */
409 {0x8722, "IT8722F", {
411 {0x8726, "IT8726F", {
412 /* Datasheet wrongly says that the ID is 0x8716. */
414 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
415 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
417 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
418 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
420 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
421 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
423 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
424 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
425 {0x3, "Parallel port",
426 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
427 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
428 {0x4, "Environment controller",
429 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
431 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
432 0x00,MISC,MISC,EOT}},
434 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
435 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
436 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
438 {0x30,0x70,0x71,0xf0,EOT},
439 {0x00,0x0c,0x02,0x00,EOT}},
441 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
442 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
443 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
444 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
445 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
446 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
447 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
448 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
449 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
450 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
451 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
452 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
453 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
455 {0x30,0x60,0x61,0x70,0xf0,EOT},
456 {0x00,0x03,0x00,0x0a,0x00,EOT}},
458 {0x30,0x60,0x61,EOT},
459 {0x00,0x02,0x01,EOT}},
461 {0x30,0x60,0x61,0x70,0xf0,EOT},
462 {0x00,0x03,0x10,0x0b,0x00,EOT}},
464 {0x8761, "IT8761E", {
466 {0x8780, "IT8780F", {
471 static const struct superio_registers ec_table[] = {
472 {0x8716, "IT8716F", {
474 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
475 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
476 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
477 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
478 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
480 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
481 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
482 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
483 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
485 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
486 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
487 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
488 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
489 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
491 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
492 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
493 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
494 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
495 0x00,0x00,0x7f,EOT}},
497 {0x8718, "IT8718F", {
499 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
500 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
501 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
502 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
503 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
504 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
505 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
506 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
507 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
508 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
509 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
510 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
512 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
513 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
514 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
515 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
516 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
517 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
518 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
519 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
520 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
521 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
522 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
523 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
529 /* Works for: IT8661F/IT8770F */
530 static const uint8_t initkey_it8661f[][4] = {
531 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
532 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
533 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
536 /* Works for: IT8671F/IT8687R, IT8673F */
537 static const uint8_t initkey_it8671f[][4] = {
538 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
539 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
540 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
543 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
544 static const uint8_t initkey_mbpnp[] = {
545 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
546 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
547 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
550 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
551 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
555 /* Determine Super I/O config port. */
556 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
557 for (i = 0; i < 4; i++)
558 OUTB(init[idx][i], ISA_PNP_ADDR);
560 /* Sequentially write the 32 MB PnP init values. */
561 for (i = 0; i < 32; i++)
562 OUTB(initkey_mbpnp[i], port);
565 static void enter_conf_mode_ite(uint16_t port)
570 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
573 static void enter_conf_mode_ite_it8761e(uint16_t port)
578 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
581 static void enter_conf_mode_ite_it8228e(uint16_t port)
586 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
589 static void exit_conf_mode_ite(uint16_t port)
591 regwrite(port, 0x02, 0x02);
594 static void probe_idregs_ite_helper(const char *init, uint16_t port)
596 uint16_t id, chipver, ecport;
598 probing_for("ITE", init, port);
600 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
601 id |= regval(port, CHIP_ID_BYTE2_REG);
602 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
604 if (superio_unknown(reg_table, id)) {
606 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
610 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
611 get_superio_name(reg_table, id), id, chipver, port);
614 dump_superio("ITE", reg_table, port, id, LDN_SEL);
617 regwrite(port, LDN_SEL, 0x04); /* Select LDN 4 (EC). */
619 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
620 ecport = regval(port, 0x60) << 8;
621 ecport |= regval(port, 0x61);
623 /* EC address register = EC base address + 5. */
626 printf("Environment controller (0x%04x)\n", ecport);
627 dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
631 void probe_idregs_ite(uint16_t port)
633 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
634 enter_conf_mode_ite_legacy(port, initkey_it8661f);
635 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
636 exit_conf_mode_ite(port);
638 enter_conf_mode_ite_legacy(port, initkey_it8671f);
639 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
640 exit_conf_mode_ite(port);
642 enter_conf_mode_ite(port);
643 probe_idregs_ite_helper("(init=standard) ", port);
644 exit_conf_mode_ite(port);
646 enter_conf_mode_ite_it8761e(port);
647 probe_idregs_ite_helper("(init=it8761e) ", port);
648 exit_conf_mode_ite(port);
650 enter_conf_mode_ite_it8228e(port);
651 probe_idregs_ite_helper("(init=it8228e) ", port);
652 exit_conf_mode_ite(port);
654 enter_conf_mode_winbond_fintek_ite_8787(port);
655 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
656 exit_conf_mode_winbond_fintek_ite_8787(port);
660 void print_ite_chips(void)
662 print_vendor_chips("ITE", reg_table);
663 print_vendor_chips("ITE-EC", ec_table);