[PATCH v6 3/5] cmd: mvebu: bubt: verify A38x target device type

Stefan Roese sr at denx.de
Wed Apr 22 14:22:09 CEST 2020


On 17.04.20 17:38, Joel Johnson wrote:
> Ensure that the device to which an image is being written includes
> header information indicating boot support for the destination
> device.
> 
> This is derived from the support in the SolidRun master-a38x vendor
> fork.
> 
> Signed-off-by: Joel Johnson <mrjoel at lixil.net>

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan

> ---
> 
> v2 changes:
>    - none
> v3 changes:
>    - use ARRAY_SIZE instead of #define size
> v4 changes:
>    - none
> v5 changes:
>    - use if(IS_ENABLED()) for inline check instead of ifdef
> v6 changes:
>    - reduce #ifdef usages at the tradeoff of otherwise unneccessarily
>      exposing A38x internal structs to more than A38x builds.
>    - since state is exposed anyway, rename a38x_check_boot_mode to
>      bubt_check_boot_mode with provision for per-target customization
> 
>      This fixes building across all mvebu targets. Exposing the needed
>      a38x_* structs isn't something I'm hugely excited about, but it does
>      get the build working and avoids inline #ifdefs as requested. In
>      cases where the target being built (all but A38x) doesn't support
>      checking the boot mode, rely on the compiler to [mostly] optimize
>      the function usage away. Local tests show an increase of only 4
>      bytes of rodata in such cases.
> 
> ---
>   cmd/mvebu/bubt.c | 52 ++++++++++++++++++++++++++++++++++++++++++++----
>   1 file changed, 48 insertions(+), 4 deletions(-)
> 
> diff --git a/cmd/mvebu/bubt.c b/cmd/mvebu/bubt.c
> index b80b81c82a..be6c5869a9 100644
> --- a/cmd/mvebu/bubt.c
> +++ b/cmd/mvebu/bubt.c
> @@ -85,7 +85,7 @@ struct mvebu_image_info {
>   	u32	encrypt_start_offset;
>   	u32	encrypt_size;
>   };
> -#elif defined(CONFIG_ARMADA_38X)	/* A38X */
> +#endif
>   
>   /* Structure of the main header, version 1 (Armada 370/38x/XP) */
>   struct a38x_main_hdr_v1 {
> @@ -107,7 +107,23 @@ struct a38x_main_hdr_v1 {
>   	u8  ext;                   /* 0x1E      */
>   	u8  checksum;              /* 0x1F      */
>   };
> -#endif
> +
> +struct a38x_boot_mode {
> +	unsigned int id;
> +	const char *name;
> +};
> +
> +/* The blockid header field values used to indicate boot device of image */
> +struct a38x_boot_mode a38x_boot_modes[] = {
> +	{ 0x4D, "i2c"  },
> +	{ 0x5A, "spi"  },
> +	{ 0x69, "uart" },
> +	{ 0x78, "sata" },
> +	{ 0x8B, "nand" },
> +	{ 0x9C, "pex"  },
> +	{ 0xAE, "mmc"  },
> +	{},
> +};
>   
>   struct bubt_dev {
>   	char name[8];
> @@ -697,7 +713,29 @@ static int check_image_header(void)
>   }
>   #endif
>   
> -static int bubt_verify(size_t image_size)
> +static int bubt_check_boot_mode(const struct bubt_dev *dst)
> +{
> +	if (IS_ENABLED(CONFIG_ARMADA_38X)) {
> +		int mode;
> +		const struct a38x_main_hdr_v1 *hdr =
> +			(struct a38x_main_hdr_v1 *)get_load_addr();
> +
> +		for (mode = 0; mode < ARRAY_SIZE(a38x_boot_modes); mode++) {
> +			if (strcmp(a38x_boot_modes[mode].name, dst->name) == 0)
> +				break;
> +		}
> +
> +		if (a38x_boot_modes[mode].id == hdr->blockid)
> +			return 0;
> +
> +		puts("Error: A38x image not built for destination device!\n");
> +		return -ENOEXEC;
> +	} else {
> +		return 0;
> +	}
> +}
> +
> +static int bubt_verify(const struct bubt_dev *dst)
>   {
>   	int err;
>   
> @@ -708,6 +746,12 @@ static int bubt_verify(size_t image_size)
>   		return err;
>   	}
>   
> +	err = bubt_check_boot_mode(dst);
> +	if (err) {
> +		printf("Error: Image boot mode verification failed\n");
> +		return err;
> +	}
> +
>   	return 0;
>   }
>   
> @@ -829,7 +873,7 @@ int do_bubt_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>   	if (!image_size)
>   		return -EIO;
>   
> -	err = bubt_verify(image_size);
> +	err = bubt_verify(dst);
>   	if (err)
>   		return err;
>   
> 


Viele Grüße,
Stefan

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list