ARM64: ACPI: Check if it runs on Xen to enable or disable ACPI
authorShannon Zhao <shannon.zhao@linaro.org>
Thu, 7 Apr 2016 12:03:29 +0000 (20:03 +0800)
committerWill Deacon <will.deacon@arm.com>
Mon, 25 Apr 2016 12:53:45 +0000 (13:53 +0100)
When it's a Xen domain0 booting with ACPI, it will supply a /chosen and
a /hypervisor node in DT. So check if it needs to enable ACPI.

Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Hanjun Guo <hanjun.guo@linaro.org>
Tested-by: Julien Grall <julien.grall@arm.com>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/kernel/acpi.c

index d1ce8e2f98b99bcb1fba0bae25c08e8f851c4f4b..57ee31745af5ac3dcdd72501ac1452a7e51fde56 100644 (file)
@@ -67,10 +67,15 @@ static int __init dt_scan_depth1_nodes(unsigned long node,
 {
        /*
         * Return 1 as soon as we encounter a node at depth 1 that is
-        * not the /chosen node.
+        * not the /chosen node, or /hypervisor node with compatible
+        * string "xen,xen".
         */
-       if (depth == 1 && (strcmp(uname, "chosen") != 0))
-               return 1;
+       if (depth == 1 && (strcmp(uname, "chosen") != 0)) {
+               if (strcmp(uname, "hypervisor") != 0 ||
+                   !of_flat_dt_is_compatible(node, "xen,xen"))
+                       return 1;
+       }
+
        return 0;
 }
 
@@ -184,7 +189,8 @@ void __init acpi_boot_table_init(void)
        /*
         * Enable ACPI instead of device tree unless
         * - ACPI has been disabled explicitly (acpi=off), or
-        * - the device tree is not empty (it has more than just a /chosen node)
+        * - the device tree is not empty (it has more than just a /chosen node,
+        *   and a /hypervisor node when running on Xen)
         *   and ACPI has not been force enabled (acpi=force)
         */
        if (param_acpi_off ||