diff options
Diffstat (limited to 'drivers/firmware/efi/efi.c')
| -rw-r--r-- | drivers/firmware/efi/efi.c | 28 | 
1 files changed, 18 insertions, 10 deletions
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index cd36deb619fa..dc79346689e6 100644 --- a/drivers/firmware/efi/efi.c +++ b/drivers/firmware/efi/efi.c @@ -346,6 +346,7 @@ static __initdata struct {  struct param_info {  	int verbose; +	int found;  	void *params;  }; @@ -353,25 +354,21 @@ static int __init fdt_find_uefi_params(unsigned long node, const char *uname,  				       int depth, void *data)  {  	struct param_info *info = data; -	void *prop, *dest; -	unsigned long len; +	const void *prop; +	void *dest;  	u64 val; -	int i; +	int i, len;  	if (depth != 1 ||  	    (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))  		return 0; -	pr_info("Getting parameters from FDT:\n"); -  	for (i = 0; i < ARRAY_SIZE(dt_params); i++) {  		prop = of_get_flat_dt_prop(node, dt_params[i].propname, &len); -		if (!prop) { -			pr_err("Can't find %s in device tree!\n", -			       dt_params[i].name); +		if (!prop)  			return 0; -		}  		dest = info->params + dt_params[i].offset; +		info->found++;  		val = of_read_number(prop, len / sizeof(u32)); @@ -390,10 +387,21 @@ static int __init fdt_find_uefi_params(unsigned long node, const char *uname,  int __init efi_get_fdt_params(struct efi_fdt_params *params, int verbose)  {  	struct param_info info; +	int ret; + +	pr_info("Getting EFI parameters from FDT:\n");  	info.verbose = verbose; +	info.found = 0;  	info.params = params; -	return of_scan_flat_dt(fdt_find_uefi_params, &info); +	ret = of_scan_flat_dt(fdt_find_uefi_params, &info); +	if (!info.found) +		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;  }  #endif /* CONFIG_EFI_PARAMS_FROM_FDT */  |