lib/prog_loaders, soc/amd/: Make payload_preload use cbfs_preload
Now that CBFS has this functionality built in, we no longer need to manually code it. payload_preload used to use the payload_preload_cache region to store the raw payload contents. This region was placed outside the firmware reserved region, so it was available for use by the OS. This was possible because the payload isn't loaded again on S3 resume. cbfs_preload only uses the cbfs_cache region. This region must be reserved because it gets used on the S3 resume path. Unfortunately this means that cbfs_cache must be increased to hold the payload. Cezanne is the only platform currently using payload_preload, and the size of cbfs_cache has already been adjusted. In the future we could look into adding an option to cbfs_preload that would allow it to use a different memory pool for the cache allocation. BUG=b:179699789 TEST=Boot guybrush and verify preloading the payload was successful CBFS DEBUG: get_preload_rdev(name='fallback/payload') preload successful Signed-off-by: Raul E Rangel <rrangel@chromium.org> Change-Id: Idc521b238620ff52b8ba481cd3c10e5c4f1394bd Reviewed-on: https://review.coreboot.org/c/coreboot/+/58962 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Karthik Ramasubramanian <kramasub@google.com>
This commit is contained in:
committed by
Raul Rangel
parent
d7e7d60e0f
commit
571e7f02de
@ -127,71 +127,37 @@ fail:
|
||||
static struct prog global_payload =
|
||||
PROG_INIT(PROG_PAYLOAD, CONFIG_CBFS_PREFIX "/payload");
|
||||
|
||||
static struct thread_handle payload_preload_handle;
|
||||
|
||||
static enum cb_err payload_preload_thread_entry(void *arg)
|
||||
{
|
||||
size_t size;
|
||||
struct prog *payload = &global_payload;
|
||||
|
||||
printk(BIOS_DEBUG, "Preloading payload\n");
|
||||
|
||||
payload->cbfs_type = CBFS_TYPE_QUERY;
|
||||
|
||||
size = cbfs_type_load(prog_name(payload), _payload_preload_cache,
|
||||
REGION_SIZE(payload_preload_cache), &payload->cbfs_type);
|
||||
|
||||
if (!size) {
|
||||
printk(BIOS_ERR, "ERROR: Preloading payload failed\n");
|
||||
return CB_ERR;
|
||||
}
|
||||
|
||||
printk(BIOS_DEBUG, "Preloading payload complete\n");
|
||||
|
||||
return CB_SUCCESS;
|
||||
}
|
||||
|
||||
void payload_preload(void)
|
||||
{
|
||||
struct thread_handle *handle = &payload_preload_handle;
|
||||
|
||||
if (!CONFIG(PAYLOAD_PRELOAD))
|
||||
if (!CONFIG(CBFS_PRELOAD))
|
||||
return;
|
||||
|
||||
if (thread_run(handle, payload_preload_thread_entry, NULL))
|
||||
printk(BIOS_ERR, "ERROR: Failed to start payload preload thread\n");
|
||||
cbfs_preload(global_payload.name);
|
||||
}
|
||||
|
||||
void payload_load(void)
|
||||
{
|
||||
struct prog *payload = &global_payload;
|
||||
struct thread_handle *handle = &payload_preload_handle;
|
||||
void *mapping = NULL;
|
||||
void *buffer;
|
||||
void *mapping;
|
||||
|
||||
timestamp_add_now(TS_LOAD_PAYLOAD);
|
||||
|
||||
if (prog_locate_hook(payload))
|
||||
goto out;
|
||||
|
||||
if (CONFIG(PAYLOAD_PRELOAD) && thread_join(handle) == CB_SUCCESS) {
|
||||
buffer = _payload_preload_cache;
|
||||
} else {
|
||||
payload->cbfs_type = CBFS_TYPE_QUERY;
|
||||
mapping = cbfs_type_map(prog_name(payload), NULL, &payload->cbfs_type);
|
||||
buffer = mapping;
|
||||
}
|
||||
payload->cbfs_type = CBFS_TYPE_QUERY;
|
||||
mapping = cbfs_type_map(prog_name(payload), NULL, &payload->cbfs_type);
|
||||
|
||||
if (!buffer)
|
||||
if (!mapping)
|
||||
goto out;
|
||||
|
||||
switch (prog_cbfs_type(payload)) {
|
||||
case CBFS_TYPE_SELF: /* Simple ELF */
|
||||
selfload_mapped(payload, buffer, BM_MEM_RAM);
|
||||
selfload_mapped(payload, mapping, BM_MEM_RAM);
|
||||
break;
|
||||
case CBFS_TYPE_FIT: /* Flattened image tree */
|
||||
if (CONFIG(PAYLOAD_FIT_SUPPORT)) {
|
||||
fit_payload(payload, buffer);
|
||||
fit_payload(payload, mapping);
|
||||
break;
|
||||
} /* else fall-through */
|
||||
default:
|
||||
@ -200,8 +166,7 @@ void payload_load(void)
|
||||
break;
|
||||
}
|
||||
|
||||
if (mapping)
|
||||
cbfs_unmap(mapping);
|
||||
cbfs_unmap(mapping);
|
||||
out:
|
||||
if (prog_entry(payload) == NULL)
|
||||
die_with_post_code(POST_INVALID_ROM, "Payload not loaded.\n");
|
||||
|
Reference in New Issue
Block a user