Split out a dump_superio() function from ite.c, and make it slightly more
[coreboot.git] / util / superiotool / superiotool.c
index 7c3f112904a10e9534a9ced70372852d8de529f5..ad3cd45c34eef1aa74d45e2d82049464ecfc103a 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2006 Ronald Minnich <rminnich@gmail.com>
  * Copyright (C) 2007 Uwe Hermann <uwe@hermann-uwe.de>
+ * Copyright (C) 2007 Carl-Daniel Hailfinger
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,6 +34,65 @@ void regwrite(unsigned short port, unsigned char reg, unsigned char val)
        outb(val, port + 1);
 }
 
+void dump_superio(const char *name, const struct superio_registers reg_table[],
+                 unsigned short port, unsigned short id)
+{
+       int i, j, k;
+       signed short *idx;
+
+       printf("%s ", name);
+
+       for (i = 0; /* Nothing */; i++) {
+               if (reg_table[i].superio_id == EOT)
+                       break;
+
+               if ((unsigned short)reg_table[i].superio_id != id)
+                       continue;
+
+               printf("%s\n", reg_table[i].name);
+
+               for (j = 0;; j++) {
+                       if (reg_table[i].ldn[j].ldn == EOT)
+                               break;
+
+                       if (reg_table[i].ldn[j].ldn != NOLDN) {
+                               printf("Switching to LDN 0x%01x\n",
+                                      reg_table[i].ldn[j].ldn);
+                               regwrite(port, 0x07,
+                                        reg_table[i].ldn[j].ldn);
+                       }
+
+                       idx = reg_table[i].ldn[j].idx;
+
+                       printf("idx ");
+                       for (k = 0;; k++) {
+                               if (idx[k] == EOT)
+                                       break;
+                               printf("%02x ", idx[k]);
+                       }
+
+                       printf("\nval ");
+                       for (k = 0;; k++) {
+                               if (idx[k] == EOT)
+                                       break;
+                               printf("%02x ", regval(port, idx[k]));
+                       }
+
+                       printf("\ndef ");
+                       idx = reg_table[i].ldn[j].def;
+                       for (k = 0;; k++) {
+                               if (idx[k] == EOT)
+                                       break;
+                               if (idx[k] == NANA)
+                                       printf("NA ");
+                               else
+                                       printf("%02x ", idx[k]);
+                       }
+                       printf("\n");
+               }
+       }
+}
+
 void probe_superio(unsigned short port)
 {
        probe_idregs_simple(port);