blob: 43a68f95f44d2b6f855c65214b4caafef706d656 [file] [log] [blame]
Patrick Georgi11f00792020-03-04 15:10:45 +01001/* SPDX-License-Identifier: GPL-2.0-only */
Kyösti Mälkkid132c992016-06-18 09:19:18 +03002
3#include <console/console.h>
4#include <string.h>
Furquan Shaikh76cedd22020-05-02 10:24:23 -07005#include <acpi/acpi.h>
Elyes HAOUASd2b9ec12018-10-27 09:41:02 +02006#include <arch/cpu.h>
Elyes HAOUASe2d152c2019-06-21 07:06:50 +02007#include <commonlib/helpers.h>
Kyösti Mälkkic5853e92020-06-16 12:45:11 +03008#include <cpu/x86/smm.h>
Kyösti Mälkki82e41d82016-12-11 13:31:17 +02009#include <fallback.h>
Kyösti Mälkkid132c992016-06-18 09:19:18 +030010#include <timestamp.h>
Kyösti Mälkkicf0e60f2016-06-20 20:40:32 +030011
Kyösti Mälkkid132c992016-06-18 09:19:18 +030012#define WAKEUP_BASE 0x600
13
Kyösti Mälkki7cd2c072018-06-03 23:04:28 +030014asmlinkage void (*acpi_do_wakeup)(uintptr_t vector) = (void *)WAKEUP_BASE;
Kyösti Mälkkid132c992016-06-18 09:19:18 +030015
16extern unsigned char __wakeup;
17extern unsigned int __wakeup_size;
18
Kyösti Mälkkia4c0e1a2020-06-18 08:28:12 +030019void __noreturn acpi_resume(void *wake_vec)
Kyösti Mälkkid132c992016-06-18 09:19:18 +030020{
Kyösti Mälkkic3c55212020-06-17 10:34:26 +030021 /* Restore GNVS pointer in SMM if found. */
22 apm_control(APM_CNT_GNVS_UPDATE);
Kyösti Mälkkid132c992016-06-18 09:19:18 +030023
24 /* Call mainboard resume handler first, if defined. */
25 mainboard_suspend_resume();
26
Kyösti Mälkki561b5cf2020-06-18 12:24:06 +030027 /* Copy wakeup trampoline in place. */
28 memcpy((void *)WAKEUP_BASE, &__wakeup, __wakeup_size);
29
30 set_boot_successful();
31
32 timestamp_add_now(TS_ACPI_WAKE_JUMP);
33
Kyösti Mälkkid132c992016-06-18 09:19:18 +030034 post_code(POST_OS_RESUME);
Kyösti Mälkki561b5cf2020-06-18 12:24:06 +030035 acpi_do_wakeup((uintptr_t)wake_vec);
Kyösti Mälkkia4c0e1a2020-06-18 08:28:12 +030036
37 die("Failed the jump to wakeup vector\n");
Kyösti Mälkkid132c992016-06-18 09:19:18 +030038}