[PATCH 18/18] stm32mp: stm32prog: add support of RAM target

Patrice CHOTARD patrice.chotard at st.com
Tue Apr 14 15:11:47 CEST 2020


Hi

On 3/18/20 9:25 AM, Patrick Delaunay wrote:
> Add support of RAM target in flashlayout to load kernel image
> ("system") and device tree ("filesystem") in DDR with DFU and
> start these images.
>
> The flashlayout.tsv is:
>
> -	0x01	fsbl		Binary		none	0x00000000	tf-a.stm32
> -	0x03	ssbl		Binary		none	0x00000000	u-boot.stm32
> P	0x10	kernel		System		ram0	0xC2000000	uImage.bin
> P	0x11	dtb		FileSystem	ram0	0xC4000000	dtb.bin
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
> ---
>
>  .../cmd_stm32prog/cmd_stm32prog.c             | 28 ++++++++++++++++++
>  .../mach-stm32mp/cmd_stm32prog/stm32prog.c    | 29 ++++++++++++++++++-
>  .../mach-stm32mp/cmd_stm32prog/stm32prog.h    |  7 ++++-
>  3 files changed, 62 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> index baf9b6bd1e..6bebea7ad5 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> @@ -47,6 +47,7 @@ static int do_stm32prog(cmd_tbl_t *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;
> @@ -118,11 +119,38 @@ static int do_stm32prog(cmd_tbl_t *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) {
> +		char boot_addr_start[20];
> +		char dtb_addr[20];
> +		char *bootm_argv[5] = {
> +			"bootm", boot_addr_start, "-", dtb_addr, NULL
> +		};
> +		if (!dtb)
> +			bootm_argv[3] = env_get("fdtcontroladdr");
> +		else
> +			snprintf(dtb_addr, sizeof(dtb_addr) - 1,
> +				 "0x%x", dtb);
> +
> +		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]);
> +		/* Try bootm for legacy and FIT format image */
> +		if (genimg_get_format((void *)uimage) != IMAGE_FORMAT_INVALID)
> +			do_bootm(cmdtp, 0, 4, bootm_argv);
> +		else if CONFIG_IS_ENABLED(CMD_BOOTZ)
> +			do_bootz(cmdtp, 0, 4, bootm_argv);
> +	}
> +
>  	if (reset) {
>  		puts("Reset...\n");
>  		run_command("reset", 0);
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> index 0967bbc11a..cc303214cf 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> @@ -272,6 +272,9 @@ static int parse_ip(struct stm32prog_data *data,
>  	} else if (!strncmp(p, "spi-nand", 8)) {
>  		part->target = STM32PROG_SPI_NAND;
>  		len = 8;
> +	} else if (!strncmp(p, "ram", 3)) {
> +		part->target = STM32PROG_RAM;
> +		len = 0;
>  	} else {
>  		result = -EINVAL;
>  	}
> @@ -610,6 +613,11 @@ static int init_device(struct stm32prog_data *data,
>  		dev->mtd = mtd;
>  		break;
>  #endif
> +	case STM32PROG_RAM:
> +		first_addr = gd->bd->bi_dram[0].start;
> +		last_addr = first_addr + gd->bd->bi_dram[0].size;
> +		dev->erase_size = 1;
> +		break;
>  	default:
>  		stm32prog_err("unknown device type = %d", dev->target);
>  		return -ENODEV;
> @@ -1022,7 +1030,11 @@ static int stm32prog_alt_add(struct stm32prog_data *data,
>  			  part->name, part->id,
>  			  size, multiplier, type);
>  
> -	if (part->part_type == RAW_IMAGE) {
> +	if (part->target == STM32PROG_RAM) {
> +		offset += snprintf(buf + offset, ALT_BUF_LEN - offset,
> +				   "ram 0x%llx 0x%llx",
> +				   part->addr, part->size);
> +	} else if (part->part_type == RAW_IMAGE) {
>  		u64 dfu_size;
>  
>  		if (part->dev->target == STM32PROG_MMC)
> @@ -1073,6 +1085,10 @@ static int stm32prog_alt_add(struct stm32prog_data *data,
>  		get_mtd_by_target(devstr, part->target, part->dev_id);
>  		break;
>  #endif
> +	case STM32PROG_RAM:
> +		sprintf(dfustr, "ram");
> +		sprintf(devstr, "0");
> +		break;
>  	default:
>  		stm32prog_err("invalid target: %d", part->target);
>  		return -ENODEV;
> @@ -1440,6 +1456,13 @@ static void stm32prog_end_phase(struct stm32prog_data *data)
>  	if (!data->cur_part)
>  		return;
>  
> +	if (data->cur_part->target == STM32PROG_RAM) {
> +		if (data->cur_part->part_type == PART_SYSTEM)
> +			data->uimage = data->cur_part->addr;
> +		if (data->cur_part->part_type == PART_FILESYSTEM)
> +			data->dtb = data->cur_part->addr;
> +	}
> +
>  	if (CONFIG_IS_ENABLED(MMC) &&
>  	    data->cur_part->part_id < 0) {
>  		char cmdbuf[60];
> @@ -1569,6 +1592,10 @@ static int part_delete(struct stm32prog_data *data,
>  		}
>  		break;
>  #endif
> +	case STM32PROG_RAM:
> +		printf("on ram: ");
> +		memset((void *)(uintptr_t)part->addr, 0, (size_t)part->size);
> +		break;
>  	default:
>  		ret = -1;
>  		stm32prog_err("%s (0x%x): erase invalid", part->name, part->id);
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> index c4fdb5b8c3..bae4e91c01 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> @@ -27,7 +27,8 @@ enum stm32prog_target {
>  	STM32PROG_MMC,
>  	STM32PROG_NAND,
>  	STM32PROG_NOR,
> -	STM32PROG_SPI_NAND
> +	STM32PROG_SPI_NAND,
> +	STM32PROG_RAM
>  };
>  
>  enum stm32prog_link_t {
> @@ -136,6 +137,10 @@ struct stm32prog_data {
>  	u8	*buffer; /* size = USART_RAM_BUFFER_SIZE*/
>  	int	dfu_seq;
>  	u8	read_phase;
> +
> +	/* bootm information */
> +	u32	uimage;
> +	u32	dtb;
>  };
>  
>  extern struct stm32prog_data *stm32prog_data;

Reviewed-by: Patrice Chotard <patrice.chotard at st.com>

Thanks

Patrice


More information about the U-Boot mailing list