From patchwork Fri Apr 21 14:24:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 753443 X-Patchwork-Delegate: bmeng.cn@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3w8dTC5JkHz9s2x for ; Sat, 22 Apr 2017 00:31:11 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="HaYsrxS9"; dkim-atps=neutral Received: by lists.denx.de (Postfix, from userid 105) id 6271BC21D4D; Fri, 21 Apr 2017 14:23:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 71EFEC21CC9; Fri, 21 Apr 2017 14:22:04 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 3B9C0C21C76; Fri, 21 Apr 2017 14:21:19 +0000 (UTC) Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by lists.denx.de (Postfix) with ESMTPS id A43A1C21CF0 for ; Fri, 21 Apr 2017 14:21:15 +0000 (UTC) Received: by mail-wm0-f68.google.com with SMTP id d79so5186494wmi.2 for ; Fri, 21 Apr 2017 07:21:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=lYczASJ9zr76NUrzeZcbOvFrockPqUDnlAqZuXqtUCg=; b=HaYsrxS94zcjeC5R8MO1G06M0APofr8EHch2tpT6rx4WEjn+FkrWzV5EMfjUrrzLIE GK1e8ePoqD1v7+CAkL6fJEXgz3pH+PB1YziL6Xe1aAJapgWfoyd5l0oPw4Y5dcfgewNg 57MdiN4NMmVKSxxTqVMmnl6ozZT/Dq0tl2DUqlYiBiP1esjxk3IpQ48x7YAEJm6L1MyC ZS5LJ9NRxVdqkFyU9ZnhE/XWAGJiqc8c5AWfvbU8b7MEoLbMMPK4ZnB8pZhsHL8JI7tm +uEPgQwkBHXB66dGVrrnBSz/1cKoWyy+o2FkTvt5HVu+gfUsFZ2SHgTZu9FQ2+ZKZquO HbQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=lYczASJ9zr76NUrzeZcbOvFrockPqUDnlAqZuXqtUCg=; b=HIosxFmK9T5HvcZpbGCPh1llHZLimv0LCsBKyYs9hDjbjE/XJx4+MrsHDrtN1sOTrH bw3AKhk/DfKQN8cwx7v3fjdKJWYRZCbw55UGM0W75soWKkZBeu5/lQUbhHF1DyK6QG57 NM9/a2ixZWsfbiQj7Rj5R03hbTmmxUHYz/k3AnWEDeuJaKd9Ce+aXD0NYS4qZ5xuVNad 9qT1Ch/esTxh7dN2idI32QMmtfeJGbVNi0AqvzedhQK9J678Dmzg1BRmMYPzPp8oOWhj 6FIrG91nxFvK438TB1X97DJoG5KWn1fraI7W+dRlyljh5iXsu0b0NZShHvpmzyV8HadI +jXA== X-Gm-Message-State: AN3rC/4OLG9guPgTS6SzPBBZyE8Ea9VC0XaBL2Sk/xkmMT08S1qsACv7 DulfyEOaVT5jVEI1 X-Received: by 10.28.67.68 with SMTP id q65mr8707298wma.142.1492784475375; Fri, 21 Apr 2017 07:21:15 -0700 (PDT) Received: from ala-d2121-lx1.wrs.com (unknown-157-139.windriver.com. [147.11.157.139]) by smtp.gmail.com with ESMTPSA id 4sm464843edt.64.2017.04.21.07.21.13 (version=TLS1_1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 21 Apr 2017 07:21:14 -0700 (PDT) From: Bin Meng To: Simon Glass , Stefan Roese , U-Boot Mailing List Date: Fri, 21 Apr 2017 07:24:37 -0700 Message-Id: <1492784689-15701-11-git-send-email-bmeng.cn@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1492784689-15701-1-git-send-email-bmeng.cn@gmail.com> References: <1492784689-15701-1-git-send-email-bmeng.cn@gmail.com> Subject: [U-Boot] [PATCH v2 10/22] x86: acpi: Resume OS if resume vector is found X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" 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 Reviewed-by: Simon Glass --- Changes in v2: None 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 diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c index 7222ec8..f686ad4 100644 --- a/arch/x86/cpu/cpu.c +++ b/arch/x86/cpu/cpu.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -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 a06466c..b8d14f4 100644 --- a/arch/x86/include/asm/acpi_s3.h +++ b/arch/x86/include/asm/acpi_s3.h @@ -99,6 +99,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 d1ad37a..21f59a0 100644 --- a/arch/x86/lib/Makefile +++ b/arch/x86/lib/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_INTEL_MID) += scu.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 + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include + +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); + acpi_do_wakeup(vector); +} + +void acpi_resume(void *wake_vec) +{ + post_code(POST_OS_RESUME); + acpi_jump_to_wakeup(wake_vec); +}