mirror of
https://github.com/fail0verflow/switch-coreboot.git
synced 2025-05-04 01:39:18 -04:00
UPSTREAM: arch/x86: cache postcar in stage cache
Stash and reload postcar stage in the stage cache for increased S3 resume speed. It's impact is small (2 ms or so), but there's no need to go to the boot media on resume to reload something that was already loaded. This aligns with the same paths we take on ramstage as well. BUG=None BRANCH=None TEST=None Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/17649 Tested-by: build bot (Jenkins) Reviewed-by: Furquan Shaikh <furquan@google.com> Change-Id: I4313794826120853163c7366e81346858747ed0a Reviewed-on: https://chromium-review.googlesource.com/416158 Commit-Ready: Furquan Shaikh <furquan@chromium.org> Tested-by: Furquan Shaikh <furquan@chromium.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
7751c63f97
commit
e75c553a4d
2 changed files with 22 additions and 7 deletions
|
@ -20,6 +20,8 @@
|
|||
#include <cpu/x86/mtrr.h>
|
||||
#include <program_loading.h>
|
||||
#include <rmodule.h>
|
||||
#include <romstage_handoff.h>
|
||||
#include <stage_cache.h>
|
||||
|
||||
static inline void stack_push(struct postcar_frame *pcf, uint32_t val)
|
||||
{
|
||||
|
@ -110,18 +112,14 @@ void *postcar_commit_mtrrs(struct postcar_frame *pcf)
|
|||
return (void *) pcf->stack;
|
||||
}
|
||||
|
||||
void run_postcar_phase(struct postcar_frame *pcf)
|
||||
static void load_postcar_cbfs(struct prog *prog, struct postcar_frame *pcf)
|
||||
{
|
||||
struct prog prog =
|
||||
PROG_INIT(PROG_UNKNOWN, CONFIG_CBFS_PREFIX "/postcar");
|
||||
struct rmod_stage_load rsl = {
|
||||
.cbmem_id = CBMEM_ID_AFTER_CAR,
|
||||
.prog = &prog,
|
||||
.prog = prog,
|
||||
};
|
||||
|
||||
postcar_commit_mtrrs(pcf);
|
||||
|
||||
if (prog_locate(&prog))
|
||||
if (prog_locate(prog))
|
||||
die("Failed to locate after CAR program.\n");
|
||||
if (rmodule_stage_load(&rsl))
|
||||
die("Failed to load after CAR program.\n");
|
||||
|
@ -139,5 +137,21 @@ void run_postcar_phase(struct postcar_frame *pcf)
|
|||
prog_segment_loaded((uintptr_t)rsl.params, sizeof(uintptr_t),
|
||||
SEG_FINAL);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_NO_STAGE_CACHE))
|
||||
stage_cache_add(STAGE_POSTCAR, prog);
|
||||
}
|
||||
|
||||
void run_postcar_phase(struct postcar_frame *pcf)
|
||||
{
|
||||
struct prog prog =
|
||||
PROG_INIT(PROG_UNKNOWN, CONFIG_CBFS_PREFIX "/postcar");
|
||||
|
||||
postcar_commit_mtrrs(pcf);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_NO_STAGE_CACHE) && romstage_handoff_is_resume())
|
||||
stage_cache_load_stage(STAGE_POSTCAR, &prog);
|
||||
else
|
||||
load_postcar_cbfs(&prog, pcf);
|
||||
|
||||
prog_run(&prog);
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
enum {
|
||||
STAGE_RAMSTAGE,
|
||||
STAGE_REFCODE,
|
||||
STAGE_POSTCAR,
|
||||
};
|
||||
|
||||
/* Cache the loaded stage provided according to the parameters. */
|
||||
|
|
Loading…
Add table
Reference in a new issue