HI Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> Add the support in command stm32prog of kernel load and start
> with initrd file, identify by the partition Type "Binary" in
> the flashlayout.tsv, for example:
> 
> - 0x01 fsbl   Binary none 0x0 tfa.stm32
> - 0x03 fip    Binary none 0x0 fip.bin
> P 0x10 kernel System ram0 0xC2000000 uImage.bin
> P 0x11 dtb FileSystem ram0 0xC4000000 board.dtb
> P 0x12 initrd Binary ram0 0xC4400000 <initrd>
> 
> The <initrd> file can be a legacy image "uInitrd", generated
> with mkimage, or a RAW initrd image "initrd.gz".
> 
> After a DFU detach the bootm command with be executed
> with the associated address, for example:
> 
> $> bootm 0xC2000000 0xC4400000:<size> 0xC4000000
> 
> When the "Binary" partition type is absent, the 'bootm'
> command starts the kernel without ramdisk, for example:
> 
> $> bootm 0xC2000000 - 0xC4000000
> 
> With this paths, it is no more mandatory to generate FIT
> including the kernel, DT and initrd:
> 
> - 0x01 fsbl Binary none 0x0 tfa.stm32
> - 0x03 fip Binary none 0x0 fip.bin
> P 0x10 fit System ram0 0xC2000000 fit.bin
> 
> Signed-off-by: Patrick Delaunay <[email protected]>
> ---
> 
>  .../cmd_stm32prog/cmd_stm32prog.c             | 22 +++++++++++++------
>  .../mach-stm32mp/cmd_stm32prog/stm32prog.c    | 10 ++++++---
>  .../mach-stm32mp/cmd_stm32prog/stm32prog.h    |  2 ++
>  3 files changed, 24 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c 
> b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> index e36501a86b..e584bb52bd 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> @@ -45,7 +45,6 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, 
> int argc,
>       bool reset = false;
>       struct image_header_s header;
>       struct stm32prog_data *data;
> -     u32 uimage, dtb;
>  
>       if (argc < 3 ||  argc > 5)
>               return CMD_RET_USAGE;
> @@ -119,21 +118,23 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int 
> flag, int argc,
>               goto cleanup;
>       }
>  
> -     uimage = data->uimage;
> -     dtb = data->dtb;
> -
>       stm32prog_clean(data);
>       free(stm32prog_data);
>       stm32prog_data = NULL;
>  
>       puts("Download done\n");
>  
> -     if (uimage) {
> +     if (data->uimage) {
>               char boot_addr_start[20];
>               char dtb_addr[20];
> +             char initrd_addr[40];
>               char *bootm_argv[5] = {
>                       "bootm", boot_addr_start, "-", dtb_addr, NULL
>               };
> +             u32 uimage = data->uimage;
> +             u32 dtb = data->dtb;
> +             u32 initrd = data->initrd;
> +
>               if (!dtb)
>                       bootm_argv[3] = env_get("fdtcontroladdr");
>               else
> @@ -142,8 +143,15 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, 
> int argc,
>  
>               snprintf(boot_addr_start, sizeof(boot_addr_start) - 1,
>                        "0x%x", uimage);
> -             printf("Booting kernel at %s - %s...\n\n\n",
> -                    boot_addr_start, bootm_argv[3]);
> +
> +             if (initrd) {
> +                     snprintf(initrd_addr, sizeof(initrd_addr) - 1, 
> "0x%x:0x%x",
> +                              initrd, data->initrd_size);
> +                     bootm_argv[2] = initrd_addr;
> +             }
> +
> +             printf("Booting kernel at %s %s %s...\n\n\n",
> +                    boot_addr_start, bootm_argv[2], bootm_argv[3]);
>               /* Try bootm for legacy and FIT format image */
>               if (genimg_get_format((void *)uimage) != IMAGE_FORMAT_INVALID)
>                       do_bootm(cmdtp, 0, 4, bootm_argv);
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c 
> b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> index 84b880261a..ea69d5dd16 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> @@ -1473,7 +1473,7 @@ error:
>       return ret;
>  }
>  
> -static void stm32prog_end_phase(struct stm32prog_data *data)
> +static void stm32prog_end_phase(struct stm32prog_data *data, u64 offset)
>  {
>       if (data->phase == PHASE_FLASHLAYOUT) {
>               if (parse_flash_layout(data, STM32_DDR_BASE, 0))
> @@ -1489,6 +1489,10 @@ static void stm32prog_end_phase(struct stm32prog_data 
> *data)
>                       data->uimage = data->cur_part->addr;
>               if (data->cur_part->part_type == PART_FILESYSTEM)
>                       data->dtb = data->cur_part->addr;
> +             if (data->cur_part->part_type == PART_BINARY) {
> +                     data->initrd = data->cur_part->addr;
> +                     data->initrd_size = offset;
> +             }
>       }
>  
>       if (CONFIG_IS_ENABLED(MMC) &&
> @@ -1747,7 +1751,7 @@ void dfu_flush_callback(struct dfu_entity *dfu)
>       if (dfu->dev_type == DFU_DEV_RAM) {
>               if (dfu->alt == 0 &&
>                   stm32prog_data->phase == PHASE_FLASHLAYOUT) {
> -                     stm32prog_end_phase(stm32prog_data);
> +                     stm32prog_end_phase(stm32prog_data, dfu->offset);
>                       /* waiting DFU DETACH for reenumeration */
>               }
>       }
> @@ -1756,7 +1760,7 @@ void dfu_flush_callback(struct dfu_entity *dfu)
>               return;
>  
>       if (dfu->alt == stm32prog_data->cur_part->alt_id) {
> -             stm32prog_end_phase(stm32prog_data);
> +             stm32prog_end_phase(stm32prog_data, dfu->offset);
>               stm32prog_next_phase(stm32prog_data);
>       }
>  }
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h 
> b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> index ad404879a7..efb51a3022 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> @@ -142,6 +142,8 @@ struct stm32prog_data {
>       /* bootm information */
>       u32     uimage;
>       u32     dtb;
> +     u32     initrd;
> +     u32     initrd_size;
>  };
>  
>  extern struct stm32prog_data *stm32prog_data;
> 

Reviewed-by: Patrice Chotard <[email protected]>

Thanks
Patrice

Reply via email to