Hi Stefan, On 17 April 2017 at 03:37, Stefan Roese <s...@denx.de> wrote: > Hi Bin, > > On 12.04.2017 10:14, Bin Meng wrote: >> 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. > > I also vote for this explicit print line in this case. > >> Actually I was even thinking we should introduce >> a log level for U-Boot, just like coreboot/linux. > > Interesting idea. How could the log-level be configured in U-Boot? > Via some env variable?
Yes I suppose so. Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot