stm32mp: stm32prog: add support of RAM target

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@st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
This commit is contained in:
Patrick Delaunay 2020-03-18 09:25:03 +01:00
parent d0686c69ff
commit 306a5cf24f
3 changed files with 62 additions and 2 deletions
arch/arm/mach-stm32mp/cmd_stm32prog

View File

@ -47,6 +47,7 @@ static int do_stm32prog(cmd_tbl_t *cmdtp, int flag, int argc,
bool reset = false; bool reset = false;
struct image_header_s header; struct image_header_s header;
struct stm32prog_data *data; struct stm32prog_data *data;
u32 uimage, dtb;
if (argc < 3 || argc > 5) if (argc < 3 || argc > 5)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -118,11 +119,38 @@ static int do_stm32prog(cmd_tbl_t *cmdtp, int flag, int argc,
goto cleanup; goto cleanup;
} }
uimage = data->uimage;
dtb = data->dtb;
stm32prog_clean(data); stm32prog_clean(data);
free(stm32prog_data); free(stm32prog_data);
stm32prog_data = NULL; stm32prog_data = NULL;
puts("Download done\n"); 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) { if (reset) {
puts("Reset...\n"); puts("Reset...\n");
run_command("reset", 0); run_command("reset", 0);

View File

@ -272,6 +272,9 @@ static int parse_ip(struct stm32prog_data *data,
} else if (!strncmp(p, "spi-nand", 8)) { } else if (!strncmp(p, "spi-nand", 8)) {
part->target = STM32PROG_SPI_NAND; part->target = STM32PROG_SPI_NAND;
len = 8; len = 8;
} else if (!strncmp(p, "ram", 3)) {
part->target = STM32PROG_RAM;
len = 0;
} else { } else {
result = -EINVAL; result = -EINVAL;
} }
@ -610,6 +613,11 @@ static int init_device(struct stm32prog_data *data,
dev->mtd = mtd; dev->mtd = mtd;
break; break;
#endif #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: default:
stm32prog_err("unknown device type = %d", dev->target); stm32prog_err("unknown device type = %d", dev->target);
return -ENODEV; return -ENODEV;
@ -1022,7 +1030,11 @@ static int stm32prog_alt_add(struct stm32prog_data *data,
part->name, part->id, part->name, part->id,
size, multiplier, type); 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; u64 dfu_size;
if (part->dev->target == STM32PROG_MMC) 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); get_mtd_by_target(devstr, part->target, part->dev_id);
break; break;
#endif #endif
case STM32PROG_RAM:
sprintf(dfustr, "ram");
sprintf(devstr, "0");
break;
default: default:
stm32prog_err("invalid target: %d", part->target); stm32prog_err("invalid target: %d", part->target);
return -ENODEV; return -ENODEV;
@ -1440,6 +1456,13 @@ static void stm32prog_end_phase(struct stm32prog_data *data)
if (!data->cur_part) if (!data->cur_part)
return; 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) && if (CONFIG_IS_ENABLED(MMC) &&
data->cur_part->part_id < 0) { data->cur_part->part_id < 0) {
char cmdbuf[60]; char cmdbuf[60];
@ -1569,6 +1592,10 @@ static int part_delete(struct stm32prog_data *data,
} }
break; break;
#endif #endif
case STM32PROG_RAM:
printf("on ram: ");
memset((void *)(uintptr_t)part->addr, 0, (size_t)part->size);
break;
default: default:
ret = -1; ret = -1;
stm32prog_err("%s (0x%x): erase invalid", part->name, part->id); stm32prog_err("%s (0x%x): erase invalid", part->name, part->id);

View File

@ -27,7 +27,8 @@ enum stm32prog_target {
STM32PROG_MMC, STM32PROG_MMC,
STM32PROG_NAND, STM32PROG_NAND,
STM32PROG_NOR, STM32PROG_NOR,
STM32PROG_SPI_NAND STM32PROG_SPI_NAND,
STM32PROG_RAM
}; };
enum stm32prog_link_t { enum stm32prog_link_t {
@ -136,6 +137,10 @@ struct stm32prog_data {
u8 *buffer; /* size = USART_RAM_BUFFER_SIZE*/ u8 *buffer; /* size = USART_RAM_BUFFER_SIZE*/
int dfu_seq; int dfu_seq;
u8 read_phase; u8 read_phase;
/* bootm information */
u32 uimage;
u32 dtb;
}; };
extern struct stm32prog_data *stm32prog_data; extern struct stm32prog_data *stm32prog_data;