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/include/bootstate.h b/src/include/bootstate.h
index a2eacfb..f28c07f 100644
--- a/src/include/bootstate.h
+++ b/src/include/bootstate.h
@@ -158,4 +158,25 @@
 /* Entry into the boot state machine. */
 void hardwaremain(int boot_complete);
 
+/* In order to schedule boot state callbacks at compile-time specify the
+ * entries in an array using the BOOT_STATE_INIT_ENTRIES and
+ * BOOT_STATE_INIT_ENTRY macros below. */
+struct boot_state_init_entry {
+	boot_state_t state;
+	boot_state_sequence_t when;
+	struct boot_state_callback bscb;
+};
+
+#define BOOT_STATE_INIT_ATTR  __attribute__ ((used,section (".bs_init")))
+
+#define BOOT_STATE_INIT_ENTRIES(name_) \
+	static struct boot_state_init_entry name_[] BOOT_STATE_INIT_ATTR
+
+#define BOOT_STATE_INIT_ENTRY(state_, when_, func_, arg_)	\
+	{							\
+		.state = state_,				\
+		.when = when_,					\
+		.bscb = BOOT_STATE_CALLBACK_INIT(func_, arg_),	\
+	}
+
 #endif /* BOOTSTATE_H */