a5dcb2e7531820a70a4674e73e97a75d7485423a
[coreboot.git] / util / superiotool / superiotool.c
1 /*
2  * This file is part of the LinuxBIOS project.
3  *
4  * Copyright (C) 2006 Ronald Minnich <rminnich@gmail.com>
5  * Copyright (C) 2007 Uwe Hermann <uwe@hermann-uwe.de>
6  * Copyright (C) 2007 Carl-Daniel Hailfinger
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
21  */
22
23 #include "superiotool.h"
24
25 unsigned char regval(unsigned short port, unsigned char reg)
26 {
27         outb(reg, port);
28         return inb(port + 1);
29 }
30
31 void regwrite(unsigned short port, unsigned char reg, unsigned char val)
32 {
33         outb(reg, port);
34         outb(val, port + 1);
35 }
36
37 void dump_superio(const char *name, const struct superio_registers reg_table[],
38                   unsigned short port, unsigned short id)
39 {
40         int i, j, k;
41         signed short *idx;
42
43         printf("%s ", name);
44
45         for (i = 0; /* Nothing */; i++) {
46                 if (reg_table[i].superio_id == EOT)
47                         break;
48
49                 if ((unsigned short)reg_table[i].superio_id != id)
50                         continue;
51
52                 printf("%s\n", reg_table[i].name);
53
54                 for (j = 0;; j++) {
55                         if (reg_table[i].ldn[j].ldn == EOT)
56                                 break;
57
58                         if (reg_table[i].ldn[j].ldn != NOLDN) {
59                                 printf("Switching to LDN 0x%01x\n",
60                                        reg_table[i].ldn[j].ldn);
61                                 regwrite(port, 0x07,
62                                          reg_table[i].ldn[j].ldn);
63                         }
64
65                         idx = reg_table[i].ldn[j].idx;
66
67                         printf("idx ");
68                         for (k = 0;; k++) {
69                                 if (idx[k] == EOT)
70                                         break;
71                                 printf("%02x ", idx[k]);
72                         }
73
74                         printf("\nval ");
75                         for (k = 0;; k++) {
76                                 if (idx[k] == EOT)
77                                         break;
78                                 printf("%02x ", regval(port, idx[k]));
79                         }
80
81                         printf("\ndef ");
82                         idx = reg_table[i].ldn[j].def;
83                         for (k = 0;; k++) {
84                                 if (idx[k] == EOT)
85                                         break;
86                                 else if (idx[k] == NANA)
87                                         printf("NA ");
88                                 else if (idx[k] == RSVD)
89                                         printf("RR ");
90                                 else
91                                         printf("%02x ", idx[k]);
92                         }
93                         printf("\n");
94                 }
95         }
96 }
97
98 int main(int argc, char *argv[])
99 {
100         if (iopl(3) < 0) {
101                 perror("iopl");
102                 exit(1);
103         }
104
105         probe_idregs_simple(0x2e);
106         probe_idregs_simple(0x4e);
107
108         probe_idregs_fintek(0x2e);
109         probe_idregs_fintek(0x4e);
110
111         probe_idregs_ite(0x2e);
112         probe_idregs_ite(0x4e);
113
114         probe_idregs_smsc(0x3f0);
115         probe_idregs_smsc(0x370);
116
117         return 0;
118 }