reset: Provide new single-function reset API
board_reset() replaces the existing common reset API. There is no common distinction between reset types across platforms, hence, common code could never decide which one to call. Currently only hard_reset() is used by common code. We replace these calls and provide a fall-back to the current hard_reset() implemen- tation. The fall-back will be removed along with hard_reset() after the transition of all boards. Change-Id: I274a8cee9cb38226b5a0bdff6a847c74ef0b3128 Signed-off-by: Nico Huber <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/29047 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
committed by
Patrick Georgi
parent
076ce2f4d9
commit
4f32b64e4f
@ -147,7 +147,7 @@ static void root_dev_scan_bus(struct device *bus)
|
|||||||
static void root_dev_reset(struct bus *bus)
|
static void root_dev_reset(struct bus *bus)
|
||||||
{
|
{
|
||||||
printk(BIOS_INFO, "Resetting board...\n");
|
printk(BIOS_INFO, "Resetting board...\n");
|
||||||
hard_reset();
|
board_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)
|
#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)
|
||||||
|
@ -1,7 +1,43 @@
|
|||||||
#ifndef RESET_H
|
#ifndef RESET_H
|
||||||
#define RESET_H
|
#define RESET_H
|
||||||
|
|
||||||
/* Generic reset functions. Call from code that wants to trigger a reset. */
|
/*
|
||||||
|
* Generic board reset function. Call from common code that
|
||||||
|
* wants to trigger a reset.
|
||||||
|
*/
|
||||||
|
__noreturn void board_reset(void);
|
||||||
|
/*
|
||||||
|
* SoC or board specific implementation of the board reset.
|
||||||
|
*
|
||||||
|
* Implementations shall meet the following criteria:
|
||||||
|
*
|
||||||
|
* o For vboot support, the TPM MUST be reset.
|
||||||
|
*
|
||||||
|
* o All SoC/chipset blocks SHOULD be reset except for those
|
||||||
|
* that are intentionally meant to survive reset (e.g. tomb-
|
||||||
|
* stone registers and that sort of stuff).
|
||||||
|
*
|
||||||
|
* o All external SoC pins SHOULD return to power-on reset values.
|
||||||
|
*
|
||||||
|
* o The CPU MUST resume execution from power-on reset vector
|
||||||
|
* (same as cold boot).
|
||||||
|
*
|
||||||
|
* o Other board components (e.g. PCI, SDIO and stuff) SHOULD
|
||||||
|
* be reset.
|
||||||
|
*
|
||||||
|
* o USB SHOULD be power-cycled.
|
||||||
|
*
|
||||||
|
* o Board components that are intended to be fully independent
|
||||||
|
* from SoC (e.g. EC and EC-attached devices, the Cr50 on
|
||||||
|
* Chromebooks) SHOULD NOT be reset.
|
||||||
|
*
|
||||||
|
* General recommendations:
|
||||||
|
*
|
||||||
|
* o DRAM SHOULD NOT lose power if possible.
|
||||||
|
*
|
||||||
|
* o Reset time SHOULD be minimized
|
||||||
|
*/
|
||||||
|
void do_board_reset(void);
|
||||||
|
|
||||||
/* Super-hard reset specific to some Intel SoCs. */
|
/* Super-hard reset specific to some Intel SoCs. */
|
||||||
__noreturn void global_reset(void);
|
__noreturn void global_reset(void);
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
config MISSING_BOARD_RESET
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
Selected by boards that don't provide a do_board_reset()
|
||||||
|
implementation. This activates a stub that logs the missing
|
||||||
|
board reset and halts execution.
|
||||||
|
|
||||||
config NO_EDID_FILL_FB
|
config NO_EDID_FILL_FB
|
||||||
bool
|
bool
|
||||||
default y if !MAINBOARD_DO_NATIVE_VGA_INIT
|
default y if !MAINBOARD_DO_NATIVE_VGA_INIT
|
||||||
|
@ -84,8 +84,7 @@ static void ramstage_cache_invalid(void)
|
|||||||
{
|
{
|
||||||
printk(BIOS_ERR, "ramstage cache invalid.\n");
|
printk(BIOS_ERR, "ramstage cache invalid.\n");
|
||||||
if (IS_ENABLED(CONFIG_RESET_ON_INVALID_RAMSTAGE_CACHE)) {
|
if (IS_ENABLED(CONFIG_RESET_ON_INVALID_RAMSTAGE_CACHE)) {
|
||||||
hard_reset();
|
board_reset();
|
||||||
halt();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,6 +18,30 @@
|
|||||||
#include <halt.h>
|
#include <halt.h>
|
||||||
#include <reset.h>
|
#include <reset.h>
|
||||||
|
|
||||||
|
__noreturn void board_reset(void)
|
||||||
|
{
|
||||||
|
printk(BIOS_INFO, "%s() called!\n", __func__);
|
||||||
|
dcache_clean_all();
|
||||||
|
do_board_reset();
|
||||||
|
halt();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_MISSING_BOARD_RESET)
|
||||||
|
void do_board_reset(void)
|
||||||
|
{
|
||||||
|
printk(BIOS_CRIT, "No board_reset implementation, hanging...\n");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* Fall back to hard_reset() for a regression free transition.
|
||||||
|
* FIXME: Remove after everything is converted to board_reset().
|
||||||
|
*/
|
||||||
|
__weak void do_board_reset(void)
|
||||||
|
{
|
||||||
|
hard_reset();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
__noreturn static void __hard_reset(void) {
|
__noreturn static void __hard_reset(void) {
|
||||||
if (IS_ENABLED(CONFIG_HAVE_HARD_RESET))
|
if (IS_ENABLED(CONFIG_HAVE_HARD_RESET))
|
||||||
do_hard_reset();
|
do_hard_reset();
|
||||||
|
@ -18,7 +18,7 @@ config VBOOT
|
|||||||
bool "Verify firmware with vboot."
|
bool "Verify firmware with vboot."
|
||||||
default n
|
default n
|
||||||
select VBOOT_MOCK_SECDATA if !TPM1 && !TPM2
|
select VBOOT_MOCK_SECDATA if !TPM1 && !TPM2
|
||||||
depends on HAVE_HARD_RESET
|
depends on HAVE_HARD_RESET || !MISSING_BOARD_RESET
|
||||||
help
|
help
|
||||||
Enabling VBOOT will use vboot to verify the components of the firmware
|
Enabling VBOOT will use vboot to verify the components of the firmware
|
||||||
(stages, payload, etc).
|
(stages, payload, etc).
|
||||||
|
@ -129,6 +129,5 @@ void vboot_reboot(void)
|
|||||||
if (IS_ENABLED(CONFIG_CONSOLE_CBMEM_DUMP_TO_UART))
|
if (IS_ENABLED(CONFIG_CONSOLE_CBMEM_DUMP_TO_UART))
|
||||||
cbmem_dump_console();
|
cbmem_dump_console();
|
||||||
vboot_platform_prepare_reboot();
|
vboot_platform_prepare_reboot();
|
||||||
hard_reset();
|
board_reset();
|
||||||
die("failed to reboot");
|
|
||||||
}
|
}
|
||||||
|
@ -52,5 +52,5 @@ void reboot_from_watchdog(void)
|
|||||||
{
|
{
|
||||||
printk(BIOS_INFO, "Last reset was watchdog, reboot again to reset TPM!\n");
|
printk(BIOS_INFO, "Last reset was watchdog, reboot again to reset TPM!\n");
|
||||||
mark_watchdog_tombstone();
|
mark_watchdog_tombstone();
|
||||||
hard_reset();
|
board_reset();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user