diff options
author | Furquan Shaikh <furquan@google.com> | 2016-06-23 14:00:05 -0700 |
---|---|---|
committer | Furquan Shaikh <furquan@google.com> | 2016-06-27 20:16:47 +0200 |
commit | 4c1cb4287b21e4ec33795249925cb9c522d5095f (patch) | |
tree | 783ca89f686ffa37ba18493e722b29c12b9356b5 | |
parent | 9b7262115b99c2504b8fa12c83726210de7678f9 (diff) |
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 <furquan@google.com>
Reviewed-on: https://review.coreboot.org/15340
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
-rw-r--r-- | src/soc/intel/apollolake/pmutil.c | 13 |
1 files changed, 13 insertions, 0 deletions
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); +} |