Can you help me? I'm working on VIA-EPIA

SONE Takeshi ts1 at tsn.or.jp
Thu Jul 24 13:12:00 CEST 2003


On Thu, Jul 24, 2003 at 08:38:44AM -0600, ron minnich wrote:
> > I thought this was a bug made by me and sent a patch to Ron some weeks ago,
> > but it seems it is not committed.
> 
> resend patch?


Attached is CVS diff against my current tree.
Beside 2 bug fixes (both by me), this includes some enhancements.
If you can't accept these, I will make a patch consists of only bug
fixes.

* Fixed to do write operation when no option but a filename is supplied
* Fixed wrong error report when enabling flash on vt8231
* Changed to report progress every 4KB instead of byte by byte on some chips
(significantly speeds up flashing those chips)
* Added -c option: only specified Flash ROM is probed; this saves
BIOS Savior users from accidentially overwrite the "known good" BIOS
if he/she forgot to toggle the switch.


Index: flash_rom.c
===================================================================
RCS file: /cvsroot/freebios/freebios/util/flash_and_burn/flash_rom.c,v
retrieving revision 1.21
diff -u -r1.21 flash_rom.c
--- flash_rom.c	22 Jul 2003 10:12:08 -0000	1.21
+++ flash_rom.c	24 Jul 2003 17:02:07 -0000
@@ -33,6 +33,7 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <pci/pci.h>
+#include <string.h>
 
 #include "flash.h"
 #include "jedec.h"
@@ -69,6 +70,8 @@
     {NULL,}
 };
 
+char *chip_to_probe = NULL;
+
 int enable_flash_sis630 (struct pci_dev *dev, char *name)
 {
     char b;
@@ -127,7 +130,6 @@
 enable_flash_e7500(struct pci_dev *dev, char *name) {
   /* register 4e.b gets or'ed with one */
   unsigned char old, new;
-  int ok;
   /* if it fails, it fails. There are so many variations of broken mobos
    * that it is hard to argue that we should quit at this point. 
    */
@@ -139,11 +141,11 @@
   if (new == old)
       return 0;
 
-  ok = pci_write_byte(dev, 0x4e, new);
+  pci_write_byte(dev, 0x4e, new);
 
-  if (ok != new) {
+  if (pci_read_byte(dev, 0x4e) != new) {
     printf("tried to set 0x%x to 0x%x on %s failed (WARNING ONLY)\n", 
-	   old, new, name);
+	   0x4e, new, name);
     return -1;
   }
   return 0;
@@ -189,21 +191,15 @@
 
 int
 enable_flash_vt8231(struct pci_dev *dev, char *name) {
-  unsigned char old, new;
-  int ok;
+  unsigned char val;
   
-  old = pci_read_byte(dev, 0x40);
-
-  new = old | 0x10;
+  val = pci_read_byte(dev, 0x40);
+  val |= 0x10;
+  pci_write_byte(dev, 0x40, val);
 
-  if (new == old)
-      return 0;
-
-  ok = pci_write_byte(dev, 0x40, new);
-
-  if (ok != 0) {
+  if (pci_read_byte(dev, 0x40) != val) {
     printf("tried to set 0x%x to 0x%x on %s failed (WARNING ONLY)\n", 
-	   old, new, name);
+	   0x40, val, name);
     return -1;
   }
   return 0;
@@ -278,6 +274,10 @@
     }
 
     while (flash->name != NULL) {
+	if (chip_to_probe && strcmp(flash->name, chip_to_probe) != 0) {
+	    flash++;
+	    continue;
+	}
 	printf("Trying %s, %d KB\n", flash->name, flash->total_size);
 	size = flash->total_size * 1024;
 	bios = mmap (0, size, PROT_WRITE | PROT_READ, MAP_SHARED,
@@ -425,10 +425,11 @@
 
 void usage(const char *name)
 {
-    printf("usage: %s [-rwv] [file]\n", name);
+    printf("usage: %s [-rwv] [-c chipname][file]\n", name);
     printf("-r: read flash and save into file\n"
         "-w: write file into flash (default when file is specified)\n"
         "-v: verify flash against file\n"
+        "-c: probe only for specified flash chip\n"
         " If no file is specified, then all that happens\n"
         " is that flash info is dumped\n");
     exit(1);
@@ -444,7 +445,10 @@
     int opt;
     int read_it = 0, write_it = 0, verify_it = 0;
     char *filename = NULL;
-    while ((opt = getopt(argc, argv, "rwv")) != EOF) {
+
+    setbuf(stdout, NULL);
+
+    while ((opt = getopt(argc, argv, "rwvc:")) != EOF) {
         switch (opt) {
         case 'r':
             read_it = 1;
@@ -455,6 +459,9 @@
         case 'v':
             verify_it = 1;
             break;
+        case 'c':
+            chip_to_probe = strdup(optarg);
+            break;
         default:
             usage(argv[0]);
             break;
@@ -509,7 +516,7 @@
         fclose(image);
     }
 
-    if (write_it)
+    if (write_it || (!read_it && !verify_it))
         flash->write (flash, buf);
     if (verify_it)
         verify_flash (flash, buf, /* verbose = */ 0);
Index: mx29f002.c
===================================================================
RCS file: /cvsroot/freebios/freebios/util/flash_and_burn/mx29f002.c,v
retrieving revision 1.4
diff -u -r1.4 mx29f002.c
--- mx29f002.c	11 Feb 2003 16:09:12 -0000	1.4
+++ mx29f002.c	24 Jul 2003 17:02:07 -0000
@@ -97,7 +97,8 @@
    printf ("Programming Page: ");
     for (i = 0; i < total_size; i++) {
 	/* write to the sector */
-	printf ("address: 0x%08lx", i);
+	if ((i & 0xfff) == 0)
+	    printf ("address: 0x%08lx", i);
 	*(bios + 0x5555) = 0xAA;
 	*(bios + 0x2AAA) = 0x55;
 	*(bios + 0x5555) = 0xA0;
@@ -106,7 +107,8 @@
 	/* wait for Toggle bit ready */
 	toggle_ready_jedec(dst);
 
-	printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
+	if ((i & 0xfff) == 0)
+	    printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
     }
 #endif
     printf("\n");
Index: w49f002u.c
===================================================================
RCS file: /cvsroot/freebios/freebios/util/flash_and_burn/w49f002u.c,v
retrieving revision 1.2
diff -u -r1.2 w49f002u.c
--- w49f002u.c	28 Feb 2003 17:21:38 -0000	1.2
+++ w49f002u.c	24 Jul 2003 17:02:07 -0000
@@ -97,7 +97,8 @@
    printf ("Programming Page: ");
     for (i = 0; i < total_size; i++) {
 	/* write to the sector */
-	printf ("address: 0x%08lx", i);
+	if ((i & 0xfff) == 0)
+	    printf ("address: 0x%08lx", i);
 	*(bios + 0x5555) = 0xAA;
 	*(bios + 0x2AAA) = 0x55;
 	*(bios + 0x5555) = 0xA0;
@@ -106,7 +107,8 @@
 	/* wait for Toggle bit ready */
 	toggle_ready_jedec(dst);
 
-	printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
+	if ((i & 0xfff) == 0)
+	    printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
     }
 #endif
     printf("\n");



More information about the coreboot mailing list