All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] fastboot: add support for writing raw MMC
@ 2016-10-05 13:38 ` Petr Kulhavy
  2016-10-06 23:57   ` Jaehoon Chung
  0 siblings, 1 reply; 3+ messages in thread
From: Petr Kulhavy @ 2016-10-05 13:38 UTC (permalink / raw)
  To: u-boot

The current fastboot implementation is only able to flash partition images.
However sometimes it is needed to write the raw MMC, e.g. when storing the
U-boot environment image or SPL.

This patch adds the possibility to write MMC as a block device using a
special target name composed of "lba:" followed by the block address.
The address can be in decimal or hexadecimal with the "0x" prefix.

Signed-off-by: Petr Kulhavy <brain@jikos.cz>
---
 common/fb_mmc.c             | 38 +++++++++++++++++++++++++++++++++++++-
 doc/README.android-fastboot | 15 +++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/common/fb_mmc.c b/common/fb_mmc.c
index 81a3bd0..c4fe2ac 100644
--- a/common/fb_mmc.c
+++ b/common/fb_mmc.c
@@ -27,6 +27,9 @@
 #define CONFIG_FASTBOOT_MBR_NAME "mbr"
 #endif
 
+#define FB_RAW_PREFIX		"lba:"
+#define FB_RAW_PREFIX_LEN	4
+
 struct fb_mmc_sparse {
 	struct blk_desc	*dev_desc;
 };
@@ -68,6 +71,29 @@ static lbaint_t fb_mmc_sparse_reserve(struct sparse_storage *info,
 	return blkcnt;
 }
 
+/*
+ * attempt to interpret the partition name as raw LBA
+ * on success return 1 and fill info
+ * on failure (not a LBA matching name) return 0 (info undefined)
+ */
+static int get_raw_part_info(const struct blk_desc *dev_desc, const char *name,
+		disk_partition_t *info)
+{
+	if (strlen(name) <= FB_RAW_PREFIX_LEN ||
+	    strncmp(name, FB_RAW_PREFIX, FB_RAW_PREFIX_LEN) != 0)
+		return 0;
+
+#if CONFIG_SYS_64BIT_LBA
+	info->start = simple_strtoull(name + FB_RAW_PREFIX_LEN, NULL, 10);
+#else
+	info->start = simple_strtoul(name + FB_RAW_PREFIX_LEN, NULL, 10);
+#endif
+	info->size = dev_desc->lba - info->start;
+	info->blksz = dev_desc->blksz;
+
+	return 1;
+}
+
 static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
 		const char *part_name, void *buffer,
 		unsigned int download_bytes)
@@ -153,7 +179,17 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
 	}
 #endif
 
-	if (part_get_info_by_name_or_alias(dev_desc, cmd, &info)) {
+	/* first try to interpret as a raw write */
+	if (get_raw_part_info(dev_desc, cmd, &info)) {
+		printf("%s: writing raw data at LBA 0x%llx\n", __func__,
+		       (unsigned long long) info.start);
+		/* check if start is within the media */
+		if (info.start >= dev_desc->lba) {
+			error("Attempt to write beyond the end of media\n");
+			fastboot_fail("LBA write out of media");
+			return;
+		}
+	} else if (part_get_info_by_name_or_alias(dev_desc, cmd, &info)) {
 		error("cannot find partition: '%s'\n", cmd);
 		fastboot_fail("cannot find partition");
 		return;
diff --git a/doc/README.android-fastboot b/doc/README.android-fastboot
index b8afa15..cbc42a1 100644
--- a/doc/README.android-fastboot
+++ b/doc/README.android-fastboot
@@ -97,6 +97,21 @@ configuration options:
 CONFIG_FASTBOOT_GPT_NAME
 CONFIG_FASTBOOT_MBR_NAME
 
+Writing as a Block Device
+=========================
+Sometimes it is useful to write sections of eMMC which are not allocated as
+partitions. For instance to store the SPL or U-Boot environment.
+
+This can be achieved by writing a special target with the name "lba:" (lower
+case) followed by the block address at which the image should be stored. The
+block address can be noted in decimal or hexadecimal (prefixed with "0x").
+
+Example command:
+
+  $ fastboot flash "lba:1024" uboot-env.bin
+
+This writes the uboot-env.bin image file at logical block 1024, i.e. 512KiB.
+
 In Action
 =========
 Enter into fastboot by executing the fastboot command in u-boot and you
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH] fastboot: add support for writing raw MMC
  2016-10-05 13:38 ` [U-Boot] [PATCH] fastboot: add support for writing raw MMC Petr Kulhavy
@ 2016-10-06 23:57   ` Jaehoon Chung
  2016-10-07  6:59     ` Petr Kulhavy
  0 siblings, 1 reply; 3+ messages in thread
From: Jaehoon Chung @ 2016-10-06 23:57 UTC (permalink / raw)
  To: u-boot

On 10/05/2016 10:38 PM, Petr Kulhavy wrote:
> The current fastboot implementation is only able to flash partition images.
> However sometimes it is needed to write the raw MMC, e.g. when storing the
> U-boot environment image or SPL.
> 
> This patch adds the possibility to write MMC as a block device using a
> special target name composed of "lba:" followed by the block address.
> The address can be in decimal or hexadecimal with the "0x" prefix.
> 
> Signed-off-by: Petr Kulhavy <brain@jikos.cz>
> ---
>  common/fb_mmc.c             | 38 +++++++++++++++++++++++++++++++++++++-
>  doc/README.android-fastboot | 15 +++++++++++++++
>  2 files changed, 52 insertions(+), 1 deletion(-)
> 
> diff --git a/common/fb_mmc.c b/common/fb_mmc.c
> index 81a3bd0..c4fe2ac 100644
> --- a/common/fb_mmc.c
> +++ b/common/fb_mmc.c
> @@ -27,6 +27,9 @@
>  #define CONFIG_FASTBOOT_MBR_NAME "mbr"
>  #endif
>  
> +#define FB_RAW_PREFIX		"lba:"
> +#define FB_RAW_PREFIX_LEN	4
> +
>  struct fb_mmc_sparse {
>  	struct blk_desc	*dev_desc;
>  };
> @@ -68,6 +71,29 @@ static lbaint_t fb_mmc_sparse_reserve(struct sparse_storage *info,
>  	return blkcnt;
>  }
>  
> +/*
> + * attempt to interpret the partition name as raw LBA
> + * on success return 1 and fill info
> + * on failure (not a LBA matching name) return 0 (info undefined)
> + */
> +static int get_raw_part_info(const struct blk_desc *dev_desc, const char *name,
> +		disk_partition_t *info)

Is it right about "const struct blk_desc ..."? Why use "const"?

> +{
> +	if (strlen(name) <= FB_RAW_PREFIX_LEN ||
> +	    strncmp(name, FB_RAW_PREFIX, FB_RAW_PREFIX_LEN) != 0)

strlen(name) was need to check?

> +		return 0;
> +
> +#if CONFIG_SYS_64BIT_LBA
> +	info->start = simple_strtoull(name + FB_RAW_PREFIX_LEN, NULL, 10);
> +#else
> +	info->start = simple_strtoul(name + FB_RAW_PREFIX_LEN, NULL, 10);
> +#endif
> +	info->size = dev_desc->lba - info->start;
> +	info->blksz = dev_desc->blksz;
> +
> +	return 1;
> +}
> +
>  static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
>  		const char *part_name, void *buffer,
>  		unsigned int download_bytes)
> @@ -153,7 +179,17 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
>  	}
>  #endif
>  
> -	if (part_get_info_by_name_or_alias(dev_desc, cmd, &info)) {
> +	/* first try to interpret as a raw write */
> +	if (get_raw_part_info(dev_desc, cmd, &info)) {
> +		printf("%s: writing raw data at LBA 0x%llx\n", __func__,
> +		       (unsigned long long) info.start);
> +		/* check if start is within the media */
> +		if (info.start >= dev_desc->lba) {
> +			error("Attempt to write beyond the end of media\n");
> +			fastboot_fail("LBA write out of media");
> +			return;
> +		}
> +	} else if (part_get_info_by_name_or_alias(dev_desc, cmd, &info)) {
>  		error("cannot find partition: '%s'\n", cmd);
>  		fastboot_fail("cannot find partition");
>  		return;
> diff --git a/doc/README.android-fastboot b/doc/README.android-fastboot
> index b8afa15..cbc42a1 100644
> --- a/doc/README.android-fastboot
> +++ b/doc/README.android-fastboot
> @@ -97,6 +97,21 @@ configuration options:
>  CONFIG_FASTBOOT_GPT_NAME
>  CONFIG_FASTBOOT_MBR_NAME
>  
> +Writing as a Block Device
> +=========================
> +Sometimes it is useful to write sections of eMMC which are not allocated as
> +partitions. For instance to store the SPL or U-Boot environment.
> +
> +This can be achieved by writing a special target with the name "lba:" (lower
> +case) followed by the block address at which the image should be stored. The
> +block address can be noted in decimal or hexadecimal (prefixed with "0x").
> +
> +Example command:
> +
> +  $ fastboot flash "lba:1024" uboot-env.bin
> +
> +This writes the uboot-env.bin image file at logical block 1024, i.e. 512KiB.
> +
>  In Action
>  =========
>  Enter into fastboot by executing the fastboot command in u-boot and you
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH] fastboot: add support for writing raw MMC
  2016-10-06 23:57   ` Jaehoon Chung
@ 2016-10-07  6:59     ` Petr Kulhavy
  0 siblings, 0 replies; 3+ messages in thread
From: Petr Kulhavy @ 2016-10-07  6:59 UTC (permalink / raw)
  To: u-boot



On 07/10/16 01:57, Jaehoon Chung wrote:
> On 10/05/2016 10:38 PM, Petr Kulhavy wrote:
>> The current fastboot implementation is only able to flash partition images.
>> However sometimes it is needed to write the raw MMC, e.g. when storing the
>> U-boot environment image or SPL.
>>
>> This patch adds the possibility to write MMC as a block device using a
>> special target name composed of "lba:" followed by the block address.
>> The address can be in decimal or hexadecimal with the "0x" prefix.
>>
>> Signed-off-by: Petr Kulhavy <brain@jikos.cz>
>> ---
>>   common/fb_mmc.c             | 38 +++++++++++++++++++++++++++++++++++++-
>>   doc/README.android-fastboot | 15 +++++++++++++++
>>   2 files changed, 52 insertions(+), 1 deletion(-)
>>
>> diff --git a/common/fb_mmc.c b/common/fb_mmc.c
>> index 81a3bd0..c4fe2ac 100644
>> --- a/common/fb_mmc.c
>> +++ b/common/fb_mmc.c
>> @@ -27,6 +27,9 @@
>>   #define CONFIG_FASTBOOT_MBR_NAME "mbr"
>>   #endif
>>   
>> +#define FB_RAW_PREFIX		"lba:"
>> +#define FB_RAW_PREFIX_LEN	4
>> +
>>   struct fb_mmc_sparse {
>>   	struct blk_desc	*dev_desc;
>>   };
>> @@ -68,6 +71,29 @@ static lbaint_t fb_mmc_sparse_reserve(struct sparse_storage *info,
>>   	return blkcnt;
>>   }
>>   
>> +/*
>> + * attempt to interpret the partition name as raw LBA
>> + * on success return 1 and fill info
>> + * on failure (not a LBA matching name) return 0 (info undefined)
>> + */
>> +static int get_raw_part_info(const struct blk_desc *dev_desc, const char *name,
>> +		disk_partition_t *info)
> Is it right about "const struct blk_desc ..."? Why use "const"?

This is a standard practice in C to make sure the function doesn't alter 
*dev_desc and in the header to indicate which parameters are inputs 
(read-only) and which outputs.
In fact this should be used all over the code, but in U-boot it's not 
very strictly followed.

>> +{
>> +	if (strlen(name) <= FB_RAW_PREFIX_LEN ||
>> +	    strncmp(name, FB_RAW_PREFIX, FB_RAW_PREFIX_LEN) != 0)
> strlen(name) was need to check?
To make sure there is at least one character after the ":", i.e. the 
input is not just "lba:". Otherwise the simple_stroul() returns 0.
There still could be some non-numeric characters though, but that check 
would be more complex and ideally done in simple_strtoul()

Regards
Petr

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-10-07  6:59 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CGME20161005133851epcas1p10a1096f2601d402e4f0158af95824184@epcas1p1.samsung.com>
2016-10-05 13:38 ` [U-Boot] [PATCH] fastboot: add support for writing raw MMC Petr Kulhavy
2016-10-06 23:57   ` Jaehoon Chung
2016-10-07  6:59     ` Petr Kulhavy

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.