From patchwork Thu Mar 16 14:26:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 739868 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 3vkWDq4Hsrz9rvt for ; Fri, 17 Mar 2017 01:33:47 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="dFs7nX3l"; dkim-atps=neutral Received: by lists.denx.de (Postfix, from userid 105) id 452E9C21C59; Thu, 16 Mar 2017 14:27:22 +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_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, 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 F423BC21C5F; Thu, 16 Mar 2017 14:24:44 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 762D7C21C5F; Thu, 16 Mar 2017 14:22:46 +0000 (UTC) Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by lists.denx.de (Postfix) with ESMTPS id 3A925C21C52 for ; Thu, 16 Mar 2017 14:22:43 +0000 (UTC) Received: by mail-pf0-f196.google.com with SMTP id o126so5974862pfb.1 for ; Thu, 16 Mar 2017 07:22:43 -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=POW97ttEanvPoz71GoO3IhBOIMIU8FvHwZXCxbqomlE=; b=dFs7nX3lQcpo/Wk2nqYlJm3Vs2UruNDAiuOrI2yXWACioqq3B+FRRpAr261nvKCT7p JyWBD7FwXSL9fUGP9bOk/baJ2jF8a9mzL1797/DYklDtBoN6uc3E89CyqOXbDUQMqqAs HRACnYsKLeb5XhrQw1czM35uDPyRXJfm3ejSggsoDXCO7fkFmfpv86NZy5S6apIxpZoJ Zyk5BbR7Shz84uhwSYSohxE4oEQxM2JXevmkoeGiVG3RbgKtOZW5f5cl5FxcjbGXEE6H 5RaqcSBTFH8jSbbCj13o9KoD6zDGxbOKRl60dCYxgr/uxDunYor9phHx7qleJ8nD92/P S6vA== 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=POW97ttEanvPoz71GoO3IhBOIMIU8FvHwZXCxbqomlE=; b=BmDPXIexl0HH/k529B6FSLgpRUSEya7pXS4mqcEBcn6fUpyuifBYluxQmwHmzjl/TS ThhTRZNRgu8/BTRpxSJ7/Iluk6XWA3G8U9HiH6Z37z4kfozLf0wkz9Y5z6wyTPgQ7Yye hts3nlaTOX7JdaZ08wa8cWHhHVfjkV0IOvJPcXV2MfHJQPuQ7mer1PsacGVWb0766349 4QDHE+Y1PdG4+LfjWw/wAzKYmNlqU8l9TqRcaI9f5S3ZlAAu/DIZgulXnEO1XY0iAAbj mZyL93J/vzpEoXuz+eqRo4JZrjtscJVNaKABqeB0SjQ163jb8WMBqagJUFxH7+OES81h hf3g== X-Gm-Message-State: AFeK/H0z3KQa0MstRZZyGRU9OL6YpI6GIoMZPe0E64cUaBSbnK5Lh1Pa0p9LWTHpUJMQKg== X-Received: by 10.98.93.90 with SMTP id r87mr10446637pfb.226.1489674161875; Thu, 16 Mar 2017 07:22:41 -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 c64sm11039959pfa.45.2017.03.16.07.22.40 (version=TLS1_1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 16 Mar 2017 07:22:40 -0700 (PDT) From: Bin Meng To: Simon Glass , Stefan Roese , U-Boot Mailing List Date: Thu, 16 Mar 2017 07:26:44 -0700 Message-Id: <1489674408-17498-19-git-send-email-bmeng.cn@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1489674408-17498-1-git-send-email-bmeng.cn@gmail.com> References: <1489674408-17498-1-git-send-email-bmeng.cn@gmail.com> Subject: [U-Boot] [PATCH 18/22] x86: acpi: Refactor acpi_resume() 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" To do something more in acpi_resume() like turning on ACPI mode, we need locate ACPI FADT table pointer first. But currently this is done in acpi_find_wakeup_vector(). This changes acpi_resume() signature to accept ACPI FADT pointer as the parameter. A new API acpi_find_fadt() is introduced, and acpi_find_wakeup_vector() is updated to use FADT pointer as the parameter as well. Signed-off-by: Bin Meng Reviewed-by: Simon Glass --- arch/x86/cpu/cpu.c | 6 +++--- arch/x86/include/asm/acpi_s3.h | 5 +++-- arch/x86/include/asm/acpi_table.h | 3 ++- arch/x86/lib/acpi_s3.c | 7 ++++++- arch/x86/lib/acpi_table.c | 16 +++++++++++----- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c index bd5aeb8..42fe8a2 100644 --- a/arch/x86/cpu/cpu.c +++ b/arch/x86/cpu/cpu.c @@ -208,10 +208,10 @@ int last_stage_init(void) board_final_cleanup(); #if CONFIG_HAVE_ACPI_RESUME - void *wake_vector = acpi_find_wakeup_vector(); + struct acpi_fadt *fadt = acpi_find_fadt(); - if (wake_vector != NULL && gd->arch.prev_sleep_state == ACPI_S3) - acpi_resume(wake_vector); + if (fadt != NULL && gd->arch.prev_sleep_state == ACPI_S3) + acpi_resume(fadt); #endif write_tables(); diff --git a/arch/x86/include/asm/acpi_s3.h b/arch/x86/include/asm/acpi_s3.h index 5892a8b..567ed3e 100644 --- a/arch/x86/include/asm/acpi_s3.h +++ b/arch/x86/include/asm/acpi_s3.h @@ -100,15 +100,16 @@ enum acpi_sleep_state chipset_prev_sleep_state(void); */ void chipset_clear_sleep_state(void); +struct acpi_fadt; /** * 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 + * @fadt: FADT table pointer in the ACPI table * @return: Never returns */ -void acpi_resume(void *wake_vec); +void acpi_resume(struct acpi_fadt *fadt); #endif /* __ASSEMBLY__ */ diff --git a/arch/x86/include/asm/acpi_table.h b/arch/x86/include/asm/acpi_table.h index 3e11362..c9eba42 100644 --- a/arch/x86/include/asm/acpi_table.h +++ b/arch/x86/include/asm/acpi_table.h @@ -318,4 +318,5 @@ u32 acpi_fill_madt(u32 current); void acpi_create_gnvs(struct acpi_global_nvs *gnvs); void enter_acpi_mode(int pm1_cnt); ulong write_acpi_tables(ulong start); -void *acpi_find_wakeup_vector(void); +struct acpi_fadt *acpi_find_fadt(void); +void *acpi_find_wakeup_vector(struct acpi_fadt *); diff --git a/arch/x86/lib/acpi_s3.c b/arch/x86/lib/acpi_s3.c index f679c06..e5cc3b0 100644 --- a/arch/x86/lib/acpi_s3.c +++ b/arch/x86/lib/acpi_s3.c @@ -6,6 +6,7 @@ #include #include +#include #include static void asmlinkage (*acpi_do_wakeup)(void *vector) = (void *)WAKEUP_BASE; @@ -19,8 +20,12 @@ static void acpi_jump_to_wakeup(void *vector) acpi_do_wakeup(vector); } -void acpi_resume(void *wake_vec) +void acpi_resume(struct acpi_fadt *fadt) { + void *wake_vec; + + wake_vec = acpi_find_wakeup_vector(fadt); + post_code(POST_OS_RESUME); acpi_jump_to_wakeup(wake_vec); } diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c index 87a71ca..01d5b6f 100644 --- a/arch/x86/lib/acpi_table.c +++ b/arch/x86/lib/acpi_table.c @@ -460,18 +460,14 @@ static struct acpi_rsdp *acpi_valid_rsdp(struct acpi_rsdp *rsdp) return rsdp; } -void *acpi_find_wakeup_vector(void) +struct acpi_fadt *acpi_find_fadt(void) { char *p, *end; struct acpi_rsdp *rsdp = NULL; struct acpi_rsdt *rsdt; struct acpi_fadt *fadt = NULL; - struct acpi_facs *facs; - void *wake_vec; int i; - debug("Trying to find the wakeup vector...\n"); - /* Find RSDP */ for (p = (char *)ROM_TABLE_ADDR; p < (char *)ROM_TABLE_END; p += 16) { rsdp = acpi_valid_rsdp((struct acpi_rsdp *)p); @@ -499,6 +495,16 @@ void *acpi_find_wakeup_vector(void) return NULL; debug("FADT found at %p\n", fadt); + return fadt; +} + +void *acpi_find_wakeup_vector(struct acpi_fadt *fadt) +{ + struct acpi_facs *facs; + void *wake_vec; + + debug("Trying to find the wakeup vector...\n"); + facs = (struct acpi_facs *)fadt->firmware_ctrl; if (facs == NULL) {