summaryrefslogtreecommitdiff
path: root/util/flashrom/board_enable.c
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2007-05-20 16:16:13 +0000
committerUwe Hermann <uwe@hermann-uwe.de>2007-05-20 16:16:13 +0000
commita56b99879680890283a4f0a9788b950d48b41986 (patch)
tree10e943b9e0410e93a7faba7c3dfddcd1485220c0 /util/flashrom/board_enable.c
parent9a2193e6f1a82a837c3562bb4b311fd2c3c5f007 (diff)
downloadcoreboot-a56b99879680890283a4f0a9788b950d48b41986.tar.xz
Flashrom: add support for ASUS P5A (Socket 7, ALi based).
* Add support for the ALi M1533 to chipset_enable.c * Add some SMBus poking needed for the ASUS P5A, to board_enable.c Since PCI subsystem IDs are worthless with this board, people will have to name the board directly. Signed-off-by: Luc Verhaegen <libv@skynet.be> Signed-off-by: Uwe Hermann <uwe@hermann-uwe.de> Acked-by: Uwe Hermann <uwe@hermann-uwe.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2677 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'util/flashrom/board_enable.c')
-rw-r--r--util/flashrom/board_enable.c82
1 files changed, 80 insertions, 2 deletions
diff --git a/util/flashrom/board_enable.c b/util/flashrom/board_enable.c
index 10608adca0..27d2d01988 100644
--- a/util/flashrom/board_enable.c
+++ b/util/flashrom/board_enable.c
@@ -138,7 +138,7 @@ static int board_via_epia_m(const char *name)
}
/*
- * Suited for Asus A7V8X-MX SE and A7V400-MX.
+ * Suited for ASUS A7V8X-MX SE and A7V400-MX.
*
*/
@@ -170,6 +170,83 @@ static int board_asus_a7v8x_mx(const char *name)
}
/*
+ * Suited for ASUS P5A.
+ *
+ * This is rather nasty code, but there's no way to do this cleanly.
+ * We're basically talking to some unknown device on SMBus, my guess
+ * is that it is the Winbond W83781D that lives near the DIP BIOS.
+ */
+
+static int board_asus_p5a(const char *name)
+{
+ uint8_t tmp;
+ int i;
+
+#define ASUSP5A_LOOP 5000
+
+ outb(0x00, 0xE807);
+ outb(0xEF, 0xE803);
+
+ outb(0xFF, 0xE800);
+
+ for (i = 0; i < ASUSP5A_LOOP; i++) {
+ outb(0xE1, 0xFF);
+ if (inb(0xE800) & 0x04)
+ break;
+ }
+
+ if (i == ASUSP5A_LOOP) {
+ printf("%s: Unable to contact device.\n", name);
+ return -1;
+ }
+
+ outb(0x20, 0xE801);
+ outb(0x20, 0xE1);
+
+ outb(0xFF, 0xE802);
+
+ for (i = 0; i < ASUSP5A_LOOP; i++) {
+ tmp = inb(0xE800);
+ if (tmp & 0x70)
+ break;
+ }
+
+ if ((i == ASUSP5A_LOOP) || !(tmp & 0x10)) {
+ printf("%s: failed to read device.\n", name);
+ return -1;
+ }
+
+ tmp = inb(0xE804);
+ tmp &= ~0x02;
+
+ outb(0x00, 0xE807);
+ outb(0xEE, 0xE803);
+
+ outb(tmp, 0xE804);
+
+ outb(0xFF, 0xE800);
+ outb(0xE1, 0xFF);
+
+ outb(0x20, 0xE801);
+ outb(0x20, 0xE1);
+
+ outb(0xFF, 0xE802);
+
+ for (i = 0; i < ASUSP5A_LOOP; i++) {
+ tmp = inb(0xE800);
+ if (tmp & 0x70)
+ break;
+ }
+
+ if ((i == ASUSP5A_LOOP) || !(tmp & 0x10)) {
+ printf("%s: failed to write to device.\n", name);
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
* We use 2 sets of ids here, you're free to choose which is which. This
* to provide a very high degree of certainty when matching a board on
* the basis of Subsystem/card ids. As not every vendor handles
@@ -211,7 +288,8 @@ struct board_pciid_enable board_pciid_enables[] = {
NULL, NULL, "VIA EPIA M/MII/...", board_via_epia_m},
{0x1106, 0x3177, 0x1043, 0x80A1, 0x1106, 0x3205, 0x1043, 0x8118,
NULL, NULL, "ASUS A7V8-MX SE", board_asus_a7v8x_mx},
-
+ {0x10B9, 0x1541, 0x0000, 0x0000, 0x10B9, 0x1533, 0x0000, 0x0000,
+ "asus", "p5a", "ASUS P5A", board_asus_p5a},
{0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL} /* Keep this */
};