From 4c1cb4287b21e4ec33795249925cb9c522d5095f Mon Sep 17 00:00:00 2001 From: Furquan Shaikh Date: Thu, 23 Jun 2016 14:00:05 -0700 Subject: intel/apollolake: Set sleep type to S5 on vboot reboot request Add support for vboot_platform_prepare_reboot which is called whenever vboot requests reboot of the platform. SLP_TYPE needs to be set to S5 in such conditions since the platform would no longer be in a resuming state after reset. Change-Id: I01392bfda90c9274cd52c1004555d250b1d539b7 Signed-off-by: Furquan Shaikh Reviewed-on: https://review.coreboot.org/15340 Reviewed-by: Paul Menzel Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin --- src/soc/intel/apollolake/pmutil.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/soc/intel/apollolake/pmutil.c') diff --git a/src/soc/intel/apollolake/pmutil.c b/src/soc/intel/apollolake/pmutil.c index b49c52e98e..f8b2fdfdd1 100644 --- a/src/soc/intel/apollolake/pmutil.c +++ b/src/soc/intel/apollolake/pmutil.c @@ -399,3 +399,16 @@ void global_reset_enable(bool enable) reg = enable ? reg | CF9_GLB_RST : reg & ~CF9_GLB_RST; write32((void *)etr, reg); } + +/* + * The PM1 control is set to S5 when vboot requests a reboot because the power + * state code above may not have collected its data yet. Therefore, set it to + * S5 when vboot requests a reboot. That's necessary if vboot fails in the + * resume path and requests a reboot. This prevents a reboot loop where the + * error is continually hit on the failing vboot resume path. + */ +void vboot_platform_prepare_reboot(void) +{ + const uint16_t port = ACPI_PMIO_BASE + PM1_CNT; + outl((inl(port) & ~(SLP_TYP)) | (SLP_TYP_S5 << SLP_TYP_SHIFT), port); +} -- cgit v1.2.3