blob: 4bc9b013328c440fa80357244e342602c928dc92 [file] [log] [blame]
Patrick Georgi11f00792020-03-04 15:10:45 +01001/* SPDX-License-Identifier: GPL-2.0-only */
Kyösti Mälkkib8d575c2019-12-16 16:00:49 +02002
3#include <cbfs.h>
Kyösti Mälkkia5811662020-01-04 22:07:37 +02004#include <fallback.h>
Kyösti Mälkkib8d575c2019-12-16 16:00:49 +02005#include <program_loading.h>
6#include <stddef.h>
Kyösti Mälkkib8d575c2019-12-16 16:00:49 +02007
8static const char *get_fallback(const char *stagelist)
9{
10 while (*stagelist)
11 stagelist++;
12 return ++stagelist;
13}
14
Julius Werner797a1102022-03-07 18:54:47 -080015enum cb_err legacy_romstage_select_and_load(struct prog *romstage)
Kyösti Mälkkib8d575c2019-12-16 16:00:49 +020016{
17 static const char *default_filenames = "normal/romstage\0fallback/romstage";
18 const char *boot_candidate;
19 size_t stages_len;
20
Julius Werner834b3ec2020-03-04 16:52:08 -080021 boot_candidate = cbfs_map("coreboot-stages", &stages_len);
Kyösti Mälkkib8d575c2019-12-16 16:00:49 +020022 if (!boot_candidate)
23 boot_candidate = default_filenames;
24
25 if (do_normal_boot()) {
26 romstage->name = boot_candidate;
Julius Werner797a1102022-03-07 18:54:47 -080027 if (cbfs_prog_stage_load(romstage) == CB_SUCCESS)
28 return CB_SUCCESS;
Kyösti Mälkkib8d575c2019-12-16 16:00:49 +020029 }
30
31 romstage->name = get_fallback(boot_candidate);
Julius Werner1de87082020-12-23 17:38:11 -080032 return cbfs_prog_stage_load(romstage);
Kyösti Mälkkib8d575c2019-12-16 16:00:49 +020033}