summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/intel/fsp1_1/car.c8
-rw-r--r--src/drivers/intel/fsp1_1/fsp_relocate.c15
-rw-r--r--src/drivers/intel/fsp1_1/include/fsp/util.h4
-rw-r--r--src/drivers/intel/fsp1_1/ramstage.c17
-rw-r--r--src/drivers/intel/fsp1_1/temp_ram_exit.c7
-rw-r--r--src/include/program_loading.h23
-rw-r--r--src/lib/prog_loaders.c17
7 files changed, 20 insertions, 71 deletions
diff --git a/src/drivers/intel/fsp1_1/car.c b/src/drivers/intel/fsp1_1/car.c
index 9b47e71db1..5d41a017b6 100644
--- a/src/drivers/intel/fsp1_1/car.c
+++ b/src/drivers/intel/fsp1_1/car.c
@@ -2,13 +2,13 @@
#include <arch/romstage.h>
#include <arch/symbols.h>
+#include <cbfs.h>
#include <cbmem.h>
#include <console/console.h>
#include <commonlib/helpers.h>
#include <cpu/x86/mtrr.h>
#include <fsp/car.h>
#include <fsp/util.h>
-#include <program_loading.h>
void fill_postcar_frame(struct postcar_frame *pcf)
{
@@ -27,14 +27,14 @@ void mainboard_romstage_entry(void)
{
/* Need to locate the current FSP_INFO_HEADER. The cache-as-ram
* is still enabled. We can directly access work buffer here. */
- struct prog fsp = PROG_INIT(PROG_REFCODE, "fsp.bin");
+ void *fsp = cbfs_map("fsp.bin", NULL);
- if (prog_locate(&fsp))
+ if (!fsp)
die_with_post_code(POST_INVALID_CBFS, "Unable to locate fsp.bin");
/* This leaks a mapping which this code assumes is benign as
* the flash is memory mapped CPU's address space. */
- FSP_INFO_HEADER *fih = find_fsp((uintptr_t)rdev_mmap_full(prog_rdev(&fsp)));
+ FSP_INFO_HEADER *fih = find_fsp((uintptr_t)fsp);
if (!fih)
die("Invalid FSP header\n");
diff --git a/src/drivers/intel/fsp1_1/fsp_relocate.c b/src/drivers/intel/fsp1_1/fsp_relocate.c
index d078f5998d..7aaba82e6b 100644
--- a/src/drivers/intel/fsp1_1/fsp_relocate.c
+++ b/src/drivers/intel/fsp1_1/fsp_relocate.c
@@ -1,29 +1,24 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <console/console.h>
+#include <cbfs.h>
#include <cbmem.h>
#include <commonlib/fsp.h>
#include <fsp/util.h>
-int fsp_relocate(struct prog *fsp_relocd, const struct region_device *fsp_src)
+int fsp_relocate(struct prog *fsp_relocd)
{
- void *new_loc;
void *fih;
ssize_t fih_offset;
- size_t size = region_device_sz(fsp_src);
-
- new_loc = cbmem_add(CBMEM_ID_REFCODE, size);
+ size_t size;
+ void *new_loc = cbfs_cbmem_alloc(prog_name(fsp_relocd),
+ CBMEM_ID_REFCODE, &size);
if (new_loc == NULL) {
printk(BIOS_ERR, "ERROR: Unable to load FSP into memory.\n");
return -1;
}
- if (rdev_readat(fsp_src, new_loc, 0, size) != size) {
- printk(BIOS_ERR, "ERROR: Can't read FSP's region device.\n");
- return -1;
- }
-
fih_offset = fsp1_1_relocate((uintptr_t)new_loc, new_loc, size);
if (fih_offset <= 0) {
diff --git a/src/drivers/intel/fsp1_1/include/fsp/util.h b/src/drivers/intel/fsp1_1/include/fsp/util.h
index e67ecd16d0..e1fb59605a 100644
--- a/src/drivers/intel/fsp1_1/include/fsp/util.h
+++ b/src/drivers/intel/fsp1_1/include/fsp/util.h
@@ -40,10 +40,10 @@ static inline uint32_t fsp_version(FSP_INFO_HEADER *fih)
/*
* Relocate FSP entire binary into ram. Returns < 0 on error, 0 on success.
- * The FSP source is pointed to by region_device and the relocation information
+ * The CBFS file name of the FSP source and the relocation information
* is encoded in a struct prog with its entry point set to the FSP info header.
*/
-int fsp_relocate(struct prog *fsp_relocd, const struct region_device *fsp_src);
+int fsp_relocate(struct prog *fsp_relocd);
/* Additional HOB types not included in the FSP:
* #define EFI_HOB_TYPE_HANDOFF 0x0001
diff --git a/src/drivers/intel/fsp1_1/ramstage.c b/src/drivers/intel/fsp1_1/ramstage.c
index 22d4f1c8be..b10fccd5e4 100644
--- a/src/drivers/intel/fsp1_1/ramstage.c
+++ b/src/drivers/intel/fsp1_1/ramstage.c
@@ -144,21 +144,6 @@ static void fsp_run_silicon_init(FSP_INFO_HEADER *fsp_info_header)
soc_after_silicon_init();
}
-static int fsp_find_and_relocate(struct prog *fsp)
-{
- if (prog_locate(fsp)) {
- printk(BIOS_ERR, "ERROR: Couldn't find %s\n", prog_name(fsp));
- return -1;
- }
-
- if (fsp_relocate(fsp, prog_rdev(fsp))) {
- printk(BIOS_ERR, "ERROR: FSP relocation failed.\n");
- return -1;
- }
-
- return 0;
-}
-
static void fsp_load(void)
{
struct prog fsp = PROG_INIT(PROG_REFCODE, "fsp.bin");
@@ -166,7 +151,7 @@ static void fsp_load(void)
if (resume_from_stage_cache()) {
stage_cache_load_stage(STAGE_REFCODE, &fsp);
} else {
- fsp_find_and_relocate(&fsp);
+ fsp_relocate(&fsp);
if (prog_entry(&fsp))
stage_cache_add(STAGE_REFCODE, &fsp);
diff --git a/src/drivers/intel/fsp1_1/temp_ram_exit.c b/src/drivers/intel/fsp1_1/temp_ram_exit.c
index df7e67459b..4fb95da76c 100644
--- a/src/drivers/intel/fsp1_1/temp_ram_exit.c
+++ b/src/drivers/intel/fsp1_1/temp_ram_exit.c
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <cbmem.h>
+#include <cbfs.h>
#include <console/console.h>
#include <fsp/util.h>
@@ -9,13 +10,13 @@ asmlinkage void chipset_teardown_car_main(void)
FSP_INFO_HEADER *fih;
uint32_t status;
FSP_TEMP_RAM_EXIT temp_ram_exit;
- struct prog fsp = PROG_INIT(PROG_REFCODE, "fsp.bin");
/* CBMEM_ID_VBOOT_WORKBUF is used as vboot workbuffer.
* Init CBMEM before loading fsp, to have buffer available */
cbmem_initialize();
- if (prog_locate(&fsp)) {
+ void *fsp = cbfs_map("fsp.bin", NULL);
+ if (!fsp) {
die("Unable to locate fsp.bin\n");
} else {
/* This leaks a mapping which this code assumes is benign as
@@ -25,7 +26,7 @@ asmlinkage void chipset_teardown_car_main(void)
as it casts error values to FSP_INFO_HEADER pointers.
Checking for return values can only be done sanely once
that is fixed. */
- fih = find_fsp((uintptr_t)rdev_mmap_full(prog_rdev(&fsp)));
+ fih = find_fsp((uintptr_t)fsp);
}
temp_ram_exit = (FSP_TEMP_RAM_EXIT)(fih->TempRamExitEntryOffset +
diff --git a/src/include/program_loading.h b/src/include/program_loading.h
index f936c618ad..bb4f6ea1d2 100644
--- a/src/include/program_loading.h
+++ b/src/include/program_loading.h
@@ -41,8 +41,7 @@ void arch_segment_loaded(uintptr_t start, size_t size, int flags);
/* Representation of a program. */
struct prog {
- /* The region_device is the source of program content to load. After
- * loading program it represents the memory region of the stages and
+ /* The region_device represents the memory region of the stages and
* payload. For architectures that use a bounce buffer
* then it would represent the bounce buffer. */
enum prog_type type;
@@ -128,13 +127,10 @@ static inline void prog_set_arg(struct prog *prog, void *arg)
prog->arg = arg;
}
-/* Locate the identified program to run. Return 0 on success. < 0 on error. */
-int prog_locate(struct prog *prog);
/* The prog_locate_hook() is called prior to CBFS traversal. The hook can be
- * used to implement policy that allows or prohibits further progress through
- * prog_locate(). The type and name field within struct prog are the only valid
- * fields. A 0 return value allows further progress while a non-zero return
- * value prohibits further progress */
+ * used to implement policy that allows or prohibits further program loading.
+ * The type and name field within struct prog are the only valid fields. A 0
+ * return value allows loading while a non-zero return value prohibits it. */
int prog_locate_hook(struct prog *prog);
/* Run the program described by prog. */
@@ -147,17 +143,6 @@ void arch_prog_run(struct prog *prog);
* code it needs to that as well. */
void platform_prog_run(struct prog *prog);
-struct prog_loader_ops {
- const char *name;
- /* Determine if the loader is the active one. If so returns 1 else 0
- * or < 0 on error. */
- int (*is_loader_active)(struct prog *prog);
- /* Returns < 0 on error or 0 on success. This function locates
- * the rdev representing the file data associated with the passed in
- * prog. */
- int (*locate)(struct prog *prog);
-};
-
/************************
* ROMSTAGE LOADING *
************************/
diff --git a/src/lib/prog_loaders.c b/src/lib/prog_loaders.c
index 22abeb5dfd..28c6bf7978 100644
--- a/src/lib/prog_loaders.c
+++ b/src/lib/prog_loaders.c
@@ -20,23 +20,6 @@
const struct mem_region_device addrspace_32bit =
MEM_REGION_DEV_RO_INIT(0, ~0UL);
-int prog_locate(struct prog *prog)
-{
- struct cbfsf file;
-
- if (prog_locate_hook(prog))
- return -1;
-
- if (cbfs_boot_locate(&file, prog_name(prog), NULL))
- return -1;
-
- cbfsf_file_type(&file, &prog->cbfs_type);
-
- cbfs_file_data(prog_rdev(prog), &file);
-
- return 0;
-}
-
void run_romstage(void)
{
struct prog romstage =