From patchwork Thu Apr 18 16:03:58 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 2461481 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by patchwork1.kernel.org (Postfix) with ESMTP id 745223FD8C for ; Thu, 18 Apr 2013 16:05:15 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1USrKJ-00050R-Ks; Thu, 18 Apr 2013 16:04:48 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1USrJq-0002cV-RV; Thu, 18 Apr 2013 16:04:18 +0000 Received: from smtp02.citrix.com ([66.165.176.63]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1USrJn-0002cC-H1 for linux-arm-kernel@lists.infradead.org; Thu, 18 Apr 2013 16:04:16 +0000 X-IronPort-AV: E=Sophos;i="4.87,502,1363132800"; d="scan'208";a="19273079" Received: from accessns.citrite.net (HELO FTLPEX01CL03.citrite.net) ([10.9.154.239]) by FTLPIPO02.CITRIX.COM with ESMTP/TLS/AES128-SHA; 18 Apr 2013 16:04:11 +0000 Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com (10.13.107.80) with Microsoft SMTP Server id 14.2.342.3; Thu, 18 Apr 2013 12:04:11 -0400 Received: from kaball.uk.xensource.com ([10.80.2.59]) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1USrJj-0006mL-1V; Thu, 18 Apr 2013 17:04:11 +0100 From: Stefano Stabellini To: Subject: [PATCH v2] xen/arm: introduce xen_early_init, use PSCI on xen Date: Thu, 18 Apr 2013 17:03:58 +0100 Message-ID: <1366301038-13433-1-git-send-email-stefano.stabellini@eu.citrix.com> X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130418_120415_771891_C5F5B4CE X-CRM114-Status: GOOD ( 19.20 ) X-Spam-Score: -3.3 (---) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-3.3 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [66.165.176.63 listed in list.dnswl.org] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.0 SPF_PASS SPF: sender matches SPF record -0.7 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: nicolas.pitre@linaro.org, linux@arm.linux.org.uk, arnd@arndb.de, Stefano Stabellini , will.deacon@arm.com, linux-kernel@vger.kernel.org, rob.herring@calxeda.com, olof@lixom.net, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org Split xen_guest_init in two functions, one of them (xen_early_init) is going to be called very early from setup_arch. Change machine_desc->smp_init to xen_smp_init if Xen is present on the platform. xen_smp_init just sets smp_ops to psci_smp_ops. XEN selects ARM_PSCI. This patch is based on "xen/arm: move to mach-virt and support SMP" (http://marc.info/?l=linux-kernel&m=136629656432231&w=2) and "arm: introduce psci_smp_ops" (http://marc.info/?l=linux-kernel&m=136629750732674&w=2). Changes in v2: - fix missing return value for xen_smp_init ifndef CONFIG_SMP. A git tag for this patch is available here: git://git.kernel.org/pub/scm/linux/kernel/git/sstabellini/xen.git 3.9-rc3-psci-xen-2-tag Signed-off-by: Stefano Stabellini CC: xen-devel@lists.xensource.com CC: linux-kernel@vger.kernel.org CC: linux-arm-kernel@lists.infradead.org CC: will.deacon@arm.com CC: arnd@arndb.de CC: nicolas.pitre@linaro.org CC: rob.herring@calxeda.com CC: linux@arm.linux.org.uk CC: olof@lixom.net Signed-off-by: Stefano Stabellini --- arch/arm/Kconfig | 1 + arch/arm/include/asm/xen/hypervisor.h | 6 +++++ arch/arm/kernel/setup.c | 3 ++ arch/arm/xen/enlighten.c | 39 ++++++++++++++++++++++++++------ 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 2c3bdce..344e299 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1892,6 +1892,7 @@ config XEN depends on ARM && AEABI && OF depends on CPU_V7 && !CPU_V6 depends on !GENERIC_ATOMIC64 + select ARM_PSCI help Say Y if you want to run Linux in a Virtual Machine on Xen on ARM. diff --git a/arch/arm/include/asm/xen/hypervisor.h b/arch/arm/include/asm/xen/hypervisor.h index d7ab99a..17b3ea2 100644 --- a/arch/arm/include/asm/xen/hypervisor.h +++ b/arch/arm/include/asm/xen/hypervisor.h @@ -16,4 +16,10 @@ static inline enum paravirt_lazy_mode paravirt_get_lazy_mode(void) return PARAVIRT_LAZY_NONE; } +#ifdef CONFIG_XEN +void xen_early_init(void); +#else +static inline void xen_early_init(void) { return; } +#endif + #endif /* _ASM_ARM_XEN_HYPERVISOR_H */ diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 22cc863..3dcd357 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -55,6 +55,8 @@ #include #include #include +#include +#include #include "atags.h" #include "tcm.h" @@ -768,6 +770,7 @@ void __init setup_arch(char **cmdline_p) arm_dt_init_cpu_maps(); psci_init(); + xen_early_init(); #ifdef CONFIG_SMP if (is_smp()) { if (!mdesc->smp_init || !mdesc->smp_init()) { diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index b002822..c1fe6f3 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -176,11 +178,36 @@ static int __init xen_secondary_init(unsigned int cpu) return 0; } +static bool __init xen_smp_init(void) +{ +#ifdef CONFIG_SMP + /* If we are running on Xen, use PSCI if available. + * In any case do not try to use the native smp_ops. */ + if (psci_smp_available()) + smp_set_ops(&psci_smp_ops); +#endif + return true; +} + /* * see Documentation/devicetree/bindings/arm/xen.txt for the * documentation of the Xen Device Tree format. */ #define GRANT_TABLE_PHYSADDR 0 +void __init xen_early_init(void) +{ + struct device_node *node; + + node = of_find_compatible_node(NULL, NULL, "xen,xen"); + if (!node) { + pr_debug("No Xen support\n"); + return; + } + + xen_domain_type = XEN_HVM_DOMAIN; + machine_desc->smp_init = xen_smp_init; +} + static int __init xen_guest_init(void) { struct xen_add_to_physmap xatp; @@ -194,25 +221,21 @@ static int __init xen_guest_init(void) int i; node = of_find_compatible_node(NULL, NULL, "xen,xen"); - if (!node) { - pr_debug("No Xen support\n"); - return 0; - } + s = of_get_property(node, "compatible", &len); if (strlen(xen_prefix) + 3 < len && !strncmp(xen_prefix, s, strlen(xen_prefix))) version = s + strlen(xen_prefix); if (version == NULL) { - pr_debug("Xen version not found\n"); - return 0; + pr_warn("Xen version not found\n"); + return -EINVAL; } if (of_address_to_resource(node, GRANT_TABLE_PHYSADDR, &res)) - return 0; + return -EINVAL; xen_hvm_resume_frames = res.start >> PAGE_SHIFT; xen_events_irq = irq_of_parse_and_map(node, 0); pr_info("Xen %s support found, events_irq=%d gnttab_frame_pfn=%lx\n", version, xen_events_irq, xen_hvm_resume_frames); - xen_domain_type = XEN_HVM_DOMAIN; xen_setup_features(); if (xen_feature(XENFEAT_dom0))