Here's the chip_enable code for the ALI M1533 and the board_enable for 
the Asus P5A, an ALI M1541+M1533 socket 7 motherboard.

It's quite nasty:
It does an SMBUS read/write to a yet unidentified device, i think it is 
the superio, but i'm not sure.
The Asus P5A also seriously messes up pci-ids, there is nothing 
dependable there, so people who want to use flashrom on this board 
should use -m asus:p5a

but it works :)

This is a board i own myself and this has been tested successfully.

Luc Verhaegen.
flashrom: add support for asus p5a (Socket7, 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 <[EMAIL PROTECTED]>
Index: chipset_enable.c
===================================================================
--- chipset_enable.c    (revision 2663)
+++ chipset_enable.c    (working copy)
@@ -18,6 +18,19 @@
 #include "flash.h"
 #include "debug.h"
 
+static int enable_flash_ali_m1533(struct pci_dev *dev, char *name)
+{
+       uint8_t tmp;
+
+       /* ROM Write enable, 0xFFFC0000-0xFFFDFFFF and
+          0xFFFE0000-0xFFFFFFFF ROM select enable */
+       tmp = pci_read_byte(dev, 0x47);
+       tmp |= 0x46;
+       pci_write_byte(dev, 0x47, tmp);
+
+       return 0;
+}
+
 static int enable_flash_sis630(struct pci_dev *dev, char *name)
 {
        char b;
@@ -410,6 +423,7 @@
        {0x100b, 0x0510, "SC1100", enable_flash_sc1100},
        {0x1039, 0x0008, "SIS5595", enable_flash_sis5595},
        {0x1022, 0x7468, "AMD8111", enable_flash_amd8111},
+       {0x10B9, 0x1533, "ALI M1533", enable_flash_ali_m1533},
        /* this fallthrough looks broken. */
        {0x10de, 0x0050, "NVIDIA CK804", enable_flash_ck804},   /* LPC */
        {0x10de, 0x0051, "NVIDIA CK804", enable_flash_ck804},   /* Pro */
Index: README
===================================================================
--- README      (revision 2663)
+++ README      (working copy)
@@ -52,6 +52,7 @@
 
 * IWILL DK8-HTX: use -m iwill:dk8_htx
 * agami Aruma: use -m AGAMI:ARUMA
+* Asus P5A: use -m asus:p5a
 
 
 ROM Layout Support
Index: board_enable.c
===================================================================
--- board_enable.c      (revision 2663)
+++ board_enable.c      (working copy)
@@ -170,6 +170,83 @@
 }
 
 /*
+ * 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 @@
         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 */
 };
 
-- 
linuxbios mailing list
[email protected]
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to