[PATCH 01/10] stm32mp: stm32prog: remove all the header check for UART download
Patrice CHOTARD
patrice.chotard at foss.st.com
Fri May 28 14:53:08 CEST 2021
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 at 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 at foss.st.com>
Thanks
Patrice
More information about the U-Boot
mailing list