EFI_STUB fails to boot non-EFI on arm64

Leif Lindholm leif.lindholm at linaro.org
Tue Jul 8 04:09:24 PDT 2014


On Tue, Jul 08, 2014 at 10:21:00AM +0100, Catalin Marinas wrote:
> I forgot about this thread. I think we need it sorted in some way.

Agreed.
 
> On Fri, May 23, 2014 at 04:03:31PM +0100, Leif Lindholm wrote:
> > My view is that this should be fixed in fdt_find_uefi_params(). A
> > single info message that we can't find evidence of UEFI should be
> > printed in the non-error case.
> [...]
> > diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
> > index cd36deb..4bb42e1e 100644
> > --- a/drivers/firmware/efi/efi.c
> > +++ b/drivers/firmware/efi/efi.c
> > @@ -366,11 +366,8 @@ static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
> >  
> >  	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);
> > -			return 0;
> > -		}
> > +		if (!prop)
> > +			goto fail;
> >  		dest = info->params + dt_params[i].offset;
> >  
> >  		val = of_read_number(prop, len / sizeof(u32));
> > @@ -385,6 +382,14 @@ static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
> >  				dt_params[i].size * 2, val);
> >  	}
> >  	return 1;
> > +
> > +	fail:
> > +	if (i == 0)
> > +		pr_info("  UEFI not found.\n");
> > +	else
> > +		pr_err("Can't find %s in device tree!\n", dt_params[i].name);
> > +
> > +	return 0;
> 
> I'm ok with the idea but I don't particularly like the implementation.
> Does this look any better (functionally the same as yours)?

It solves the problem, so sure.
Acked-by: Leif Lindholm <leif.lindholm at linaro.org>
Tested-by: Leif Lindholm <leif.lindholm at linaro.org>

> diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
> index eff1a2f22f09..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;
>  };
>  
> @@ -362,16 +363,12 @@ static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
>  	    (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen at 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 */
> --
> To unsubscribe from this list: send the line "unsubscribe linux-efi" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the linux-arm-kernel mailing list