[U-Boot] [PATCH 11/22] x86: acpi: Resume OS if resume vector is found

Simon Glass sjg at chromium.org
Thu Apr 13 21:15:59 UTC 2017


Hi Bin,

On 12 April 2017 at 02:14, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> Hi Simon,
>
> On Wed, Mar 22, 2017 at 4:06 AM, Simon Glass <sjg at chromium.org> wrote:
> > Hi Bin,
> >
> > On 16 March 2017 at 08:26, Bin Meng <bmeng.cn at 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.cn at 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 <sjg at 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.cn at 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.

OK sounds good.

Since you are thinking about logging, here are the features I'd love to see:

- Log messages have category, log level, filename and line number (but
many people would continue to just use debug())
- Ability to enable at build time on a per-file basis (as now) or globally.
- Separately, be able to enable/disable per file at run-time (assuming
enabled at build time)
- Ability to filter log messages that go to console
- Collection of log messages in a buffer (perhaps a circular membuff
or a plain buffer)
- A command to access the log

Regards,
Simon


More information about the U-Boot mailing list