Skip to content
Snippets Groups Projects
Commit 0abd63b2 authored by Steve Rae's avatar Steve Rae Committed by Tom Rini
Browse files

fastboot: sparse: improve CHUNK_TYPE_FILL write performance


- increase the size of the fill buffer
- testing has shown a 10x improvement when the sparse image
  has large CHUNK_TYPE_FILL chunks

Signed-off-by: default avatarSteve Rae <srae@broadcom.com>
parent 2c724046
Branches
Tags
No related merge requests found
/* /*
* Copyright (c) 2009, Google Inc. * Copyright (c) 2009, Google Inc.
* All rights reserved. * All rights reserved.
...@@ -46,6 +45,10 @@ ...@@ -46,6 +45,10 @@
#include <linux/math64.h> #include <linux/math64.h>
#ifndef CONFIG_FASTBOOT_FLASH_FILLBUF_SIZE
#define CONFIG_FASTBOOT_FLASH_FILLBUF_SIZE (1024 * 512)
#endif
void write_sparse_image( void write_sparse_image(
struct sparse_storage *info, const char *part_name, struct sparse_storage *info, const char *part_name,
void *data, unsigned sz) void *data, unsigned sz)
...@@ -62,7 +65,11 @@ void write_sparse_image( ...@@ -62,7 +65,11 @@ void write_sparse_image(
sparse_header_t *sparse_header; sparse_header_t *sparse_header;
chunk_header_t *chunk_header; chunk_header_t *chunk_header;
uint32_t total_blocks = 0; uint32_t total_blocks = 0;
int fill_buf_num_blks;
int i; int i;
int j;
fill_buf_num_blks = CONFIG_FASTBOOT_FLASH_FILLBUF_SIZE / info->blksz;
/* Read and skip over sparse image header */ /* Read and skip over sparse image header */
sparse_header = (sparse_header_t *)data; sparse_header = (sparse_header_t *)data;
...@@ -169,7 +176,8 @@ void write_sparse_image( ...@@ -169,7 +176,8 @@ void write_sparse_image(
fill_buf = (uint32_t *) fill_buf = (uint32_t *)
memalign(ARCH_DMA_MINALIGN, memalign(ARCH_DMA_MINALIGN,
ROUNDUP(info->blksz, ROUNDUP(
info->blksz * fill_buf_num_blks,
ARCH_DMA_MINALIGN)); ARCH_DMA_MINALIGN));
if (!fill_buf) { if (!fill_buf) {
fastboot_fail( fastboot_fail(
...@@ -180,7 +188,10 @@ void write_sparse_image( ...@@ -180,7 +188,10 @@ void write_sparse_image(
fill_val = *(uint32_t *)data; fill_val = *(uint32_t *)data;
data = (char *)data + sizeof(uint32_t); data = (char *)data + sizeof(uint32_t);
for (i = 0; i < (info->blksz / sizeof(fill_val)); i++) for (i = 0;
i < (info->blksz * fill_buf_num_blks /
sizeof(fill_val));
i++)
fill_buf[i] = fill_val; fill_buf[i] = fill_val;
if (blk + blkcnt > info->start + info->size) { if (blk + blkcnt > info->start + info->size) {
...@@ -192,18 +203,24 @@ void write_sparse_image( ...@@ -192,18 +203,24 @@ void write_sparse_image(
return; return;
} }
for (i = 0; i < blkcnt; i++) { for (i = 0; i < blkcnt;) {
blks = info->write(info, blk, 1, fill_buf); j = blkcnt - i;
/* blks might be > 1 (eg. NAND bad-blocks) */ if (j > fill_buf_num_blks)
if (blks < 1) { j = fill_buf_num_blks;
printf("%s: %s, block # " LBAFU "\n", blks = info->write(info, blk, j, fill_buf);
__func__, "Write failed", blk); /* blks might be > j (eg. NAND bad-blocks) */
if (blks < j) {
printf("%s: %s " LBAFU " [%d]\n",
__func__,
"Write failed, block #",
blk, j);
fastboot_fail( fastboot_fail(
"flash write failure"); "flash write failure");
free(fill_buf); free(fill_buf);
return; return;
} }
blk += blks; blk += blks;
i += j;
} }
bytes_written += blkcnt * info->blksz; bytes_written += blkcnt * info->blksz;
total_blocks += chunk_data_sz / sparse_header->blk_sz; total_blocks += chunk_data_sz / sparse_header->blk_sz;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment