blob: f893e3a9f6b50259cda94af1ea8f88f81f472121 [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älkki82e41d82016-12-11 13:31:17 +02008#include <fallback.h>
Kyösti Mälkkid132c992016-06-18 09:19:18 +03009#include <timestamp.h>
Kyösti Mälkkicf0e60f2016-06-20 20:40:32 +030010
Kyösti Mälkkid132c992016-06-18 09:19:18 +030011#define WAKEUP_BASE 0x600
12
Kyösti Mälkki7cd2c072018-06-03 23:04:28 +030013asmlinkage void (*acpi_do_wakeup)(uintptr_t vector) = (void *)WAKEUP_BASE;
Kyösti Mälkkid132c992016-06-18 09:19:18 +030014
15extern unsigned char __wakeup;
16extern unsigned int __wakeup_size;
17
Kyösti Mälkkia4c0e1a2020-06-18 08:28:12 +030018void __noreturn acpi_resume(void *wake_vec)
Kyösti Mälkkid132c992016-06-18 09:19:18 +030019{
Kyösti Mälkkid132c992016-06-18 09:19:18 +030020 /* Call mainboard resume handler first, if defined. */
21 mainboard_suspend_resume();
22
Kyösti Mälkki561b5cf2020-06-18 12:24:06 +030023 /* Copy wakeup trampoline in place. */
24 memcpy((void *)WAKEUP_BASE, &__wakeup, __wakeup_size);
25
26 set_boot_successful();
27
28 timestamp_add_now(TS_ACPI_WAKE_JUMP);
29
lilacious40cb3fe2023-06-21 23:24:14 +020030 post_code(POSTCODE_OS_RESUME);
Kyösti Mälkki561b5cf2020-06-18 12:24:06 +030031 acpi_do_wakeup((uintptr_t)wake_vec);
Kyösti Mälkkia4c0e1a2020-06-18 08:28:12 +030032
33 die("Failed the jump to wakeup vector\n");
Kyösti Mälkkid132c992016-06-18 09:19:18 +030034}