The attached patch enables flashing on the Iwill DK8-HTX board.
Basically, it configures the SuperIO to set the right GPIO pins, so
write protection is disabled.

Signed-off-by: Mondrian Nuessle <[EMAIL PROTECTED]>
---

Ok, this is the third try :-)

* I changed the name argument to "const char*" (as suggested by Uwe,
applied that to all boards, of course)
* I fixed indent, as specified by the coding styles, notice that this
bloats the patch considerably, since a lot of existing code is touched
* fixed several typos, comments etc
* I tested this patch on real hardware, both booted by factory BIOS and
LinuxBIOS
* regarding the naming of the boards, these are the names as used in the
LinuxBIOS config and therefore correct (i.e. LinuxBIOS identifies the
dk8-htx board as iwill:dk8_htx, I did never check the the ARUMA...)
* added some explanation to the README

Regards,
Mondrian

-- 
 Mondrian Nuessle                 University of Mannheim
 Phone: +49 621 181 2717          Computer Architecture Group
 Fax:   +49 621 181 2713          http://ra.ti.uni-mannheim.de
 mailto:[EMAIL PROTECTED]

Index: util/flashrom/README
===================================================================
--- util/flashrom/README	(revision 2618)
+++ util/flashrom/README	(working copy)
@@ -47,7 +47,12 @@
 
   flashrom -w --mainboard ISLAND:ARUMA island_aruma.rom
 
+The following boards require the specification of the board name, if
+no LinuxBIOS table is found:
 
+* Iwill DK8-HTX: use -m iwill:dk8_htx
+* AGAMI ARUMA: use -m AGAMI:ARUMA
+
 ROM Layout Support
 ------------------
 
Index: util/flashrom/board_enable.c
===================================================================
--- util/flashrom/board_enable.c	(revision 2618)
+++ util/flashrom/board_enable.c	(working copy)
@@ -23,6 +23,56 @@
 #include "flash.h"
 #include "debug.h"
 
+static int board_iwill_dk8htx(const char *name)
+{
+	/* Extended function index register, either 0x2e or 0x4e    */
+#define EFIR 0x2e
+	/* Extended function data register, one plus the index reg. */
+#define EFDR EFIR + 1
+	char b;
+
+	/*  Disable the flash write protect.  The flash write protect is
+	 *  connected to the WinBond w83627hf GPIOs
+	 */
+	outb(0x87, EFIR);	/* sequence to unlock extended functions */
+	outb(0x87, EFIR);
+
+	/* activate logical devie */
+	outb(0x7, EFIR);
+	outb(8, EFDR);
+
+	/* set GPIO regs... */
+	outb(0x2b, EFIR);	/* GPIO multiplexed pin reg. */
+	b = inb(EFDR) | 0xd0;
+	outb(0x2b, EFIR);
+	outb(b, EFDR);
+
+	outb(0x30, EFIR);	/* GPIO2  */
+	b = inb(EFDR) | 0x01;
+	outb(0x30, EFIR);
+	outb(b, EFDR);
+
+	outb(0xf0, EFIR);	/* IO sel */
+	b = inb(EFDR) | 0xef;
+	outb(0xf0, EFIR);
+	outb(b, EFDR);
+
+	outb(0xf1, EFIR);	/* GPIO data reg */
+	b = inb(EFDR) | 0x16;
+	outb(0xf1, EFIR);
+	outb(b, EFDR);
+
+	outb(0xf2, EFIR);	/*GPIO inversion reg */
+	b = inb(EFDR) | 0x00;
+	outb(0xf2, EFIR);
+	outb(b, EFDR);
+
+	/*lock extended function sagain */
+	outb(0xaa, EFIR);	/* command to exit extended functions */
+
+	return 0;
+}
+
 /*
  * Match on pci-ids, no report received, just data from the mainboard
  * specific code:
@@ -30,7 +80,7 @@
  *   card: 0x1022:0x36C0...
  */
 
-static int board_agami_aruma(char *name)
+static int board_agami_aruma(const char *name)
 {
 	/* Extended function index register, either 0x2e or 0x4e    */
 #define EFIR 0x2e
@@ -38,43 +88,44 @@
 #define EFDR EFIR + 1
 	char b;
 
-        /*  Disable the flash write protect.  The flash write protect is
-         *  connected to the WinBond w83627hf GPIO 24.
-         */
-	outb(0x87, EFIR); /* sequence to unlock extended functions */
+	/*  Disable the flash write protect.  The flash write protect is
+	 *  connected to the WinBond w83627hf GPIO 24.
+	 */
+	outb(0x87, EFIR);	/* sequence to unlock extended functions */
 	outb(0x87, EFIR);
 
-	outb(0x20, EFIR); /* SIO device ID register */
+	outb(0x20, EFIR);	/* SIO device ID register */
 	b = inb(EFDR);
-	printf_debug("\nW83627HF device ID = 0x%x\n",b);
+	printf_debug("\nW83627HF device ID = 0x%x\n", b);
 
 	if (b != 0x52) {
-		fprintf(stderr, "\nIncorrect device ID, aborting write protect disable\n");
+		fprintf(stderr,
+			"\nIncorrect device ID, aborting write protect disable\n");
 		return -1;
 	}
 
-	outb(0x2b, EFIR); /* GPIO multiplexed pin reg. */
+	outb(0x2b, EFIR);	/* GPIO multiplexed pin reg. */
 	b = inb(EFDR) | 0x10;
 	outb(0x2b, EFIR);
-	outb(b, EFDR); /* select GPIO 24 instead of WDTO */
+	outb(b, EFDR);		/* select GPIO 24 instead of WDTO */
 
-	outb(0x7, EFIR); /* logical device select */
-        outb(0x8, EFDR); /* point to device 8, GPIO port 2 */
+	outb(0x7, EFIR);	/* logical device select */
+	outb(0x8, EFDR);	/* point to device 8, GPIO port 2 */
 
-	outb(0x30, EFIR); /* logic device activation control */
-	outb(0x1, EFDR); /* activate */
+	outb(0x30, EFIR);	/* logic device activation control */
+	outb(0x1, EFDR);	/* activate */
 
-	outb(0xf0, EFIR); /* GPIO 20-27 I/O selection register */
+	outb(0xf0, EFIR);	/* GPIO 20-27 I/O selection register */
 	b = inb(EFDR) & ~0x10;
 	outb(0xf0, EFIR);
-	outb(b, EFDR); /* set GPIO 24 as an output */
+	outb(b, EFDR);		/* set GPIO 24 as an output */
 
-	outb(0xf1, EFIR); /* GPIO 20-27 data register */
+	outb(0xf1, EFIR);	/* GPIO 20-27 data register */
 	b = inb(EFDR) | 0x10;
 	outb(0xf1, EFIR);
-	outb(b, EFDR); /* set GPIO 24 */
+	outb(b, EFDR);		/* set GPIO 24 */
 
-	outb(0xaa, EFIR); /* command to exit extended functions */
+	outb(0xaa, EFIR);	/* command to exit extended functions */
 
 	return 0;
 }
@@ -85,32 +136,32 @@
  * We don't need to do this when using linuxbios, GPIO15 is never lowered there.
  */
 
-static int board_via_epia_m(char *name)
+static int board_via_epia_m(const char *name)
 {
-        struct pci_dev *dev;
-        unsigned int base;
-        uint8_t val;
+	struct pci_dev *dev;
+	unsigned int base;
+	uint8_t val;
 
-        dev = pci_dev_find(0x1106, 0x3177); /* VT8235 ISA bridge */
-        if (!dev) {
-                fprintf(stderr, "\nERROR: VT8235 ISA Bridge not found.\n");
-                return -1;
-        }
+	dev = pci_dev_find(0x1106, 0x3177);	/* VT8235 ISA bridge */
+	if (!dev) {
+		fprintf(stderr, "\nERROR: VT8235 ISA Bridge not found.\n");
+		return -1;
+	}
 
-        /* GPIO12-15 -> output */
-        val = pci_read_byte(dev, 0xE4);
-        val |= 0x10;
-        pci_write_byte(dev, 0xE4, val);
+	/* GPIO12-15 -> output */
+	val = pci_read_byte(dev, 0xE4);
+	val |= 0x10;
+	pci_write_byte(dev, 0xE4, val);
 
-        /* Get Power Management IO address. */
-        base = pci_read_word(dev, 0x88) & 0xFF80;
+	/* Get Power Management IO address. */
+	base = pci_read_word(dev, 0x88) & 0xFF80;
 
-        /* enable GPIO15 which is connected to write protect. */
-        val = inb(base + 0x4D);
-        val |= 0x80;
-        outb(val, base + 0x4D);
+	/* enable GPIO15 which is connected to write protect. */
+	val = inb(base + 0x4D);
+	val |= 0x80;
+	outb(val, base + 0x4D);
 
-        return 0;
+	return 0;
 }
 
 /*
@@ -121,18 +172,18 @@
 
 static void w83697_rom_memw_enable(void)
 {
-        uint8_t val;
+	uint8_t val;
 
-        outb(0x87, 0x2E); /* enable extended functions */
-        outb(0x87, 0x2E);
+	outb(0x87, 0x2E);	/* enable extended functions */
+	outb(0x87, 0x2E);
 
-        outb(0x24, 0x2E); /* rom bits live here */
+	outb(0x24, 0x2E);	/* rom bits live here */
 
-        val = inb(0x2F);
-        if (!(val & 0x02)) /* flash rom enabled? */
-                outb(val | 0x08, 0x2F); /* enable MEMW# */
+	val = inb(0x2F);
+	if (!(val & 0x02))	/* flash rom enabled? */
+		outb(val | 0x08, 0x2F);	/* enable MEMW# */
 
-        outb(0xAA, 0x2E); /* disable extended functions */
+	outb(0xAA, 0x2E);	/* disable extended functions */
 }
 
 /*
@@ -140,25 +191,25 @@
  *
  */
 
-static int board_asus_a7v8x_mx(char *name)
+static int board_asus_a7v8x_mx(const char *name)
 {
-        struct pci_dev *dev;
-        uint8_t val;
+	struct pci_dev *dev;
+	uint8_t val;
 
-        dev = pci_dev_find(0x1106, 0x3177); /* VT8235 ISA bridge */
-        if (!dev) {
-                fprintf(stderr, "\nERROR: VT8235 ISA Bridge not found.\n");
-                return -1;
-        }
+	dev = pci_dev_find(0x1106, 0x3177);	/* VT8235 ISA bridge */
+	if (!dev) {
+		fprintf(stderr, "\nERROR: VT8235 ISA Bridge not found.\n");
+		return -1;
+	}
 
-        /* This bit is marked reserved actually */
-        val = pci_read_byte(dev, 0x59);
-        val &= 0x7F;
-        pci_write_byte(dev, 0x59, val);
+	/* This bit is marked reserved actually */
+	val = pci_read_byte(dev, 0x59);
+	val &= 0x7F;
+	pci_write_byte(dev, 0x59, val);
 
-        w83697_rom_memw_enable();
+	w83697_rom_memw_enable();
 
-        return 0;
+	return 0;
 }
 
 /*
@@ -172,36 +223,38 @@
  */
 
 struct board_pciid_enable {
-        /* Any device, but make it sensible, like the isa bridge. */
-        uint16_t  first_vendor;
-        uint16_t  first_device;
-        uint16_t  first_card_vendor;
-        uint16_t  first_card_device;
+	/* Any device, but make it sensible, like the isa bridge. */
+	uint16_t first_vendor;
+	uint16_t first_device;
+	uint16_t first_card_vendor;
+	uint16_t first_card_device;
 
-        /* Any device, but make it sensible, like 
+	/* Any device, but make it sensible, like 
 	 * the host bridge. May be NULL
 	 */
-        uint16_t  second_vendor;
-        uint16_t  second_device;
-        uint16_t  second_card_vendor;
-        uint16_t  second_card_device;
+	uint16_t second_vendor;
+	uint16_t second_device;
+	uint16_t second_card_vendor;
+	uint16_t second_card_device;
 
-        /* From linuxbios table */
-        char  *lb_vendor;
-        char  *lb_part;
+	/* From linuxbios table */
+	char *lb_vendor;
+	char *lb_part;
 
-        char  *name;
-        int  (*enable)(char *name);
+	char *name;
+	int (*enable) (const char *name);
 };
 
 struct board_pciid_enable board_pciid_enables[] = {
-        { 0x1022, 0x746B, 0x1022, 0x36C0,  0x0000, 0x0000, 0x0000, 0x0000,
-		"AGAMI", "ARUMA", "Agami Aruma", board_agami_aruma },
-        { 0x1106, 0x3177, 0x1106, 0xAA01,  0x1106, 0x3123, 0x1106, 0xAA01, 
-		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 },
-        { 0, 0, 0, 0,  0, 0, 0, 0, NULL, NULL } /* Keep this */
+	{0x1022, 0x746B, 0x1022, 0x36C0, 0x0000, 0x0000, 0x0000, 0x0000,
+	 "AGAMI", "ARUMA", "Agami Aruma", board_agami_aruma},
+	{0x1106, 0x3177, 0x1106, 0xAA01, 0x1106, 0x3123, 0x1106, 0xAA01,
+	 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},
+	{0x1022, 0x7468, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+	 "iwill", "dk8_htx", "IWILL DK8-HTX", board_iwill_dk8htx},
+	{0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL}	/* Keep this */
 
 };
 
@@ -210,27 +263,27 @@
  * Require main pci-ids to match too as extra safety.
  *
  */
-static struct board_pciid_enable *
-board_match_linuxbios_name(char *vendor, char *part)
+static struct board_pciid_enable *board_match_linuxbios_name(char *vendor,
+							     char *part)
 {
-        struct board_pciid_enable *board = board_pciid_enables;
+	struct board_pciid_enable *board = board_pciid_enables;
 
-        for (; board->name; board++) {
-                if (!board->lb_vendor || strcmp(board->lb_vendor, vendor))
-                        continue;
+	for (; board->name; board++) {
+		if (!board->lb_vendor || strcmp(board->lb_vendor, vendor))
+			continue;
 
-                if (!board->lb_part || strcmp(board->lb_part, part))
-                        continue;
+		if (!board->lb_part || strcmp(board->lb_part, part))
+			continue;
 
-                if (!pci_dev_find(board->first_vendor, board->first_device))
-                        continue;
+		if (!pci_dev_find(board->first_vendor, board->first_device))
+			continue;
 
-                if (board->second_vendor &&
-                    !pci_dev_find(board->second_vendor, board->second_device))
-                        continue;
-                return board;
-        }
-        return NULL;
+		if (board->second_vendor &&
+		    !pci_dev_find(board->second_vendor, board->second_device))
+			continue;
+		return board;
+	}
+	return NULL;
 }
 
 /*
@@ -239,35 +292,35 @@
  */
 static struct board_pciid_enable *board_match_pci_card_ids(void)
 {
-        struct board_pciid_enable *board = board_pciid_enables;
+	struct board_pciid_enable *board = board_pciid_enables;
 
-        for (; board->name; board++) {
-                if (!board->first_card_vendor || !board->first_card_device)
-                        continue;
+	for (; board->name; board++) {
+		if (!board->first_card_vendor || !board->first_card_device)
+			continue;
 
-                if (!pci_card_find(board->first_vendor, board->first_device,
-                                   board->first_card_vendor,
-                                   board->first_card_device))
-                        continue;
+		if (!pci_card_find(board->first_vendor, board->first_device,
+				   board->first_card_vendor,
+				   board->first_card_device))
+			continue;
 
-                if (board->second_vendor) {
-                        if (board->second_card_vendor) {
-                                if (!pci_card_find(board->second_vendor,
-                                                   board->second_device,
-                                                   board->second_card_vendor,
-                                                   board->second_card_device))
-                                        continue;
-                        } else {
-                                if (!pci_dev_find(board->second_vendor,
-                                                  board->second_device))
-                                        continue;
-                        }
-                }
+		if (board->second_vendor) {
+			if (board->second_card_vendor) {
+				if (!pci_card_find(board->second_vendor,
+						   board->second_device,
+						   board->second_card_vendor,
+						   board->second_card_device))
+					continue;
+			} else {
+				if (!pci_dev_find(board->second_vendor,
+						  board->second_device))
+					continue;
+			}
+		}
 
-                return board;
-        }
+		return board;
+	}
 
-        return NULL;
+	return NULL;
 }
 
 /*
@@ -275,25 +328,25 @@
  */
 int board_flash_enable(char *vendor, char *part)
 {
-        struct board_pciid_enable *board = NULL;
-        int ret = 0;
+	struct board_pciid_enable *board = NULL;
+	int ret = 0;
 
-        if (vendor && part)
-                board = board_match_linuxbios_name(vendor, part);
+	if (vendor && part)
+		board = board_match_linuxbios_name(vendor, part);
 
-        if (!board)
-                board = board_match_pci_card_ids();
+	if (!board)
+		board = board_match_pci_card_ids();
 
-        if (board) {
-                printf("Found board \"%s\": Enabling flash write... ",
-                       board->name);
+	if (board) {
+		printf("Found board \"%s\": Enabling flash write... ",
+		       board->name);
 
-                ret = board->enable(board->name);
-                if (ret)
-                        printf("Failed!\n");
-                else
-                        printf("OK.\n");
-        }
+		ret = board->enable(board->name);
+		if (ret)
+			printf("Failed!\n");
+		else
+			printf("OK.\n");
+	}
 
-        return ret;
+	return ret;
 }
-- 
linuxbios mailing list
[email protected]
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to