aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86/bootblock_normal.c
diff options
context:
space:
mode:
authorStefan Reinauer <stefan.reinauer@coreboot.org>2015-07-13 09:39:15 +0200
committerStefan Reinauer <stefan.reinauer@coreboot.org>2015-07-13 21:04:56 +0200
commit6cb3a59fd5e754c3627b79db21c5bcc284bfd721 (patch)
treee83db5b11ee4a29d496dcf2798d024b6b8455ab7 /src/arch/x86/bootblock_normal.c
parent9693885ad88d21ead7bd9ebc32f3e4901841b18b (diff)
x86: flatten hierarchy
It never made sense to have bootblock_* in init, but pirq_routing.c in boot, and some ld scripts on the main level while others live in subdirectories. This patch flattens the directory hierarchy and makes x86 more similar to the other architectures. Change-Id: I4056038fe7813e4d3d3042c441e7ab6076a36384 Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-on: http://review.coreboot.org/10901 Tested-by: build bot (Jenkins) Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com> Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/arch/x86/bootblock_normal.c')
-rw-r--r--src/arch/x86/bootblock_normal.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/arch/x86/bootblock_normal.c b/src/arch/x86/bootblock_normal.c
new file mode 100644
index 0000000000..bde2535ba6
--- /dev/null
+++ b/src/arch/x86/bootblock_normal.c
@@ -0,0 +1,52 @@
+#include <smp/node.h>
+#include <bootblock_common.h>
+#include <pc80/mc146818rtc.h>
+#include <halt.h>
+
+static const char *get_fallback(const char *stagelist) {
+ while (*stagelist) stagelist++;
+ return ++stagelist;
+}
+
+static void main(unsigned long bist)
+{
+ unsigned long entry;
+ int boot_mode;
+ const char *default_filenames = "normal/romstage\0fallback/romstage";
+
+ if (boot_cpu()) {
+ bootblock_mainboard_init();
+
+#if CONFIG_USE_OPTION_TABLE
+ sanitize_cmos();
+#endif
+ boot_mode = do_normal_boot();
+ } else {
+
+ /* Questionable single byte read from CMOS.
+ * Do not add any other CMOS access in the
+ * bootblock for AP CPUs.
+ */
+ boot_mode = last_boot_normal();
+ }
+
+ char *filenames = (char *)walkcbfs("coreboot-stages");
+ if (!filenames) {
+ filenames = default_filenames;
+ }
+ char *normal_candidate = filenames;
+
+ if (boot_mode)
+ entry = findstage(normal_candidate);
+ else
+ entry = findstage(get_fallback(normal_candidate));
+
+ if (entry) call(entry, bist);
+
+ /* run fallback if normal can't be found */
+ entry = findstage(get_fallback(normal_candidate));
+ if (entry) call(entry, bist);
+
+ /* duh. we're stuck */
+ halt();
+}