All of lore.kernel.org
 help / color / mirror / Atom feed
From: jassisinghbrar at gmail.com <jassisinghbrar@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/3] fastboot: sparse: make write_sparse_image useable for non-fastboot
Date: Fri,  6 Apr 2018 12:05:09 +0530	[thread overview]
Message-ID: <1522996509-23324-1-git-send-email-jassisinghbrar@gmail.com> (raw)
In-Reply-To: <1522996457-23191-1-git-send-email-jassisinghbrar@gmail.com>

From: Jassi Brar <jaswinder.singh@linaro.org>

write_sparse_image could be useful for non-fastboot users.
For ex a platform, without usb-device/fastboot support, could
get sparse images over tftp and write using the mmc command.
Or non-android systems could also leverage the sparse format.

Towards that, this patch removes anything fastboot specific from
the write_sparse_image implementation. Which includes making the
function return integer as error code and calls for fastboot logging
via an optional callback function 'mssg'.

Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
---
 common/fb_mmc.c        |  6 ++++-
 common/fb_nand.c       |  5 +++-
 common/image-sparse.c  | 69 +++++++++++++++++++++++---------------------------
 include/image-sparse.h |  6 +++--
 4 files changed, 45 insertions(+), 41 deletions(-)

diff --git a/common/fb_mmc.c b/common/fb_mmc.c
index 6993309..d14b22f 100644
--- a/common/fb_mmc.c
+++ b/common/fb_mmc.c
@@ -330,6 +330,7 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
 	if (is_sparse_image(download_buffer)) {
 		struct fb_mmc_sparse sparse_priv;
 		struct sparse_storage sparse;
+		int err;
 
 		sparse_priv.dev_desc = dev_desc;
 
@@ -338,12 +339,15 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
 		sparse.size = info.size;
 		sparse.write = fb_mmc_sparse_write;
 		sparse.reserve = fb_mmc_sparse_reserve;
+		sparse.mssg = fastboot_fail;
 
 		printf("Flashing sparse image at offset " LBAFU "\n",
 		       sparse.start);
 
 		sparse.priv = &sparse_priv;
-		write_sparse_image(&sparse, cmd, download_buffer);
+		err = write_sparse_image(&sparse, cmd, download_buffer);
+		if (!err)
+			fastboot_okay("");
 	} else {
 		write_raw_image(dev_desc, &info, cmd, download_buffer,
 				download_bytes);
diff --git a/common/fb_nand.c b/common/fb_nand.c
index 6130612..ad2b112 100644
--- a/common/fb_nand.c
+++ b/common/fb_nand.c
@@ -175,12 +175,15 @@ void fb_nand_flash_write(const char *cmd, void *download_buffer,
 		sparse.size = part->size / sparse.blksz;
 		sparse.write = fb_nand_sparse_write;
 		sparse.reserve = fb_nand_sparse_reserve;
+		sparse.mssg = fastboot_fail;
 
 		printf("Flashing sparse image at offset " LBAFU "\n",
 		       sparse.start);
 
 		sparse.priv = &sparse_priv;
-		write_sparse_image(&sparse, cmd, download_buffer);
+		ret = write_sparse_image(&sparse, cmd, download_buffer);
+		if (!ret)
+			fastboot_okay("");
 	} else {
 		printf("Flashing raw image at offset 0x%llx\n",
 		       part->offset);
diff --git a/common/image-sparse.c b/common/image-sparse.c
index 8ebd647..9223b9a 100644
--- a/common/image-sparse.c
+++ b/common/image-sparse.c
@@ -41,7 +41,6 @@
 #include <malloc.h>
 #include <part.h>
 #include <sparse_format.h>
-#include <fastboot.h>
 
 #include <linux/math64.h>
 
@@ -49,9 +48,10 @@
 #define CONFIG_FASTBOOT_FLASH_FILLBUF_SIZE (1024 * 512)
 #endif
 
-void write_sparse_image(
-		struct sparse_storage *info, const char *part_name,
-		void *data)
+static void default_log(const char *ignored) {}
+
+int write_sparse_image(struct sparse_storage *info,
+		       const char *part_name, void *data)
 {
 	lbaint_t blk;
 	lbaint_t blkcnt;
@@ -83,6 +83,9 @@ void write_sparse_image(
 		data += (sparse_header->file_hdr_sz - sizeof(sparse_header_t));
 	}
 
+	if (!info->mssg)
+		info->mssg = default_log;
+
 	debug("=== Sparse Image Header ===\n");
 	debug("magic: 0x%x\n", sparse_header->magic);
 	debug("major_version: 0x%x\n", sparse_header->major_version);
@@ -101,8 +104,8 @@ void write_sparse_image(
 	if (offset) {
 		printf("%s: Sparse image block size issue [%u]\n",
 		       __func__, sparse_header->blk_sz);
-		fastboot_fail("sparse image block size issue");
-		return;
+		info->mssg("sparse image block size issue");
+		return -1;
 	}
 
 	puts("Flashing Sparse Image\n");
@@ -136,18 +139,16 @@ void write_sparse_image(
 		case CHUNK_TYPE_RAW:
 			if (chunk_header->total_sz !=
 			    (sparse_header->chunk_hdr_sz + chunk_data_sz)) {
-				fastboot_fail(
-					"Bogus chunk size for chunk type Raw");
-				return;
+				info->mssg("Bogus chunk size for chunk type Raw");
+				return -1;
 			}
 
 			if (blk + blkcnt > info->start + info->size) {
 				printf(
 				    "%s: Request would exceed partition size!\n",
 				    __func__);
-				fastboot_fail(
-				    "Request would exceed partition size!");
-				return;
+				info->mssg("Request would exceed partition size!");
+				return -1;
 			}
 
 			blks = info->write(info, blk, blkcnt, data);
@@ -156,9 +157,8 @@ void write_sparse_image(
 				printf("%s: %s" LBAFU " [" LBAFU "]\n",
 				       __func__, "Write failed, block #",
 				       blk, blks);
-				fastboot_fail(
-					      "flash write failure");
-				return;
+				info->mssg("flash write failure");
+				return -1;
 			}
 			blk += blks;
 			bytes_written += blkcnt * info->blksz;
@@ -169,9 +169,8 @@ void write_sparse_image(
 		case CHUNK_TYPE_FILL:
 			if (chunk_header->total_sz !=
 			    (sparse_header->chunk_hdr_sz + sizeof(uint32_t))) {
-				fastboot_fail(
-					"Bogus chunk size for chunk type FILL");
-				return;
+				info->mssg("Bogus chunk size for chunk type FILL");
+				return -1;
 			}
 
 			fill_buf = (uint32_t *)
@@ -180,9 +179,8 @@ void write_sparse_image(
 						info->blksz * fill_buf_num_blks,
 						ARCH_DMA_MINALIGN));
 			if (!fill_buf) {
-				fastboot_fail(
-					"Malloc failed for: CHUNK_TYPE_FILL");
-				return;
+				info->mssg("Malloc failed for: CHUNK_TYPE_FILL");
+				return -1;
 			}
 
 			fill_val = *(uint32_t *)data;
@@ -198,9 +196,8 @@ void write_sparse_image(
 				printf(
 				    "%s: Request would exceed partition size!\n",
 				    __func__);
-				fastboot_fail(
-				    "Request would exceed partition size!");
-				return;
+				info->mssg("Request would exceed partition size!");
+				return -1;
 			}
 
 			for (i = 0; i < blkcnt;) {
@@ -214,10 +211,9 @@ void write_sparse_image(
 					       __func__,
 					       "Write failed, block #",
 					       blk, j);
-					fastboot_fail(
-						      "flash write failure");
+					info->mssg("flash write failure");
 					free(fill_buf);
-					return;
+					return -1;
 				}
 				blk += blks;
 				i += j;
@@ -235,9 +231,8 @@ void write_sparse_image(
 		case CHUNK_TYPE_CRC32:
 			if (chunk_header->total_sz !=
 			    sparse_header->chunk_hdr_sz) {
-				fastboot_fail(
-					"Bogus chunk size for chunk type Dont Care");
-				return;
+				info->mssg("Bogus chunk size for chunk type Dont Care");
+				return -1;
 			}
 			total_blocks += chunk_header->chunk_sz;
 			data += chunk_data_sz;
@@ -246,8 +241,8 @@ void write_sparse_image(
 		default:
 			printf("%s: Unknown chunk type: %x\n", __func__,
 			       chunk_header->chunk_type);
-			fastboot_fail("Unknown chunk type");
-			return;
+			info->mssg("Unknown chunk type");
+			return -1;
 		}
 	}
 
@@ -255,10 +250,10 @@ void write_sparse_image(
 	      total_blocks, sparse_header->total_blks);
 	printf("........ wrote %u bytes to '%s'\n", bytes_written, part_name);
 
-	if (total_blocks != sparse_header->total_blks)
-		fastboot_fail("sparse image write failure");
-	else
-		fastboot_okay("");
+	if (total_blocks != sparse_header->total_blks) {
+		info->mssg("sparse image write failure");
+		return -1;
+	}
 
-	return;
+	return 0;
 }
diff --git a/include/image-sparse.h b/include/image-sparse.h
index d92d0f3..d2b1c2e 100644
--- a/include/image-sparse.h
+++ b/include/image-sparse.h
@@ -23,6 +23,8 @@ struct sparse_storage {
 	lbaint_t	(*reserve)(struct sparse_storage *info,
 				 lbaint_t blk,
 				 lbaint_t blkcnt);
+
+	void		(*mssg)(const char *str);
 };
 
 static inline int is_sparse_image(void *buf)
@@ -36,5 +38,5 @@ static inline int is_sparse_image(void *buf)
 	return 0;
 }
 
-void write_sparse_image(struct sparse_storage *info, const char *part_name,
-			void *data);
+int write_sparse_image(struct sparse_storage *info, const char *part_name,
+		       void *data);
-- 
2.7.4

  parent reply	other threads:[~2018-04-06  6:35 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-06  6:34 [U-Boot] [PATCH 0/3] Enable mmc to write sparse images jassisinghbrar at gmail.com
2018-04-06  6:34 ` [U-Boot] [PATCH 1/3] fastboot: sparse: remove redundant argument to write_sparse_image jassisinghbrar at gmail.com
2018-05-08 17:15   ` [U-Boot] [U-Boot, " Tom Rini
2018-04-06  6:35 ` jassisinghbrar at gmail.com [this message]
2018-05-08 17:15   ` [U-Boot] [U-Boot, 2/3] fastboot: sparse: make write_sparse_image useable for non-fastboot Tom Rini
2018-04-06  6:35 ` [U-Boot] [PATCH 3/3] mmc: support writing sparse images jassisinghbrar at gmail.com
2018-05-08 17:15   ` [U-Boot] [U-Boot,3/3] " Tom Rini
2018-05-14 13:12     ` Jassi Brar
2018-05-14 14:46       ` Tom Rini
2018-05-14 16:14         ` Alex Kiernan
2018-05-14 20:50           ` Tom Rini
2018-05-14 21:08             ` Alex Kiernan
2018-05-08  3:59 ` [U-Boot] [PATCH 0/3] Enable mmc to write " Jassi Brar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1522996509-23324-1-git-send-email-jassisinghbrar@gmail.com \
    --to=jassisinghbrar@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.