[PATCH v5 3/5] cmd: mvebu: bubt: verify A38x target device type
Stefan Roese
sr at denx.de
Tue Apr 14 10:40:10 CEST 2020
Hi Joel,
On 24.03.20 15:23, 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>
>
> ---
>
> 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
>
> ---
> cmd/mvebu/bubt.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 45 insertions(+), 2 deletions(-)
>
> diff --git a/cmd/mvebu/bubt.c b/cmd/mvebu/bubt.c
> index b80b81c82a..b03924ca06 100644
> --- a/cmd/mvebu/bubt.c
> +++ b/cmd/mvebu/bubt.c
> @@ -107,6 +107,24 @@ struct a38x_main_hdr_v1 {
> u8 ext; /* 0x1E */
> u8 checksum; /* 0x1F */
> };
> +
> +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" },
> + {},
> +};
> +
> #endif
>
> struct bubt_dev {
> @@ -644,6 +662,23 @@ static int check_image_header(void)
> return 0;
> }
> #elif defined(CONFIG_ARMADA_38X)
> +static int a38x_check_boot_mode(const struct bubt_dev *dst)
> +{
> + 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;
> +
> + return -ENOEXEC;
> +}
> +
> static size_t a38x_header_size(const struct a38x_main_hdr_v1 *h)
> {
> if (h->version == 1)
> @@ -697,7 +732,7 @@ static int check_image_header(void)
> }
> #endif
>
> -static int bubt_verify(size_t image_size)
> +static int bubt_verify(const struct bubt_dev *dst)
> {
> int err;
>
> @@ -708,6 +743,14 @@ static int bubt_verify(size_t image_size)
> return err;
> }
>
> + if (IS_ENABLED(CONFIG_ARMADA_38X)) {
> + err = a38x_check_boot_mode(dst);
Unfortunately this does not work. I'm getting this warning when
compiling for A37xx boards:
cmd/mvebu/bubt.c: In function ‘bubt_verify’:
cmd/mvebu/bubt.c:758:9: warning: implicit declaration of function
‘a38x_check_boot_mode’ [-Wimplicit-function-declaration]
err = a38x_check_boot_mode(dst);
^~~~~~~~~~~~~~~~~~~~
So we can't use #ifdef in the function desclaration and IS_ENABLED()
in the "if" line above.
It seems that we need to switch back to the #ifdef in the function
description again. Or unconditianally compile a38x_check_boot_mode().
This might be even better. Please give it a try.
Thanks,
Stefan
> + if (err) {
> + puts("Error: image not built for destination device!\n");
> + return err;
> + }
> + }
> +
> return 0;
> }
>
> @@ -829,7 +872,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