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.delau...@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.chot...@foss.st.com>
>
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> uboot-st...@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
>
Applied on u-boot-stm32/next
Thanks