From 094e06a523ba040f81857609f9d889b4b57ee151 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Fri, 28 Sep 2012 08:56:35 +0000 Subject: bootstage: Export bootstage_add_record() function This function is not static, but not exported either. Add a prototype in the header file and move the required enum to the header also. Signed-off-by: Simon Glass --- include/bootstage.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'include') diff --git a/include/bootstage.h b/include/bootstage.h index a000538..64b2ec6 100644 --- a/include/bootstage.h +++ b/include/bootstage.h @@ -31,6 +31,12 @@ #define CONFIG_BOOTSTAGE_USER_COUNT 20 #endif +/* Flags for each bootstage record */ +enum bootstage_flags { + BOOTSTAGEF_ERROR = 1 << 0, /* Error record */ + BOOTSTAGEF_ALLOC = 1 << 1, /* Allocate an id */ +}; + /* * A list of boot stages that we know about. Each of these indicates the * state that we are at, and the action that we are about to perform. For @@ -221,6 +227,17 @@ void show_boot_progress(int val); #ifdef CONFIG_BOOTSTAGE /* This is the full bootstage implementation */ +/** + * Add a new bootstage record + * + * @param id Bootstage ID to use (ignored if flags & BOOTSTAGEF_ALLOC) + * @param name Name of record, or NULL for none + * @param flags Flags (BOOTSTAGEF_...) + * @param mark Time to record in this record, in microseconds + */ +ulong bootstage_add_record(enum bootstage_id id, const char *name, + int flags, ulong mark); + /* * Mark a time stamp for the current boot stage. */ -- cgit v1.1 From 0e9967735869a4e2bbc92d5d0eea0e2136180d49 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Fri, 28 Sep 2012 08:56:36 +0000 Subject: bootstage: Add time accumulation feature Sometimes we want to add up the amount of time spent in a particular activity when it is happening in a number of discrete chunks. Add bootstage_start() to mark the start of an acitivity and bootstage_accum() to accumulate the time since the last start. Calling these function in pairs results in the accumulated time being collected. Signed-off-by: Simon Glass --- include/bootstage.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'include') diff --git a/include/bootstage.h b/include/bootstage.h index 64b2ec6..127c94f 100644 --- a/include/bootstage.h +++ b/include/bootstage.h @@ -247,6 +247,33 @@ ulong bootstage_error(enum bootstage_id id); ulong bootstage_mark_name(enum bootstage_id id, const char *name); +/** + * Mark the start of a bootstage activity. The end will be marked later with + * bootstage_accum() and at that point we accumulate the time taken. Calling + * this function turns the given id into a accumulator rather than and + * absolute mark in time. Accumulators record the total amount of time spent + * in an activty during boot. + * + * @param id Bootstage id to record this timestamp against + * @param name Textual name to display for this id in the report (maybe NULL) + * @return start timestamp in microseconds + */ +uint32_t bootstage_start(enum bootstage_id id, const char *name); + +/** + * Mark the end of a bootstage activity + * + * After previously marking the start of an activity with bootstage_start(), + * call this function to mark the end. You can call these functions in pairs + * as many times as you like. + * + * @param id Bootstage id to record this timestamp against + * @return time spent in this iteration of the activity (i.e. the time now + * less the start time recorded in the last bootstage_start() call + * with this id. + */ +uint32_t bootstage_accum(enum bootstage_id id); + /* Print a report about boot time */ void bootstage_report(void); -- cgit v1.1 From 94fd1316b75896b668d22ce846785d92c0340100 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Fri, 28 Sep 2012 08:56:37 +0000 Subject: bootstage: Store boot timings in device tree Add an option, CONFIG_BOOTSTAGE_FDT to pass boot timings to the kernel in the device tree, if available. To use this, you must have CONFIG_OF_LIBFDT defined. Signed-off-by: Simon Glass --- include/bootstage.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'include') diff --git a/include/bootstage.h b/include/bootstage.h index 127c94f..9113852 100644 --- a/include/bootstage.h +++ b/include/bootstage.h @@ -277,6 +277,13 @@ uint32_t bootstage_accum(enum bootstage_id id); /* Print a report about boot time */ void bootstage_report(void); +/** + * Add bootstage information to the device tree + * + * @return 0 if ok, -ve on error + */ +int bootstage_fdt_add_report(void); + #else /* * This is a dummy implementation which just calls show_boot_progress(), -- cgit v1.1 From fcf509b80760156fe146aeb11510ffb0278b7b74 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Fri, 28 Sep 2012 08:56:38 +0000 Subject: bootstage: Add feature to stash/unstash bootstage info It is useful to be able to write the bootstage information to memory for use by a later utility, or the Linux kernel. Provide a function to do this as well as a function to read bootstage information back and incorporate it into the current table. This also makes it possible for U-Boot to chain to another U-Boot and pass on its bootstage information. Signed-off-by: Simon Glass --- include/bootstage.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'include') diff --git a/include/bootstage.h b/include/bootstage.h index 9113852..d6b4e7b 100644 --- a/include/bootstage.h +++ b/include/bootstage.h @@ -284,6 +284,27 @@ void bootstage_report(void); */ int bootstage_fdt_add_report(void); +/* + * Stash bootstage data into memory + * + * @param base Base address of memory buffer + * @param size Size of memory buffer + * @return 0 if stashed ok, -1 if out of space + */ +int bootstage_stash(void *base, int size); + +/** + * Read bootstage data from memory + * + * Bootstage data is read from memory and placed in the bootstage table + * in the user records. + * + * @param base Base address of memory buffer + * @param size Size of memory buffer (-1 if unknown) + * @return 0 if unstashed ok, -1 if bootstage info not found, or out of space + */ +int bootstage_unstash(void *base, int size); + #else /* * This is a dummy implementation which just calls show_boot_progress(), @@ -307,7 +328,15 @@ static inline ulong bootstage_mark_name(enum bootstage_id id, const char *name) return 0; } +static inline int bootstage_stash(void *base, int size) +{ + return 0; /* Pretend to succeed */ +} +static inline int bootstage_unstash(void *base, int size) +{ + return 0; /* Pretend to succeed */ +} #endif /* CONFIG_BOOTSTAGE */ #endif -- cgit v1.1 From 996e95d49d482d439b0a9fb8f7a58ce76463e5b9 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Fri, 28 Sep 2012 08:56:40 +0000 Subject: bootstage: Add new bootstage IDs for board, LCD Add bootstage IDs for board init and LCD. Signed-off-by: Simon Glass --- include/bootstage.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'include') diff --git a/include/bootstage.h b/include/bootstage.h index d6b4e7b..8fa1326 100644 --- a/include/bootstage.h +++ b/include/bootstage.h @@ -187,6 +187,7 @@ enum bootstage_id { * rough boot timing information. */ BOOTSTAGE_ID_AWAKE, + BOOTSTAGE_ID_START_SPL, BOOTSTAGE_ID_START_UBOOT_F, BOOTSTAGE_ID_START_UBOOT_R, BOOTSTAGE_ID_USB_START, @@ -198,11 +199,15 @@ enum bootstage_id { BOOTSTAGE_ID_MAIN_LOOP, BOOTSTAGE_KERNELREAD_START, BOOTSTAGE_KERNELREAD_STOP, + BOOTSTAGE_ID_BOARD_INIT, + BOOTSTAGE_ID_BOARD_INIT_DONE, BOOTSTAGE_ID_CPU_AWAKE, BOOTSTAGE_ID_MAIN_CPU_AWAKE, BOOTSTAGE_ID_MAIN_CPU_READY, + BOOTSTAGE_ID_ACCUM_LCD, + /* a few spare for the user, from here */ BOOTSTAGE_ID_USER, BOOTSTAGE_ID_COUNT = BOOTSTAGE_ID_USER + CONFIG_BOOTSTAGE_USER_COUNT, -- cgit v1.1