1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 15:12:36 +02:00

The delay loop is probably one of the oldest pieces of code

Clean up code duplication and measure timing of 10/100/1000/10000 us
delays.

Corresponding to flashrom svn r986.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Maciej Pijanka <maciej.pijanka@gmail.com>
This commit is contained in:
Carl-Daniel Hailfinger 2010-03-27 16:16:01 +00:00
parent 4e3d0b3a24
commit b811461abb

View File

@ -2,6 +2,7 @@
* This file is part of the flashrom project. * This file is part of the flashrom project.
* *
* Copyright (C) 2000 Silicon Integrated System Corporation * Copyright (C) 2000 Silicon Integrated System Corporation
* Copyright (C) 2009,2010 Carl-Daniel Hailfinger
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -19,6 +20,8 @@
*/ */
#include <sys/time.h> #include <sys/time.h>
#include <stdlib.h>
#include <limits.h>
#include "flash.h" #include "flash.h"
// count to a billion. Time it. If it's < 1 sec, count to 10B, etc. // count to a billion. Time it. If it's < 1 sec, count to 10B, etc.
@ -30,21 +33,30 @@ void myusec_delay(int usecs)
for (i = 0; i < usecs * micro; i++) ; for (i = 0; i < usecs * micro; i++) ;
} }
unsigned long measure_delay(int usecs)
{
unsigned long timeusec;
struct timeval start, end;
gettimeofday(&start, 0);
myusec_delay(usecs);
gettimeofday(&end, 0);
timeusec = 1000000 * (end.tv_sec - start.tv_sec) +
(end.tv_usec - start.tv_usec);
return timeusec;
}
void myusec_calibrate_delay(void) void myusec_calibrate_delay(void)
{ {
int count = 1000; int count = 1000;
unsigned long timeusec; unsigned long timeusec;
struct timeval start, end;
int ok = 0; int ok = 0;
printf("Calibrating delay loop... "); printf("Calibrating delay loop... ");
while (!ok) { while (!ok) {
gettimeofday(&start, 0); timeusec = measure_delay(count);
myusec_delay(count);
gettimeofday(&end, 0);
timeusec = 1000000 * (end.tv_sec - start.tv_sec) +
(end.tv_usec - start.tv_usec);
count *= 2; count *= 2;
if (timeusec < 1000000 / 4) if (timeusec < 1000000 / 4)
continue; continue;
@ -53,14 +65,18 @@ void myusec_calibrate_delay(void)
// compute one microsecond. That will be count / time // compute one microsecond. That will be count / time
micro = count / timeusec; micro = count / timeusec;
msg_pdbg("%ldM loops per second, ", micro);
/* We're interested in the actual precision. */
timeusec = measure_delay(10);
msg_pdbg("10 myus = %ld us, ", timeusec);
timeusec = measure_delay(100);
msg_pdbg("100 myus = %ld us, ", timeusec);
timeusec = measure_delay(1000);
msg_pdbg("1000 myus = %ld us, ", timeusec);
timeusec = measure_delay(10000);
msg_pdbg("10000 myus = %ld us, ", timeusec);
gettimeofday(&start, 0);
myusec_delay(100);
gettimeofday(&end, 0);
timeusec = 1000000 * (end.tv_sec - start.tv_sec) +
(end.tv_usec - start.tv_usec);
printf_debug("%ldM loops per second, 100 myus = %ld us. ",
(unsigned long)micro, timeusec);
printf("OK.\n"); printf("OK.\n");
} }