2 * This file is part of the superiotool project.
4 * Copyright (C) 2007 Carl-Daniel Hailfinger
5 * Copyright (C) 2007 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[] = {
30 {0x8661, "IT8661F/IT8770F", {
32 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x20,0x21,0x22,
34 {NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x86,0x61,0x00,
37 {0x30,0x31,0x60,0x61,0x70,0x71,0x74,0xf0,EOT},
38 {0x00,0x00,0x03,0xf0,0x06,0x02,0x02,0x00,EOT}},
40 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
41 {0x00,0x00,0x03,0xf8,0x04,0x02,0x00,EOT}},
43 {0x30,0x31,0x60,0x61,0x70,0x71,0xf0,EOT},
44 {0x00,0x00,0x02,0xf8,0x03,0x02,0x00,EOT}},
45 {0x3, "Parallel port",
46 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x74,
48 {0x00,0x00,0x03,0x78,0x07,0x78,0x07,0x02,0x03,
51 {0x30,0x31,0x60,0x61,0x62,0x63,0x70,0x71,0x72,0x73,
53 {0x00,0x00,0x02,0xe8,0x03,0x00,0x0a,0x02,0x0b,0x02,
56 {0x25,0x26,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
57 0x70,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
58 0xf9,0xfa,0xfb,0xfc,EOT},
59 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
60 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
61 0x00,0x00,0x00,0x00,EOT}},
65 {0x8681, "IT8671F/IT8687R", {
69 {0x8705, "IT8705F/AF / IT8700F", {
71 {0x20,0x21,0x22,0x23,0x24,EOT},
72 {0x87,0x05,0x00,0x00,NANA,EOT}},
74 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
75 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
77 {0x30,0x60,0x61,0x70,0xf0,EOT},
78 {0x00,0x03,0xf8,0x04,0x00,EOT}},
80 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
81 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
82 {0x3, "Parallel port",
83 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
85 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
87 {0x4, "Environment controller",
88 {0x2b,0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,
89 0xf3,0xf4,0xf5,0xf6,EOT},
90 {0x00,0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,
91 0x00,0x00,NANA,NANA,EOT}},
93 {0x25,0x26,0x27,0x28,0x29,0x2a,0x60,0x61,0x62,0x63,
94 0x64,0x65,0x70,0x71,0x72,0xb0,0xb1,0xb2,0xb3,0xb4,
95 0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,
96 0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xd0,
97 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd8,0xd9,0xda,0xf0,
98 0xf1,0xf2,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,
100 {0x00,0x00,0x00,0xff,0xe0,0xff,0x00,0x00,0x00,0x00,
101 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
102 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
103 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
104 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
105 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
106 0x00,NANA,0x00,EOT}},
108 {0x30,0x60,0x61,EOT},
109 {0x00,0x02,0x01,EOT}},
111 {0x30,0x60,0x61,0x70,0xf0,EOT},
112 {0x00,0x03,0x10,0x0b,0x00,EOT}},
114 {0x30,0x60,0x61,0x70,0xf0,EOT},
115 {0x00,0x03,0x00,0x0a,0x00,EOT}},
117 {0x8706, "IT8706R", { /* TODO: Not yet in sensors-detect */
118 /* This is a "Special General Purpose I/O chip". */
120 {0x8708, "IT8708F", {
122 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
124 {0x87,0x08,0x00,0x00,NANA,0x3f,0x00,0xff,0xff,0xff,
125 0xff,0x00,0x00,EOT}},
127 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
128 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
130 {0x30,0x60,0x61,0x70,0xf0,EOT},
131 {0x00,0x03,0xf8,0x04,0x00,EOT}},
133 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
134 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
135 {0x3, "Parallel port",
136 {0x30,0x60,0x61,0x62,0x63,0x64,0x65,0x70,0x74,
138 {0x00,0x03,0x78,0x07,0x78,0x00,0x80,0x07,0x03,
141 {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
142 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,EOT},
143 {NANA,NANA,0x00,0x00,0x00,0x00,0x00,0x00,
144 0x00,0x00,0x00,0x00,0x00,NANA,NANA,EOT}},
146 /* Note: 0x30 can actually be 0x00 _or_ 0x01. */
147 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
148 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
150 {0x30,0x70,0x71,0xf0,EOT},
151 {0x00,0x0c,0x02,0x00,EOT}},
153 {0x70,0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,
154 0xbb,0xbc,0xbd,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,
155 0xc9,0xca,0xcb,0xcc,0xcd,0xd0,0xd1,0xd2,0xd3,0xd4,
156 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xf0,0xf1,
157 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,
159 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
160 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
161 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
162 0x00,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x00,0x00,
163 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,
166 {0x30,0x60,0x61,EOT},
167 {0x00,0x02,0x01,EOT}},
169 {0x30,0x60,0x61,0x70,0xf0,EOT},
170 {0x00,0x03,0x10,0x0b,0x00,EOT}},
172 {0x30,0x60,0x61,0x70,0xf0,EOT},
173 {0x00,0x03,0x00,0x0a,0x00,EOT}},
175 {0x8710, "IT8710F", { /* TODO: Not yet in sensors-detect */
177 {0x8712, "IT8712F", {
179 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
180 {0x87,0x12,0x08,0x00,0x00,0x00,EOT}},
182 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
183 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
185 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
186 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
188 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
189 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
190 {0x3, "Parallel port",
191 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
192 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
193 {0x4, "Environment controller",
194 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
196 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
197 0x00,NANA,NANA,EOT}},
199 /* TODO: 0xf0: Error in datasheet? */
200 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
201 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
203 {0x30,0x70,0x71,0xf0,EOT},
204 {0x00,0x0c,0x02,0x00,EOT}},
205 {0x7, "GPIO", /* TODO: 0x72, 0x73: Errors in datasheet? */
206 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
207 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
208 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
209 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
210 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
211 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
212 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
213 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,
214 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
215 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
216 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
217 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
219 {0x30,0x60,0x61,0x70,0xf0,EOT},
220 {0x00,0x03,0x00,0x0a,0x00,EOT}},
222 {0x30,0x60,0x61,EOT},
223 {0x00,0x02,0x01,EOT}},
225 {0x30,0x60,0x61,0x70,0xf0,EOT},
226 {0x00,0x03,0x10,0x0b,0x00,EOT}},
228 {0x8716, "IT8716F", {
230 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
231 {0x87,0x16,0x01,0x00,0x00,0x00,EOT}},
233 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
234 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
236 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
237 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
239 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
240 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
241 {0x3, "Parallel port",
242 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
243 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
244 {0x4, "Environment controller",
245 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
247 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
248 0x00,NANA,NANA,EOT}},
250 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
251 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
253 {0x30,0x70,0x71,0xf0,EOT},
254 {0x00,0x0c,0x02,0x00,EOT}},
256 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
257 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
258 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
259 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
260 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
261 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
262 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
263 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
264 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
265 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
266 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
267 0x00,0x00,0x00,0x00,0x00,0x00,0x00,NANA,0x00,EOT}},
269 {0x30,0x60,0x61,0x70,0xf0,EOT},
270 {0x00,0x03,0x00,0x0a,0x00,EOT}},
272 {0x30,0x60,0x61,EOT},
273 {0x00,0x02,0x01,EOT}},
275 {0x30,0x60,0x61,0x70,0xf0,EOT},
276 {0x00,0x03,0x10,0x0b,0x00,EOT}},
278 {0x8718, "IT8718F", {
280 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
281 {0x87,0x18,0x01,0x00,0x00,0x00,EOT}},
283 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
284 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
286 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
287 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
289 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
290 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
291 {0x3, "Parallel port",
292 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
293 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
294 {0x4, "Environment controller",
295 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
297 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
298 0x00,NANA,NANA,EOT}},
300 /* 0xf0: Datasheet page 33: 0x00; page 56: 0x08. */
301 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
302 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x00,EOT}},
304 {0x30,0x70,0x71,0xf0,EOT},
305 {0x00,0x0c,0x02,0x00,EOT}},
307 /* 0x2c: Datasheet page 30: 0x00; page 43: 0x1f. */
308 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
309 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
310 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
311 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc8,0xc9,0xca,0xcb,
312 0xcc,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xf0,
313 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
314 0xfb,0xfc,0xfd,0xfe,0xff,EOT},
315 {0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
316 0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x00,0x00,0x00,
317 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
318 0x01,0x00,0x00,0x40,0x00,0x00,0x01,0x00,0x00,0x40,
319 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
320 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
321 0x00,NANA,0x00,0x00,0x00,EOT}},
323 {0x30,0x60,0x61,0x70,0xf0,EOT},
324 {0x00,0x03,0x10,0x0b,0x00,EOT}},
326 {0x8720, "IT8720F", { /* From sensors-detect */
328 {0x8726, "IT8726F", {
329 /* Datasheet wrongly says that the ID is 0x8716. */
331 {0x20,0x21,0x22,0x23,0x24,0x2b,EOT},
332 {0x87,0x26,0x01,0x00,MISC,0x00,EOT}},
334 {0x30,0x60,0x61,0x70,0x74,0xf0,0xf1,EOT},
335 {0x00,0x03,0xf0,0x06,0x02,0x00,0x00,EOT}},
337 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
338 {0x00,0x03,0xf8,0x04,0x00,0x50,0x00,0x7f,EOT}},
340 {0x30,0x60,0x61,0x70,0xf0,0xf1,0xf2,0xf3,EOT},
341 {0x00,0x02,0xf8,0x03,0x00,0x50,0x00,0x7f,EOT}},
342 {0x3, "Parallel port",
343 {0x30,0x60,0x61,0x62,0x63,0x70,0x74,0xf0,EOT},
344 {0x00,0x03,0x78,0x07,0x78,0x07,0x03,0x03,EOT}},
345 {0x4, "Environment controller",
346 {0x30,0x60,0x61,0x62,0x63,0x70,0xf0,0xf1,0xf2,0xf3,
348 {0x00,0x02,0x90,0x02,0x30,0x09,0x00,0x00,0x00,0x00,
349 0x00,MISC,MISC,EOT}},
351 /* 0xf0: Datasheet page 35: 0x00; page 59: 0x08. */
352 {0x30,0x60,0x61,0x62,0x63,0x70,0x71,0xf0,EOT},
353 {0x01,0x00,0x60,0x00,0x64,0x01,0x02,0x08,EOT}},
355 {0x30,0x70,0x71,0xf0,EOT},
356 {0x00,0x0c,0x02,0x00,EOT}},
358 /* 0x2c: Datasheet page 33: 0x00; page 45: 0x1f. */
359 {0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0x60,0x61,0x62,
360 0x63,0x64,0x65,0x70,0x71,0x72,0x73,0x74,0xb0,0xb1,
361 0xb2,0xb3,0xb4,0xb5,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,
362 0xc0,0xc1,0xc2,0xc3,0xc4,0xc8,0xc9,0xca,0xcb,0xcc,
363 0xe0,0xe1,0xe2,0xe3,0xe4,0xf0,0xf1,0xf2,0xf3,0xf4,
364 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,EOT},
365 {0x01,0x00,0x00,0x40,0x00,0x00,0x1f,0x00,0x00,0x00,
366 0x00,0x00,0x00,0x00,0x00,MISC,0x38,0x00,0x00,0x00,
367 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
368 0x01,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x40,0x00,
369 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
370 0x00,0x00,0x00,0x00,0x00,0x00,0x00,MISC,0x00,EOT}},
372 {0x30,0x60,0x61,0x70,0xf0,EOT},
373 {0x00,0x03,0x00,0x0a,0x00,EOT}},
375 {0x30,0x60,0x61,EOT},
376 {0x00,0x02,0x01,EOT}},
378 {0x30,0x60,0x61,0x70,0xf0,EOT},
379 {0x00,0x03,0x10,0x0b,0x00,EOT}},
384 static const struct superio_registers ec_table[] = {
385 {0x8716, "IT8716F", {
387 {0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x10,
388 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x1b,0x1c,0x1d,
389 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
390 0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,
391 0x44,0x45,0x48,0x50,0x51,0x52,0x53,0x54,0x56,0x57,
393 0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x68,
394 0x69,0x6a,0x6b,0x6c,0x6d,0x70,0x71,0x72,0x73,0x74,
395 0x75,0x84,0x85,0x86,0x87,0x88,0x89,0x8c,0x8d,0x8e,
396 0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x98,0x99,0x9a,
398 {0x18,0x00,0x00,0x00,0x00,0x00,0x80,0x09,0x00,NANA,
399 NANA,NANA,0x07,0x50,NANA,NANA,NANA,NANA,NANA,NANA,
400 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
401 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
402 NANA,NANA,RSVD,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,
404 0x00,0x00,0x00,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,
405 0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,
406 0x7f,NANA,NANA,NANA,NANA,0x00,0x00,0x02,0x00,0x99,
407 0x99,0x7f,0x7f,0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,
408 0x00,0x00,0x7f,EOT}},
410 {0x8718, "IT8718F", {
412 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
413 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
414 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
415 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
416 0x2a,0x2b,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
417 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,
418 0x42,0x43,0x44,0x45,0x50,0x51,0x52,0x53,0x54,0x56,
419 0x57,0x58,0x59,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,
420 0x62,0x63,0x64,0x65,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
421 0x70,0x71,0x72,0x73,0x74,0x75,0x80,0x81,0x82,0x83,
422 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,
423 0x92,0x94,0x95,0x96,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,
425 {0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
426 0x40,0x09,0x00,NANA,NANA,NANA,NANA,NANA,NANA,0x07,
427 0x50,MISC,MISC,MISC,NANA,NANA,NANA,NANA,NANA,NANA,
428 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
429 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
430 NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,NANA,
431 NANA,NANA,NANA,NANA,0x00,0x00,0x7f,0x7f,0x7f,0x00,
432 0x00,0x90,0x00,0x12,0x00,0x00,0x00,0x00,0x7f,0x7f,
433 0x7f,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x7f,
434 0x7f,0x7f,0x7f,0x00,0x00,0x7f,NANA,NANA,NANA,NANA,
435 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xff,0x00,
436 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
442 /* Works for: IT8661F/IT8770F */
443 static const uint8_t initkey_it8661f[][4] = {
444 {0x86, 0x61, 0x55, 0x55}, /* 0x3f0 */
445 {0x86, 0x61, 0x55, 0xaa}, /* 0x3bd */
446 {0x86, 0x61, 0xaa, 0x55}, /* 0x370 */
449 /* Works for: IT8671F/IT8687R, IT8673F */
450 static const uint8_t initkey_it8671f[][4] = {
451 {0x86, 0x80, 0x55, 0x55}, /* 0x3f0 */
452 {0x86, 0x80, 0x55, 0xaa}, /* 0x3bd */
453 {0x86, 0x80, 0xaa, 0x55}, /* 0x370 */
456 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
457 static const uint8_t initkey_mbpnp[] = {
458 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe, 0xdf, 0x6f, 0x37,
459 0x1b, 0x0d, 0x86, 0xc3, 0x61, 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45,
460 0xa2, 0xd1, 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39,
463 /* Works for: IT8661F/IT8770F, IT8671F/IT8687R, IT8673F. */
464 static void enter_conf_mode_ite_legacy(uint16_t port, const uint8_t init[][4])
468 /* Determine Super I/O config port. */
469 idx = (port == 0x3f0) ? 0 : ((port == 0x3bd) ? 1 : 2);
470 for (i = 0; i < 4; i++)
471 OUTB(init[idx][i], ISA_PNP_ADDR);
473 /* Sequentially write the 32 MB PnP init values. */
474 for (i = 0; i < 32; i++)
475 OUTB(initkey_mbpnp[i], port);
479 * IT871[01]F and IT8708F use 0x87, 0x87
480 * IT8761F uses 0x87, 0x61, 0x55, 0x55/0xaa
481 * IT86xxF series uses different ports
483 static void enter_conf_mode_ite(uint16_t port)
488 OUTB((port == 0x2e) ? 0x55 : 0xaa, port);
491 static void exit_conf_mode_ite(uint16_t port)
493 regwrite(port, 0x02, 0x02);
496 static void probe_idregs_ite_helper(const char *init, uint16_t port)
498 uint16_t id, chipver, ecport;
500 probing_for("ITE", init, port);
502 id = regval(port, CHIP_ID_BYTE1_REG) << 8;
503 id |= regval(port, CHIP_ID_BYTE2_REG);
504 chipver = regval(port, CHIP_VERSION_REG) & 0x0f; /* Only bits 3..0 */
506 if (superio_unknown(reg_table, id)) {
508 printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
512 printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
513 get_superio_name(reg_table, id), id, chipver, port);
516 dump_superio("ITE", reg_table, port, id);
519 regwrite(port, 0x07, 0x04); /* Select LDN 4 (EC). */
521 /* Get EC base address (stored in LDN 4, index 0x60/0x61). */
522 ecport = regval(port, 0x60) << 8;
523 ecport |= regval(port, 0x61);
525 /* EC address register = EC base address + 5. */
528 printf("Environment controller (0x%04x)\n", ecport);
529 dump_superio("ITE-EC", ec_table, ecport, id);
533 void probe_idregs_ite(uint16_t port)
535 if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
536 enter_conf_mode_ite_legacy(port, initkey_it8661f);
537 probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
538 exit_conf_mode_ite(port);
540 enter_conf_mode_ite_legacy(port, initkey_it8671f);
541 probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
542 exit_conf_mode_ite(port);
544 enter_conf_mode_ite(port);
545 probe_idregs_ite_helper("(init=0x87,0x01,0x55,0x55/0xaa) ", port);
546 exit_conf_mode_ite(port);
548 enter_conf_mode_winbond_fintek_ite_8787(port);
549 probe_idregs_ite_helper("(init=0x87,0x87) ", port);
550 exit_conf_mode_winbond_fintek_ite_8787(port);
554 void print_ite_chips(void)
556 print_vendor_chips("ITE", reg_table);
557 print_vendor_chips("ITE EC", ec_table);