Hi Simon, On Wed, Mar 22, 2017 at 4:06 AM, Simon Glass <s...@chromium.org> wrote: > Hi Bin, > > On 16 March 2017 at 08:26, Bin Meng <bmeng...@gmail.com> wrote: >> In an S3 resume path, U-Boot does everything like a cold boot except >> in the last_stage_init() it jumps to the OS resume vector. >> >> Signed-off-by: Bin Meng <bmeng...@gmail.com> >> --- >> >> arch/x86/cpu/cpu.c | 8 ++++++++ >> arch/x86/include/asm/acpi_s3.h | 10 ++++++++++ >> arch/x86/lib/Makefile | 1 + >> arch/x86/lib/acpi_s3.c | 26 ++++++++++++++++++++++++++ >> 4 files changed, 45 insertions(+) >> create mode 100644 arch/x86/lib/acpi_s3.c > > Reviewed-by: Simon Glass <s...@chromium.org> > >> >> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c >> index 9dde54c..afc8645 100644 >> --- a/arch/x86/cpu/cpu.c >> +++ b/arch/x86/cpu/cpu.c >> @@ -26,6 +26,7 @@ >> #include <malloc.h> >> #include <syscon.h> >> #include <asm/acpi_s3.h> >> +#include <asm/acpi_table.h> >> #include <asm/control_regs.h> >> #include <asm/coreboot_tables.h> >> #include <asm/cpu.h> >> @@ -204,6 +205,13 @@ __weak void board_final_cleanup(void) >> >> int last_stage_init(void) >> { >> +#if CONFIG_HAVE_ACPI_RESUME >> + void *wake_vector = acpi_find_wakeup_vector(); >> + >> + if (wake_vector != NULL && gd->arch.prev_sleep_state == ACPI_S3) >> + acpi_resume(wake_vector); >> +#endif >> + >> write_tables(); >> >> board_final_cleanup(); >> diff --git a/arch/x86/include/asm/acpi_s3.h b/arch/x86/include/asm/acpi_s3.h >> index f9d4739..5892a8b 100644 >> --- a/arch/x86/include/asm/acpi_s3.h >> +++ b/arch/x86/include/asm/acpi_s3.h >> @@ -100,6 +100,16 @@ enum acpi_sleep_state chipset_prev_sleep_state(void); >> */ >> void chipset_clear_sleep_state(void); >> >> +/** >> + * acpi_resume() - Do ACPI S3 resume >> + * >> + * This calls U-Boot wake up assembly stub and jumps to OS's wake up vector. >> + * >> + * @wake_vec: OS wake up vector >> + * @return: Never returns >> + */ >> +void acpi_resume(void *wake_vec); >> + >> #endif /* __ASSEMBLY__ */ >> >> #endif /* __ASM_ACPI_S3_H__ */ >> diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile >> index 1c2c085..c61f931 100644 >> --- a/arch/x86/lib/Makefile >> +++ b/arch/x86/lib/Makefile >> @@ -35,6 +35,7 @@ obj-$(CONFIG_X86_RAMTEST) += ramtest.o >> obj-y += sections.o >> obj-y += sfi.o >> obj-y += string.o >> +obj-$(CONFIG_HAVE_ACPI_RESUME) += acpi_s3.o >> ifndef CONFIG_QEMU >> obj-$(CONFIG_GENERATE_ACPI_TABLE) += acpi_table.o >> endif >> diff --git a/arch/x86/lib/acpi_s3.c b/arch/x86/lib/acpi_s3.c >> new file mode 100644 >> index 0000000..f679c06 >> --- /dev/null >> +++ b/arch/x86/lib/acpi_s3.c >> @@ -0,0 +1,26 @@ >> +/* >> + * Copyright (C) 2017, Bin Meng <bmeng...@gmail.com> >> + * >> + * SPDX-License-Identifier: GPL-2.0+ >> + */ >> + >> +#include <common.h> >> +#include <asm/acpi_s3.h> >> +#include <asm/post.h> >> + >> +static void asmlinkage (*acpi_do_wakeup)(void *vector) = (void >> *)WAKEUP_BASE; >> + >> +static void acpi_jump_to_wakeup(void *vector) >> +{ >> + /* Copy wakeup trampoline in place */ >> + memcpy((void *)WAKEUP_BASE, __wakeup, __wakeup_size); >> + >> + printf("Jumping to OS waking vector %p\n", vector); > > Should this be debug()? >
I wanted to explicitly print this to show that we are in S3 and jumping to OS vector. Actually I was even thinking we should introduce a log level for U-Boot, just like coreboot/linux. Regards, Bin _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot