Skip to contentSkip to conversation

dfu, nand, ubi: add partubi alt settings for updating ubi partition

PATCH Superseded Heiko Schocher 5 participants 24 messages Jul 15, 2013 – Jul 25, 2013

v1 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 dfu, nand, ubi: add partubi alt settings for updating ubi partition

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

---
 drivers/dfu/dfu.c      | 33 ++++++++++++++++++++++++++++++++-
 drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++
 include/dfu.h          |  2 ++

3 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +32 -1
index 0521752..04059be 100644
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <malloc.h>
 #include <mmc.h>
+#include <nand.h>
 #include <fat.h>
 #include <dfu.h>
 #include <linux/list.h>
@@ -176,6 +177,37 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 			ret = dfu->flush_medium(dfu);
 		printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
 
+		/* in case of ubi partition, erase rest of the partition */
+		if (dfu->ubi == 1) {
+			int ret;
+			nand_info_t *nand;
+			/* erase complete partition */
+			nand_erase_options_t opts;
+
+			if (nand_curr_device < 0 ||
+			    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+			    !nand_info[nand_curr_device].name) {
+				printf("%s: invalid nand device\n", __func__);
+				return -1;
+			}
+
+			nand = &nand_info[nand_curr_device];
+
+			memset(&opts, 0, sizeof(opts));
+			opts.offset = dfu->data.nand.start + dfu->offset +
+					dfu->bad_skip;
+			opts.length = dfu->data.nand.start +
+					dfu->data.nand.size - opts.offset;
+			opts.lim = opts.length;
+			opts.spread = 1;
+			opts.quiet = 0;
+			ret = nand_erase_opts(nand, &opts);
+			if (ret) {
+				printf("Failure erase: %d\n", ret);
+				return ret;
+			}
+		}
+
 		/* clear everything */
 		dfu_free_buf();
 		dfu->crc = 0;
@@ -186,7 +218,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 		dfu->i_buf = dfu->i_buf_start;
 
 		dfu->inited = 0;
-
 	}
 
 	return ret = 0 ? size : ret;
drivers/dfu/dfu_nand.c +26 -0
index 07dee89..d8afc48 100644
@@ -153,6 +153,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 	char *st;
 	int ret, dev, part;
 
+	dfu->ubi = 0;
 	dfu->dev_type = DFU_DEV_NAND;
 	st = strsep(&s, " ");
 	if (!strcmp(st, "raw")) {
@@ -185,7 +186,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
 		dfu->data.nand.start = pi->offset;
 		dfu->data.nand.size = pi->size;
+	} else if (!strcmp(st, "partubi")) {
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
+
+		dfu->layout = DFU_RAW_ADDR;
 
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num, &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->ubi = 1;
 	} else {
 		printf("%s: Memory layout (%s) not supported!\n", __func__, st);
 		return -1;
include/dfu.h +2 -0
index 124653c..7bbe42d 100644
@@ -111,6 +111,8 @@ struct dfu_entity {
 	u32 bad_skip;	/* for nand use */
 
 	unsigned int inited:1;
+	/* for nand/ubi use */
+	unsigned int ubi:1;
 };
 
 int dfu_config_entities(char *s, char *interface, int num);
Signature · 1 line
1.7.11.7
#1 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

---
 drivers/dfu/dfu.c      | 30 +++++++++++++++++++++++++++++-
 drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++
 include/dfu.h          |  2 ++

3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +29 -1
index 0521752..7ba7026 100644
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <malloc.h>
 #include <mmc.h>
+#include <nand.h>
 #include <fat.h>
 #include <dfu.h>
 #include <linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 			ret = dfu->flush_medium(dfu);
 		printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
 
+		/* in case of ubi partition, erase rest of the partition */
+		if (dfu->ubi == 1) {
+			int ret;
+			nand_info_t *nand;
+			/* erase complete partition */
+			nand_erase_options_t opts;
+
+			if (nand_curr_device < 0 ||
+			    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+			    !nand_info[nand_curr_device].name) {
+				printf("%s: invalid nand device\n", __func__);
+				return -1;
+			}
+
+			nand = &nand_info[nand_curr_device];
+
+			memset(&opts, 0, sizeof(opts));
+			opts.offset = dfu->data.nand.start + dfu->offset +
+					dfu->bad_skip;
+			opts.length = dfu->data.nand.start +
+					dfu->data.nand.size - opts.offset;
+			ret = nand_erase_opts(nand, &opts);
+			if (ret != 0) {
+				printf("Failure erase: %d\n", ret);
+				return ret;
+			}
+		}
+
 		/* clear everything */
 		dfu_free_buf();
 		dfu->crc = 0;
@@ -186,7 +215,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 		dfu->i_buf = dfu->i_buf_start;
 
 		dfu->inited = 0;
-
 	}
 
 	return ret = 0 ? size : ret;
drivers/dfu/dfu_nand.c +26 -0
index 07dee89..d8afc48 100644
@@ -153,6 +153,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 	char *st;
 	int ret, dev, part;
 
+	dfu->ubi = 0;
 	dfu->dev_type = DFU_DEV_NAND;
 	st = strsep(&s, " ");
 	if (!strcmp(st, "raw")) {
@@ -185,7 +186,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
 		dfu->data.nand.start = pi->offset;
 		dfu->data.nand.size = pi->size;
+	} else if (!strcmp(st, "partubi")) {
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
+
+		dfu->layout = DFU_RAW_ADDR;
 
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num, &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->ubi = 1;
 	} else {
 		printf("%s: Memory layout (%s) not supported!\n", __func__, st);
 		return -1;
include/dfu.h +2 -0
index 124653c..7bbe42d 100644
@@ -111,6 +111,8 @@ struct dfu_entity {
 	u32 bad_skip;	/* for nand use */
 
 	unsigned int inited:1;
+	/* for nand/ubi use */
+	unsigned int ubi:1;
 };
 
 int dfu_config_entities(char *s, char *interface, int num);
Signature · 1 line
1.7.11.7
#2 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Dear Heiko Schocher,

Quoted 66 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

---
 drivers/dfu/dfu.c      | 30 +++++++++++++++++++++++++++++-
 drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++
 include/dfu.h          |  2 ++

3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +16 -0
index 0521752..7ba7026 100644
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <malloc.h>
 #include <mmc.h>
+#include <nand.h>
 #include <fat.h>
 #include <dfu.h>
 #include <linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int
 size, int blk_seq_num) ret = dfu->flush_medium(dfu);
 		printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
 
+		/* in case of ubi partition, erase rest of the partition */
+		if (dfu->ubi == 1) {
+			int ret;
+			nand_info_t *nand;
+			/* erase complete partition */
+			nand_erase_options_t opts;
+
+			if (nand_curr_device < 0 ||
+			    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+			    !nand_info[nand_curr_device].name) {
+				printf("%s: invalid nand device\n", __func__);
+				return -1;
+			}
+
+			nand = &nand_info[nand_curr_device];

drivers/dfu/dfu.c int dfu_write(struct dfu_entity *dfu, void *buf, int · line 204

Quoted 10 lines
drivers/dfu/dfu.c +10 -0
+
+			memset(&opts, 0, sizeof(opts));
+			opts.offset = dfu->data.nand.start + dfu->offset +
+					dfu->bad_skip;
+			opts.length = dfu->data.nand.start +
+					dfu->data.nand.size - opts.offset;
+			ret = nand_erase_opts(nand, &opts);
+			if (ret != 0) {
+				printf("Failure erase: %d\n", ret);
+				return ret;

Are you not leaking memory here ? I suspect you should call dfu_free_buf() as below ?

Quoted 73 lines
drivers/dfu/dfu.c +3 -1
+			}
+		}
+
 		/* clear everything */
 		dfu_free_buf();
 		dfu->crc = 0;
@@ -186,7 +215,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int
 size, int blk_seq_num) dfu->i_buf = dfu->i_buf_start;
 
 		dfu->inited = 0;
-
 	}
 
 	return ret = 0 ? size : ret;
drivers/dfu/dfu_nand.c +26 -0
index 07dee89..d8afc48 100644
@@ -153,6 +153,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char
 *s) char *st;
 	int ret, dev, part;
 
+	dfu->ubi = 0;
 	dfu->dev_type = DFU_DEV_NAND;
 	st = strsep(&s, " ");
 	if (!strcmp(st, "raw")) {
@@ -185,7 +186,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char
 *s)
 
 		dfu->data.nand.start = pi->offset;
 		dfu->data.nand.size = pi->size;
+	} else if (!strcmp(st, "partubi")) {
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
+
+		dfu->layout = DFU_RAW_ADDR;
 
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num, &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->ubi = 1;
 	} else {
 		printf("%s: Memory layout (%s) not supported!\n", __func__, st);
drivers/dfu/dfu_nand.c +0 -0
 		return -1;
include/dfu.h +2 -0
index 124653c..7bbe42d 100644
@@ -111,6 +111,8 @@ struct dfu_entity {
 	u32 bad_skip;	/* for nand use */
 
 	unsigned int inited:1;
+	/* for nand/ubi use */
+	unsigned int ubi:1;
 };
 
 int dfu_config_entities(char *s, char *interface, int num);
#3 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Hello Marek,

Am 16.07.2013 07:00, schrieb Marek Vasut:

Quoted 73 lines

Dear Heiko Schocher,

Quoted 71 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou<[email protected]>
Cc Tom Rini<[email protected]>
Cc Lukasz Majewski<[email protected]>
Cc Kyungmin Park<[email protected]>
Cc Marek Vasut<[email protected]>
Cc Wolfgang Denk<[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

---
  drivers/dfu/dfu.c      | 30 +++++++++++++++++++++++++++++-
  drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++
  include/dfu.h          |  2 ++

3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +21 -0
index 0521752..7ba7026 100644
@@ -23,6 +23,7 @@
  #include<errno.h>
  #include<malloc.h>
  #include<mmc.h>
+#include<nand.h>
  #include<fat.h>
  #include<dfu.h>
  #include<linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int
 size, int blk_seq_num) ret = dfu->flush_medium(dfu);
  		printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
 
+		/* in case of ubi partition, erase rest of the partition */
+		if (dfu->ubi == 1) {
+			int ret;
+			nand_info_t *nand;
+			/* erase complete partition */
+			nand_erase_options_t opts;
+
+			if (nand_curr_device<  0 ||
+			    nand_curr_device>= CONFIG_SYS_MAX_NAND_DEVICE ||
+			    !nand_info[nand_curr_device].name) {
+				printf("%s: invalid nand device\n", __func__);
+				return -1;
+			}
+
+			nand =&nand_info[nand_curr_device];
+
+			memset(&opts, 0, sizeof(opts));
+			opts.offset = dfu->data.nand.start + dfu->offset +
+					dfu->bad_skip;
+			opts.length = dfu->data.nand.start +
Quoted 8 lines

drivers/dfu/dfu.c int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) · line 204

Quoted 5 lines
drivers/dfu/dfu.c +5 -0
+					dfu->data.nand.size - opts.offset;
+			ret = nand_erase_opts(nand,&opts);
+			if (ret != 0) {
+				printf("Failure erase: %d\n", ret);
+				return ret;

Are you not leaking memory here ? I suspect you should call dfu_free_buf() as below ?

Yes, fixed. Thanks!

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#4 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

In reply to Heiko Schocher

Hi Heiko,

Quoted 61 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

---
 drivers/dfu/dfu.c      | 30 +++++++++++++++++++++++++++++-
 drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++
 include/dfu.h          |  2 ++

3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +2 -0
index 0521752..7ba7026 100644
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <malloc.h>
 #include <mmc.h>
+#include <nand.h>
 #include <fat.h>
 #include <dfu.h>
 #include <linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf,
 int size, int blk_seq_num) ret = dfu->flush_medium(dfu);
 		printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
 
+		/* in case of ubi partition, erase rest of the

partition */

drivers/dfu/dfu.c +8 -0
+		if (dfu->ubi == 1) {
+			int ret;
+			nand_info_t *nand;
+			/* erase complete partition */
+			nand_erase_options_t opts;
+
+			if (nand_curr_device < 0 ||
+			    nand_curr_device >=
Quoted 1 line

CONFIG_SYS_MAX_NAND_DEVICE ||

^^^^^^^^^^^^^^^^^^^^^^^^^^^ - this config won't be defined at devices, which don't have NAND memory (like Trats). Due to that Trats board is not building.

Please remove memory type dependent code from the common dfu code.

Quoted 92 lines
drivers/dfu/dfu.c +2 -0
+			    !nand_info[nand_curr_device].name) {
+				printf("%s: invalid nand device\n",

__func__);

drivers/dfu/dfu.c +7 -0
+				return -1;
+			}
+
+			nand = &nand_info[nand_curr_device];
+
+			memset(&opts, 0, sizeof(opts));
+			opts.offset = dfu->data.nand.start +

dfu->offset +

drivers/dfu/dfu.c +3 -0
+					dfu->bad_skip;
+			opts.length = dfu->data.nand.start +
+					dfu->data.nand.size -

opts.offset;

drivers/dfu/dfu.c +7 -1
+			ret = nand_erase_opts(nand, &opts);
+			if (ret != 0) {
+				printf("Failure erase: %d\n", ret);
+				return ret;
+			}
+		}
+
 		/* clear everything */
 		dfu_free_buf();
 		dfu->crc = 0;
@@ -186,7 +215,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf,
 int size, int blk_seq_num) dfu->i_buf = dfu->i_buf_start;
 
 		dfu->inited = 0;
-
 	}
 
 	return ret = 0 ? size : ret;
drivers/dfu/dfu_nand.c +26 -0
index 07dee89..d8afc48 100644
@@ -153,6 +153,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,
 char *s) char *st;
 	int ret, dev, part;
 
+	dfu->ubi = 0;
 	dfu->dev_type = DFU_DEV_NAND;
 	st = strsep(&s, " ");
 	if (!strcmp(st, "raw")) {
@@ -185,7 +186,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,
 char *s) 
 		dfu->data.nand.start = pi->offset;
 		dfu->data.nand.size = pi->size;
+	} else if (!strcmp(st, "partubi")) {
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
+
+		dfu->layout = DFU_RAW_ADDR;
 
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num,
 &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->ubi = 1;
 	} else {
 		printf("%s: Memory layout (%s) not supported!\n",

__func__, st); return -1;

include/dfu.h +2 -0
index 124653c..7bbe42d 100644
@@ -111,6 +111,8 @@ struct dfu_entity {
 	u32 bad_skip;	/* for nand use */
 
 	unsigned int inited:1;
+	/* for nand/ubi use */
+	unsigned int ubi:1;
 };
 
 int dfu_config_entities(char *s, char *interface, int num);
Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#5 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Hello Lukasz,

Am 16.07.2013 09:41, schrieb Lukasz Majewski:

Quoted 68 lines

Hi Heiko,

Quoted 61 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou<[email protected]>
Cc Tom Rini<[email protected]>
Cc Lukasz Majewski<[email protected]>
Cc Kyungmin Park<[email protected]>
Cc Marek Vasut<[email protected]>
Cc Wolfgang Denk<[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

---
  drivers/dfu/dfu.c      | 30 +++++++++++++++++++++++++++++-
  drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++
  include/dfu.h          |  2 ++

3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +2 -0
index 0521752..7ba7026 100644
@@ -23,6 +23,7 @@
  #include<errno.h>
  #include<malloc.h>
  #include<mmc.h>
+#include<nand.h>
  #include<fat.h>
  #include<dfu.h>
  #include<linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf,
 int size, int blk_seq_num) ret = dfu->flush_medium(dfu);
  		printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
 
+		/* in case of ubi partition, erase rest of the

partition */

drivers/dfu/dfu.c +8 -0
+		if (dfu->ubi == 1) {
+			int ret;
+			nand_info_t *nand;
+			/* erase complete partition */
+			nand_erase_options_t opts;
+
+			if (nand_curr_device<  0 ||
+			    nand_curr_device>=
Quoted 1 line

CONFIG_SYS_MAX_NAND_DEVICE ||

^^^^^^^^^^^^^^^^^^^^^^^^^^^ - this config won't be defined at devices, which don't have NAND memory (like Trats). Due to that Trats board is not building.

Quoted 1 line

Please remove memory type dependent code from the common dfu code.

Oh... Hmm... maybe I move this code to drivers/dfu/dfu_nand.c and make there a dfu_nand_flush() ?

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#6 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Hi Heiko,

Quoted 72 lines

Hello Lukasz,

Am 16.07.2013 09:41, schrieb Lukasz Majewski:

Quoted 69 lines

Hi Heiko,

Quoted 62 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou<[email protected]>
Cc Tom Rini<[email protected]>
Cc Lukasz Majewski<[email protected]>
Cc Kyungmin Park<[email protected]>
Cc Marek Vasut<[email protected]>
Cc Wolfgang Denk<[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

---
  drivers/dfu/dfu.c      | 30 +++++++++++++++++++++++++++++-
  drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++
  include/dfu.h          |  2 ++

3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +2 -0
index 0521752..7ba7026 100644
@@ -23,6 +23,7 @@
  #include<errno.h>
  #include<malloc.h>
  #include<mmc.h>
+#include<nand.h>
  #include<fat.h>
  #include<dfu.h>
  #include<linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void
 *buf, int size, int blk_seq_num) ret = dfu->flush_medium(dfu);
  		printf("\nDFU complete CRC32: 0x%08x\n",
 dfu->crc);
 
+		/* in case of ubi partition, erase rest of the

partition */

drivers/dfu/dfu.c +8 -0
+		if (dfu->ubi == 1) {
+			int ret;
+			nand_info_t *nand;
+			/* erase complete partition */
+			nand_erase_options_t opts;
+
+			if (nand_curr_device<  0 ||
+			    nand_curr_device>=
Quoted 1 line

CONFIG_SYS_MAX_NAND_DEVICE ||

^^^^^^^^^^^^^^^^^^^^^^^^^^^ - this config won't be defined at devices, which don't have NAND memory (like Trats). Due to that Trats board is not building.

Quoted 5 lines
Quoted 2 lines

Please remove memory type dependent code from the common dfu
code.

Oh... Hmm... maybe I move this code to drivers/dfu/dfu_nand.c and make there a dfu_nand_flush() ?

Sounds like a good idea :-). I would prefer to encapsulate NAND (MMC) code at dfu_nand.c (dfu_mmc.c) file.

Quoted 3 lines

bye,
Heiko

Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#7 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

In reply to Heiko Schocher

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 07/16/2013 12:54 AM, Heiko Schocher wrote:

[snip]

Quoted 4 lines

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

So, lets talk. Have you, or can you, take a guess at how long it might take to add code to allow us to do this the right way?

- --
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBAgAGBQJR5WNhAAoJENk4IS6UOR1WQboP/jY3dOXBg0dADKHlrKRwUKRu 9E1Esp5n6y5M6jNmjNPihSFI0PuLclLMab2ZoByzZn0RGDNq++/G5LK3XfaMAv4H yPOqarY2UPvirND0DeYZW471C5hPfsDNm9SGgOU8eL05+b/VaCiYGYYyMn6crFnr dyMfgmDg16Idr/4VNDSW/kGN+FpP+pD8I2zpSMgrzKM+NcAWRe2cBEWLA6tgJYW+ V5oos+8MdbdsBdOPzFhwY9xsW4S7u5nRVPmKna0/F2y4lI497yi2ctPpDyWFyC9O rQSTD7R/BpSbzb8r3u4tHlPCneR1me/IxzjAXZeCYS9Dj3JpJFJM5rY8xMIBKCd+ b+hbrCmPtkMqTPBAIrQNp8KmNkVrKZEdLnVs45PB7P+ldzBcwMWMZ+jVNVtwb6gw D+QcyAJhFXu4kViJcBVdEBoRmTxvJ15Sqxdg9rgL+cgcmpFUUdIgdkcTMngXKAw6 Fk9i01cTCPRaQMDKlR4fuHaRThQIZmdWLLKtJ1AIryS4ArJFlH5e7onZElj6opVc GvRKfBEm1qe9IeYgVoFP9tQmMyK3sVmeGeivWJ1gtEYHZRO3L/48kgcyv84kxDcF pT3+bx7sxejgVfoQH41Rze7eStrkR8rTy0KoXA5nJX2prV7Nlhwx2SrYnCJT7pPv 1QSW19Jd1R7MnKbbM9/N
=ZXBp
-----END PGP SIGNATURE-----

#8 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Hello Tom,

Am 16.07.2013 17:14, schrieb Tom Rini:

Quoted 5 lines

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 07/16/2013 12:54 AM, Heiko Schocher wrote:

Quoted 8 lines

[snip]

Quoted 4 lines

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

So, lets talk. Have you, or can you, take a guess at how long it might take to add code to allow us to do this the right way?

Good question! My hope was, that this is a result of a discussion here ;-)

First, we should discuss how to handle an update of an ubi partition on nand with dfu ...

I propose:

a) add a "partubi" for dfu_alt_info as this patch do, so we can use "dfu nand 0" as it is for raw nand partitions *and* nand ubi partitions
b) add a "ubi format ..." command
(or can "ubi write" handle writing ubi images created with
ubinize ? I think no ...)
best: "ubi format ..." should handle incremental writes, so we can use the dfu_buf as it is ... else we must malloc an buffer which can hold the hole image -> the board must have enough ram for this ...
c) use "ubi format ..." for burning the ubi image into the nand ubi partition

a) done with this patch,
b) no real idea how many time it needs ...
c) should be trivial if we have step b)

What Do you think?

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#9 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

In reply to Heiko Schocher
Quoted 17 lines · Heiko Schocher

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>
Quoted 8 lines

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

The lack of erase counter preservation is a problem, but the part about ECC on erased pages is dealt with in U-Boot by the WITH_DROP_FFS flag.

Quoted 52 lines

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

---
 drivers/dfu/dfu.c      | 30 +++++++++++++++++++++++++++++-
 drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++
 include/dfu.h          |  2 ++

3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +2 -0
index 0521752..7ba7026 100644
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <malloc.h>
 #include <mmc.h>
+#include <nand.h>
 #include <fat.h>
 #include <dfu.h>
 #include <linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf,  
 int size, int blk_seq_num)
 			ret = dfu->flush_medium(dfu);
 		printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
 
+		/* in case of ubi partition, erase rest of the  

partition */

drivers/dfu/dfu.c +8 -0
+		if (dfu->ubi == 1) {
+			int ret;
+			nand_info_t *nand;
+			/* erase complete partition */
+			nand_erase_options_t opts;
+
+			if (nand_curr_device < 0 ||
+			    nand_curr_device >=  

CONFIG_SYS_MAX_NAND_DEVICE ||

drivers/dfu/dfu.c +2 -0
+			    !nand_info[nand_curr_device].name) {
+				printf("%s: invalid nand device\n",  

__func__);

drivers/dfu/dfu.c +7 -0
+				return -1;
+			}
+
+			nand = &nand_info[nand_curr_device];
+
+			memset(&opts, 0, sizeof(opts));
+			opts.offset = dfu->data.nand.start +  

dfu->offset +

drivers/dfu/dfu.c +3 -0
+					dfu->bad_skip;
+			opts.length = dfu->data.nand.start +
+					dfu->data.nand.size -  

opts.offset;

drivers/dfu/dfu.c int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) · line 206

Quoted 6 lines
drivers/dfu/dfu.c +6 -0
+			ret = nand_erase_opts(nand, &opts);
+			if (ret != 0) {
+				printf("Failure erase: %d\n", ret);
+				return ret;
+			}
+		}

Instead of separately erasing the remainder of the partition, how about recognizing up front that it's UBI (or that a full partition erase is otherwise desired) and erasing the full partition then? Besides being cleaner, it would be easier to convert to an ubi-aware mechanism.

-Scott

#10 lore raw

PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Hello Scott,

Am 18.07.2013 00:35, schrieb Scott Wood:

Quoted 20 lines · Heiko Schocher
Quoted 19 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

Quoted 8 lines
Quoted 6 lines

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

The lack of erase counter preservation is a problem, but the part about ECC on erased pages is dealt with in U-Boot by the WITH_DROP_FFS flag.

Ah, ok!

Quoted 47 lines
Quoted 47 lines

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.
---
drivers/dfu/dfu.c | 30 +++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++
3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)

drivers/dfu/dfu.c +23 -0
index 0521752..7ba7026 100644
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <malloc.h>
 #include <mmc.h>
+#include <nand.h>
 #include <fat.h>
 #include <dfu.h>
 #include <linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 ret = dfu->flush_medium(dfu);
 printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
 
+ /* in case of ubi partition, erase rest of the partition */
+ if (dfu->ubi == 1) {
+ int ret;
+ nand_info_t *nand;
+ /* erase complete partition */
+ nand_erase_options_t opts;
+
+ if (nand_curr_device < 0 ||
+ nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+ !nand_info[nand_curr_device].name) {
+ printf("%s: invalid nand device\n", __func__);
+ return -1;
+ }
+
+ nand = &nand_info[nand_curr_device];
+
+ memset(&opts, 0, sizeof(opts));
+ opts.offset = dfu->data.nand.start + dfu->offset +
+ dfu->bad_skip;
+ opts.length = dfu->data.nand.start +
+ dfu->data.nand.size - opts.offset;
+ ret = nand_erase_opts(nand, &opts);
Quoted 8 lines

drivers/dfu/dfu.c int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) · line 206

Quoted 5 lines
drivers/dfu/dfu.c +5 -0
+ if (ret != 0) {
+ printf("Failure erase: %d\n", ret);
+ return ret;
+ }
+ }

Instead of separately erasing the remainder of the partition, how about recognizing up front that it's UBI (or that a full partition erase is otherwise desired) and erasing the full partition then? Besides being cleaner, it would be easier to convert to an ubi-aware mechanism.

I tried this too, but if I erase the hole partition first (when a dfu transfer is started) I got:

GADGET DRIVER: usb_dnl_dfu
dfu_write: Wrong sequence number! [7] [0]
dfu_write: Wrong sequence number! [7] [1]
dfu_write: Wrong sequence number! [7] [2]

So, this version needs more investigation ...

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#11 lore raw

PATCH v3 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

In reply to Heiko Schocher

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

---
 drivers/dfu/dfu_nand.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
 include/dfu.h          |  2 ++

2 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+)

drivers/dfu/dfu_nand.c +58 -0
index 07dee89..ade5ae7 100644
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
 	return ret;
 }
 
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+	int ret = 0;
+
+	/* in case of ubi partition, erase rest of the partition */
+	if (dfu->ubi == 1) {
+		nand_info_t *nand;
+		nand_erase_options_t opts;
+
+		if (nand_curr_device < 0 ||
+		    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+		    !nand_info[nand_curr_device].name) {
+			printf("%s: invalid nand device\n", __func__);
+			return -1;
+		}
+
+		nand = &nand_info[nand_curr_device];
+
+		memset(&opts, 0, sizeof(opts));
+		opts.offset = dfu->data.nand.start + dfu->offset +
+				dfu->bad_skip;
+		opts.length = dfu->data.nand.start +
+				dfu->data.nand.size - opts.offset;
+		ret = nand_erase_opts(nand, &opts);
+		if (ret != 0)
+			printf("Failure erase: %d\n", ret);
+	}
+
+	return ret;
+}
+
 int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 {
 	char *st;
 	int ret, dev, part;
 
+	dfu->ubi = 0;
 	dfu->dev_type = DFU_DEV_NAND;
 	st = strsep(&s, " ");
 	if (!strcmp(st, "raw")) {
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
 		dfu->data.nand.start = pi->offset;
 		dfu->data.nand.size = pi->size;
+	} else if (!strcmp(st, "partubi")) {
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
 
+		dfu->layout = DFU_RAW_ADDR;
+
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num, &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->ubi = 1;
 	} else {
 		printf("%s: Memory layout (%s) not supported!\n", __func__, st);
 		return -1;
@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
 	dfu->read_medium = dfu_read_medium_nand;
 	dfu->write_medium = dfu_write_medium_nand;
+	dfu->flush_medium = dfu_flush_medium_nand;
 
 	/* initial state */
 	dfu->inited = 0;
include/dfu.h +2 -0
index 124653c..7bbe42d 100644
@@ -111,6 +111,8 @@ struct dfu_entity {
 	u32 bad_skip;	/* for nand use */
 
 	unsigned int inited:1;
+	/* for nand/ubi use */
+	unsigned int ubi:1;
 };
 
 int dfu_config_entities(char *s, char *interface, int num);
Signature · 1 line
1.7.11.7
#12 lore raw

PATCH v3 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

On Thu, 18 Jul 2013 08:04:55 +0200 Heiko Schocher hs at denx.de wrote,

Hi Heiko,

Quoted 46 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

---
 drivers/dfu/dfu_nand.c | 58

++++++++++++++++++++++++++++++++++++++++++++++++++
include/dfu.h | 2 ++ 2 Dateien ge?ndert, 60 Zeilen
hinzugef?gt(+)

drivers/dfu/dfu_nand.c +0 -0
index 07dee89..ade5ae7 100644

drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct · line 156

Quoted 9 lines
drivers/dfu/dfu_nand.c +6 -0
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct
 dfu_entity *dfu, u64 offset, void *buf, return ret;
 }
 
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+	int ret = 0;
+
+	/* in case of ubi partition, erase rest of the partition */
+	if (dfu->ubi == 1) {
	^^^^^^^^^^^^^^^^^^ if (dfu->ubi) shall be enough here.
Quoted 82 lines
drivers/dfu/dfu_nand.c +26 -0
+		nand_info_t *nand;
+		nand_erase_options_t opts;
+
+		if (nand_curr_device < 0 ||
+		    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+		    !nand_info[nand_curr_device].name) {
+			printf("%s: invalid nand device\n",
 __func__);
+			return -1;
+		}
+
+		nand = &nand_info[nand_curr_device];
+
+		memset(&opts, 0, sizeof(opts));
+		opts.offset = dfu->data.nand.start + dfu->offset +
+				dfu->bad_skip;
+		opts.length = dfu->data.nand.start +
+				dfu->data.nand.size - opts.offset;
+		ret = nand_erase_opts(nand, &opts);
+		if (ret != 0)
+			printf("Failure erase: %d\n", ret);
+	}
+
+	return ret;
+}
+
 int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 {
 	char *st;
 	int ret, dev, part;
 
+	dfu->ubi = 0;
 	dfu->dev_type = DFU_DEV_NAND;
 	st = strsep(&s, " ");
drivers/dfu/dfu_nand.c +25 -0
 	if (!strcmp(st, "raw")) {
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,
 char *s) 
 		dfu->data.nand.start = pi->offset;
 		dfu->data.nand.size = pi->size;
+	} else if (!strcmp(st, "partubi")) {
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
 
+		dfu->layout = DFU_RAW_ADDR;
+
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num,
 &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->ubi = 1;
 	} else {
 		printf("%s: Memory layout (%s) not supported!\n",

__func__, st); return -1;

drivers/dfu/dfu_nand.c +1 -0
@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,
 char *s) 
 	dfu->read_medium = dfu_read_medium_nand;
 	dfu->write_medium = dfu_write_medium_nand;
+	dfu->flush_medium = dfu_flush_medium_nand;
 
 	/* initial state */
 	dfu->inited = 0;
include/dfu.h +0 -0
index 124653c..7bbe42d 100644

include/dfu.h struct dfu_entity { · line 115

Quoted 5 lines
include/dfu.h +2 -0
@@ -111,6 +111,8 @@ struct dfu_entity {
 	u32 bad_skip;	/* for nand use */
 
 	unsigned int inited:1;
+	/* for nand/ubi use */
+	unsigned int ubi:1;

Maybe it would be better to add this flag to struct nand_internal_data? It seems to me like a nand specific.

As a side note, I'm curious how bool ubi would be implemented by the compiler and if it is equivalent to explicite bit fields.

Quoted 3 lines
include/dfu.h +0 -0
 };
 
 int dfu_config_entities(char *s, char *interface, int num);
Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#13 lore raw

PATCH v3 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Quoted 2 lines · Lukasz Majewski

As a side note, I'm curious how bool ubi would be implemented by the compiler and if it is equivalent to explicite bit fields.

I believe the compiler implements bool as an 8-bit data type.

-Scott

#14 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

In reply to Heiko Schocher

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct struct nand_internal_data

---
 drivers/dfu/dfu_nand.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
 include/dfu.h          |  2 ++

2 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+)

drivers/dfu/dfu_nand.c +58 -0
index 07dee89..c0f8adf 100644
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
 	return ret;
 }
 
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+	int ret = 0;
+
+	/* in case of ubi partition, erase rest of the partition */
+	if (dfu->data.nand.ubi) {
+		nand_info_t *nand;
+		nand_erase_options_t opts;
+
+		if (nand_curr_device < 0 ||
+		    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+		    !nand_info[nand_curr_device].name) {
+			printf("%s: invalid nand device\n", __func__);
+			return -1;
+		}
+
+		nand = &nand_info[nand_curr_device];
+
+		memset(&opts, 0, sizeof(opts));
+		opts.offset = dfu->data.nand.start + dfu->offset +
+				dfu->bad_skip;
+		opts.length = dfu->data.nand.start +
+				dfu->data.nand.size - opts.offset;
+		ret = nand_erase_opts(nand, &opts);
+		if (ret != 0)
+			printf("Failure erase: %d\n", ret);
+	}
+
+	return ret;
+}
+
 int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 {
 	char *st;
 	int ret, dev, part;
 
+	dfu->data.nand.ubi = 0;
 	dfu->dev_type = DFU_DEV_NAND;
 	st = strsep(&s, " ");
 	if (!strcmp(st, "raw")) {
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
 		dfu->data.nand.start = pi->offset;
 		dfu->data.nand.size = pi->size;
+	} else if (!strcmp(st, "partubi")) {
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
 
+		dfu->layout = DFU_RAW_ADDR;
+
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num, &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->data.nand.ubi = 1;
 	} else {
 		printf("%s: Memory layout (%s) not supported!\n", __func__, st);
 		return -1;
@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
 	dfu->read_medium = dfu_read_medium_nand;
 	dfu->write_medium = dfu_write_medium_nand;
+	dfu->flush_medium = dfu_flush_medium_nand;
 
 	/* initial state */
 	dfu->inited = 0;
include/dfu.h +2 -0
index 124653c..4de7b34 100644
@@ -59,6 +59,8 @@ struct nand_internal_data {
 
 	unsigned int dev;
 	unsigned int part;
+	/* for nand/ubi use */
+	unsigned int ubi;
 };
 
 static inline unsigned int get_mmc_blk_size(int dev)
Signature · 1 line
1.7.11.7
#15 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

On Fri, 19 Jul 2013 06:32:14 +0200 Heiko Schocher hs at denx.de wrote,

Hi Heiko,

Quoted 8 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

I've tested it on Trats. This patch seems to be orthogonal and doesn't interfere with eMMC.

Quoted 141 lines
Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct struct nand_internal_data

---
 drivers/dfu/dfu_nand.c | 58

++++++++++++++++++++++++++++++++++++++++++++++++++
include/dfu.h | 2 ++ 2 Dateien ge?ndert, 60 Zeilen
hinzugef?gt(+)

drivers/dfu/dfu_nand.c +32 -0
index 07dee89..c0f8adf 100644
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct
 dfu_entity *dfu, u64 offset, void *buf, return ret;
 }
 
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+	int ret = 0;
+
+	/* in case of ubi partition, erase rest of the partition */
+	if (dfu->data.nand.ubi) {
+		nand_info_t *nand;
+		nand_erase_options_t opts;
+
+		if (nand_curr_device < 0 ||
+		    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+		    !nand_info[nand_curr_device].name) {
+			printf("%s: invalid nand device\n",
 __func__);
+			return -1;
+		}
+
+		nand = &nand_info[nand_curr_device];
+
+		memset(&opts, 0, sizeof(opts));
+		opts.offset = dfu->data.nand.start + dfu->offset +
+				dfu->bad_skip;
+		opts.length = dfu->data.nand.start +
+				dfu->data.nand.size - opts.offset;
+		ret = nand_erase_opts(nand, &opts);
+		if (ret != 0)
+			printf("Failure erase: %d\n", ret);
+	}
+
+	return ret;
+}
+
 int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 {
 	char *st;
 	int ret, dev, part;
 
+	dfu->data.nand.ubi = 0;
 	dfu->dev_type = DFU_DEV_NAND;
 	st = strsep(&s, " ");
drivers/dfu/dfu_nand.c +25 -0
 	if (!strcmp(st, "raw")) {
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,
 char *s) 
 		dfu->data.nand.start = pi->offset;
 		dfu->data.nand.size = pi->size;
+	} else if (!strcmp(st, "partubi")) {
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
 
+		dfu->layout = DFU_RAW_ADDR;
+
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num,
 &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->data.nand.ubi = 1;
 	} else {
 		printf("%s: Memory layout (%s) not supported!\n",

__func__, st); return -1;

drivers/dfu/dfu_nand.c +1 -0
@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,
 char *s) 
 	dfu->read_medium = dfu_read_medium_nand;
 	dfu->write_medium = dfu_write_medium_nand;
+	dfu->flush_medium = dfu_flush_medium_nand;
 
 	/* initial state */
 	dfu->inited = 0;
include/dfu.h +2 -0
index 124653c..4de7b34 100644
@@ -59,6 +59,8 @@ struct nand_internal_data {
 
 	unsigned int dev;
 	unsigned int part;
+	/* for nand/ubi use */
+	unsigned int ubi;
 };
 
 static inline unsigned int get_mmc_blk_size(int dev)
Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#16 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Dear Lukasz Majewski,

Quoted 13 lines

On Fri, 19 Jul 2013 06:32:14 +0200 Heiko Schocher hs at denx.de wrote,

Hi Heiko,

Quoted 8 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Quoted 5 lines

I've tested it on Trats. This patch seems to be orthogonal and doesn't interfere with eMMC.

I'll wait for Scott's ACK and then pick this, ok?

Best regards,
Marek Vasut

#17 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

In reply to Heiko Schocher
Quoted 17 lines · Heiko Schocher

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>
Quoted 8 lines

---

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

In the meantime, should you be using WITH_DROP_FFS when "ubi" is set? Though we really should be skipping FFs at the end of each block, rather than just at the end of the image.

Quoted 24 lines

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct struct nand_internal_data

---
 drivers/dfu/dfu_nand.c | 58  
++++++++++++++++++++++++++++++++++++++++++++++++++
 include/dfu.h          |  2 ++

2 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+)

drivers/dfu/dfu_nand.c +0 -0
index 07dee89..c0f8adf 100644

drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct · line 156

Quoted 9 lines
drivers/dfu/dfu_nand.c +5 -0
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct  
 dfu_entity *dfu, u64 offset, void *buf,
 	return ret;
 }
 
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+	int ret = 0;
+
+	/* in case of ubi partition, erase rest of the partition */

Did you have a chance to investigate the errors you saw when erasing the whole partition up front? If there's other DFU data in the partition that needs to be preserved, then replace "partition" with "area reserved for this image".

-Scott

#18 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Hello Scott,

Am 22.07.2013 23:24, schrieb Scott Wood:

Quoted 20 lines · Heiko Schocher
Quoted 19 lines

updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html

So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.

Cc Pantelis Antoniou <[email protected]>
Cc Tom Rini <[email protected]>
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Wolfgang Denk <[email protected]>

---

Quoted 8 lines
Quoted 6 lines

- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

This must be fixed ... we have no "ubiformat" in u-boot, or?

In the meantime, should you be using WITH_DROP_FFS when "ubi" is set? Though we really should be skipping FFs at the end of each block, rather than just at the end of the image.

Yes, but this would be another patch, as this patch did not touch the nand write part ...!

Quoted 26 lines
Quoted 26 lines

- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.

- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()

- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct struct nand_internal_data
---
drivers/dfu/dfu_nand.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/dfu.h | 2 ++
2 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+)

drivers/dfu/dfu_nand.c +0 -0
index 07dee89..c0f8adf 100644
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
 return ret;
 }
 
Quoted 7 lines

drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, · line 155

Quoted 5 lines
drivers/dfu/dfu_nand.c +5 -0
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ /* in case of ubi partition, erase rest of the partition */

Did you have a chance to investigate the errors you saw when erasing the whole partition up front? If there's other DFU data in the partition that needs to be preserved, then replace "partition" with "area reserved for this image".

Currently no :-(

But I hope to get the chance to fix this in the correct way, by introducing an "ubi format ..." command ...

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#19 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Quoted 10 lines · Heiko Schocher

Hello Scott,

Am 22.07.2013 23:24, schrieb Scott Wood:

Quoted 7 lines · Heiko Schocher
Quoted 6 lines

- This patch is also a good starting point to fix up updating ubi, as
we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img

Quoted 8 lines
Quoted 5 lines
Quoted 1 line

This must be fixed ... we have no "ubiformat" in u-boot, or?

In the meantime, should you be using WITH_DROP_FFS when "ubi" is set? Though we really should be skipping FFs at the end of each block, rather than just at the end of the image.

Yes, but this would be another patch, as this patch did not touch the nand write part ...!

It was a response to the comment, not to the patch.

-Scott

#20 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

In reply to Heiko Schocher
Quoted 13 lines · Heiko Schocher
drivers/dfu/dfu_nand.c +13 -0
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+	int ret = 0;
+
+	/* in case of ubi partition, erase rest of the partition */
+	if (dfu->data.nand.ubi) {
+		nand_info_t *nand;
+		nand_erase_options_t opts;
+
+		if (nand_curr_device < 0 ||
+		    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+		    !nand_info[nand_curr_device].name) {
+			printf("%s: invalid nand device\n", __func__);

drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, · line 173

Quoted 10 lines
drivers/dfu/dfu_nand.c +10 -0
+			return -1;
+		}
+
+		nand = &nand_info[nand_curr_device];
+
+		memset(&opts, 0, sizeof(opts));
+		opts.offset = dfu->data.nand.start + dfu->offset +
+				dfu->bad_skip;
+		opts.length = dfu->data.nand.start +
+				dfu->data.nand.size - opts.offset;

opts.length is equivalent to dfu->data.nand.size - dfu->offset - dfu->bad_skip. Is this correct? dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't?

Quoted 22 lines
drivers/dfu/dfu_nand.c +16 -0
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu,  
 char *s)
 
 		dfu->data.nand.start = pi->offset;
+	} else if (!strcmp(st, "partubi")) {
 		dfu->data.nand.size = pi->size;
+		char mtd_id[32];
+		struct mtd_device *mtd_dev;
+		u8 part_num;
+		struct part_info *pi;
 
+		dfu->layout = DFU_RAW_ADDR;
+
+		dev = simple_strtoul(s, &s, 10);
+		s++;
+		part = simple_strtoul(s, &s, 10);
+
+		sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+		printf("using id '%s'\n", mtd_id);
+
+		mtdparts_init();
+

drivers/dfu/dfu_nand.c int dfu_fill_entity_nand(struct dfu_entity *dfu, · line 247

Quoted 10 lines
drivers/dfu/dfu_nand.c +9 -0
+		ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num,  
 &pi);
+		if (ret != 0) {
+			printf("Could not locate '%s'\n", mtd_id);
+			return -1;
+		}
+
+		dfu->data.nand.start = pi->offset;
+		dfu->data.nand.size = pi->size;
+		dfu->data.nand.ubi = 1;

Please don't duplicate all of this just to set one flag at the end.

-Scott

#21 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Hello Scott,

Am 24.07.2013 01:22, schrieb Scott Wood:

Quoted 18 lines · Heiko Schocher
Quoted 17 lines
drivers/dfu/dfu_nand.c +17 -0
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ /* in case of ubi partition, erase rest of the partition */
+ if (dfu->data.nand.ubi) {
+ nand_info_t *nand;
+ nand_erase_options_t opts;
+
+ if (nand_curr_device < 0 ||
+ nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+ !nand_info[nand_curr_device].name) {
+ printf("%s: invalid nand device\n", __func__);
+ return -1;
+ }
+
+ nand = &nand_info[nand_curr_device];
Quoted 8 lines
Quoted 6 lines

+
+ memset(&opts, 0, sizeof(opts));
+ opts.offset = dfu->data.nand.start + dfu->offset +
+ dfu->bad_skip;
+ opts.length = dfu->data.nand.start +
+ dfu->data.nand.size - opts.offset;

opts.length is equivalent to dfu->data.nand.size - dfu->offset - dfu->bad_skip. Is this correct? dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't?

Yes, it is correct!

I could not parse "dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't" ... What do you mean?

I need to calculate "opts-offset" and "opts.length" for nand_erase_opts():
opts.offset contains the starting sector where the erase should begin

      dfu->data.nand.start is equal to the starting sector of the
      partition, so this is needed here + dfu->offset + dfu->bad_skip
      and we are at our starting point.

opts.length contains the count of sectors to erase.
I just did here end_sector - start_sector with:
end_sector = dfu->data.nand.start + dfu->data.nand.size start_sector = opts.offset

Maybe my calculation of opts.length is confusing, and I should use "dfu->data.nand.size - dfu->offset - dfu->bad_skip" ?

Quoted 24 lines
Quoted 24 lines
drivers/dfu/dfu_nand.c +19 -0
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 
 dfu->data.nand.start = pi->offset;
+ } else if (!strcmp(st, "partubi")) {
 dfu->data.nand.size = pi->size;
+ char mtd_id[32];
+ struct mtd_device *mtd_dev;
+ u8 part_num;
+ struct part_info *pi;
 
+ dfu->layout = DFU_RAW_ADDR;
+
+ dev = simple_strtoul(s, &s, 10);
+ s++;
+ part = simple_strtoul(s, &s, 10);
+
+ sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
+ printf("using id '%s'\n", mtd_id);
+
+ mtdparts_init();
+
+ ret = find_dev_and_part(mtd_id, &mtd_dev, &part_num, &pi);
+ if (ret != 0) {
+ printf("Could not locate '%s'\n", mtd_id);
Quoted 8 lines

drivers/dfu/dfu_nand.c int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) · line 245

Quoted 6 lines
drivers/dfu/dfu_nand.c +6 -0
+ return -1;
+ }
+
+ dfu->data.nand.start = pi->offset;
+ dfu->data.nand.size = pi->size;
+ dfu->data.nand.ubi = 1;

Please don't duplicate all of this just to set one flag at the end.

You are right! Fixed!

Thanks!

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#22 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Quoted 32 lines · Heiko Schocher

Hello Scott,

Am 24.07.2013 01:22, schrieb Scott Wood:

Quoted 20 lines · Heiko Schocher
Quoted 19 lines
drivers/dfu/dfu_nand.c +19 -0
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ /* in case of ubi partition, erase rest of the partition */
+ if (dfu->data.nand.ubi) {
+ nand_info_t *nand;
+ nand_erase_options_t opts;
+
+ if (nand_curr_device < 0 ||
+ nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+ !nand_info[nand_curr_device].name) {
+ printf("%s: invalid nand device\n", __func__);
+ return -1;
+ }
+
+ nand = &nand_info[nand_curr_device];
+
+ memset(&opts, 0, sizeof(opts));
Quoted 8 lines
Quoted 4 lines

+ opts.offset = dfu->data.nand.start + dfu->offset +
+ dfu->bad_skip;
+ opts.length = dfu->data.nand.start +
+ dfu->data.nand.size - opts.offset;

opts.length is equivalent to dfu->data.nand.size - dfu->offset - dfu->bad_skip. Is this correct? dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't?

Quoted 1 line

Yes, it is correct!

No need to shout...

Quoted 2 lines

I could not parse "dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't" ... What do you mean?

I think my confusion was over what dfu->offset and nand.start represent. If nand.start/nand.size describe the raw partition, and dfu->offset is the offset into that partition that the image starts at, then this looks OK.

-Scott

#23 lore raw

PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition

Hello Scott,

Am 24.07.2013 21:08, schrieb Scott Wood:

Quoted 31 lines · Heiko Schocher
Quoted 30 lines

Hello Scott,

Am 24.07.2013 01:22, schrieb Scott Wood:

Quoted 26 lines · Heiko Schocher
Quoted 13 lines
drivers/dfu/dfu_nand.c +13 -0
+static int dfu_flush_medium_nand(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ /* in case of ubi partition, erase rest of the partition */
+ if (dfu->data.nand.ubi) {
+ nand_info_t *nand;
+ nand_erase_options_t opts;
+
+ if (nand_curr_device < 0 ||
+ nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
+ !nand_info[nand_curr_device].name) {
+ printf("%s: invalid nand device\n", __func__);

drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, · line 173

Quoted 10 lines
drivers/dfu/dfu_nand.c +10 -0
+ return -1;
+ }
+
+ nand = &nand_info[nand_curr_device];
+
+ memset(&opts, 0, sizeof(opts));
+ opts.offset = dfu->data.nand.start + dfu->offset +
+ dfu->bad_skip;
+ opts.length = dfu->data.nand.start +
+ dfu->data.nand.size - opts.offset;

opts.length is equivalent to dfu->data.nand.size - dfu->offset - dfu->bad_skip. Is this correct? dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't?

Quoted 3 lines
Quoted 1 line

Yes, it is correct!

No need to shout...

Sorry, I did not intent to shout ...

Quoted 4 lines
Quoted 2 lines

I could not parse "dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't" ... What do you mean?

I think my confusion was over what dfu->offset and nand.start represent. If nand.start/nand.size describe the raw partition, and dfu->offset is the offset into that partition that the image starts at, then this looks OK.

Ok, I send an update of this patch for your other comment, thanks.

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany