When system supporting both DT and ACPI but firmware providing
no dtb, we can use this linux,uefi-stub-generated-dtb property
to let kernel know that we can try ACPI configuration data even
if no "acpi=force" is passed in early parameters.

CC: Mark Rutland <mark.rutl...@arm.com>
CC: Jonathan Corbet <cor...@lwn.net>
CC: Catalin Marinas <catalin.mari...@arm.com>
CC: Will Deacon <will.dea...@arm.com>
CC: Leif Lindholm <leif.lindh...@linaro.org>
CC: Grant Likely <grant.lik...@linaro.org>
CC: Matt Fleming <matt.flem...@intel.com>
Signed-off-by: Hanjun Guo <hanjun....@linaro.org>
---
 Documentation/arm/uefi.txt         |  3 +++
 arch/arm64/include/asm/acpi.h      |  1 +
 arch/arm64/kernel/setup.c          | 30 ++++++++++++++++++++++++++++++
 drivers/firmware/efi/libstub/fdt.c |  8 ++++++++
 4 files changed, 42 insertions(+)

diff --git a/Documentation/arm/uefi.txt b/Documentation/arm/uefi.txt
index d60030a..5f86eae 100644
--- a/Documentation/arm/uefi.txt
+++ b/Documentation/arm/uefi.txt
@@ -60,5 +60,8 @@ linux,uefi-mmap-desc-ver  | 32-bit | Version of the mmap 
descriptor format.
 
--------------------------------------------------------------------------------
 linux,uefi-stub-kern-ver  | string | Copy of linux_banner from build.
 
--------------------------------------------------------------------------------
+linux,uefi-stub-generated-dtb  | bool | Indication for no DTB provided by
+                              |      | firmware.
+--------------------------------------------------------------------------------
 
 For verbose debug messages, specify 'uefi_debug' on the kernel command line.
diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
index 496c33b..9fcf632 100644
--- a/arch/arm64/include/asm/acpi.h
+++ b/arch/arm64/include/asm/acpi.h
@@ -49,6 +49,7 @@ static inline void arch_fix_phys_package_id(int num, u32 
slot) { }
 
 #else
 static inline void disable_acpi(void) { }
+static inline void enable_acpi(void) { }
 #endif /* CONFIG_ACPI */
 
 #endif /*_ASM_ACPI_H*/
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index fc4fb7b..510a681 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -371,6 +371,29 @@ static void __init request_standard_resources(void)
        }
 }
 
+static int __init dt_scan_chosen(unsigned long node, const char *uname,
+                       int depth, void *data)
+{
+       const char *p;
+
+       if (depth != 1 || !data || (strcmp(uname, "chosen") != 0))
+               return 0;
+
+       p = of_get_flat_dt_prop(node, "linux,uefi-stub-generated-dtb", NULL);
+       *(bool *)data = p ? true : false;
+
+       return 1;
+}
+
+static bool __init is_uefi_stub_generated_dtb(void)
+{
+       bool flag = false;
+
+       of_scan_flat_dt(dt_scan_chosen, &flag);
+
+       return flag;
+}
+
 u64 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = INVALID_HWID };
 
 void __init setup_arch(char **cmdline_p)
@@ -399,6 +422,13 @@ void __init setup_arch(char **cmdline_p)
        parse_early_param();
 
        /*
+        * If no dtb provided by firmware, enable ACPI and give system a
+        * chance to boot with ACPI configuration data
+        */
+       if (is_uefi_stub_generated_dtb() && acpi_disabled)
+               enable_acpi();
+
+       /*
         *  Unmask asynchronous aborts after bringing up possible earlycon.
         * (Report possible System Errors once we can report this occurred)
         */
diff --git a/drivers/firmware/efi/libstub/fdt.c 
b/drivers/firmware/efi/libstub/fdt.c
index c846a96..3777d50 100644
--- a/drivers/firmware/efi/libstub/fdt.c
+++ b/drivers/firmware/efi/libstub/fdt.c
@@ -154,6 +154,14 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, 
void *orig_fdt,
        if (status)
                goto fdt_set_fail;
 
+       /* Add a property to show the dtb is generated by uefi stub */
+       if (!orig_fdt) {
+               status = fdt_setprop(fdt, node,
+                                    "linux,uefi-stub-generated-dtb", NULL, 0);
+               if (status)
+                       goto fdt_set_fail;
+       }
+
        return EFI_SUCCESS;
 
 fdt_set_fail:
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to