From fa1a5aac4ceca752409895527a440a677f1ac4a6 Mon Sep 17 00:00:00 2001
From: Antoine Tenart <antoine.tenart@free-electrons.com>
Date: Wed, 22 Apr 2015 17:32:23 +0200
Subject: [PATCH 1/2] fastboot: allow to flash at a given address

Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
---
 common/fb_mmc.c | 34 ++++++++++++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/common/fb_mmc.c b/common/fb_mmc.c
index 0c48cf929f8f..747a0e58de64 100644
--- a/common/fb_mmc.c
+++ b/common/fb_mmc.c
@@ -87,11 +87,36 @@ static void write_raw_image(block_dev_desc_t *dev_desc, disk_partition_t *info,
 	fastboot_okay("");
 }
 
+static void write_raw_raw_image(block_dev_desc_t *dev_desc, long start, int blksz,
+		void *buffer, unsigned int download_bytes)
+{
+	lbaint_t blkcnt;
+	lbaint_t blks;
+
+	/* determine number of blocks to write */
+	blkcnt = ((download_bytes + (blksz - 1)) & ~(blksz - 1));
+	blkcnt = blkcnt / blksz;
+
+	puts("Flashing Raw Image\n");
+
+	blks = dev_desc->block_write(dev_desc->dev, start / blksz, blkcnt, buffer);
+	if (blks != blkcnt) {
+		error("failed writing to device %d\n", dev_desc->dev);
+		fastboot_fail("failed writing to device");
+		return;
+	}
+
+	printf("........ wrote " LBAFU " bytes to 0x%lx\n", blkcnt * blksz,
+			start);
+	fastboot_okay("");
+}
+
 void fb_mmc_flash_write(const char *cmd, void *download_buffer,
 			unsigned int download_bytes, char *response)
 {
 	block_dev_desc_t *dev_desc;
 	disk_partition_t info;
+	long start_addr;
 
 	/* initialize the response buffer */
 	response_str = response;
@@ -121,8 +146,13 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
 		fastboot_okay("");
 		return;
 	} else if (get_partition_info_efi_by_name_or_alias(dev_desc, cmd, &info)) {
-		error("cannot find partition: '%s'\n", cmd);
-		fastboot_fail("cannot find partition");
+		/* fallback on using the 'partition name' as a number */
+
+		start_addr = simple_strtol(cmd, NULL, 16);
+
+		write_raw_raw_image(dev_desc, start_addr, dev_desc->blksz,
+				download_buffer, download_bytes);
+
 		return;
 	}
 
-- 
2.6.2

