All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/10] stm32mp: stm32prog: several features and fixes
@ 2021-05-18 13:12 Patrick Delaunay
  2021-05-18 13:12 ` [PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download Patrick Delaunay
                   ` (9 more replies)
  0 siblings, 10 replies; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot


This serie provides several evolution and patches for the
command stm32prog used on STM32MP platform to communicate
with the STMicroelectonics tools STM32CubeProgrammer.



Patrick Delaunay (10):
  stm32mp: stm32prog: remove all the header check for UART download
  stm32mp: stm32prog: add timeout in stm32prog_serial_get_buffer
  stm32mp: stm32prog: add support of initrd in flashlayout
  stm32mp: stm32prog: solve compilation with CONFIG_FIT_SIGNATURE
  stm32mp: stm32prog: handle the next phase after USB re-enumeration
  stm32mp: stm32prog: correctly handle DM_PMIC
  stm32mp: stm32prog: use get_cpu_dev for GetID command
  stm32mp: stm32prog: change one message level to debug
  dfu: add error callback
  stm32mp: stm32prog: handle dfu error

 .../cmd_stm32prog/cmd_stm32prog.c             |  26 ++-
 .../mach-stm32mp/cmd_stm32prog/stm32prog.c    |  43 +++--
 .../mach-stm32mp/cmd_stm32prog/stm32prog.h    |   7 +-
 .../cmd_stm32prog/stm32prog_serial.c          | 173 ++++--------------
 .../cmd_stm32prog/stm32prog_usb.c             |   7 +-
 drivers/dfu/dfu.c                             |  12 ++
 include/dfu.h                                 |  11 ++
 7 files changed, 108 insertions(+), 171 deletions(-)

-- 
2.17.1

^ permalink raw reply	[flat|nested] 32+ messages in thread

* [PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:53   ` Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 02/10] stm32mp: stm32prog: add timeout in stm32prog_serial_get_buffer Patrick Delaunay
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

This patch removes the header check for UART download;
the check of checksum is not mandatory with even parity and chuck
checksum for each 256 received bytes and it is only done for
STM32 image (FSBL = TF-A BL2), not for FIT image.

This patch solve issue of duplicated 0x100 byte written with FIP header.

Fixes: 4fb7b3e10891 ("stm32mp: stm32prog: add FIP header support")
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 .../mach-stm32mp/cmd_stm32prog/stm32prog.c    |  14 +-
 .../mach-stm32mp/cmd_stm32prog/stm32prog.h    |   5 -
 .../cmd_stm32prog/stm32prog_serial.c          | 151 ++----------------
 3 files changed, 22 insertions(+), 148 deletions(-)

diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
index 4c4d8a7a69..84b880261a 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
@@ -369,23 +369,24 @@ static int parse_flash_layout(struct stm32prog_data *data,
 	bool end_of_line, eof;
 	char *p, *start, *last, *col;
 	struct stm32prog_part_t *part;
+	struct image_header_s header;
 	int part_list_size;
 	int i;
 
 	data->part_nb = 0;
 
 	/* check if STM32image is detected */
-	stm32prog_header_check((struct raw_header_s *)addr, &data->header);
-	if (data->header.type == HEADER_STM32IMAGE) {
+	stm32prog_header_check((struct raw_header_s *)addr, &header);
+	if (header.type == HEADER_STM32IMAGE) {
 		u32 checksum;
 
 		addr = addr + BL_HEADER_SIZE;
-		size = data->header.image_length;
+		size = header.image_length;
 
-		checksum = stm32prog_header_checksum(addr, &data->header);
-		if (checksum != data->header.image_checksum) {
+		checksum = stm32prog_header_checksum(addr, &header);
+		if (checksum != header.image_checksum) {
 			stm32prog_err("Layout: invalid checksum : 0x%x expected 0x%x",
-				      checksum, data->header.image_checksum);
+				      checksum, header.image_checksum);
 			return -EIO;
 		}
 	}
@@ -1727,7 +1728,6 @@ void stm32prog_clean(struct stm32prog_data *data)
 	free(data->part_array);
 	free(data->otp_part);
 	free(data->buffer);
-	free(data->header_data);
 }
 
 /* DFU callback: used after serial and direct DFU USB access */
diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
index 581b10d0ac..ad404879a7 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
@@ -132,14 +132,9 @@ struct stm32prog_data {
 	u32			*otp_part;
 	u8			pmic_part[PMIC_SIZE];
 
-	/* STM32 header information */
-	struct raw_header_s	*header_data;
-	struct image_header_s	header;
-
 	/* SERIAL information */
 	u32	cursor;
 	u32	packet_number;
-	u32	checksum;
 	u8	*buffer; /* size = USART_RAM_BUFFER_SIZE*/
 	int	dfu_seq;
 	u8	read_phase;
diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
index 2b92e3b149..7eca86c11b 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
@@ -292,56 +292,6 @@ static void stm32prog_serial_putc(u8 w_byte)
 }
 
 /* Helper function ************************************************/
-
-static u8 stm32prog_header(struct stm32prog_data *data)
-{
-	u8 ret;
-	u8 boot = 0;
-	struct dfu_entity *dfu_entity;
-	u64 size = 0;
-
-	dfu_entity = stm32prog_get_entity(data);
-	if (!dfu_entity)
-		return -ENODEV;
-
-	printf("\nSTM32 download write %s\n", dfu_entity->name);
-
-	/* force cleanup to avoid issue with previous read */
-	dfu_transaction_cleanup(dfu_entity);
-
-	stm32prog_header_check(data->header_data, &data->header);
-
-	/* no stm32 image header : max size is partition size */
-	if (data->header.type != HEADER_STM32IMAGE) {
-		dfu_entity->get_medium_size(dfu_entity, &size);
-		data->header.image_length = size;
-	}
-
-	/**** Flash the header if necessary for boot partition */
-	if (data->phase < PHASE_FIRST_USER)
-		boot = 1;
-
-	/* write header if boot partition */
-	if (boot) {
-		if (ret) {
-			stm32prog_err("invalid header (error %d)", ret);
-		} else {
-			ret = stm32prog_write(data,
-					      (u8 *)data->header_data,
-					      BL_HEADER_SIZE);
-		}
-	} else {
-		if (ret)
-			printf("  partition without checksum\n");
-		ret = 0;
-	}
-
-	free(data->header_data);
-	data->header_data = NULL;
-
-	return ret;
-}
-
 static u8 stm32prog_start(struct stm32prog_data *data, u32 address)
 {
 	u8 ret = 0;
@@ -388,23 +338,6 @@ static u8 stm32prog_start(struct stm32prog_data *data, u32 address)
 		data->dfu_seq = 0;
 
 		printf("\n  received length = 0x%x\n", data->cursor);
-		if (data->header.type == HEADER_STM32IMAGE) {
-			if (data->cursor !=
-			    (data->header.image_length + BL_HEADER_SIZE)) {
-				stm32prog_err("transmission interrupted (length=0x%x expected=0x%x)",
-					      data->cursor,
-					      data->header.image_length +
-					      BL_HEADER_SIZE);
-				return -EIO;
-			}
-			if (data->header.image_checksum != data->checksum) {
-				stm32prog_err("invalid checksum received (0x%x expected 0x%x)",
-					      data->checksum,
-					      data->header.image_checksum);
-				return -EIO;
-			}
-			printf("\n  checksum OK (0x%x)\n", data->checksum);
-		}
 
 		/* update DFU with received flashlayout */
 		if (data->phase == PHASE_FLASHLAYOUT)
@@ -627,14 +560,12 @@ static void download_command(struct stm32prog_data *data)
 	u32 counter = 0x0, codesize = 0x0;
 	u8 *ramaddress = 0;
 	u8 rcv_data = 0x0;
-	struct image_header_s *image_header = &data->header;
 	u32 cursor = data->cursor;
 	long size = 0;
 	u8 operation;
 	u32 packet_number;
 	u32 result = ACK_BYTE;
 	u8 ret;
-	unsigned int i;
 	bool error;
 	int rcv;
 
@@ -668,13 +599,8 @@ static void download_command(struct stm32prog_data *data)
 	if (packet_number == 0) {
 		/* erase: re-initialize the image_header struct */
 		data->packet_number = 0;
-		if (data->header_data)
-			memset(data->header_data, 0, BL_HEADER_SIZE);
-		else
-			data->header_data = calloc(1, BL_HEADER_SIZE);
 		cursor = 0;
 		data->cursor = 0;
-		data->checksum = 0;
 		/*idx = cursor;*/
 	} else {
 		data->packet_number++;
@@ -746,74 +672,27 @@ static void download_command(struct stm32prog_data *data)
 		goto end;
 	}
 
-	/* Update current position in buffer */
-	data->cursor += codesize;
-
-	if (operation == PHASE_OTP) {
-		size = data->cursor - cursor;
-		/* no header for OTP */
-		if (stm32prog_otp_write(data, cursor,
-					data->buffer, &size))
-			result = ABORT_BYTE;
-		goto end;
-	}
+	switch (operation) {
+	case PHASE_OTP:
+		size = codesize;
+		ret = stm32prog_otp_write(data, cursor, data->buffer, &size);
+		break;
 
-	if (operation == PHASE_PMIC) {
-		size = data->cursor - cursor;
-		/* no header for PMIC */
-		if (stm32prog_pmic_write(data, cursor,
-					 data->buffer, &size))
-			result = ABORT_BYTE;
-		goto end;
-	}
+	case PHASE_PMIC:
+		size = codesize;
+		ret = stm32prog_pmic_write(data, cursor, data->buffer, &size);
+		break;
 
-	if (cursor < BL_HEADER_SIZE) {
-		/* size = portion of header in this chunck */
-		if (data->cursor >= BL_HEADER_SIZE)
-			size = BL_HEADER_SIZE - cursor;
-		else
-			size = data->cursor - cursor;
-		memcpy((void *)((u32)(data->header_data) + cursor),
-		       data->buffer, size);
-		cursor += size;
-
-		if (cursor == BL_HEADER_SIZE) {
-			/* Check and Write the header */
-			if (stm32prog_header(data)) {
-				result = ABORT_BYTE;
-				goto end;
-			}
-		} else {
-			goto end;
-		}
+	default:
+		ret = stm32prog_write(data, data->buffer, codesize);
+		break;
 	}
 
-	if (data->header.type == HEADER_STM32IMAGE) {
-		if (data->cursor <= BL_HEADER_SIZE)
-			goto end;
-		/* compute checksum on payload */
-		for (i = (unsigned long)size; i < codesize; i++)
-			data->checksum += data->buffer[i];
-
-		if (data->cursor >
-		    image_header->image_length + BL_HEADER_SIZE) {
-			log_err("expected size exceeded\n");
-			result = ABORT_BYTE;
-			goto end;
-		}
-
-		/* write data (payload) */
-		ret = stm32prog_write(data,
-				      &data->buffer[size],
-				      codesize - size);
-	} else {
-		/* write all */
-		ret = stm32prog_write(data,
-				      data->buffer,
-				      codesize);
-	}
 	if (ret)
 		result = ABORT_BYTE;
+	else
+		/* Update current position in buffer */
+		data->cursor += codesize;
 
 end:
 	stm32prog_serial_result(result);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 02/10] stm32mp: stm32prog: add timeout in stm32prog_serial_get_buffer
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
  2021-05-18 13:12 ` [PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:53   ` Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 03/10] stm32mp: stm32prog: add support of initrd in flashlayout Patrick Delaunay
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

Handle timeout in stm32prog_serial_get_buffer to sent NACK
to STM32CubeProgrammer when the buffer is not fully received.

This patch avoids to reach the STM32CubeProgrammer timeout and
the associated unrecoverable error.

  Timeout error occurred while waiting for acknowledgment.

  Error: Write Operation fails at packet number 4165 at address 0x1044FF

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 .../mach-stm32mp/cmd_stm32prog/stm32prog_serial.c    | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
index 7eca86c11b..2550ae6a2b 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
@@ -60,6 +60,9 @@ const u8 cmd_id[] = {
 
 #define NB_CMD sizeof(cmd_id)
 
+/* with 115200 bauds, 20 ms allow to receive the 256 bytes buffer */
+#define TIMEOUT_SERIAL_BUFFER	30
+
 /* DFU support for serial *********************************************/
 static struct dfu_entity *stm32prog_get_entity(struct stm32prog_data *data)
 {
@@ -264,6 +267,7 @@ static bool stm32prog_serial_get_buffer(u8 *buffer, u32 *count)
 {
 	struct dm_serial_ops *ops = serial_get_ops(down_serial_dev);
 	int err;
+	ulong start = get_timer(0);
 
 	do {
 		err = ops->getc(down_serial_dev);
@@ -273,6 +277,10 @@ static bool stm32prog_serial_get_buffer(u8 *buffer, u32 *count)
 		} else if (err == -EAGAIN) {
 			ctrlc();
 			WATCHDOG_RESET();
+			if (get_timer(start) > TIMEOUT_SERIAL_BUFFER) {
+				err = -ETIMEDOUT;
+				break;
+			}
 		} else {
 			break;
 		}
@@ -648,7 +656,7 @@ static void download_command(struct stm32prog_data *data)
 		printf("transmission error on packet %d, byte %d\n",
 		       packet_number, codesize - counter);
 		/* waiting end of packet before flush & NACK */
-		mdelay(30);
+		mdelay(TIMEOUT_SERIAL_BUFFER);
 		data->packet_number--;
 		result = NACK_BYTE;
 		goto end;
@@ -666,7 +674,7 @@ static void download_command(struct stm32prog_data *data)
 		/* wait to be sure that all data are received
 		 * in the FIFO before flush
 		 */
-		mdelay(30);
+		mdelay(TIMEOUT_SERIAL_BUFFER);
 		data->packet_number--;
 		result = NACK_BYTE;
 		goto end;
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 03/10] stm32mp: stm32prog: add support of initrd in flashlayout
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
  2021-05-18 13:12 ` [PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download Patrick Delaunay
  2021-05-18 13:12 ` [PATCH 02/10] stm32mp: stm32prog: add timeout in stm32prog_serial_get_buffer Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:53   ` Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 04/10] stm32mp: stm32prog: solve compilation with CONFIG_FIT_SIGNATURE Patrick Delaunay
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

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 <patrick.delaunay@foss.st.com>
---

 .../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;
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 04/10] stm32mp: stm32prog: solve compilation with CONFIG_FIT_SIGNATURE
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
                   ` (2 preceding siblings ...)
  2021-05-18 13:12 ` [PATCH 03/10] stm32mp: stm32prog: add support of initrd in flashlayout Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:53   ` Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 05/10] stm32mp: stm32prog: handle the next phase after USB re-enumeration Patrick Delaunay
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

When CONFIG_FIT_SIGNATURE is activated, CONFIG_LEGACY_IMAGE_FORMAT
is deactivated and the define IMAGE_FORMAT_LEGACY don't exist with
include/image.h:
  #if defined(CONFIG_LEGACY_IMAGE_FORMAT)
  #define IMAGE_FORMAT_LEGACY	0x01	/* legacy image_header based format */
  #endif

This patch adds the needed check on compilation flag
CONFIG_LEGACY_IMAGE_FORMAT to avoid the compilation error
for command stm32prog:

cmd_stm32prog.c:81:8: error: ?IMAGE_FORMAT_LEGACY? undeclared
(first use in this function); did you mean ?IMAGE_FORMAT_FIT??
   81 |    if (IMAGE_FORMAT_LEGACY ==
      |        ^~~~~~~~~~~~~~~~~~~
      |        IMAGE_FORMAT_FIT

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
index e584bb52bd..f3790f900f 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
@@ -77,10 +77,12 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, int argc,
 		if (header.type == HEADER_STM32IMAGE) {
 			size = header.image_length + BL_HEADER_SIZE;
 
+#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
 			/* uImage detected in STM32IMAGE, execute the script */
 			if (IMAGE_FORMAT_LEGACY ==
 			    genimg_get_format((void *)(addr + BL_HEADER_SIZE)))
 				return image_source_script(addr + BL_HEADER_SIZE, "script at 1");
+#endif
 		}
 	}
 
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 05/10] stm32mp: stm32prog: handle the next phase after USB re-enumeration
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
                   ` (3 preceding siblings ...)
  2021-05-18 13:12 ` [PATCH 04/10] stm32mp: stm32prog: solve compilation with CONFIG_FIT_SIGNATURE Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:53   ` Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 06/10] stm32mp: stm32prog: correctly handle DM_PMIC Patrick Delaunay
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

Handle the second USB enumeration only when the flashlayout is received
and when phase is PHASE_FLASHLAYOUT. This patch removes the call of
stm32prog_next_phase as it is already done in stm32prog_dfu_init().

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
index bc44d9fc8f..d4a3f7ea16 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
@@ -207,13 +207,10 @@ bool stm32prog_usb_loop(struct stm32prog_data *data, int dev)
 
 	if (stm32prog_data->phase == PHASE_FLASHLAYOUT) {
 		ret = run_usb_dnl_gadget(dev, "usb_dnl_dfu");
-		if (ret || stm32prog_data->phase == PHASE_DO_RESET)
+		if (ret || stm32prog_data->phase != PHASE_FLASHLAYOUT)
 			return ret;
 		/* prepare the second enumeration with the FlashLayout */
-		if (stm32prog_data->phase == PHASE_FLASHLAYOUT)
-			stm32prog_dfu_init(data);
-		/* found next selected partition */
-		stm32prog_next_phase(data);
+		stm32prog_dfu_init(data);
 	}
 
 	ret = run_usb_dnl_gadget(dev, "usb_dnl_dfu");
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 06/10] stm32mp: stm32prog: correctly handle DM_PMIC
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
                   ` (4 preceding siblings ...)
  2021-05-18 13:12 ` [PATCH 05/10] stm32mp: stm32prog: handle the next phase after USB re-enumeration Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:54   ` Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 07/10] stm32mp: stm32prog: use get_cpu_dev for GetID command Patrick Delaunay
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

Correctly handle number of alternate when DM_PMIC is not activated.
This patch remove the last UNKNOWN partition in this case.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
index ea69d5dd16..ab687c272d 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
@@ -1150,7 +1150,10 @@ static int dfu_init_entities(struct stm32prog_data *data)
 	struct dfu_entity *dfu;
 	int alt_nb;
 
-	alt_nb = 3; /* number of virtual = CMD, OTP, PMIC*/
+	alt_nb = 2; /* number of virtual = CMD, OTP*/
+	if (CONFIG_IS_ENABLED(DM_PMIC))
+		alt_nb++; /* PMIC NVMEM*/
+
 	if (data->part_nb == 0)
 		alt_nb++;  /* +1 for FlashLayout */
 	else
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 07/10] stm32mp: stm32prog: use get_cpu_dev for GetID command
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
                   ` (5 preceding siblings ...)
  2021-05-18 13:12 ` [PATCH 06/10] stm32mp: stm32prog: correctly handle DM_PMIC Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:54   ` Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 08/10] stm32mp: stm32prog: change one message level to debug Patrick Delaunay
                   ` (2 subsequent siblings)
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

Use get_cpu_dev() in uart getID command and remove the defines
DEVICE_ID_BYTE1 and 2 defines.

This patch prepare the support for new SOC family.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
index 2550ae6a2b..7de62668fe 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
@@ -10,6 +10,7 @@
 #include <malloc.h>
 #include <serial.h>
 #include <watchdog.h>
+#include <asm/arch/sys_proto.h>
 #include <dm/lists.h>
 #include <dm/device-internal.h>
 #include <linux/delay.h>
@@ -19,8 +20,7 @@
 /* - configuration part -----------------------------*/
 #define USART_BL_VERSION	0x40	/* USART bootloader version V4.0*/
 #define UBOOT_BL_VERSION	0x03	/* bootloader version V0.3*/
-#define DEVICE_ID_BYTE1		0x05	/* MSB byte of device ID*/
-#define DEVICE_ID_BYTE2		0x00	/* LSB byte of device ID*/
+
 #define USART_RAM_BUFFER_SIZE	256	/* Size of USART_RAM_Buf buffer*/
 
 /* - Commands -----------------------------*/
@@ -436,10 +436,12 @@ static void get_version_command(struct stm32prog_data *data)
  */
 static void get_id_command(struct stm32prog_data *data)
 {
+	u32 cpu = get_cpu_dev();
+
 	/* Send Device IDCode */
 	stm32prog_serial_putc(0x1);
-	stm32prog_serial_putc(DEVICE_ID_BYTE1);
-	stm32prog_serial_putc(DEVICE_ID_BYTE2);
+	stm32prog_serial_putc((cpu >> 8) & 0xFF);
+	stm32prog_serial_putc(cpu & 0xFF);
 	stm32prog_serial_result(ACK_BYTE);
 }
 
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 08/10] stm32mp: stm32prog: change one message level to debug
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
                   ` (6 preceding siblings ...)
  2021-05-18 13:12 ` [PATCH 07/10] stm32mp: stm32prog: use get_cpu_dev for GetID command Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:54   ` Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 09/10] dfu: add error callback Patrick Delaunay
  2021-05-18 13:12 ` [PATCH 10/10] stm32mp: stm32prog: handle dfu error Patrick Delaunay
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

Move the message "Invalid or missing layout file."
to debug level as it is a normal behavior and not an error
and add the missing '\n'.

This patch avoids the strange trace :
  Boot over usb0!
  Invalid or missing layout file.DFU alt info setting: done

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
index f3790f900f..feff73c79e 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
@@ -99,7 +99,7 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, int argc,
 
 	ret = stm32prog_init(data, addr, size);
 	if (ret)
-		printf("Invalid or missing layout file.");
+		log_debug("Invalid or missing layout file at 0x%lx.\n", addr);
 
 	/* prepare DFU for device read/write */
 	ret = stm32prog_dfu_init(data);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 09/10] dfu: add error callback
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
                   ` (7 preceding siblings ...)
  2021-05-18 13:12 ` [PATCH 08/10] stm32mp: stm32prog: change one message level to debug Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:54   ` [Uboot-stm32] " Patrice CHOTARD
  2021-05-18 13:12 ` [PATCH 10/10] stm32mp: stm32prog: handle dfu error Patrick Delaunay
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

Add error callback in dfu stack to manage some board specific
behavior on DFU targets.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 drivers/dfu/dfu.c | 12 ++++++++++++
 include/dfu.h     | 11 +++++++++++
 2 files changed, 23 insertions(+)

diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c
index 213a20e7bc..ff1859d946 100644
--- a/drivers/dfu/dfu.c
+++ b/drivers/dfu/dfu.c
@@ -44,6 +44,14 @@ __weak void dfu_initiated_callback(struct dfu_entity *dfu)
 {
 }
 
+/*
+ * The purpose of the dfu_error_callback() function is to
+ * provide callback for dfu user
+ */
+__weak void dfu_error_callback(struct dfu_entity *dfu, const char *msg)
+{
+}
+
 /*
  * The purpose of the dfu_usb_get_reset() function is to
  * provide information if after USB_DETACH request
@@ -342,6 +350,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 		printf("%s: Wrong sequence number! [%d] [%d]\n",
 		       __func__, dfu->i_blk_seq_num, blk_seq_num);
 		dfu_transaction_cleanup(dfu);
+		dfu_error_callback(dfu, "Wrong sequence number");
 		return -1;
 	}
 
@@ -366,6 +375,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 		ret = dfu_write_buffer_drain(dfu);
 		if (ret) {
 			dfu_transaction_cleanup(dfu);
+			dfu_error_callback(dfu, "DFU write error");
 			return ret;
 		}
 	}
@@ -375,6 +385,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 		pr_err("Buffer overflow! (0x%p + 0x%x > 0x%p)\n", dfu->i_buf,
 		      size, dfu->i_buf_end);
 		dfu_transaction_cleanup(dfu);
+		dfu_error_callback(dfu, "Buffer overflow");
 		return -1;
 	}
 
@@ -386,6 +397,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 		ret = dfu_write_buffer_drain(dfu);
 		if (ret) {
 			dfu_transaction_cleanup(dfu);
+			dfu_error_callback(dfu, "DFU write error");
 			return ret;
 		}
 	}
diff --git a/include/dfu.h b/include/dfu.h
index d18b701728..1963e9ffb9 100644
--- a/include/dfu.h
+++ b/include/dfu.h
@@ -383,6 +383,17 @@ void dfu_initiated_callback(struct dfu_entity *dfu);
  */
 void dfu_flush_callback(struct dfu_entity *dfu);
 
+/**
+ * dfu_error_callback() - weak callback called at the DFU write error
+ *
+ * It is a callback function called by DFU stack after DFU write error.
+ * This function allows to manage some board specific behavior on DFU targets
+ *
+ * @dfu:	pointer to the dfu_entity which cause the error
+ * @msg:	the message of the error
+ */
+void dfu_error_callback(struct dfu_entity *dfu, const char *msg);
+
 int dfu_transaction_initiate(struct dfu_entity *dfu, bool read);
 void dfu_transaction_cleanup(struct dfu_entity *dfu);
 
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [PATCH 10/10] stm32mp: stm32prog: handle dfu error
  2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
                   ` (8 preceding siblings ...)
  2021-05-18 13:12 ` [PATCH 09/10] dfu: add error callback Patrick Delaunay
@ 2021-05-18 13:12 ` Patrick Delaunay
  2021-05-28 12:54   ` Patrice CHOTARD
  9 siblings, 1 reply; 32+ messages in thread
From: Patrick Delaunay @ 2021-05-18 13:12 UTC (permalink / raw)
  To: u-boot

Handle DFU stack error in STM32CubeProgrammer protocol.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---

 arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
index ab687c272d..f7c93a1298 100644
--- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
+++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
@@ -1783,3 +1783,17 @@ void dfu_initiated_callback(struct dfu_entity *dfu)
 		log_debug("dfu offset = 0x%llx\n", dfu->offset);
 	}
 }
+
+void dfu_error_callback(struct dfu_entity *dfu, const char *msg)
+{
+	struct stm32prog_data *data = stm32prog_data;
+
+	if (!stm32prog_data)
+		return;
+
+	if (!stm32prog_data->cur_part)
+		return;
+
+	if (dfu->alt == stm32prog_data->cur_part->alt_id)
+		stm32prog_err(msg);
+}
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download
  2021-05-18 13:12 ` [PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download Patrick Delaunay
@ 2021-05-28 12:53   ` Patrice CHOTARD
  2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:53 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: Patrick Delaunay, Simon Glass, U-Boot STM32

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> This patch removes the header check for UART download;
> the check of checksum is not mandatory with even parity and chuck
> checksum for each 256 received bytes and it is only done for
> STM32 image (FSBL = TF-A BL2), not for FIT image.
> 
> This patch solve issue of duplicated 0x100 byte written with FIP header.
> 
> Fixes: 4fb7b3e10891 ("stm32mp: stm32prog: add FIP header support")
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  .../mach-stm32mp/cmd_stm32prog/stm32prog.c    |  14 +-
>  .../mach-stm32mp/cmd_stm32prog/stm32prog.h    |   5 -
>  .../cmd_stm32prog/stm32prog_serial.c          | 151 ++----------------
>  3 files changed, 22 insertions(+), 148 deletions(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> index 4c4d8a7a69..84b880261a 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> @@ -369,23 +369,24 @@ static int parse_flash_layout(struct stm32prog_data *data,
>  	bool end_of_line, eof;
>  	char *p, *start, *last, *col;
>  	struct stm32prog_part_t *part;
> +	struct image_header_s header;
>  	int part_list_size;
>  	int i;
>  
>  	data->part_nb = 0;
>  
>  	/* check if STM32image is detected */
> -	stm32prog_header_check((struct raw_header_s *)addr, &data->header);
> -	if (data->header.type == HEADER_STM32IMAGE) {
> +	stm32prog_header_check((struct raw_header_s *)addr, &header);
> +	if (header.type == HEADER_STM32IMAGE) {
>  		u32 checksum;
>  
>  		addr = addr + BL_HEADER_SIZE;
> -		size = data->header.image_length;
> +		size = header.image_length;
>  
> -		checksum = stm32prog_header_checksum(addr, &data->header);
> -		if (checksum != data->header.image_checksum) {
> +		checksum = stm32prog_header_checksum(addr, &header);
> +		if (checksum != header.image_checksum) {
>  			stm32prog_err("Layout: invalid checksum : 0x%x expected 0x%x",
> -				      checksum, data->header.image_checksum);
> +				      checksum, header.image_checksum);
>  			return -EIO;
>  		}
>  	}
> @@ -1727,7 +1728,6 @@ void stm32prog_clean(struct stm32prog_data *data)
>  	free(data->part_array);
>  	free(data->otp_part);
>  	free(data->buffer);
> -	free(data->header_data);
>  }
>  
>  /* DFU callback: used after serial and direct DFU USB access */
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> index 581b10d0ac..ad404879a7 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> @@ -132,14 +132,9 @@ struct stm32prog_data {
>  	u32			*otp_part;
>  	u8			pmic_part[PMIC_SIZE];
>  
> -	/* STM32 header information */
> -	struct raw_header_s	*header_data;
> -	struct image_header_s	header;
> -
>  	/* SERIAL information */
>  	u32	cursor;
>  	u32	packet_number;
> -	u32	checksum;
>  	u8	*buffer; /* size = USART_RAM_BUFFER_SIZE*/
>  	int	dfu_seq;
>  	u8	read_phase;
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> index 2b92e3b149..7eca86c11b 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> @@ -292,56 +292,6 @@ static void stm32prog_serial_putc(u8 w_byte)
>  }
>  
>  /* Helper function ************************************************/
> -
> -static u8 stm32prog_header(struct stm32prog_data *data)
> -{
> -	u8 ret;
> -	u8 boot = 0;
> -	struct dfu_entity *dfu_entity;
> -	u64 size = 0;
> -
> -	dfu_entity = stm32prog_get_entity(data);
> -	if (!dfu_entity)
> -		return -ENODEV;
> -
> -	printf("\nSTM32 download write %s\n", dfu_entity->name);
> -
> -	/* force cleanup to avoid issue with previous read */
> -	dfu_transaction_cleanup(dfu_entity);
> -
> -	stm32prog_header_check(data->header_data, &data->header);
> -
> -	/* no stm32 image header : max size is partition size */
> -	if (data->header.type != HEADER_STM32IMAGE) {
> -		dfu_entity->get_medium_size(dfu_entity, &size);
> -		data->header.image_length = size;
> -	}
> -
> -	/**** Flash the header if necessary for boot partition */
> -	if (data->phase < PHASE_FIRST_USER)
> -		boot = 1;
> -
> -	/* write header if boot partition */
> -	if (boot) {
> -		if (ret) {
> -			stm32prog_err("invalid header (error %d)", ret);
> -		} else {
> -			ret = stm32prog_write(data,
> -					      (u8 *)data->header_data,
> -					      BL_HEADER_SIZE);
> -		}
> -	} else {
> -		if (ret)
> -			printf("  partition without checksum\n");
> -		ret = 0;
> -	}
> -
> -	free(data->header_data);
> -	data->header_data = NULL;
> -
> -	return ret;
> -}
> -
>  static u8 stm32prog_start(struct stm32prog_data *data, u32 address)
>  {
>  	u8 ret = 0;
> @@ -388,23 +338,6 @@ static u8 stm32prog_start(struct stm32prog_data *data, u32 address)
>  		data->dfu_seq = 0;
>  
>  		printf("\n  received length = 0x%x\n", data->cursor);
> -		if (data->header.type == HEADER_STM32IMAGE) {
> -			if (data->cursor !=
> -			    (data->header.image_length + BL_HEADER_SIZE)) {
> -				stm32prog_err("transmission interrupted (length=0x%x expected=0x%x)",
> -					      data->cursor,
> -					      data->header.image_length +
> -					      BL_HEADER_SIZE);
> -				return -EIO;
> -			}
> -			if (data->header.image_checksum != data->checksum) {
> -				stm32prog_err("invalid checksum received (0x%x expected 0x%x)",
> -					      data->checksum,
> -					      data->header.image_checksum);
> -				return -EIO;
> -			}
> -			printf("\n  checksum OK (0x%x)\n", data->checksum);
> -		}
>  
>  		/* update DFU with received flashlayout */
>  		if (data->phase == PHASE_FLASHLAYOUT)
> @@ -627,14 +560,12 @@ static void download_command(struct stm32prog_data *data)
>  	u32 counter = 0x0, codesize = 0x0;
>  	u8 *ramaddress = 0;
>  	u8 rcv_data = 0x0;
> -	struct image_header_s *image_header = &data->header;
>  	u32 cursor = data->cursor;
>  	long size = 0;
>  	u8 operation;
>  	u32 packet_number;
>  	u32 result = ACK_BYTE;
>  	u8 ret;
> -	unsigned int i;
>  	bool error;
>  	int rcv;
>  
> @@ -668,13 +599,8 @@ static void download_command(struct stm32prog_data *data)
>  	if (packet_number == 0) {
>  		/* erase: re-initialize the image_header struct */
>  		data->packet_number = 0;
> -		if (data->header_data)
> -			memset(data->header_data, 0, BL_HEADER_SIZE);
> -		else
> -			data->header_data = calloc(1, BL_HEADER_SIZE);
>  		cursor = 0;
>  		data->cursor = 0;
> -		data->checksum = 0;
>  		/*idx = cursor;*/
>  	} else {
>  		data->packet_number++;
> @@ -746,74 +672,27 @@ static void download_command(struct stm32prog_data *data)
>  		goto end;
>  	}
>  
> -	/* Update current position in buffer */
> -	data->cursor += codesize;
> -
> -	if (operation == PHASE_OTP) {
> -		size = data->cursor - cursor;
> -		/* no header for OTP */
> -		if (stm32prog_otp_write(data, cursor,
> -					data->buffer, &size))
> -			result = ABORT_BYTE;
> -		goto end;
> -	}
> +	switch (operation) {
> +	case PHASE_OTP:
> +		size = codesize;
> +		ret = stm32prog_otp_write(data, cursor, data->buffer, &size);
> +		break;
>  
> -	if (operation == PHASE_PMIC) {
> -		size = data->cursor - cursor;
> -		/* no header for PMIC */
> -		if (stm32prog_pmic_write(data, cursor,
> -					 data->buffer, &size))
> -			result = ABORT_BYTE;
> -		goto end;
> -	}
> +	case PHASE_PMIC:
> +		size = codesize;
> +		ret = stm32prog_pmic_write(data, cursor, data->buffer, &size);
> +		break;
>  
> -	if (cursor < BL_HEADER_SIZE) {
> -		/* size = portion of header in this chunck */
> -		if (data->cursor >= BL_HEADER_SIZE)
> -			size = BL_HEADER_SIZE - cursor;
> -		else
> -			size = data->cursor - cursor;
> -		memcpy((void *)((u32)(data->header_data) + cursor),
> -		       data->buffer, size);
> -		cursor += size;
> -
> -		if (cursor == BL_HEADER_SIZE) {
> -			/* Check and Write the header */
> -			if (stm32prog_header(data)) {
> -				result = ABORT_BYTE;
> -				goto end;
> -			}
> -		} else {
> -			goto end;
> -		}
> +	default:
> +		ret = stm32prog_write(data, data->buffer, codesize);
> +		break;
>  	}
>  
> -	if (data->header.type == HEADER_STM32IMAGE) {
> -		if (data->cursor <= BL_HEADER_SIZE)
> -			goto end;
> -		/* compute checksum on payload */
> -		for (i = (unsigned long)size; i < codesize; i++)
> -			data->checksum += data->buffer[i];
> -
> -		if (data->cursor >
> -		    image_header->image_length + BL_HEADER_SIZE) {
> -			log_err("expected size exceeded\n");
> -			result = ABORT_BYTE;
> -			goto end;
> -		}
> -
> -		/* write data (payload) */
> -		ret = stm32prog_write(data,
> -				      &data->buffer[size],
> -				      codesize - size);
> -	} else {
> -		/* write all */
> -		ret = stm32prog_write(data,
> -				      data->buffer,
> -				      codesize);
> -	}
>  	if (ret)
>  		result = ABORT_BYTE;
> +	else
> +		/* Update current position in buffer */
> +		data->cursor += codesize;
>  
>  end:
>  	stm32prog_serial_result(result);
> 

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

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 02/10] stm32mp: stm32prog: add timeout in stm32prog_serial_get_buffer
  2021-05-18 13:12 ` [PATCH 02/10] stm32mp: stm32prog: add timeout in stm32prog_serial_get_buffer Patrick Delaunay
@ 2021-05-28 12:53   ` Patrice CHOTARD
  2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:53 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: Patrick Delaunay, Simon Glass, U-Boot STM32

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> Handle timeout in stm32prog_serial_get_buffer to sent NACK
> to STM32CubeProgrammer when the buffer is not fully received.
> 
> This patch avoids to reach the STM32CubeProgrammer timeout and
> the associated unrecoverable error.
> 
>   Timeout error occurred while waiting for acknowledgment.
> 
>   Error: Write Operation fails at packet number 4165 at address 0x1044FF
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  .../mach-stm32mp/cmd_stm32prog/stm32prog_serial.c    | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> index 7eca86c11b..2550ae6a2b 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> @@ -60,6 +60,9 @@ const u8 cmd_id[] = {
>  
>  #define NB_CMD sizeof(cmd_id)
>  
> +/* with 115200 bauds, 20 ms allow to receive the 256 bytes buffer */
> +#define TIMEOUT_SERIAL_BUFFER	30
> +
>  /* DFU support for serial *********************************************/
>  static struct dfu_entity *stm32prog_get_entity(struct stm32prog_data *data)
>  {
> @@ -264,6 +267,7 @@ static bool stm32prog_serial_get_buffer(u8 *buffer, u32 *count)
>  {
>  	struct dm_serial_ops *ops = serial_get_ops(down_serial_dev);
>  	int err;
> +	ulong start = get_timer(0);
>  
>  	do {
>  		err = ops->getc(down_serial_dev);
> @@ -273,6 +277,10 @@ static bool stm32prog_serial_get_buffer(u8 *buffer, u32 *count)
>  		} else if (err == -EAGAIN) {
>  			ctrlc();
>  			WATCHDOG_RESET();
> +			if (get_timer(start) > TIMEOUT_SERIAL_BUFFER) {
> +				err = -ETIMEDOUT;
> +				break;
> +			}
>  		} else {
>  			break;
>  		}
> @@ -648,7 +656,7 @@ static void download_command(struct stm32prog_data *data)
>  		printf("transmission error on packet %d, byte %d\n",
>  		       packet_number, codesize - counter);
>  		/* waiting end of packet before flush & NACK */
> -		mdelay(30);
> +		mdelay(TIMEOUT_SERIAL_BUFFER);
>  		data->packet_number--;
>  		result = NACK_BYTE;
>  		goto end;
> @@ -666,7 +674,7 @@ static void download_command(struct stm32prog_data *data)
>  		/* wait to be sure that all data are received
>  		 * in the FIFO before flush
>  		 */
> -		mdelay(30);
> +		mdelay(TIMEOUT_SERIAL_BUFFER);
>  		data->packet_number--;
>  		result = NACK_BYTE;
>  		goto end;
> 

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

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 03/10] stm32mp: stm32prog: add support of initrd in flashlayout
  2021-05-18 13:12 ` [PATCH 03/10] stm32mp: stm32prog: add support of initrd in flashlayout Patrick Delaunay
@ 2021-05-28 12:53   ` Patrice CHOTARD
  2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:53 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot
  Cc: Bin Meng, Patrick Delaunay, Simon Glass, U-Boot STM32

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 <patrick.delaunay@foss.st.com>
> ---
> 
>  .../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 <patrice.chotard@foss.st.com>

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 04/10] stm32mp: stm32prog: solve compilation with CONFIG_FIT_SIGNATURE
  2021-05-18 13:12 ` [PATCH 04/10] stm32mp: stm32prog: solve compilation with CONFIG_FIT_SIGNATURE Patrick Delaunay
@ 2021-05-28 12:53   ` Patrice CHOTARD
  2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:53 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot
  Cc: Bin Meng, Patrick Delaunay, Simon Glass, U-Boot STM32

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> When CONFIG_FIT_SIGNATURE is activated, CONFIG_LEGACY_IMAGE_FORMAT
> is deactivated and the define IMAGE_FORMAT_LEGACY don't exist with
> include/image.h:
>   #if defined(CONFIG_LEGACY_IMAGE_FORMAT)
>   #define IMAGE_FORMAT_LEGACY	0x01	/* legacy image_header based format */
>   #endif
> 
> This patch adds the needed check on compilation flag
> CONFIG_LEGACY_IMAGE_FORMAT to avoid the compilation error
> for command stm32prog:
> 
> cmd_stm32prog.c:81:8: error: ‘IMAGE_FORMAT_LEGACY’ undeclared
> (first use in this function); did you mean ‘IMAGE_FORMAT_FIT’?
>    81 |    if (IMAGE_FORMAT_LEGACY ==
>       |        ^~~~~~~~~~~~~~~~~~~
>       |        IMAGE_FORMAT_FIT
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> index e584bb52bd..f3790f900f 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> @@ -77,10 +77,12 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, int argc,
>  		if (header.type == HEADER_STM32IMAGE) {
>  			size = header.image_length + BL_HEADER_SIZE;
>  
> +#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
>  			/* uImage detected in STM32IMAGE, execute the script */
>  			if (IMAGE_FORMAT_LEGACY ==
>  			    genimg_get_format((void *)(addr + BL_HEADER_SIZE)))
>  				return image_source_script(addr + BL_HEADER_SIZE, "script@1");
> +#endif
>  		}
>  	}
>  
> 
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 05/10] stm32mp: stm32prog: handle the next phase after USB re-enumeration
  2021-05-18 13:12 ` [PATCH 05/10] stm32mp: stm32prog: handle the next phase after USB re-enumeration Patrick Delaunay
@ 2021-05-28 12:53   ` Patrice CHOTARD
  2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:53 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: Patrick Delaunay, U-Boot STM32

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> Handle the second USB enumeration only when the flashlayout is received
> and when phase is PHASE_FLASHLAYOUT. This patch removes the call of
> stm32prog_next_phase as it is already done in stm32prog_dfu_init().
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c | 7 ++-----
>  1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
> index bc44d9fc8f..d4a3f7ea16 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
> @@ -207,13 +207,10 @@ bool stm32prog_usb_loop(struct stm32prog_data *data, int dev)
>  
>  	if (stm32prog_data->phase == PHASE_FLASHLAYOUT) {
>  		ret = run_usb_dnl_gadget(dev, "usb_dnl_dfu");
> -		if (ret || stm32prog_data->phase == PHASE_DO_RESET)
> +		if (ret || stm32prog_data->phase != PHASE_FLASHLAYOUT)
>  			return ret;
>  		/* prepare the second enumeration with the FlashLayout */
> -		if (stm32prog_data->phase == PHASE_FLASHLAYOUT)
> -			stm32prog_dfu_init(data);
> -		/* found next selected partition */
> -		stm32prog_next_phase(data);
> +		stm32prog_dfu_init(data);
>  	}
>  
>  	ret = run_usb_dnl_gadget(dev, "usb_dnl_dfu");
> 
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 06/10] stm32mp: stm32prog: correctly handle DM_PMIC
  2021-05-18 13:12 ` [PATCH 06/10] stm32mp: stm32prog: correctly handle DM_PMIC Patrick Delaunay
@ 2021-05-28 12:54   ` Patrice CHOTARD
  2021-05-30 21:44     ` Jaehoon Chung
  2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
  0 siblings, 2 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:54 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: Patrick Delaunay, Simon Glass, U-Boot STM32

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> Correctly handle number of alternate when DM_PMIC is not activated.
> This patch remove the last UNKNOWN partition in this case.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> index ea69d5dd16..ab687c272d 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> @@ -1150,7 +1150,10 @@ static int dfu_init_entities(struct stm32prog_data *data)
>  	struct dfu_entity *dfu;
>  	int alt_nb;
>  
> -	alt_nb = 3; /* number of virtual = CMD, OTP, PMIC*/
> +	alt_nb = 2; /* number of virtual = CMD, OTP*/
> +	if (CONFIG_IS_ENABLED(DM_PMIC))
> +		alt_nb++; /* PMIC NVMEM*/
> +
>  	if (data->part_nb == 0)
>  		alt_nb++;  /* +1 for FlashLayout */
>  	else
> 

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

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 07/10] stm32mp: stm32prog: use get_cpu_dev for GetID command
  2021-05-18 13:12 ` [PATCH 07/10] stm32mp: stm32prog: use get_cpu_dev for GetID command Patrick Delaunay
@ 2021-05-28 12:54   ` Patrice CHOTARD
  2021-06-18  7:56     ` [Uboot-stm32] " Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:54 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: Patrick Delaunay, Simon Glass, U-Boot STM32

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> Use get_cpu_dev() in uart getID command and remove the defines
> DEVICE_ID_BYTE1 and 2 defines.
> 
> This patch prepare the support for new SOC family.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> index 2550ae6a2b..7de62668fe 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
> @@ -10,6 +10,7 @@
>  #include <malloc.h>
>  #include <serial.h>
>  #include <watchdog.h>
> +#include <asm/arch/sys_proto.h>
>  #include <dm/lists.h>
>  #include <dm/device-internal.h>
>  #include <linux/delay.h>
> @@ -19,8 +20,7 @@
>  /* - configuration part -----------------------------*/
>  #define USART_BL_VERSION	0x40	/* USART bootloader version V4.0*/
>  #define UBOOT_BL_VERSION	0x03	/* bootloader version V0.3*/
> -#define DEVICE_ID_BYTE1		0x05	/* MSB byte of device ID*/
> -#define DEVICE_ID_BYTE2		0x00	/* LSB byte of device ID*/
> +
>  #define USART_RAM_BUFFER_SIZE	256	/* Size of USART_RAM_Buf buffer*/
>  
>  /* - Commands -----------------------------*/
> @@ -436,10 +436,12 @@ static void get_version_command(struct stm32prog_data *data)
>   */
>  static void get_id_command(struct stm32prog_data *data)
>  {
> +	u32 cpu = get_cpu_dev();
> +
>  	/* Send Device IDCode */
>  	stm32prog_serial_putc(0x1);
> -	stm32prog_serial_putc(DEVICE_ID_BYTE1);
> -	stm32prog_serial_putc(DEVICE_ID_BYTE2);
> +	stm32prog_serial_putc((cpu >> 8) & 0xFF);
> +	stm32prog_serial_putc(cpu & 0xFF);
>  	stm32prog_serial_result(ACK_BYTE);
>  }
>  
> 

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

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 08/10] stm32mp: stm32prog: change one message level to debug
  2021-05-18 13:12 ` [PATCH 08/10] stm32mp: stm32prog: change one message level to debug Patrick Delaunay
@ 2021-05-28 12:54   ` Patrice CHOTARD
  2021-06-18  7:56     ` [Uboot-stm32] " Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:54 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot
  Cc: Bin Meng, Patrick Delaunay, Simon Glass, U-Boot STM32

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> Move the message "Invalid or missing layout file."
> to debug level as it is a normal behavior and not an error
> and add the missing '\n'.
> 
> This patch avoids the strange trace :
>   Boot over usb0!
>   Invalid or missing layout file.DFU alt info setting: done
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> index f3790f900f..feff73c79e 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> @@ -99,7 +99,7 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, int argc,
>  
>  	ret = stm32prog_init(data, addr, size);
>  	if (ret)
> -		printf("Invalid or missing layout file.");
> +		log_debug("Invalid or missing layout file at 0x%lx.\n", addr);
>  
>  	/* prepare DFU for device read/write */
>  	ret = stm32prog_dfu_init(data);
> 
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 09/10] dfu: add error callback
  2021-05-18 13:12 ` [PATCH 09/10] dfu: add error callback Patrick Delaunay
@ 2021-05-28 12:54   ` Patrice CHOTARD
  2021-06-18  7:56     ` Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:54 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: U-Boot STM32, Lukasz Majewski

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> Add error callback in dfu stack to manage some board specific
> behavior on DFU targets.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  drivers/dfu/dfu.c | 12 ++++++++++++
>  include/dfu.h     | 11 +++++++++++
>  2 files changed, 23 insertions(+)
> 
> diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c
> index 213a20e7bc..ff1859d946 100644
> --- a/drivers/dfu/dfu.c
> +++ b/drivers/dfu/dfu.c
> @@ -44,6 +44,14 @@ __weak void dfu_initiated_callback(struct dfu_entity *dfu)
>  {
>  }
>  
> +/*
> + * The purpose of the dfu_error_callback() function is to
> + * provide callback for dfu user
> + */
> +__weak void dfu_error_callback(struct dfu_entity *dfu, const char *msg)
> +{
> +}
> +
>  /*
>   * The purpose of the dfu_usb_get_reset() function is to
>   * provide information if after USB_DETACH request
> @@ -342,6 +350,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
>  		printf("%s: Wrong sequence number! [%d] [%d]\n",
>  		       __func__, dfu->i_blk_seq_num, blk_seq_num);
>  		dfu_transaction_cleanup(dfu);
> +		dfu_error_callback(dfu, "Wrong sequence number");
>  		return -1;
>  	}
>  
> @@ -366,6 +375,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
>  		ret = dfu_write_buffer_drain(dfu);
>  		if (ret) {
>  			dfu_transaction_cleanup(dfu);
> +			dfu_error_callback(dfu, "DFU write error");
>  			return ret;
>  		}
>  	}
> @@ -375,6 +385,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
>  		pr_err("Buffer overflow! (0x%p + 0x%x > 0x%p)\n", dfu->i_buf,
>  		      size, dfu->i_buf_end);
>  		dfu_transaction_cleanup(dfu);
> +		dfu_error_callback(dfu, "Buffer overflow");
>  		return -1;
>  	}
>  
> @@ -386,6 +397,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
>  		ret = dfu_write_buffer_drain(dfu);
>  		if (ret) {
>  			dfu_transaction_cleanup(dfu);
> +			dfu_error_callback(dfu, "DFU write error");
>  			return ret;
>  		}
>  	}
> diff --git a/include/dfu.h b/include/dfu.h
> index d18b701728..1963e9ffb9 100644
> --- a/include/dfu.h
> +++ b/include/dfu.h
> @@ -383,6 +383,17 @@ void dfu_initiated_callback(struct dfu_entity *dfu);
>   */
>  void dfu_flush_callback(struct dfu_entity *dfu);
>  
> +/**
> + * dfu_error_callback() - weak callback called at the DFU write error
> + *
> + * It is a callback function called by DFU stack after DFU write error.
> + * This function allows to manage some board specific behavior on DFU targets
> + *
> + * @dfu:	pointer to the dfu_entity which cause the error
> + * @msg:	the message of the error
> + */
> +void dfu_error_callback(struct dfu_entity *dfu, const char *msg);
> +
>  int dfu_transaction_initiate(struct dfu_entity *dfu, bool read);
>  void dfu_transaction_cleanup(struct dfu_entity *dfu);
>  
> 

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

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 10/10] stm32mp: stm32prog: handle dfu error
  2021-05-18 13:12 ` [PATCH 10/10] stm32mp: stm32prog: handle dfu error Patrick Delaunay
@ 2021-05-28 12:54   ` Patrice CHOTARD
  2021-06-18  7:56     ` Patrice CHOTARD
  0 siblings, 1 reply; 32+ messages in thread
From: Patrice CHOTARD @ 2021-05-28 12:54 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: Patrick Delaunay, Simon Glass, U-Boot STM32

Hi Patrick

On 5/18/21 3:12 PM, Patrick Delaunay wrote:
> Handle DFU stack error in STM32CubeProgrammer protocol.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
> ---
> 
>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> index ab687c272d..f7c93a1298 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> @@ -1783,3 +1783,17 @@ void dfu_initiated_callback(struct dfu_entity *dfu)
>  		log_debug("dfu offset = 0x%llx\n", dfu->offset);
>  	}
>  }
> +
> +void dfu_error_callback(struct dfu_entity *dfu, const char *msg)
> +{
> +	struct stm32prog_data *data = stm32prog_data;
> +
> +	if (!stm32prog_data)
> +		return;
> +
> +	if (!stm32prog_data->cur_part)
> +		return;
> +
> +	if (dfu->alt == stm32prog_data->cur_part->alt_id)
> +		stm32prog_err(msg);
> +}
> 

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

Thanks
Patrice

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 06/10] stm32mp: stm32prog: correctly handle DM_PMIC
  2021-05-28 12:54   ` Patrice CHOTARD
@ 2021-05-30 21:44     ` Jaehoon Chung
  2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
  1 sibling, 0 replies; 32+ messages in thread
From: Jaehoon Chung @ 2021-05-30 21:44 UTC (permalink / raw)
  To: Patrice CHOTARD, Patrick Delaunay, u-boot
  Cc: Patrick Delaunay, Simon Glass, U-Boot STM32

On 5/28/21 9:54 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> Correctly handle number of alternate when DM_PMIC is not activated.
>> This patch remove the last UNKNOWN partition in this case.
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c | 5 ++++-
>>  1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> index ea69d5dd16..ab687c272d 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> @@ -1150,7 +1150,10 @@ static int dfu_init_entities(struct stm32prog_data *data)
>>  	struct dfu_entity *dfu;
>>  	int alt_nb;
>>  
>> -	alt_nb = 3; /* number of virtual = CMD, OTP, PMIC*/
>> +	alt_nb = 2; /* number of virtual = CMD, OTP*/
>> +	if (CONFIG_IS_ENABLED(DM_PMIC))
>> +		alt_nb++; /* PMIC NVMEM*/
>> +
>>  	if (data->part_nb == 0)
>>  		alt_nb++;  /* +1 for FlashLayout */
>>  	else
>>
> 
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>

Acked-by: Jaehoon Chung <jh80.chung@samsung.com>

Best Regards,
Jaehoon Chung

> 
> Thanks
> Patrice
> 


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [PATCH 10/10] stm32mp: stm32prog: handle dfu error
  2021-05-28 12:54   ` Patrice CHOTARD
@ 2021-06-18  7:56     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:56 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: Patrick Delaunay, Simon Glass, U-Boot STM32

Hi Patrick

On 5/28/21 2:54 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> Handle DFU stack error in STM32CubeProgrammer protocol.
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c | 14 ++++++++++++++
>>  1 file changed, 14 insertions(+)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> index ab687c272d..f7c93a1298 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> @@ -1783,3 +1783,17 @@ void dfu_initiated_callback(struct dfu_entity *dfu)
>>  		log_debug("dfu offset = 0x%llx\n", dfu->offset);
>>  	}
>>  }
>> +
>> +void dfu_error_callback(struct dfu_entity *dfu, const char *msg)
>> +{
>> +	struct stm32prog_data *data = stm32prog_data;
>> +
>> +	if (!stm32prog_data)
>> +		return;
>> +
>> +	if (!stm32prog_data->cur_part)
>> +		return;
>> +
>> +	if (dfu->alt == stm32prog_data->cur_part->alt_id)
>> +		stm32prog_err(msg);
>> +}
>>
> 
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 09/10] dfu: add error callback
  2021-05-28 12:54   ` [Uboot-stm32] " Patrice CHOTARD
@ 2021-06-18  7:56     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:56 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: U-Boot STM32, Lukasz Majewski



On 5/28/21 2:54 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> Add error callback in dfu stack to manage some board specific
>> behavior on DFU targets.
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  drivers/dfu/dfu.c | 12 ++++++++++++
>>  include/dfu.h     | 11 +++++++++++
>>  2 files changed, 23 insertions(+)
>>
>> diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c
>> index 213a20e7bc..ff1859d946 100644
>> --- a/drivers/dfu/dfu.c
>> +++ b/drivers/dfu/dfu.c
>> @@ -44,6 +44,14 @@ __weak void dfu_initiated_callback(struct dfu_entity *dfu)
>>  {
>>  }
>>  
>> +/*
>> + * The purpose of the dfu_error_callback() function is to
>> + * provide callback for dfu user
>> + */
>> +__weak void dfu_error_callback(struct dfu_entity *dfu, const char *msg)
>> +{
>> +}
>> +
>>  /*
>>   * The purpose of the dfu_usb_get_reset() function is to
>>   * provide information if after USB_DETACH request
>> @@ -342,6 +350,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
>>  		printf("%s: Wrong sequence number! [%d] [%d]\n",
>>  		       __func__, dfu->i_blk_seq_num, blk_seq_num);
>>  		dfu_transaction_cleanup(dfu);
>> +		dfu_error_callback(dfu, "Wrong sequence number");
>>  		return -1;
>>  	}
>>  
>> @@ -366,6 +375,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
>>  		ret = dfu_write_buffer_drain(dfu);
>>  		if (ret) {
>>  			dfu_transaction_cleanup(dfu);
>> +			dfu_error_callback(dfu, "DFU write error");
>>  			return ret;
>>  		}
>>  	}
>> @@ -375,6 +385,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
>>  		pr_err("Buffer overflow! (0x%p + 0x%x > 0x%p)\n", dfu->i_buf,
>>  		      size, dfu->i_buf_end);
>>  		dfu_transaction_cleanup(dfu);
>> +		dfu_error_callback(dfu, "Buffer overflow");
>>  		return -1;
>>  	}
>>  
>> @@ -386,6 +397,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
>>  		ret = dfu_write_buffer_drain(dfu);
>>  		if (ret) {
>>  			dfu_transaction_cleanup(dfu);
>> +			dfu_error_callback(dfu, "DFU write error");
>>  			return ret;
>>  		}
>>  	}
>> diff --git a/include/dfu.h b/include/dfu.h
>> index d18b701728..1963e9ffb9 100644
>> --- a/include/dfu.h
>> +++ b/include/dfu.h
>> @@ -383,6 +383,17 @@ void dfu_initiated_callback(struct dfu_entity *dfu);
>>   */
>>  void dfu_flush_callback(struct dfu_entity *dfu);
>>  
>> +/**
>> + * dfu_error_callback() - weak callback called at the DFU write error
>> + *
>> + * It is a callback function called by DFU stack after DFU write error.
>> + * This function allows to manage some board specific behavior on DFU targets
>> + *
>> + * @dfu:	pointer to the dfu_entity which cause the error
>> + * @msg:	the message of the error
>> + */
>> +void dfu_error_callback(struct dfu_entity *dfu, const char *msg);
>> +
>>  int dfu_transaction_initiate(struct dfu_entity *dfu, bool read);
>>  void dfu_transaction_cleanup(struct dfu_entity *dfu);
>>  
>>
> 
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 08/10] stm32mp: stm32prog: change one message level to debug
  2021-05-28 12:54   ` Patrice CHOTARD
@ 2021-06-18  7:56     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:56 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot
  Cc: U-Boot STM32, Simon Glass, Bin Meng, Patrick Delaunay



On 5/28/21 2:54 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> Move the message "Invalid or missing layout file."
>> to debug level as it is a normal behavior and not an error
>> and add the missing '\n'.
>>
>> This patch avoids the strange trace :
>>   Boot over usb0!
>>   Invalid or missing layout file.DFU alt info setting: done
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
>> index f3790f900f..feff73c79e 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
>> @@ -99,7 +99,7 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, int argc,
>>  
>>  	ret = stm32prog_init(data, addr, size);
>>  	if (ret)
>> -		printf("Invalid or missing layout file.");
>> +		log_debug("Invalid or missing layout file at 0x%lx.\n", addr);
>>  
>>  	/* prepare DFU for device read/write */
>>  	ret = stm32prog_dfu_init(data);
>>
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 07/10] stm32mp: stm32prog: use get_cpu_dev for GetID command
  2021-05-28 12:54   ` Patrice CHOTARD
@ 2021-06-18  7:56     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:56 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: U-Boot STM32, Simon Glass, Patrick Delaunay



On 5/28/21 2:54 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> Use get_cpu_dev() in uart getID command and remove the defines
>> DEVICE_ID_BYTE1 and 2 defines.
>>
>> This patch prepare the support for new SOC family.
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c | 10 ++++++----
>>  1 file changed, 6 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> index 2550ae6a2b..7de62668fe 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> @@ -10,6 +10,7 @@
>>  #include <malloc.h>
>>  #include <serial.h>
>>  #include <watchdog.h>
>> +#include <asm/arch/sys_proto.h>
>>  #include <dm/lists.h>
>>  #include <dm/device-internal.h>
>>  #include <linux/delay.h>
>> @@ -19,8 +20,7 @@
>>  /* - configuration part -----------------------------*/
>>  #define USART_BL_VERSION	0x40	/* USART bootloader version V4.0*/
>>  #define UBOOT_BL_VERSION	0x03	/* bootloader version V0.3*/
>> -#define DEVICE_ID_BYTE1		0x05	/* MSB byte of device ID*/
>> -#define DEVICE_ID_BYTE2		0x00	/* LSB byte of device ID*/
>> +
>>  #define USART_RAM_BUFFER_SIZE	256	/* Size of USART_RAM_Buf buffer*/
>>  
>>  /* - Commands -----------------------------*/
>> @@ -436,10 +436,12 @@ static void get_version_command(struct stm32prog_data *data)
>>   */
>>  static void get_id_command(struct stm32prog_data *data)
>>  {
>> +	u32 cpu = get_cpu_dev();
>> +
>>  	/* Send Device IDCode */
>>  	stm32prog_serial_putc(0x1);
>> -	stm32prog_serial_putc(DEVICE_ID_BYTE1);
>> -	stm32prog_serial_putc(DEVICE_ID_BYTE2);
>> +	stm32prog_serial_putc((cpu >> 8) & 0xFF);
>> +	stm32prog_serial_putc(cpu & 0xFF);
>>  	stm32prog_serial_result(ACK_BYTE);
>>  }
>>  
>>
> 
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 06/10] stm32mp: stm32prog: correctly handle DM_PMIC
  2021-05-28 12:54   ` Patrice CHOTARD
  2021-05-30 21:44     ` Jaehoon Chung
@ 2021-06-18  7:57     ` Patrice CHOTARD
  1 sibling, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:57 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: U-Boot STM32, Simon Glass, Patrick Delaunay



On 5/28/21 2:54 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> Correctly handle number of alternate when DM_PMIC is not activated.
>> This patch remove the last UNKNOWN partition in this case.
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c | 5 ++++-
>>  1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> index ea69d5dd16..ab687c272d 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> @@ -1150,7 +1150,10 @@ static int dfu_init_entities(struct stm32prog_data *data)
>>  	struct dfu_entity *dfu;
>>  	int alt_nb;
>>  
>> -	alt_nb = 3; /* number of virtual = CMD, OTP, PMIC*/
>> +	alt_nb = 2; /* number of virtual = CMD, OTP*/
>> +	if (CONFIG_IS_ENABLED(DM_PMIC))
>> +		alt_nb++; /* PMIC NVMEM*/
>> +
>>  	if (data->part_nb == 0)
>>  		alt_nb++;  /* +1 for FlashLayout */
>>  	else
>>
> 
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 05/10] stm32mp: stm32prog: handle the next phase after USB re-enumeration
  2021-05-28 12:53   ` Patrice CHOTARD
@ 2021-06-18  7:57     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:57 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: U-Boot STM32, Patrick Delaunay



On 5/28/21 2:53 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> Handle the second USB enumeration only when the flashlayout is received
>> and when phase is PHASE_FLASHLAYOUT. This patch removes the call of
>> stm32prog_next_phase as it is already done in stm32prog_dfu_init().
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c | 7 ++-----
>>  1 file changed, 2 insertions(+), 5 deletions(-)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
>> index bc44d9fc8f..d4a3f7ea16 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_usb.c
>> @@ -207,13 +207,10 @@ bool stm32prog_usb_loop(struct stm32prog_data *data, int dev)
>>  
>>  	if (stm32prog_data->phase == PHASE_FLASHLAYOUT) {
>>  		ret = run_usb_dnl_gadget(dev, "usb_dnl_dfu");
>> -		if (ret || stm32prog_data->phase == PHASE_DO_RESET)
>> +		if (ret || stm32prog_data->phase != PHASE_FLASHLAYOUT)
>>  			return ret;
>>  		/* prepare the second enumeration with the FlashLayout */
>> -		if (stm32prog_data->phase == PHASE_FLASHLAYOUT)
>> -			stm32prog_dfu_init(data);
>> -		/* found next selected partition */
>> -		stm32prog_next_phase(data);
>> +		stm32prog_dfu_init(data);
>>  	}
>>  
>>  	ret = run_usb_dnl_gadget(dev, "usb_dnl_dfu");
>>
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 04/10] stm32mp: stm32prog: solve compilation with CONFIG_FIT_SIGNATURE
  2021-05-28 12:53   ` Patrice CHOTARD
@ 2021-06-18  7:57     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:57 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot
  Cc: U-Boot STM32, Simon Glass, Bin Meng, Patrick Delaunay



On 5/28/21 2:53 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> When CONFIG_FIT_SIGNATURE is activated, CONFIG_LEGACY_IMAGE_FORMAT
>> is deactivated and the define IMAGE_FORMAT_LEGACY don't exist with
>> include/image.h:
>>   #if defined(CONFIG_LEGACY_IMAGE_FORMAT)
>>   #define IMAGE_FORMAT_LEGACY	0x01	/* legacy image_header based format */
>>   #endif
>>
>> This patch adds the needed check on compilation flag
>> CONFIG_LEGACY_IMAGE_FORMAT to avoid the compilation error
>> for command stm32prog:
>>
>> cmd_stm32prog.c:81:8: error: ‘IMAGE_FORMAT_LEGACY’ undeclared
>> (first use in this function); did you mean ‘IMAGE_FORMAT_FIT’?
>>    81 |    if (IMAGE_FORMAT_LEGACY ==
>>       |        ^~~~~~~~~~~~~~~~~~~
>>       |        IMAGE_FORMAT_FIT
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c | 2 ++
>>  1 file changed, 2 insertions(+)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
>> index e584bb52bd..f3790f900f 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
>> @@ -77,10 +77,12 @@ static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, int argc,
>>  		if (header.type == HEADER_STM32IMAGE) {
>>  			size = header.image_length + BL_HEADER_SIZE;
>>  
>> +#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
>>  			/* uImage detected in STM32IMAGE, execute the script */
>>  			if (IMAGE_FORMAT_LEGACY ==
>>  			    genimg_get_format((void *)(addr + BL_HEADER_SIZE)))
>>  				return image_source_script(addr + BL_HEADER_SIZE, "script@1");
>> +#endif
>>  		}
>>  	}
>>  
>>
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 03/10] stm32mp: stm32prog: add support of initrd in flashlayout
  2021-05-28 12:53   ` Patrice CHOTARD
@ 2021-06-18  7:57     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:57 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot
  Cc: U-Boot STM32, Simon Glass, Bin Meng, Patrick Delaunay



On 5/28/21 2:53 PM, Patrice CHOTARD wrote:
> 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 <patrick.delaunay@foss.st.com>
>> ---
>>
>>  .../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 <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 02/10] stm32mp: stm32prog: add timeout in stm32prog_serial_get_buffer
  2021-05-28 12:53   ` Patrice CHOTARD
@ 2021-06-18  7:57     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:57 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: U-Boot STM32, Simon Glass, Patrick Delaunay



On 5/28/21 2:53 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> Handle timeout in stm32prog_serial_get_buffer to sent NACK
>> to STM32CubeProgrammer when the buffer is not fully received.
>>
>> This patch avoids to reach the STM32CubeProgrammer timeout and
>> the associated unrecoverable error.
>>
>>   Timeout error occurred while waiting for acknowledgment.
>>
>>   Error: Write Operation fails at packet number 4165 at address 0x1044FF
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  .../mach-stm32mp/cmd_stm32prog/stm32prog_serial.c    | 12 ++++++++++--
>>  1 file changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> index 7eca86c11b..2550ae6a2b 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> @@ -60,6 +60,9 @@ const u8 cmd_id[] = {
>>  
>>  #define NB_CMD sizeof(cmd_id)
>>  
>> +/* with 115200 bauds, 20 ms allow to receive the 256 bytes buffer */
>> +#define TIMEOUT_SERIAL_BUFFER	30
>> +
>>  /* DFU support for serial *********************************************/
>>  static struct dfu_entity *stm32prog_get_entity(struct stm32prog_data *data)
>>  {
>> @@ -264,6 +267,7 @@ static bool stm32prog_serial_get_buffer(u8 *buffer, u32 *count)
>>  {
>>  	struct dm_serial_ops *ops = serial_get_ops(down_serial_dev);
>>  	int err;
>> +	ulong start = get_timer(0);
>>  
>>  	do {
>>  		err = ops->getc(down_serial_dev);
>> @@ -273,6 +277,10 @@ static bool stm32prog_serial_get_buffer(u8 *buffer, u32 *count)
>>  		} else if (err == -EAGAIN) {
>>  			ctrlc();
>>  			WATCHDOG_RESET();
>> +			if (get_timer(start) > TIMEOUT_SERIAL_BUFFER) {
>> +				err = -ETIMEDOUT;
>> +				break;
>> +			}
>>  		} else {
>>  			break;
>>  		}
>> @@ -648,7 +656,7 @@ static void download_command(struct stm32prog_data *data)
>>  		printf("transmission error on packet %d, byte %d\n",
>>  		       packet_number, codesize - counter);
>>  		/* waiting end of packet before flush & NACK */
>> -		mdelay(30);
>> +		mdelay(TIMEOUT_SERIAL_BUFFER);
>>  		data->packet_number--;
>>  		result = NACK_BYTE;
>>  		goto end;
>> @@ -666,7 +674,7 @@ static void download_command(struct stm32prog_data *data)
>>  		/* wait to be sure that all data are received
>>  		 * in the FIFO before flush
>>  		 */
>> -		mdelay(30);
>> +		mdelay(TIMEOUT_SERIAL_BUFFER);
>>  		data->packet_number--;
>>  		result = NACK_BYTE;
>>  		goto end;
>>
> 
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [Uboot-stm32] [PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download
  2021-05-28 12:53   ` Patrice CHOTARD
@ 2021-06-18  7:57     ` Patrice CHOTARD
  0 siblings, 0 replies; 32+ messages in thread
From: Patrice CHOTARD @ 2021-06-18  7:57 UTC (permalink / raw)
  To: Patrick Delaunay, u-boot; +Cc: U-Boot STM32, Simon Glass, Patrick Delaunay



On 5/28/21 2:53 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 5/18/21 3:12 PM, Patrick Delaunay wrote:
>> This patch removes the header check for UART download;
>> the check of checksum is not mandatory with even parity and chuck
>> checksum for each 256 received bytes and it is only done for
>> STM32 image (FSBL = TF-A BL2), not for FIT image.
>>
>> This patch solve issue of duplicated 0x100 byte written with FIP header.
>>
>> Fixes: 4fb7b3e10891 ("stm32mp: stm32prog: add FIP header support")
>> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>> ---
>>
>>  .../mach-stm32mp/cmd_stm32prog/stm32prog.c    |  14 +-
>>  .../mach-stm32mp/cmd_stm32prog/stm32prog.h    |   5 -
>>  .../cmd_stm32prog/stm32prog_serial.c          | 151 ++----------------
>>  3 files changed, 22 insertions(+), 148 deletions(-)
>>
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> index 4c4d8a7a69..84b880261a 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
>> @@ -369,23 +369,24 @@ static int parse_flash_layout(struct stm32prog_data *data,
>>  	bool end_of_line, eof;
>>  	char *p, *start, *last, *col;
>>  	struct stm32prog_part_t *part;
>> +	struct image_header_s header;
>>  	int part_list_size;
>>  	int i;
>>  
>>  	data->part_nb = 0;
>>  
>>  	/* check if STM32image is detected */
>> -	stm32prog_header_check((struct raw_header_s *)addr, &data->header);
>> -	if (data->header.type == HEADER_STM32IMAGE) {
>> +	stm32prog_header_check((struct raw_header_s *)addr, &header);
>> +	if (header.type == HEADER_STM32IMAGE) {
>>  		u32 checksum;
>>  
>>  		addr = addr + BL_HEADER_SIZE;
>> -		size = data->header.image_length;
>> +		size = header.image_length;
>>  
>> -		checksum = stm32prog_header_checksum(addr, &data->header);
>> -		if (checksum != data->header.image_checksum) {
>> +		checksum = stm32prog_header_checksum(addr, &header);
>> +		if (checksum != header.image_checksum) {
>>  			stm32prog_err("Layout: invalid checksum : 0x%x expected 0x%x",
>> -				      checksum, data->header.image_checksum);
>> +				      checksum, header.image_checksum);
>>  			return -EIO;
>>  		}
>>  	}
>> @@ -1727,7 +1728,6 @@ void stm32prog_clean(struct stm32prog_data *data)
>>  	free(data->part_array);
>>  	free(data->otp_part);
>>  	free(data->buffer);
>> -	free(data->header_data);
>>  }
>>  
>>  /* DFU callback: used after serial and direct DFU USB access */
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
>> index 581b10d0ac..ad404879a7 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
>> @@ -132,14 +132,9 @@ struct stm32prog_data {
>>  	u32			*otp_part;
>>  	u8			pmic_part[PMIC_SIZE];
>>  
>> -	/* STM32 header information */
>> -	struct raw_header_s	*header_data;
>> -	struct image_header_s	header;
>> -
>>  	/* SERIAL information */
>>  	u32	cursor;
>>  	u32	packet_number;
>> -	u32	checksum;
>>  	u8	*buffer; /* size = USART_RAM_BUFFER_SIZE*/
>>  	int	dfu_seq;
>>  	u8	read_phase;
>> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> index 2b92e3b149..7eca86c11b 100644
>> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog_serial.c
>> @@ -292,56 +292,6 @@ static void stm32prog_serial_putc(u8 w_byte)
>>  }
>>  
>>  /* Helper function ************************************************/
>> -
>> -static u8 stm32prog_header(struct stm32prog_data *data)
>> -{
>> -	u8 ret;
>> -	u8 boot = 0;
>> -	struct dfu_entity *dfu_entity;
>> -	u64 size = 0;
>> -
>> -	dfu_entity = stm32prog_get_entity(data);
>> -	if (!dfu_entity)
>> -		return -ENODEV;
>> -
>> -	printf("\nSTM32 download write %s\n", dfu_entity->name);
>> -
>> -	/* force cleanup to avoid issue with previous read */
>> -	dfu_transaction_cleanup(dfu_entity);
>> -
>> -	stm32prog_header_check(data->header_data, &data->header);
>> -
>> -	/* no stm32 image header : max size is partition size */
>> -	if (data->header.type != HEADER_STM32IMAGE) {
>> -		dfu_entity->get_medium_size(dfu_entity, &size);
>> -		data->header.image_length = size;
>> -	}
>> -
>> -	/**** Flash the header if necessary for boot partition */
>> -	if (data->phase < PHASE_FIRST_USER)
>> -		boot = 1;
>> -
>> -	/* write header if boot partition */
>> -	if (boot) {
>> -		if (ret) {
>> -			stm32prog_err("invalid header (error %d)", ret);
>> -		} else {
>> -			ret = stm32prog_write(data,
>> -					      (u8 *)data->header_data,
>> -					      BL_HEADER_SIZE);
>> -		}
>> -	} else {
>> -		if (ret)
>> -			printf("  partition without checksum\n");
>> -		ret = 0;
>> -	}
>> -
>> -	free(data->header_data);
>> -	data->header_data = NULL;
>> -
>> -	return ret;
>> -}
>> -
>>  static u8 stm32prog_start(struct stm32prog_data *data, u32 address)
>>  {
>>  	u8 ret = 0;
>> @@ -388,23 +338,6 @@ static u8 stm32prog_start(struct stm32prog_data *data, u32 address)
>>  		data->dfu_seq = 0;
>>  
>>  		printf("\n  received length = 0x%x\n", data->cursor);
>> -		if (data->header.type == HEADER_STM32IMAGE) {
>> -			if (data->cursor !=
>> -			    (data->header.image_length + BL_HEADER_SIZE)) {
>> -				stm32prog_err("transmission interrupted (length=0x%x expected=0x%x)",
>> -					      data->cursor,
>> -					      data->header.image_length +
>> -					      BL_HEADER_SIZE);
>> -				return -EIO;
>> -			}
>> -			if (data->header.image_checksum != data->checksum) {
>> -				stm32prog_err("invalid checksum received (0x%x expected 0x%x)",
>> -					      data->checksum,
>> -					      data->header.image_checksum);
>> -				return -EIO;
>> -			}
>> -			printf("\n  checksum OK (0x%x)\n", data->checksum);
>> -		}
>>  
>>  		/* update DFU with received flashlayout */
>>  		if (data->phase == PHASE_FLASHLAYOUT)
>> @@ -627,14 +560,12 @@ static void download_command(struct stm32prog_data *data)
>>  	u32 counter = 0x0, codesize = 0x0;
>>  	u8 *ramaddress = 0;
>>  	u8 rcv_data = 0x0;
>> -	struct image_header_s *image_header = &data->header;
>>  	u32 cursor = data->cursor;
>>  	long size = 0;
>>  	u8 operation;
>>  	u32 packet_number;
>>  	u32 result = ACK_BYTE;
>>  	u8 ret;
>> -	unsigned int i;
>>  	bool error;
>>  	int rcv;
>>  
>> @@ -668,13 +599,8 @@ static void download_command(struct stm32prog_data *data)
>>  	if (packet_number == 0) {
>>  		/* erase: re-initialize the image_header struct */
>>  		data->packet_number = 0;
>> -		if (data->header_data)
>> -			memset(data->header_data, 0, BL_HEADER_SIZE);
>> -		else
>> -			data->header_data = calloc(1, BL_HEADER_SIZE);
>>  		cursor = 0;
>>  		data->cursor = 0;
>> -		data->checksum = 0;
>>  		/*idx = cursor;*/
>>  	} else {
>>  		data->packet_number++;
>> @@ -746,74 +672,27 @@ static void download_command(struct stm32prog_data *data)
>>  		goto end;
>>  	}
>>  
>> -	/* Update current position in buffer */
>> -	data->cursor += codesize;
>> -
>> -	if (operation == PHASE_OTP) {
>> -		size = data->cursor - cursor;
>> -		/* no header for OTP */
>> -		if (stm32prog_otp_write(data, cursor,
>> -					data->buffer, &size))
>> -			result = ABORT_BYTE;
>> -		goto end;
>> -	}
>> +	switch (operation) {
>> +	case PHASE_OTP:
>> +		size = codesize;
>> +		ret = stm32prog_otp_write(data, cursor, data->buffer, &size);
>> +		break;
>>  
>> -	if (operation == PHASE_PMIC) {
>> -		size = data->cursor - cursor;
>> -		/* no header for PMIC */
>> -		if (stm32prog_pmic_write(data, cursor,
>> -					 data->buffer, &size))
>> -			result = ABORT_BYTE;
>> -		goto end;
>> -	}
>> +	case PHASE_PMIC:
>> +		size = codesize;
>> +		ret = stm32prog_pmic_write(data, cursor, data->buffer, &size);
>> +		break;
>>  
>> -	if (cursor < BL_HEADER_SIZE) {
>> -		/* size = portion of header in this chunck */
>> -		if (data->cursor >= BL_HEADER_SIZE)
>> -			size = BL_HEADER_SIZE - cursor;
>> -		else
>> -			size = data->cursor - cursor;
>> -		memcpy((void *)((u32)(data->header_data) + cursor),
>> -		       data->buffer, size);
>> -		cursor += size;
>> -
>> -		if (cursor == BL_HEADER_SIZE) {
>> -			/* Check and Write the header */
>> -			if (stm32prog_header(data)) {
>> -				result = ABORT_BYTE;
>> -				goto end;
>> -			}
>> -		} else {
>> -			goto end;
>> -		}
>> +	default:
>> +		ret = stm32prog_write(data, data->buffer, codesize);
>> +		break;
>>  	}
>>  
>> -	if (data->header.type == HEADER_STM32IMAGE) {
>> -		if (data->cursor <= BL_HEADER_SIZE)
>> -			goto end;
>> -		/* compute checksum on payload */
>> -		for (i = (unsigned long)size; i < codesize; i++)
>> -			data->checksum += data->buffer[i];
>> -
>> -		if (data->cursor >
>> -		    image_header->image_length + BL_HEADER_SIZE) {
>> -			log_err("expected size exceeded\n");
>> -			result = ABORT_BYTE;
>> -			goto end;
>> -		}
>> -
>> -		/* write data (payload) */
>> -		ret = stm32prog_write(data,
>> -				      &data->buffer[size],
>> -				      codesize - size);
>> -	} else {
>> -		/* write all */
>> -		ret = stm32prog_write(data,
>> -				      data->buffer,
>> -				      codesize);
>> -	}
>>  	if (ret)
>>  		result = ABORT_BYTE;
>> +	else
>> +		/* Update current position in buffer */
>> +		data->cursor += codesize;
>>  
>>  end:
>>  	stm32prog_serial_result(result);
>>
> 
> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied on u-boot-stm32/next

Thanks

^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2021-06-18  7:58 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-18 13:12 [PATCH 00/10] stm32mp: stm32prog: several features and fixes Patrick Delaunay
2021-05-18 13:12 ` [PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download Patrick Delaunay
2021-05-28 12:53   ` Patrice CHOTARD
2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 02/10] stm32mp: stm32prog: add timeout in stm32prog_serial_get_buffer Patrick Delaunay
2021-05-28 12:53   ` Patrice CHOTARD
2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 03/10] stm32mp: stm32prog: add support of initrd in flashlayout Patrick Delaunay
2021-05-28 12:53   ` Patrice CHOTARD
2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 04/10] stm32mp: stm32prog: solve compilation with CONFIG_FIT_SIGNATURE Patrick Delaunay
2021-05-28 12:53   ` Patrice CHOTARD
2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 05/10] stm32mp: stm32prog: handle the next phase after USB re-enumeration Patrick Delaunay
2021-05-28 12:53   ` Patrice CHOTARD
2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 06/10] stm32mp: stm32prog: correctly handle DM_PMIC Patrick Delaunay
2021-05-28 12:54   ` Patrice CHOTARD
2021-05-30 21:44     ` Jaehoon Chung
2021-06-18  7:57     ` [Uboot-stm32] " Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 07/10] stm32mp: stm32prog: use get_cpu_dev for GetID command Patrick Delaunay
2021-05-28 12:54   ` Patrice CHOTARD
2021-06-18  7:56     ` [Uboot-stm32] " Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 08/10] stm32mp: stm32prog: change one message level to debug Patrick Delaunay
2021-05-28 12:54   ` Patrice CHOTARD
2021-06-18  7:56     ` [Uboot-stm32] " Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 09/10] dfu: add error callback Patrick Delaunay
2021-05-28 12:54   ` [Uboot-stm32] " Patrice CHOTARD
2021-06-18  7:56     ` Patrice CHOTARD
2021-05-18 13:12 ` [PATCH 10/10] stm32mp: stm32prog: handle dfu error Patrick Delaunay
2021-05-28 12:54   ` Patrice CHOTARD
2021-06-18  7:56     ` Patrice CHOTARD

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.