You can call bootstage_report() at any time to print a report on boot stage timings. It should ideally be called just before U-Boot hands off execution to the next stage boot.
Signed-off-by: Simon Glass <s...@chromium.org> --- common/bootstage.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ include/bootstage.h | 3 +++ 2 files changed, 51 insertions(+), 0 deletions(-) diff --git a/common/bootstage.c b/common/bootstage.c index 10f1f34..5e0178a 100644 --- a/common/bootstage.c +++ b/common/bootstage.c @@ -47,3 +47,51 @@ uint32_t bootstage_mark(enum bootstage_id id, const char *name) } return rec->time_us; } + +static void print_time(unsigned long us_time) +{ + char str[12], *s; + int grab = 3; + + /* We don't seem to have %'d in U-Boot */ + sprintf(str, "%9ld", us_time); + for (s = str; *s; s += grab) { + if (s != str) + putc(s[-1] != ' ' ? ',' : ' '); + printf("%.*s", grab, s); + grab = 3; + } +} + +static uint32_t print_time_record(enum bootstage_id id, + struct bootstage_record *rec, uint32_t prev) +{ + print_time(rec->time_us); + print_time(rec->time_us - prev); + if (rec->name) + printf(" %s\n", rec->name); + else + printf(" id=%d\n", id); + return rec->time_us; +} + +void bootstage_report(void) +{ + int id; + uint32_t prev; + + puts("Timer summary in microseconds:\n"); + printf("%11s%11s %s\n", "Mark", "Elapsed", "Stage"); + + /* Fake the first record - we could get it from early boot */ + prev = 0; + record[BOOTSTAGE_AWAKE].name = "awake"; + + for (id = 0; id < BOOTSTAGE_COUNT; id++) { + struct bootstage_record *rec = &record[id]; + + if (id == BOOTSTAGE_AWAKE || rec->time_us != 0) + prev = print_time_record(id, rec, prev); + } +} + diff --git a/include/bootstage.h b/include/bootstage.h index ba656ff..b645434 100644 --- a/include/bootstage.h +++ b/include/bootstage.h @@ -60,6 +60,9 @@ enum bootstage_id { */ uint32_t bootstage_mark(enum bootstage_id id, const char *name); +/* Print a report about boot time */ +void bootstage_report(void); + #else static inline uint32_t bootstage_mark(enum bootstage_id id, const char *name) -- 1.7.3.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot