INIT_MM_CONTEXT(efi_mm)
};
-static int uefi_debug __initdata;
-static int __init uefi_debug_setup(char *str)
-{
- uefi_debug = 1;
-
- return 0;
-}
-early_param("uefi_debug", uefi_debug_setup);
+static bool uefi_debug __initdata;
static int __init is_normal_ram(efi_memory_desc_t *md)
{
set_bit(EFI_MEMMAP, &efi.flags);
}
-void __init efi_init(void)
+void __init efi_init_fdt(void *fdt)
{
struct efi_fdt_params params;
/* Grab UEFI information placed in FDT by stub */
- if (!efi_get_fdt_params(¶ms, uefi_debug))
+ if (!efi_get_fdt_params(fdt, ¶ms))
return;
+ uefi_debug = params.verbose;
efi_system_table = params.system_table;
memblock_reserve(params.mmap & PAGE_MASK,
#include <linux/init.h>
#include <linux/efi.h>
-#include <linux/of.h>
-#include <linux/of_fdt.h>
+#include <linux/libfdt.h>
#define UEFI_PARAM(name, prop, field) \
{ \
UEFI_PARAM("MemMap Desc. Version", "linux,uefi-mmap-desc-ver", desc_ver)
};
-struct param_info {
- int verbose;
- int found;
- void *params;
-};
-
-static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
- int depth, void *data)
+bool __init efi_get_fdt_params(void *fdt, struct efi_fdt_params *params)
{
- struct param_info *info = data;
const void *prop;
- void *dest;
- u64 val;
- int i, len;
+ int node, i;
+
+ pr_info("Getting EFI parameters from FDT:\n");
- if (depth != 1 || strcmp(uname, "chosen") != 0)
- return 0;
+ node = fdt_path_offset(fdt, "/chosen");
+ if (node < 0) {
+ pr_err("/chosen node not found!\n");
+ return false;
+ }
+
+ prop = fdt_getprop(fdt, node, "bootargs", NULL);
+ params->verbose = prop && strstr(prop, "uefi_debug");
for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
- prop = of_get_flat_dt_prop(node, dt_params[i].propname, &len);
- if (!prop)
- return 0;
- dest = info->params + dt_params[i].offset;
- info->found++;
+ void *dest;
+ int len;
+ u64 val;
- val = of_read_number(prop, len / sizeof(u32));
+ prop = fdt_getprop(fdt, node, dt_params[i].propname, &len);
+ if (!prop)
+ goto not_found;
+ dest = (void *)params + dt_params[i].offset;
if (dt_params[i].size == sizeof(u32))
- *(u32 *)dest = val;
+ val = *(u32 *)dest = be32_to_cpup(prop);
else
- *(u64 *)dest = val;
+ val = *(u64 *)dest = be64_to_cpup(prop);
- if (info->verbose)
+ if (params->verbose)
pr_info(" %s: 0x%0*llx\n", dt_params[i].name,
dt_params[i].size * 2, val);
}
- return 1;
-}
-
-int __init efi_get_fdt_params(struct efi_fdt_params *params, int verbose)
-{
- struct param_info info;
- int ret;
+ return true;
- pr_info("Getting EFI parameters from FDT:\n");
-
- info.verbose = verbose;
- info.found = 0;
- info.params = params;
-
- ret = of_scan_flat_dt(fdt_find_uefi_params, &info);
- if (!info.found)
+not_found:
+ if (i == 0)
pr_info("UEFI not found.\n");
- else if (!ret)
- pr_err("Can't find '%s' in device tree!\n",
- dt_params[info.found].name);
-
- return ret;
+ else
+ pr_err("Can't find '%s' in device tree!\n", dt_params[i].name);
+ return false;
}
u32 mmap_size;
u32 desc_size;
u32 desc_ver;
+ bool verbose;
};
typedef struct {
struct resource *data_resource, struct resource *bss_resource);
extern void efi_get_time(struct timespec *now);
extern void efi_reserve_boot_services(void);
-extern int efi_get_fdt_params(struct efi_fdt_params *params, int verbose);
+extern bool efi_get_fdt_params(void *fdt, struct efi_fdt_params *params);
extern struct efi_memory_map memmap;
extern struct kobject *efi_kobj;