elog: Handle elog in later boot phase
Use POSTPONE_SPI_ACCESS to handle elog data later boot phase to avoid flash access delay by other boot controllers. Intel has pre-CPU boot controllers (e.g. CSE) which load non-CPU firmwares. Boot-critical firmwares are loaded before CPU reset and non-boot-critical firmwares are loaded during CPU boot. If another controller accesses SPI to load firmwares, reading SPI by CPU is ok, but writing to SPI for saving elog data can take ~32ms sometimes. Saving elog data usually takes less than 1ms. There are three elog handling sequences that need to move together under the Kconfig: - Soc folder - Elog driver folder - ChromeOS folder Before this change, sometimes it delays like below: BS: callback (0x7386d428) @ src/soc/intel/pantherlake/elog.c:216 (32 ms) After this change, the delay is less than 1 ms: BS: callback (0x7386d3e8) @ src/soc/intel/pantherlake/elog.c:213 (0 ms) TEST 1. Enable DEBUG_BOOT_STATE 2. Check time BS: callback (0x7386d3e8) @ src/soc/intel/pantherlake/elog.c:213 (0 ms)) Change-Id: I3f5e7acf5204e213179664d0d77151d415d00896 Signed-off-by: Wonkyu Kim <wonkyu.kim@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/87740 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Kapil Porwal <kapilporwal@google.com>
This commit is contained in:
parent
bf330f2dd0
commit
359ae67668
3 changed files with 13 additions and 0 deletions
|
|
@ -898,4 +898,9 @@ int elog_add_extended_event(u8 type, u32 complement)
|
|||
|
||||
/* Make sure elog_init() runs at least once to log System Boot event. */
|
||||
static void elog_bs_init(void *unused) { elog_init(); }
|
||||
|
||||
#if CONFIG(POSTPONE_SPI_ACCESS)
|
||||
BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, elog_bs_init, NULL);
|
||||
#else
|
||||
BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_ENTRY, elog_bs_init, NULL);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -210,7 +210,11 @@ static void pch_log_state(void *unused)
|
|||
pch_log_wake_source(ps);
|
||||
}
|
||||
|
||||
#if CONFIG(POSTPONE_SPI_ACCESS)
|
||||
BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_ENTRY, pch_log_state, NULL);
|
||||
#else
|
||||
BOOT_STATE_INIT_ENTRY(BS_DEV_INIT, BS_ON_EXIT, pch_log_state, NULL);
|
||||
#endif
|
||||
|
||||
void elog_gsmi_cb_platform_log_wake_source(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,4 +31,8 @@ static void elog_add_vboot_info(void *unused)
|
|||
elog_add_event_raw(ELOG_TYPE_FW_VBOOT_INFO, &data, width);
|
||||
}
|
||||
|
||||
#if CONFIG(POSTPONE_SPI_ACCESS)
|
||||
BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, elog_add_vboot_info, NULL);
|
||||
#else
|
||||
BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_ENTRY, elog_add_vboot_info, NULL);
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue