vboot: consolidate google_chromeec_early_init() calls
On x86 platforms, google_chromeec_early_init() is used to put the EC into RO mode when there's a recovery request. This is to avoid training memory multiple times when the recovery request is through an EC host event while the EC is running RW code. Under that condition the EC will be reset (along with the rest of the system) when the kernel verification happens. This leads to an execessively long recovery path because of the double reboot performing full memory training each time. By putting this logic into the verstage program this reduces the bootblock size on the skylake boards. Additionally, this provides the the correct logic for all future boards since it's not tied to FSP nor the mainboard itself. Lastly, this double memory training protection works only for platforms which verify starting from bootblock. The platforms which don't start verifying until after romstage need to have their own calls (such as haswell and baytrail). Change-Id: Ia8385dfc136b09fb20bd3519f3cc621e540b11a5 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/16318 Tested-by: build bot (Jenkins) Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
parent
70385968ce
commit
f7ce40baf6
|
@ -15,7 +15,6 @@
|
||||||
|
|
||||||
#include <arch/early_variables.h>
|
#include <arch/early_variables.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <ec/google/chromeec/ec.h>
|
|
||||||
#include <fsp/car.h>
|
#include <fsp/car.h>
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
#include <program_loading.h>
|
#include <program_loading.h>
|
||||||
|
@ -62,11 +61,6 @@ asmlinkage void *cache_as_ram_main(struct cache_as_ram_params *car_params)
|
||||||
car_soc_post_console_init();
|
car_soc_post_console_init();
|
||||||
car_mainboard_post_console_init();
|
car_mainboard_post_console_init();
|
||||||
|
|
||||||
/* Ensure the EC is in the right mode for recovery */
|
|
||||||
if (IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC) &&
|
|
||||||
!IS_ENABLED(CONFIG_SEPARATE_VERSTAGE))
|
|
||||||
google_chromeec_early_init();
|
|
||||||
|
|
||||||
set_fih_car(car_params->fih);
|
set_fih_car(car_params->fih);
|
||||||
|
|
||||||
/* Return new stack value in RAM back to assembly stub. */
|
/* Return new stack value in RAM back to assembly stub. */
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include <cbfs.h>
|
#include <cbfs.h>
|
||||||
#include <cbmem.h>
|
#include <cbmem.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <ec/google/chromeec/ec.h>
|
|
||||||
#include <elog.h>
|
#include <elog.h>
|
||||||
#include <fsp/api.h>
|
#include <fsp/api.h>
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
|
@ -296,14 +295,6 @@ void fsp_memory_init(bool s3wake)
|
||||||
if (IS_ENABLED(CONFIG_ELOG_BOOT_COUNT) && !s3wake)
|
if (IS_ENABLED(CONFIG_ELOG_BOOT_COUNT) && !s3wake)
|
||||||
boot_count_increment();
|
boot_count_increment();
|
||||||
|
|
||||||
/*
|
|
||||||
* Before doing any memory init/training, ensure that the EC is in the
|
|
||||||
* right mode. This saves an additional memory training when in recovery
|
|
||||||
* mode.
|
|
||||||
*/
|
|
||||||
if (IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC))
|
|
||||||
google_chromeec_early_init();
|
|
||||||
|
|
||||||
if (cbfs_boot_locate(&file_desc, name, NULL)) {
|
if (cbfs_boot_locate(&file_desc, name, NULL)) {
|
||||||
printk(BIOS_CRIT, "Could not locate %s in CBFS\n", name);
|
printk(BIOS_CRIT, "Could not locate %s in CBFS\n", name);
|
||||||
die("FSPM not available!\n");
|
die("FSPM not available!\n");
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <bootblock_common.h>
|
#include <bootblock_common.h>
|
||||||
#include <ec/google/chromeec/ec.h>
|
|
||||||
#include <soc/gpio.h>
|
#include <soc/gpio.h>
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
|
||||||
|
@ -28,8 +27,5 @@ static void early_config_gpio(void)
|
||||||
|
|
||||||
void bootblock_mainboard_init(void)
|
void bootblock_mainboard_init(void)
|
||||||
{
|
{
|
||||||
/* Ensure the EC and PD are in the right mode for recovery */
|
|
||||||
google_chromeec_early_init();
|
|
||||||
|
|
||||||
early_config_gpio();
|
early_config_gpio();
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <bootblock_common.h>
|
#include <bootblock_common.h>
|
||||||
#include <ec/google/chromeec/ec.h>
|
|
||||||
#include <soc/gpio.h>
|
#include <soc/gpio.h>
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
|
||||||
|
@ -28,8 +27,5 @@ static void early_config_gpio(void)
|
||||||
|
|
||||||
void bootblock_mainboard_init(void)
|
void bootblock_mainboard_init(void)
|
||||||
{
|
{
|
||||||
/* Ensure the EC and PD are in the right mode for recovery */
|
|
||||||
google_chromeec_early_init();
|
|
||||||
|
|
||||||
early_config_gpio();
|
early_config_gpio();
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <bootblock_common.h>
|
#include <bootblock_common.h>
|
||||||
#include <ec/google/chromeec/ec.h>
|
|
||||||
#include <soc/gpio.h>
|
#include <soc/gpio.h>
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
|
||||||
|
@ -28,8 +27,5 @@ static void early_config_gpio(void)
|
||||||
|
|
||||||
void bootblock_mainboard_init(void)
|
void bootblock_mainboard_init(void)
|
||||||
{
|
{
|
||||||
/* Ensure the EC and PD are in the right mode for recovery */
|
|
||||||
google_chromeec_early_init();
|
|
||||||
|
|
||||||
early_config_gpio();
|
early_config_gpio();
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <bootblock_common.h>
|
#include <bootblock_common.h>
|
||||||
#include <ec/google/chromeec/ec.h>
|
|
||||||
#include <soc/gpio.h>
|
#include <soc/gpio.h>
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
|
||||||
|
@ -28,8 +27,5 @@ static void early_config_gpio(void)
|
||||||
|
|
||||||
void bootblock_mainboard_init(void)
|
void bootblock_mainboard_init(void)
|
||||||
{
|
{
|
||||||
/* Ensure the EC and PD are in the right mode for recovery */
|
|
||||||
google_chromeec_early_init();
|
|
||||||
|
|
||||||
early_config_gpio();
|
early_config_gpio();
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <cbfs.h>
|
#include <cbfs.h>
|
||||||
#include <cbmem.h>
|
#include <cbmem.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
|
#include <ec/google/chromeec/ec.h>
|
||||||
#include <rmodule.h>
|
#include <rmodule.h>
|
||||||
#include <rules.h>
|
#include <rules.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -89,9 +90,29 @@ int vb2_logic_executed(void)
|
||||||
static void vboot_prepare(void)
|
static void vboot_prepare(void)
|
||||||
{
|
{
|
||||||
if (verification_should_run()) {
|
if (verification_should_run()) {
|
||||||
|
/*
|
||||||
|
* Note that this path isn't taken when
|
||||||
|
* CONFIG_RETURN_FROM_VERSTAGE is employed.
|
||||||
|
*/
|
||||||
verstage_main();
|
verstage_main();
|
||||||
car_set_var(vboot_executed, 1);
|
car_set_var(vboot_executed, 1);
|
||||||
vb2_save_recovery_reason_vbnv();
|
vb2_save_recovery_reason_vbnv();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Avoid double memory retrain when the EC is running RW code
|
||||||
|
* and a recovery request came in through an EC host event. The
|
||||||
|
* double retrain happens because the EC won't be rebooted
|
||||||
|
* until kernel verification notices the EC isn't running RO
|
||||||
|
* code which is after memory training. Therefore, reboot the
|
||||||
|
* EC after we've saved the potential recovery request so it's
|
||||||
|
* not lost. Lastly, only perform this sequence on x86
|
||||||
|
* platforms since those are the ones that currently do a
|
||||||
|
* costly memory training in recovery mode.
|
||||||
|
*/
|
||||||
|
if (IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC) &&
|
||||||
|
IS_ENABLED(CONFIG_ARCH_X86))
|
||||||
|
google_chromeec_early_init();
|
||||||
|
|
||||||
} else if (verstage_should_load()) {
|
} else if (verstage_should_load()) {
|
||||||
struct cbfsf file;
|
struct cbfsf file;
|
||||||
struct prog verstage =
|
struct prog verstage =
|
||||||
|
|
Loading…
Reference in New Issue