timestamps: You can never have enough of them!

Now that we have timestamps in pre-RAM stages, let's actually make use
of them. This patch adds several timestamps to both the bootblock and
especially the verstage to allow more fine-grained boot time tracking.

Some of the introduced timestamps can appear more than once per boot.
This doesn't seem to be a problem for both coreboot and the cbmem
utility, and the context makes it clear which operation was timestamped
at what point.

Also simplifies cbmem's timestamp printing routine a bit, fixing a
display bug when a timestamp had a section of exactly ",000," in it
(e.g. 1,000,185).

BRANCH=None
BUG=None
TEST=Booted Pinky, Blaze and Falco, confirmed that all timestamps show
up and contained sane values. Booted Storm (no timestamps here since it
doesn't support pre-RAM timestamps yet).

Change-Id: I7f4d6aba3ebe3db0d003c7bcb2954431b74961b3
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: 7a2ce81722aba85beefcc6c81f9908422b8da8fa
Original-Change-Id: I5979bfa9445a9e0aba98ffdf8006c21096743456
Original-Signed-off-by: Julius Werner <jwerner@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/234063
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/9608
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
diff --git a/src/lib/loaders/load_and_run_romstage.c b/src/lib/loaders/load_and_run_romstage.c
index 8467e90..9bd9603 100644
--- a/src/lib/loaders/load_and_run_romstage.c
+++ b/src/lib/loaders/load_and_run_romstage.c
@@ -24,6 +24,7 @@
 #include <cbfs.h>
 #include <halt.h>
 #include <program_loading.h>
+#include <timestamp.h>
 
 void run_romstage(void)
 {
@@ -32,11 +33,13 @@
 		.type = PROG_ROMSTAGE,
 	};
 
+	timestamp_add_now(TS_START_COPYROM);
 	if (cbfs_load_prog_stage(CBFS_DEFAULT_MEDIA, &romstage) < 0) {
 		if (IS_ENABLED(CONFIG_BOOTBLOCK_CONSOLE))
 			die("Couldn't load romstage.\n");
 		halt();
 	}
+	timestamp_add_now(TS_END_COPYROM);
 
 	prog_run(&romstage);
 }
diff --git a/src/lib/lzma.c b/src/lib/lzma.c
index 8efa1e6..89e4d97 100644
--- a/src/lib/lzma.c
+++ b/src/lib/lzma.c
@@ -12,6 +12,7 @@
 #include <console/console.h>
 #include <string.h>
 #include <lib.h>
+#include <timestamp.h>
 
 #include "lzmadecode.h"
 
@@ -27,6 +28,8 @@
 	MAYBE_STATIC unsigned char scratchpad[15980];
 	unsigned char *cp;
 
+	/* Note: these timestamps aren't useful for memory-mapped media (x86) */
+	timestamp_add_now(TS_START_ULZMA);
 	memcpy(properties, src, LZMA_PROPERTIES_SIZE);
 	/* The outSize in LZMA stream is a 64bit integer stored in little-endian
 	 * (ref: lzma.cc@LZMACompress: put_64). To prevent accessing by
@@ -50,5 +53,6 @@
 		printk(BIOS_WARNING, "lzma: Decoding error = %d\n", res);
 		return 0;
 	}
+	timestamp_add_now(TS_END_ULZMA);
 	return outSize;
 }
diff --git a/src/lib/timestamp.c b/src/lib/timestamp.c
index 67635f8..5846781 100644
--- a/src/lib/timestamp.c
+++ b/src/lib/timestamp.c
@@ -25,7 +25,7 @@
 #include <arch/early_variables.h>
 #include <smp/node.h>
 
-#define MAX_TIMESTAMPS 30
+#define MAX_TIMESTAMPS 60
 
 static struct timestamp_table* ts_table_p CAR_GLOBAL = NULL;
 static uint64_t ts_basetime CAR_GLOBAL = 0;