]> xenbits.xensource.com Git - people/sstabellini/linux-pvhvm-deprecated.git/commitdiff
xen/arm: introduce xen_early_init, use PSCI on xen 3.9-rc3-smp-6
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>
Wed, 3 Apr 2013 19:10:14 +0000 (19:10 +0000)
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>
Fri, 5 Apr 2013 13:07:21 +0000 (13:07 +0000)
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.

Changes in v6:
- xen_smp_init: call smp_set_ops only ifdef CONFIG_SMP;
- move more of the initialization to xen_guest_init;
- select ARM_PSCI if XEN.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
arch/arm/Kconfig
arch/arm/include/asm/xen/hypervisor.h
arch/arm/kernel/setup.c
arch/arm/xen/enlighten.c

index 2c3bdce151346f403ee171b2d85d601b1826b39d..344e299f125751cc0f34930dcc1165b5e5c4afc1 100644 (file)
@@ -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.
 
index d7ab99a0c9ebe2499b2c4defca40c0cb4a893358..17b3ea28bdd50d5a9a6e06b1ec579b44439b81b5 100644 (file)
@@ -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 */
index 2f738cb0965de17579b1710e42f9b6af2d2b6e77..336305e8280c071cb6bc0a5afa870ab69f11f6b8 100644 (file)
@@ -55,6 +55,8 @@
 #include <asm/unwind.h>
 #include <asm/memblock.h>
 #include <asm/virt.h>
+#include <asm/xen/hypervisor.h>
+#include <xen/xen.h>
 
 #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)
index b0028223483493883972b3a6f30cace4955ec532..fc1bc2ab5422bdc129b3fa603cb156b6818f3c07 100644 (file)
@@ -11,6 +11,8 @@
 #include <xen/xenbus.h>
 #include <xen/page.h>
 #include <xen/xen-ops.h>
+#include <asm/mach/arch.h>
+#include <asm/psci.h>
 #include <asm/xen/hypervisor.h>
 #include <asm/xen/hypercall.h>
 #include <linux/interrupt.h>
@@ -176,11 +178,33 @@ static int __init xen_secondary_init(unsigned int cpu)
        return 0;
 }
 
+static void __init xen_smp_init(void)
+{
+#ifdef CONFIG_SMP
+       if (psci_smp_available())
+               smp_set_ops(&psci_smp_ops);
+#endif
+}
+
 /*
  * 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 +218,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))