From patchwork Tue Feb 23 14:37:33 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 8393061 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D01249F1D4 for ; Tue, 23 Feb 2016 14:41:54 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B5EB0202D1 for ; Tue, 23 Feb 2016 14:41:53 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9390F2027D for ; Tue, 23 Feb 2016 14:41:52 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aYE72-0004J2-2f; Tue, 23 Feb 2016 14:38:52 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aYE70-0004Ix-PV for xen-devel@lists.xen.org; Tue, 23 Feb 2016 14:38:51 +0000 Received: from [85.158.137.68] by server-11.bemta-3.messagelabs.com id C8/48-02978-9FE6CC65; Tue, 23 Feb 2016 14:38:49 +0000 X-Env-Sender: prvs=854fa0872=Stefano.Stabellini@citrix.com X-Msg-Ref: server-8.tower-31.messagelabs.com!1456238327!24569762!1 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 58392 invoked from network); 23 Feb 2016 14:38:48 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-8.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 23 Feb 2016 14:38:48 -0000 X-IronPort-AV: E=Sophos;i="5.22,489,1449532800"; d="scan'208";a="340235168" Date: Tue, 23 Feb 2016 14:37:33 +0000 From: Stefano Stabellini X-X-Sender: sstabellini@kaball.uk.xensource.com To: Shannon Zhao In-Reply-To: <56CC4CCC.2070004@huawei.com> Message-ID: References: <1453540813-15764-1-git-send-email-zhaoshenglong@huawei.com> <1453540813-15764-7-git-send-email-zhaoshenglong@huawei.com> <56CC4CCC.2070004@huawei.com> User-Agent: Alpine 2.02 (DEB 1266 2009-07-14) MIME-Version: 1.0 X-DLP: MIA1 Cc: ian.campbell@citrix.com, Stefano Stabellini , peter.huangpeng@huawei.com, xen-devel@lists.xen.org, julien.grall@citrix.com, stefano.stabellini@citrix.com, shannon.zhao@linaro.org Subject: Re: [Xen-devel] [PATCH v4 06/21] arm/acpi: Parse FADT table and get PSCI flags X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Tue, 23 Feb 2016, Shannon Zhao wrote: > On 2016/1/27 23:41, Stefano Stabellini wrote: > > On Sat, 23 Jan 2016, Shannon Zhao wrote: > >> From: Shannon Zhao > >> > >> There are two flags: PSCI_COMPLIANT and PSCI_USE_HVC. When set, the > >> former signals to the OS that the hardware is PSCI compliant. The latter > >> selects the appropriate conduit for PSCI calls by toggling between > >> Hypervisor Calls (HVC) and Secure Monitor Calls (SMC). FADT table > >> contains such information, parse FADT to get the flags for furture > >> usage. > >> > >> Since STAO table and the GIC version are introduced by ACPI 6.0, we will > >> check the version and only parse FADT table with version >= 6.0. If > >> firmware provides ACPI tables with ACPI version less than 6.0, OS will > >> be messed up with those information, so disable ACPI if we get an FADT > >> table with version less than 6.0. > >> > >> Signed-off-by: Hanjun Guo > >> Signed-off-by: Naresh Bhat > >> Signed-off-by: Parth Dixit > >> Signed-off-by: Shannon Zhao > >> --- > >> V4: drop disable_acpi in acpi_parse_fadt > >> --- > >> xen/arch/arm/acpi/boot.c | 30 ++++++++++++++++++++++++++++++ > >> xen/arch/arm/acpi/lib.c | 12 ++++++++++++ > >> xen/include/asm-arm/acpi.h | 9 +++++++++ > >> 3 files changed, 51 insertions(+) > >> > >> diff --git a/xen/arch/arm/acpi/boot.c b/xen/arch/arm/acpi/boot.c > >> index 1570f7e..6b33fbe 100644 > >> --- a/xen/arch/arm/acpi/boot.c > >> +++ b/xen/arch/arm/acpi/boot.c > >> @@ -27,9 +27,32 @@ > >> > >> #include > >> #include > >> +#include > >> +#include > >> +#include > >> > >> #include > >> > >> +static int __init acpi_parse_fadt(struct acpi_table_header *table) > >> +{ > >> + struct acpi_table_fadt *fadt = (struct acpi_table_fadt *)table; > >> + > >> + /* > >> + * Revision in table header is the FADT Major revision, and there > >> + * is a minor revision of FADT which was introduced by ACPI 6.0, > >> + * we only deal with ACPI 6.0 or newer revision to get GIC and SMP > >> + * boot protocol configuration data, or we will disable ACPI. > >> + */ > >> + if ( table->revision > 6 > >> + || (table->revision == 6 && fadt->minor_revision >= 0) ) > >> + return 0; > >> + > >> + printk("Unsupported FADT revision %d.%d, should be 6.0+, will disable ACPI\n", > >> + table->revision, fadt->minor_revision); > >> + > >> + return -EINVAL; > >> +} > >> + > >> /* > >> * acpi_boot_table_init() called from setup_arch(), always. > >> * 1. find RSDP and get its address, and then find XSDT > >> @@ -54,5 +77,12 @@ int __init acpi_boot_table_init(void) > >> return error; > >> } > >> > >> + if ( acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt) ) > >> + { > >> + /* disable ACPI if no FADT is found */ > >> + disable_acpi(); > >> + printk("Can't find FADT\n"); > >> + } > >> + > >> return 0; > >> } > >> diff --git a/xen/arch/arm/acpi/lib.c b/xen/arch/arm/acpi/lib.c > >> index f817fe6..a30e4e6 100644 > >> --- a/xen/arch/arm/acpi/lib.c > >> +++ b/xen/arch/arm/acpi/lib.c > >> @@ -50,3 +50,15 @@ char *__acpi_map_table(paddr_t phys, unsigned long size) > >> > >> return ((char *) base + offset); > >> } > >> + > >> +/* 1 to indicate PSCI 0.2+ is implemented */ > >> +bool_t __init acpi_psci_present(void) > >> +{ > >> + return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_COMPLIANT; > >> +} > >> + > >> +/* 1 to indicate HVC is present instead of SMC as the PSCI conduit */ > >> +bool_t __init acpi_psci_hvc_present(void) > >> +{ > >> + return acpi_gbl_FADT.arm_boot_flags & ACPI_FADT_PSCI_USE_HVC; > >> +} > > > > So far so good. > > > > > >> diff --git a/xen/include/asm-arm/acpi.h b/xen/include/asm-arm/acpi.h > >> index 6a037c9..1ce88f8 100644 > >> --- a/xen/include/asm-arm/acpi.h > >> +++ b/xen/include/asm-arm/acpi.h > >> @@ -31,6 +31,15 @@ > >> #define ACPI_MAP_MEM_ATTR PAGE_HYPERVISOR > >> > >> extern bool_t acpi_disabled; > >> + > >> +#ifdef CONFIG_ACPI > >> +bool_t __init acpi_psci_present(void); > >> +bool_t __init acpi_psci_hvc_present(void); > >> +#else > >> +static inline bool_t acpi_psci_present(void) { return false; } > >> +static inline bool_t acpi_psci_hvc_present(void) {return false; } > >> +#endif /* CONFIG_ACPI */ > >> + > >> /* Basic configuration for ACPI */ > >> static inline void disable_acpi(void) > >> { > > > > I would prefer if we only defined each function once, outside the ifdef > > (no static inline needed). Then we could > > > > #ifdef CONFIG_ACPI > > extern bool_t acpi_disabled; > > #else > > #define acpi_disabled (1) > > #endif > > > Yes, we could do this to drop the #else (CONFIG_ACPI) case in some > places. But I think it still needs to stub out acpi_psci_present and > acpi_psci_hvc_present because they are used in some codes which are not > covered by #ifdef CONFIG_ACPI, see[1]. The file psci.c will be compiled > whether ACPI is enabled or not. > > [1] [PATCH v4 09/21] arm/acpi: Add ACPI support for SMP initialization Just to clarify, see the appended patch, generated on top of ACPI_XEN_ARM_V3. With that I can compile Xen both arm64 (ACPI) and arm32 (non-ACPI). diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 1a40323..0a2b64e 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -52,7 +52,9 @@ struct bootinfo __initdata bootinfo; struct cpuinfo_arm __read_mostly boot_cpu_data; +#ifdef CONFIG_ACPI bool_t __read_mostly acpi_disabled; +#endif #ifdef CONFIG_ARM_32 static unsigned long opt_xenheap_megabytes __initdata; @@ -101,7 +103,7 @@ static void __init parse_acpi_param(char *s) } else if ( !strcmp(s, "force") ) { - acpi_disabled = 0; + enable_acpi(); } } diff --git a/xen/include/asm-arm/acpi.h b/xen/include/asm-arm/acpi.h index 628f3c8..5fe5a1d 100644 --- a/xen/include/asm-arm/acpi.h +++ b/xen/include/asm-arm/acpi.h @@ -29,7 +29,6 @@ #define COMPILER_DEPENDENT_INT64 long long #define COMPILER_DEPENDENT_UINT64 unsigned long long -extern bool_t acpi_disabled; /* Tables marked as reserved in efi table */ typedef enum { @@ -43,22 +42,14 @@ typedef enum { TBL_MMAX, } EFI_MEM_RES; -#ifdef CONFIG_ACPI bool_t __init acpi_psci_present(void); bool_t __init acpi_psci_hvc_present(void); void __init acpi_smp_init_cpus(void); unsigned int acpi_get_irq_type(u32 flags); unsigned int acpi_get_table_offset(struct membank tbl_add[], EFI_MEM_RES index); -#else -static inline bool_t acpi_psci_present(void) { return false; } -static inline bool_t acpi_psci_hvc_present(void) {return false; } -static inline void acpi_smp_init_cpus(void) { } -static inline unsigned int acpi_get_irq_type(u32 flags) { return 0; } -unsigned int acpi_get_table_offset(struct membank tbl_add[], EFI_MEM_RES index) -{ - return 0; -} -#endif /* CONFIG_ACPI */ + +#ifdef CONFIG_ACPI +extern bool_t acpi_disabled; /* Basic configuration for ACPI */ static inline void disable_acpi(void) @@ -66,6 +57,18 @@ static inline void disable_acpi(void) acpi_disabled = 1; } +static inline void enable_acpi(void) +{ + acpi_disabled = 0; +} +#else + +#define acpi_disabled (1) +#define disable_acpi(x) +#define enable_acpi(x) + +#endif /* CONFIG_ACPI */ + #define ACPI_GTDT_INTR_MASK ( ACPI_GTDT_INTERRUPT_MODE | ACPI_GTDT_INTERRUPT_POLARITY ) /* Triggering */