Skip to content
Snippets Groups Projects
Commit 1f8690aa authored by Maxime Ripard's avatar Maxime Ripard Committed by Tom Rini
Browse files

sparse: Implement several chunks flashing


The fastboot client will split the sparse images into several chunks if the
image that it tries to flash is bigger than what the device can handle.

In such a case, the bootloader is supposed to retain the last offset to
which it wrote to, so that it can resume the writes at the right offset
when flashing the next chunk.

Retain the last offset we used, and use the session ID to know if we need
it or not.

Signed-off-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
Reviewed-by: default avatarTom Rini <trini@konsulko.com>
parent 6c9e00ee
No related branches found
No related tags found
No related merge requests found
...@@ -52,6 +52,8 @@ typedef struct sparse_buffer { ...@@ -52,6 +52,8 @@ typedef struct sparse_buffer {
u16 type; u16 type;
} sparse_buffer_t; } sparse_buffer_t;
static uint32_t last_offset;
static unsigned int sparse_get_chunk_data_size(sparse_header_t *sparse, static unsigned int sparse_get_chunk_data_size(sparse_header_t *sparse,
chunk_header_t *chunk) chunk_header_t *chunk)
{ {
...@@ -301,10 +303,19 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv, ...@@ -301,10 +303,19 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv,
return -EINVAL; return -EINVAL;
} }
puts("Flashing Sparse Image\n"); /*
* If it's a new flashing session, start at the beginning of
* the partition. If not, then simply resume where we were.
*/
if (session_id > 0)
start = last_offset;
else
start = storage->start;
printf("Flashing sparse image on partition %s at offset 0x%x (ID: %d)\n",
storage->name, start * storage->block_sz, session_id);
/* Start processing chunks */ /* Start processing chunks */
start = storage->start;
for (chunk = 0; chunk < sparse_header->total_chunks; chunk++) { for (chunk = 0; chunk < sparse_header->total_chunks; chunk++) {
uint32_t blkcnt; uint32_t blkcnt;
...@@ -376,5 +387,7 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv, ...@@ -376,5 +387,7 @@ int store_sparse_image(sparse_storage_t *storage, void *storage_priv,
return -EIO; return -EIO;
} }
last_offset = start + total_blocks;
return 0; return 0;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment