boot state: schedule static callbacks

Many of the boot state callbacks can be scheduled at compile time.
Therefore, provide a way for a compilation unit to inform the
boot state machine when its callbacks should be called. Each C
module can export the callbacks and their scheduling requirements
without changing the shared boot flow code.

Change-Id: Ibc4cea4bd5ad45b2149c2d4aa91cbea652ed93ed
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/3133
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c
index dba47a7..0a5a522b 100644
--- a/src/lib/hardwaremain.c
+++ b/src/lib/hardwaremain.c
@@ -293,6 +293,23 @@
 	return boot_state_sched_callback(state, bscb, BS_ON_EXIT);
 }
 
+static void boot_state_schedule_static_entries(void)
+{
+	extern struct boot_state_init_entry _bs_init_begin;
+	extern struct boot_state_init_entry _bs_init_end;
+	struct boot_state_init_entry *cur;
+
+	cur = &_bs_init_begin;
+
+	while (cur != &_bs_init_end) {
+		if (cur->when == BS_ON_ENTRY)
+			boot_state_sched_on_entry(&cur->bscb, cur->state);
+		else
+			boot_state_sched_on_exit(&cur->bscb, cur->state);
+		cur++;
+	}
+}
+
 void hardwaremain(int boot_complete)
 {
 	timestamp_stash(TS_START_RAMSTAGE);
@@ -318,6 +335,9 @@
 		hard_reset();
 	}
 
+	/* Schedule the static boot state entries. */
+	boot_state_schedule_static_entries();
+
 	/* FIXME: Is there a better way to handle this? */
 	init_timer();