Another indirection for normal/fallback bootblock

Provide a way to redefine the names of normal and fallback via CBFS.
This way updates can use some more expressive naming scheme (numbers,
dates, version numbers) and replace the coreboot-stages file to
point to the new version (with the current version as new "old").

If coreboot-stages doesn't exist, the default behaviour remains to
use "normal" and "fallback".

Change-Id: I77c134d79ed95831ad5098b7663c15e95d3b5a2a
Signed-off-by: Patrick Georgi <patrick@georgi-clan.de>
Reviewed-on: http://review.coreboot.org/589
Tested-by: build bot (Jenkins)
Reviewed-by: Marc Jones <marcj303@gmail.com>
This commit is contained in:
Patrick Georgi 2012-01-07 19:15:43 +01:00
parent 7a39446ec2
commit 06c04299c1
1 changed files with 15 additions and 3 deletions

View File

@ -1,10 +1,16 @@
#include <bootblock_common.h> #include <bootblock_common.h>
#include <pc80/mc146818rtc.h> #include <pc80/mc146818rtc.h>
static const char *get_fallback(const char *stagelist) {
while (*stagelist) stagelist++;
return ++stagelist;
}
static void main(unsigned long bist) static void main(unsigned long bist)
{ {
unsigned long entry; unsigned long entry;
int boot_mode; int boot_mode;
const char *default_filenames = "normal/romstage\0fallback/romstage";
if (boot_cpu()) { if (boot_cpu()) {
bootblock_northbridge_init(); bootblock_northbridge_init();
@ -24,15 +30,21 @@ static void main(unsigned long bist)
boot_mode = last_boot_normal(); boot_mode = last_boot_normal();
} }
char *filenames = (char *)walkcbfs("coreboot-stages");
if (!filenames) {
filenames = default_filenames;
}
char *normal_candidate = filenames;
if (boot_mode) if (boot_mode)
entry = findstage("normal/romstage"); entry = findstage(normal_candidate);
else else
entry = findstage("fallback/romstage"); entry = findstage(get_fallback(normal_candidate));
if (entry) call(entry, bist); if (entry) call(entry, bist);
/* run fallback if normal can't be found */ /* run fallback if normal can't be found */
entry = findstage("fallback/romstage"); entry = findstage(get_fallback(normal_candidate));
if (entry) call(entry, bist); if (entry) call(entry, bist);
/* duh. we're stuck */ /* duh. we're stuck */