summaryrefslogtreecommitdiff
path: root/src/soc/intel
diff options
context:
space:
mode:
authorKarthikeyan Ramasubramanian <kramasub@google.com>2020-08-04 16:38:58 -0600
committerEdward O'Callaghan <quasisec@chromium.org>2020-08-14 08:34:21 +0000
commitf9cc6374f218789ae91dfc61f8d4494874908b5e (patch)
tree33c84fabbb325a0c2e4b3aaea8292684e4935b96 /src/soc/intel
parentcd9596b459b95d55051f81c4a3a8aa3e12df4d0f (diff)
soc/intel/common/cse_lite: Perform a board specific reset
When CSE Lite jumps from RO to RW, global reset is initiated. When AP is reset as part of global reset, in some boards TPM initialization fails. This is because AP reset is not detected by TPM hosting an older firmware version. To signal TPMs running older firmware version about AP reset, a modified reset sequence needs to be performed. Hence add support to perform board-specific reset sequence. BUG=b:162290856, b:162386991 TEST=Ensure that the device boots to OS with the board-specific reset sequence when CSE Lite jumps from RO to RW with an older and newer Cr50 firmware. Change-Id: I8663e7f25461e58e45766e2ac00d752bfa191d8b Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/44187 Reviewed-by: Furquan Shaikh <furquan@google.com> Reviewed-by: Nick Vaccaro <nvaccaro@google.com> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/intel')
-rw-r--r--src/soc/intel/common/block/cse/cse_lite.c9
-rw-r--r--src/soc/intel/common/block/include/intelblocks/cse.h4
2 files changed, 13 insertions, 0 deletions
diff --git a/src/soc/intel/common/block/cse/cse_lite.c b/src/soc/intel/common/block/cse/cse_lite.c
index ff489af9b5..d89044f2ba 100644
--- a/src/soc/intel/common/block/cse/cse_lite.c
+++ b/src/soc/intel/common/block/cse/cse_lite.c
@@ -364,12 +364,21 @@ static bool cse_set_next_boot_partition(enum boot_partition_id bp)
return true;
}
+__weak void cse_board_reset(void)
+{
+ /* Default weak implementation, does nothing. */
+}
+
/* Set the CSE's next boot partition and issues system reset */
static bool cse_set_and_boot_from_next_bp(enum boot_partition_id bp)
{
if (!cse_set_next_boot_partition(bp))
return false;
+ /* Allow the board to perform a reset for CSE RO<->RW jump */
+ cse_board_reset();
+
+ /* If board does not perform the reset, then perform global_reset */
do_global_reset();
die("cse_lite: Failed to reset the system\n");
diff --git a/src/soc/intel/common/block/include/intelblocks/cse.h b/src/soc/intel/common/block/include/intelblocks/cse.h
index a1dc3d9d56..5466ba6a74 100644
--- a/src/soc/intel/common/block/include/intelblocks/cse.h
+++ b/src/soc/intel/common/block/include/intelblocks/cse.h
@@ -219,4 +219,8 @@ uint8_t cse_wait_com_soft_temp_disable(void);
* currently selected partition.
*/
void cse_fw_sync(void *unused);
+
+/* Perform a board-specific reset sequence for CSE RO<->RW jump */
+void cse_board_reset(void);
+
#endif // SOC_INTEL_COMMON_CSE_H