[flashrom] [PATCH] Reenable forced read

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Thu Feb 16 21:18:06 CET 2012


Am 16.02.2012 19:15 schrieb Carl-Daniel Hailfinger:
> Forced read functionality was disabled when programmer registration was
> merged in r.
>
> We now support registering more than one controller at once for each bus
> type. This can happen e.g. if one SPI controller has an attached flash
> chip and one controller doesn't. In such a case we rely on the probe
> mechanism to find exactly one chip, and the probe mechanism will
> remember which controller/bus the flash chip is attached to. A forced
> read does not have the luxury of knowing which compatible controller to
> use, so this case is handled by always picking the first one. That may
> or may not be the correct one, but there is no way (yet) to specify
> which controller a flash chip is attached to.
>
> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

Index: flashrom-forced_read_reenable/cli_classic.c
===================================================================
--- flashrom-forced_read_reenable/cli_classic.c	(Revision 1495)
+++ flashrom-forced_read_reenable/cli_classic.c	(Arbeitskopie)
@@ -168,7 +168,7 @@
 	struct flashctx *fill_flash;
 	const char *name;
 	int namelen, opt, i, j;
-	int startchip = 0, chipcount = 0, option_index = 0, force = 0;
+	int startchip = -1, chipcount = 0, option_index = 0, force = 0;
 #if CONFIG_PRINT_WIKI == 1
 	int list_supported_wiki = 0;
 #endif
@@ -456,11 +456,27 @@
 			printf("Note: flashrom can never write if the flash "
 			       "chip isn't found automatically.\n");
 		}
-#if 0 // FIXME: What happens for a forced chip read if multiple compatible programmers are registered?
 		if (force && read_it && chip_to_probe) {
+			struct registered_programmer *pgm;
+			int compatible_programmers = 0;
 			printf("Force read (-f -r -c) requested, pretending "
 			       "the chip is there:\n");
-			startchip = probe_flash(0, &flashes[0], 1);
+			/* This loop just counts compatible controllers. */
+			for (j = 0; j < registered_programmer_count; j++) {
+				pgm = &registered_programmers[j];
+				if (pgm->buses_supported & flashes[0].bustype)
+					compatible_programmers++;
+			}
+			if (compatible_programmers > 1)
+				printf("More than one compatible controller "
+				       "found for the requested flash chip, "
+				       "using the first one.\n");
+			for (j = 0; j < registered_programmer_count; j++) {
+				pgm = &registered_programmers[j];
+				startchip = probe_flash(pgm, 0, &flashes[0], 1);
+				if (startchip != -1)
+					break;
+			}
 			if (startchip == -1) {
 				printf("Probing for flash chip '%s' failed.\n",
 				       chip_to_probe);
@@ -471,7 +487,6 @@
 			       "contain garbage.\n");
 			return read_flash_to_file(&flashes[0], filename);
 		}
-#endif
 		ret = 1;
 		goto out_shutdown;
 	} else if (!chip_to_probe) {


-- 
http://www.hailfinger.org/





More information about the flashrom mailing list