aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/intel/fsp2_0/silicon_init.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2020-05-15 15:09:10 -0600
committerAaron Durbin <adurbin@chromium.org>2020-05-28 19:37:18 +0000
commita85febcb1cfd31bd4d27e955fc2bcf9f8ef16cd5 (patch)
treed6e2d2dfb841b696b8df807c3ecf78b6698724d7 /src/drivers/intel/fsp2_0/silicon_init.c
parent84f394e9c0cd9a82948f0027a76c8b41b14a11bc (diff)
drivers/intel/fsp2_0: add option to compress FSP-S in cbfs
Allow the ability for chipset or mainboard to choose to compress FSP-S in cbfs using LZMA or LZ4 routines. To accomplish this fsp_load_component() is added as an assist for performing the necessary logic and allow the caller to provide the destination selection. Since the main cbfs decompression paths are utilized add the appropriate checks for including compression algorithms under the FSP-S compression options. On picasso FSP-S (debug builds) the following savings were measured: no-compression: fsps.bin 327680 none FSP_COMPRESS_FSP_S_LZ4: fsps.bin 98339 LZ4 (327680 decompressed) -70% FSP_COMPRESS_FSP_S_LZMA: fsps.bin 71275 LZMA (327680 decompressed) -78% BUG=b:155322763,b:150746858,b:152909132 Change-Id: I8aa5d8c1cbaf4d08f38a918a9031a2570bc5247e Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/41449 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
Diffstat (limited to 'src/drivers/intel/fsp2_0/silicon_init.c')
-rw-r--r--src/drivers/intel/fsp2_0/silicon_init.c60
1 files changed, 21 insertions, 39 deletions
diff --git a/src/drivers/intel/fsp2_0/silicon_init.c b/src/drivers/intel/fsp2_0/silicon_init.c
index 6af445c19e..6f3781afaf 100644
--- a/src/drivers/intel/fsp2_0/silicon_init.c
+++ b/src/drivers/intel/fsp2_0/silicon_init.c
@@ -80,15 +80,24 @@ static void do_silicon_init(struct fsp_header *hdr)
}
}
+static int fsps_get_dest(const struct fsp_load_descriptor *fspld, void **dest,
+ size_t size, const struct region_device *source)
+{
+ *dest = cbmem_add(CBMEM_ID_REFCODE, size);
+
+ if (*dest == NULL)
+ return -1;
+
+ return 0;
+}
+
void fsps_load(bool s3wake)
{
- struct fsp_header *hdr = &fsps_hdr;
- struct cbfsf file_desc;
- struct region_device rdev;
- const char *name = CONFIG_FSP_S_CBFS;
- void *dest;
- size_t size;
- struct prog fsps = PROG_INIT(PROG_REFCODE, name);
+ struct fsp_load_descriptor fspld = {
+ .fsp_prog = PROG_INIT(PROG_REFCODE, CONFIG_FSP_S_CBFS),
+ .get_destination = fsps_get_dest,
+ };
+ struct prog *fsps = &fspld.fsp_prog;
static int load_done;
if (load_done)
@@ -96,45 +105,18 @@ void fsps_load(bool s3wake)
if (s3wake && !CONFIG(NO_STAGE_CACHE)) {
printk(BIOS_DEBUG, "Loading FSPS from stage_cache\n");
- stage_cache_load_stage(STAGE_REFCODE, &fsps);
- if (fsp_validate_component(hdr, prog_rdev(&fsps)) != CB_SUCCESS)
+ stage_cache_load_stage(STAGE_REFCODE, fsps);
+ if (fsp_validate_component(&fsps_hdr, prog_rdev(fsps)) != CB_SUCCESS)
die("On resume fsps header is invalid\n");
load_done = 1;
return;
}
- if (cbfs_boot_locate(&file_desc, name, NULL)) {
- printk(BIOS_ERR, "Could not locate %s in CBFS\n", name);
- die("FSPS not available!\n");
- }
-
- cbfs_file_data(&rdev, &file_desc);
-
- /* Load and relocate into CBMEM. */
- size = region_device_sz(&rdev);
- dest = cbmem_add(CBMEM_ID_REFCODE, size);
-
- if (dest == NULL)
- die("Could not add FSPS to CBMEM!\n");
-
- if (rdev_readat(&rdev, dest, 0, size) < 0)
- die("Failed to read FSPS!\n");
-
- if (fsp_component_relocate((uintptr_t)dest, dest, size) < 0)
- die("Unable to relocate FSPS!\n");
-
- /* Create new region device in memory after relocation. */
- rdev_chain(&rdev, &addrspace_32bit.rdev, (uintptr_t)dest, size);
-
- if (fsp_validate_component(hdr, &rdev) != CB_SUCCESS)
- die("Invalid FSPS header!\n");
-
- prog_set_area(&fsps, dest, size);
+ if (fsp_load_component(&fspld, &fsps_hdr) != CB_SUCCESS)
+ die("FSP-S failed to load\n");
- stage_cache_add(STAGE_REFCODE, &fsps);
+ stage_cache_add(STAGE_REFCODE, fsps);
- /* Signal that FSP component has been loaded. */
- prog_segment_loaded(hdr->image_base, hdr->image_size, SEG_FINAL);
load_done = 1;
}