[flashrom] [PATCH] Allow setting delay loop speed

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Wed Jan 12 00:53:57 CET 2011


Allow setting delay loop speed from the command line.
This can speed up delay loop calibration somewhat (some time is lost to
delay loop verification).

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

Index: flashrom-specifydelayloop/cli_classic.c
===================================================================
--- flashrom-specifydelayloop/cli_classic.c	(Revision 1250)
+++ flashrom-specifydelayloop/cli_classic.c	(Arbeitskopie)
@@ -351,9 +351,6 @@
 		flash = NULL;
 	}
 
-	/* FIXME: Delay calibration should happen in programmer code. */
-	myusec_calibrate_delay();
-
 	if (programmer_init(pparam)) {
 		fprintf(stderr, "Error: Programmer initialization failed.\n");
 		exit(1);
Index: flashrom-specifydelayloop/flashrom.8
===================================================================
--- flashrom-specifydelayloop/flashrom.8	(Revision 1250)
+++ flashrom-specifydelayloop/flashrom.8	(Arbeitskopie)
@@ -220,6 +220,21 @@
 programmers use a key/value interface in which the key and value is separated
 by an equal sign and different pairs are separated by a comma or a colon.
 .TP
+.B Common parameters for all programmers
+The initial delay loop calibration of flashrom usually takes more than one
+second, and in case of a machine with high system load or variable CPU speed
+flashrom may repeat the delay loop calibration a few times until it is satisfied
+with the precision or until it gives up. You can speed up the delay loop
+calibration using
+.sp
+.B "  flashrom \-p programmername:delayloops=value"
+.sp
+where value is the number of loops per microsecond (Mloops per second) reported
+during the last flashrom run in verbose mode. flashrom will use the specified
+value as basis for the delay loop calibration, so do not worry if it is not the
+exact value. You can expect an 1 GHz CPU to have delayloop values between 250
+and 2000.
+.TP
 .BR "internal " programmer
 Some mainboards require to run mainboard specific code to enable flash erase
 and write support (and probe support on old systems with parallel flash).
Index: flashrom-specifydelayloop/flashrom.c
===================================================================
--- flashrom-specifydelayloop/flashrom.c	(Revision 1250)
+++ flashrom-specifydelayloop/flashrom.c	(Arbeitskopie)
@@ -527,6 +527,10 @@
 	programmer_param = param;
 	msg_pdbg("Initializing %s programmer\n",
 		 programmer_table[programmer].name);
+
+	/* FIXME: Delay calibration should be programmer specific. */
+	myusec_calibrate_delay();
+
 	ret = programmer_table[programmer].init();
 	if (programmer_param && strlen(programmer_param)) {
 		msg_perr("Unhandled programmer parameters: %s\n",
Index: flashrom-specifydelayloop/udelay.c
===================================================================
--- flashrom-specifydelayloop/udelay.c	(Revision 1250)
+++ flashrom-specifydelayloop/udelay.c	(Arbeitskopie)
@@ -26,6 +26,7 @@
 #include <stdlib.h>
 #include <limits.h>
 #include "flash.h"
+#include "programmer.h"
 
 /* loops per microsecond */
 static unsigned long micro = 1;
@@ -89,6 +90,7 @@
 	unsigned long count = 1000;
 	unsigned long timeusec, resolution;
 	int i, tries = 0;
+	char *delayloops;
 
 	msg_pinfo("Calibrating delay loop... ");
 	resolution = measure_os_delay_resolution();
@@ -98,6 +100,18 @@
 		msg_pinfo("OS timer resolution is unusable. ");
 	}
 
+	delayloops = extract_programmer_param("delayloops");
+	if (delayloops) {
+		micro = strtoul(delayloops, NULL, 0);
+		free(delayloops);
+		if (micro == 0) {
+			/* The delay calibration function is void, we have to
+			 * recover instead of throwing an error.
+			 */
+			micro = 1;
+		}
+	}
+
 recalibrate:
 	count = 1000;
 	while (1) {


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





More information about the flashrom mailing list