Skip to contentSkip to conversation

SPI-NAND support (third batch)

PATCH Superseded Miquel Raynal 2 participants 16 messages Sep 27, 2018 – Sep 29, 2018 Memory technology devices (MTD)

v10 of 13 Superseded Latest is v13 →

lore
Share & tools
lore

Miquel Raynal

author maintainer
#0 lore raw

v10 cover SPI-NAND support (third batch)

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.

cmd/mtd.c:
* The logic in the mtd_is_aligned_with_*() functions was wrong, inversed it so the result is what the reader expects (the logic in the end was valid, though).
* Discriminate two path: for NAND-like devices (pages, OOB, raw mode, bad blocks) and the others.
* Add the "bad" feature to display all bad blocks (if any).
* Fix some typos/display strings.
* Moved the refcounting put_mtd_device() below in the code as suggested by Boris.
* Avoid writing empty pages by default (add an option to force the writing).
* Always skip bad blocks.
* Lightened the code by creating helpers.

Changes since v7:
-----------------
* Added Stefan R-b tags.
* Used tolower() as suggested by Stefan in lib/strto.c.
* Added a mention saying that we continue to abuse the kB suffix in lib/strto.c by not making a difference between kB and kiB which both mean "* 1024" for us. This has been added in the commit log.
* Fixed various bugs in the mtd command and in the parsers, they should be pretty stable now (tested with two MTD devices probed and several different partition configurations).
* mtdids is not deprecated at all as opposed at what I wrote in v6. U-Boot still uses its own MTD names (being <type><idx> like nor0 or spi-nand1) and mtdids is still needed to do the glue.
* Removed a useless patch removing a Kconfig entry I added myself since during a rebase someone else also added this symbol.

Changes since v6:
-----------------
* Squashed Boris' fixes about build issues in Travis.
* Merged Stefan Roese's contributions.
* cmd: mtdparts:
* added fallthrough comments in switch blocks deriving sizes.
* balanced debug messages to compare freed and allocated partitions.
* move mtdparts_init() declaration in mtd/partitions.h to be used in mtd command as well.
* introduced a "compatibility" function to return what the MTD device name could be thanks to the mtdids environment variable (which is useless with the new partitioning logic).
* mtd: mtdpart:
* reworked the way partitions are created/handled.
* cmd: mtd:
* implement a partitioning logic that takes the best out of the MTD layer without re-inventing the wheel. Partitions are all freed correctly when the value of mtdparts changes.
* balance get_mtd_device() by put_mtd_device() calls.
* prevent memory leak by reorganizing the code a bit in do_mtd.
* do not reconstruct partition list when a partition is already in use (complain about that instead).
* add support for the legacy mtdids (not needed anymore if mtdparts directly uses the MTD device names as in Linux.
* cmd: ubi:
* clean and simplify the partition handling a bit to make use the best use of the MTD layer as well and keep the code simple.

Changes since v5:
-----------------
* Included Boris fixup about the build issues.
* Added Rb/Ab tags from Jagan on patchs 20/21.

Changes since v4:
-----------------
* Added Jagan's Acked-by tags to every patch related to the SPI-mem/SPI-NAND addition.
* Rebased on top of master.

Changes since v3:
-----------------
* Fixed the debug messages in spi-mem to print either Rx or Tx data.
* Fixed a Kconfig error that prevented to build mtdparts with plain defconfig.
* Fixed a compilation error due to the above error that prevented one file to be compiled.
* Adapted the mtd command to probe MTD partitions also.
* Declared mtd_probe_devices() in a header so mtdparts or UBI could use it too (to probe all devices and MTD partitions in a clean way).
* As I worked on mtdparts, I found annoying and completely useless the fact that we need to prefix the environment variable with "mtdparts=". Canceled this obligation.
* Added one patch to allow spi-nand devices to be recognized by mtdparts (this is purely useless but needed to be done in order to use this command).
* Removed useless definitions of MTD device types in UBI code.
* Wrote a generic mtdparts environment variable parser, used by the mtd command.
* Used the mtd_probe_devices() function from get_mtd_info() in cmd/mtdparts.c to be sure the desired partition really does not exist (otherwise it will be probed and then found).

Changes since v2:
-----------------
* Rebased on u-boot master branch.
* Removed extra-parenthesis in
"mtd: Fallback to ->_read/write() when ->_read/write_oob() is missing"
* s/fiels/files/ in "mtd: move NAND fiels into a raw/ subdirectory"
* Do not describe generic SPI device properties in SPI NAND bindings.
* Changes in the mtd command:
* Printing more information in 'mtd list' (device type, device characteristics)
* Switch to do_div() instead of '(u32)value64b % value32b' which only worked because value32b was a power of 2.
* Removed erase.chip option.
* By default, erase/read/write happen on the full MTD device while a dump will only work on a single page.

Changes since v1:
-----------------
* Fixed the nand_memorg structure of the MX35LF2GE4AB chip.
* Added Reviewed-by tags from Jagan.
* Backported and squashed two patches fixing things in the SPI NAND core received on the Linux ML.
* Backported more changes in mtdcore.c from Linux.
* Added a patch to add a fallback on mtd->_read/_write() in mtdcore.c when mtd->_read/write_oob() is not supported.
* Removed the DT changes, useless as the DTs are not available in mainline yet.
* Addressed Boris/Stefan comments on the 'mtd' command.
* Added support for multi-pages OOB read/write.

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

 cmd/Kconfig                    |  18 +-
 cmd/Makefile                   |   1 +
 cmd/mtd.c                      | 471 +++++++++++++++++++++++++
 cmd/ubi.c                      |  96 ++---
 drivers/mtd/Makefile           |   2 +-
 drivers/mtd/mtd-uclass.c       |  16 +
 drivers/mtd/mtd_uboot.c        | 216 +++++++++++-
 drivers/mtd/mtdcore.c          |   2 +
 drivers/mtd/mtdpart.c          | 622 ++++++++++++++++++++-------------
 include/linux/mtd/mtd.h        |  36 ++
 include/linux/mtd/partitions.h |  22 +-
 include/mtd.h                  |   3 +
 12 files changed, 1190 insertions(+), 315 deletions(-)
 create mode 100644 cmd/mtd.c
Signature · 1 line
2.17.1
author maintainer
#1 lore raw

PATCH v10 1/7 mtd: uclass: add probe function

The user might want to trigger the probe of any MTD device, export these functions so they can be called from a command source file.

---
 drivers/mtd/mtd-uclass.c | 16 ++++++++++++++++
 include/mtd.h            |  2 ++
 2 files changed, 18 insertions(+)
drivers/mtd/mtd-uclass.c +16 -0
index 9ca049c437..5418217431 100644
@@ -5,9 +5,25 @@
 
 #include <common.h>
 #include <dm.h>
+#include <dm/device-internal.h>
 #include <errno.h>
 #include <mtd.h>
 
+/**
+ * mtd_probe - Probe the device @dev if not already done
+ *
+ * @dev: U-Boot device to probe
+ *
+ * @return 0 on success, an error otherwise.
+ */
+int mtd_probe(struct udevice *dev)
+{
+	if (device_active(dev))
+		return 0;
+
+	return device_probe(dev);
+}
+
 /*
  * Implement a MTD uclass which should include most flash drivers.
  * The uclass private is pointed to mtd_info.
include/mtd.h +2 -0
index 548e7f191b..6e6da3002f 100644
@@ -19,4 +19,6 @@ static inline struct mtd_info *mtd_get_info(struct udevice *dev)
 	return dev_get_uclass_priv(dev);
 }
 
+int mtd_probe(struct udevice *dev);
+
 #endif	/* _MTD_H_ */
Signature · 1 line
2.17.1
author maintainer
#2 lore raw

PATCH v10 2/7 mtd: mtdpart: add a generic mtdparts-like parser

In reply to Miquel Raynal

The current parser is very specific to U-Boot mtdparts implementation. It does not use MTD structures like mtd_info and mtd_partition. Copy and adapt the current parser in drivers/mtd/mtd-uclass.c (to not break the current use of mtdparts.c itself) and write some kind of a wrapper around the current implementation to allow other commands to benefit from this parsing in a user-friendly way.

This new function will allocate an mtd_partition array for each successful call. This array must be freed after use by the caller. The given 'mtdparts' buffer pointer will be moved forward to the next MTD device (if any, it will point towards a '\0' character otherwise).

---
 drivers/mtd/mtdpart.c          | 209 +++++++++++++++++++++++++++++++++
 include/linux/mtd/partitions.h |  21 ++++
 2 files changed, 230 insertions(+)
drivers/mtd/mtdpart.c +209 -0
index 9ccb1b3361..0220de661d 100644
@@ -76,6 +76,215 @@ char *kstrdup(const char *s, gfp_t gfp)
 }
 #endif
 
+#define MTD_SIZE_REMAINING		(~0LLU)
+#define MTD_OFFSET_NOT_SPECIFIED	(~0LLU)
+
+/**
+ * mtd_parse_partition - Parse @mtdparts partition definition, fill @partition
+ *                       with it and update the @mtdparts string pointer.
+ *
+ * The partition name is allocated and must be freed by the caller.
+ *
+ * This function is widely inspired from part_parse (mtdparts.c).
+ *
+ * @mtdparts: String describing the partition with mtdparts command syntax
+ * @partition: MTD partition structure to fill
+ *
+ * @return 0 on success, an error otherwise.
+ */
+static int mtd_parse_partition(const char **_mtdparts,
+			       struct mtd_partition *partition)
+{
+	const char *mtdparts = *_mtdparts;
+	const char *name = NULL;
+	int name_len;
+	char *buf;
+
+	/* Ensure the partition structure is empty */
+	memset(partition, 0, sizeof(struct mtd_partition));
+
+	/* Fetch the partition size */
+	if (*mtdparts == '-') {
+		/* Assign all remaining space to this partition */
+		partition->size = MTD_SIZE_REMAINING;
+		mtdparts++;
+	} else {
+		partition->size = ustrtoull(mtdparts, (char **)&mtdparts, 0);
+		if (partition->size < SZ_4K) {
+			printf("Minimum partition size 4kiB, %lldB requested\n",
+			       partition->size);
+			return -EINVAL;
+		}
+	}
+
+	/* Check for the offset */
+	partition->offset = MTD_OFFSET_NOT_SPECIFIED;
+	if (*mtdparts == '@') {
+		mtdparts++;
+		partition->offset = ustrtoull(mtdparts, (char **)&mtdparts, 0);
+	}
+
+	/* Now look for the name */
+	if (*mtdparts == '(') {
+		name = ++mtdparts;
+		mtdparts = strchr(name, ')');
+		if (!mtdparts) {
+			printf("No closing ')' found in partition name\n");
+			return -EINVAL;
+		}
+		name_len = mtdparts - name + 1;
+		if ((name_len - 1) == 0) {
+			printf("Empty partition name\n");
+			return -EINVAL;
+		}
+		mtdparts++;
+	} else {
+		/* Name will be of the form size at offset */
+		name_len = 22;
+	}
+
+	/* Check if the partition is read-only */
+	if (strncmp(mtdparts, "ro", 2) == 0) {
+		partition->mask_flags |= MTD_WRITEABLE;
+		mtdparts += 2;
+	}
+
+	/* Check for a potential next partition definition */
+	if (*mtdparts == ',') {
+		if (partition->size == MTD_SIZE_REMAINING) {
+			printf("No partitions allowed after a fill-up\n");
+			return -EINVAL;
+		}
+		++mtdparts;
+	} else if ((*mtdparts == ';') || (*mtdparts == '\0')) {
+		/* NOP */
+	} else {
+		printf("Unexpected character '%c' in mtdparts\n", *mtdparts);
+		return -EINVAL;
+	}
+
+	/*
+	 * Allocate a buffer for the name and either copy the provided name or
+	 * auto-generate it with the form 'size at offset'.
+	 */
+	buf = malloc(name_len);
+	if (!buf)
+		return -ENOMEM;
+
+	if (name)
+		strncpy(buf, name, name_len - 1);
+	else
+		snprintf(buf, name_len, "0x%08llx at 0x%08llx",
+			 partition->size, partition->offset);
+
+	buf[name_len - 1] = '\0';
+	partition->name = buf;
+
+	*_mtdparts = mtdparts;
+
+	return 0;
+}
+
+/**
+ * mtd_parse_partitions - Create a partition array from an mtdparts definition
+ *
+ * Stateless function that takes a @parent MTD device, a string @_mtdparts
+ * describing the partitions (with the "mtdparts" command syntax) and creates
+ * the corresponding MTD partition structure array @_parts. Both the name and
+ * the structure partition itself must be freed freed, the caller may use
+ * @mtd_free_parsed_partitions() for this purpose.
+ *
+ * @parent: MTD device which contains the partitions
+ * @_mtdparts: Pointer to a string describing the partitions with "mtdparts"
+ *             command syntax.
+ * @_parts: Allocated array containing the partitions, must be freed by the
+ *          caller.
+ * @_nparts: Size of @_parts array.
+ *
+ * @return 0 on success, an error otherwise.
+ */
+int mtd_parse_partitions(struct mtd_info *parent, const char **_mtdparts,
+			 struct mtd_partition **_parts, int *_nparts)
+{
+	struct mtd_partition partition = {}, *parts;
+	const char *mtdparts = *_mtdparts;
+	int cur_off = 0, cur_sz = 0;
+	int nparts = 0;
+	int ret, idx;
+	u64 sz;
+
+	/* First, iterate over the partitions until we know their number */
+	while (mtdparts[0] != '\0' && mtdparts[0] != ';') {
+		ret = mtd_parse_partition(&mtdparts, &partition);
+		if (ret)
+			return ret;
+
+		free((char *)partition.name);
+		nparts++;
+	}
+
+	/* Allocate an array of partitions to give back to the caller */
+	parts = malloc(sizeof(*parts) * nparts);
+	if (!parts) {
+		printf("Not enough space to save partitions meta-data\n");
+		return -ENOMEM;
+	}
+
+	/* Iterate again over each partition to save the data in our array */
+	for (idx = 0; idx < nparts; idx++) {
+		ret = mtd_parse_partition(_mtdparts, &parts[idx]);
+		if (ret)
+			return ret;
+
+		if (parts[idx].size == MTD_SIZE_REMAINING)
+			parts[idx].size = parent->size - cur_sz;
+		cur_sz += parts[idx].size;
+
+		sz = parts[idx].size;
+		if (sz < parent->writesize || do_div(sz, parent->writesize)) {
+			printf("Partition size must be a multiple of %d\n",
+			       parent->writesize);
+			return -EINVAL;
+		}
+
+		if (parts[idx].offset == MTD_OFFSET_NOT_SPECIFIED)
+			parts[idx].offset = cur_off;
+		cur_off += parts[idx].size;
+
+		parts[idx].ecclayout = parent->ecclayout;
+	}
+
+	/* Offset by one mtdparts to point to the next device if any */
+	if (*_mtdparts[0] == ';')
+		(*_mtdparts)++;
+
+	*_parts = parts;
+	*_nparts = nparts;
+
+	return 0;
+}
+
+/**
+ * mtd_free_parsed_partitions - Free dynamically allocated partitions
+ *
+ * Each successful call to @mtd_parse_partitions must be followed by a call to
+ * @mtd_free_parsed_partitions to free any allocated array during the parsing
+ * process.
+ *
+ * @parts: Array containing the partitions that will be freed.
+ * @nparts: Size of @parts array.
+ */
+void mtd_free_parsed_partitions(struct mtd_partition *parts,
+				unsigned int nparts)
+{
+	int i;
+
+	for (i = 0; i < nparts; i++)
+		free((char *)parts[i].name);
+
+	free(parts);
+}
+
 /*
  * MTD methods which simply translate the effective address and pass through
  * to the _real_ device.
include/linux/mtd/partitions.h +21 -0
index ce0e8dbee4..3240869bf9 100644
@@ -87,4 +87,25 @@ int mtd_add_partition(struct mtd_info *master, const char *name,
 int mtd_del_partition(struct mtd_info *master, int partno);
 uint64_t mtd_get_device_size(const struct mtd_info *mtd);
 
+#if IS_ENABLED(CONFIG_MTD_PARTITIONS)
+int mtd_parse_partitions(struct mtd_info *parent, const char **_mtdparts,
+			 struct mtd_partition **_parts, int *_nparts);
+void mtd_free_parsed_partitions(struct mtd_partition *parts,
+				unsigned int nparts);
+#else
+static inline int
+mtd_parse_partitions(struct mtd_info *parent, const char **_mtdparts,
+		     struct mtd_partition **_parts, int *_nparts)
+{
+	*_nparts = 0;
+
+	return 0;
+}
+static inline void
+mtd_free_parsed_partitions(struct mtd_partition *parts, unsigned int nparts)
+{
+	return;
+}
+#endif /* defined(MTD_PARTITIONS) */
+
 #endif
Signature · 1 line
2.17.1
author maintainer
#3 lore raw

PATCH v10 3/7 mtd: uboot: search for an equivalent MTD name with the mtdids

In reply to Miquel Raynal

Using an MTD device (resp. partition) name in mtdparts is simple and straightforward. However, for a long time already, another name was given in mtdparts to indicate a device (resp. partition) so the "mtdids" environment variable was created to do the match.

Let's create a function that, from an MTD device (resp. partition) name, search for the equivalent name in the "mtdparts" environment variable thanks to the "mtdids" string.

---
 drivers/mtd/mtd_uboot.c | 65 ++++++++++++++++++++++++++++++++++++++++-
 include/linux/mtd/mtd.h |  5 ++++
 2 files changed, 69 insertions(+), 1 deletion(-)
drivers/mtd/mtd_uboot.c +64 -1
index 2b3b2eecca..8d7e7890b7 100644
@@ -5,7 +5,70 @@
  */
 #include <common.h>
 #include <linux/mtd/mtd.h>
-#include <jffs2/jffs2.h>
+#include <jffs2/jffs2.h> /* Legacy */
+
+/**
+ * mtd_search_alternate_name - Search an alternate name for @mtdname thanks to
+ *                             the mtdids legacy environment variable.
+ *
+ * The mtdids string is a list of comma-separated 'dev_id=mtd_id' tupples.
+ * Check if one of the mtd_id matches mtdname, in this case save dev_id in
+ * altname.
+ *
+ * @mtdname: Current MTD device name
+ * @altname: Alternate name to return
+ * @max_len: Length of the alternate name buffer
+ *
+ * @return 0 on success, an error otherwise.
+ */
+int mtd_search_alternate_name(const char *mtdname, char *altname,
+			      unsigned int max_len)
+{
+	const char *mtdids, *equal, *comma, *dev_id, *mtd_id;
+	int dev_id_len, mtd_id_len;
+
+	mtdids = env_get("mtdids");
+	if (!mtdids)
+		return -EINVAL;
+
+	do {
+		/* Find the '=' sign */
+		dev_id = mtdids;
+		equal = strchr(dev_id, '=');
+		if (!equal)
+			break;
+		dev_id_len = equal - mtdids;
+		mtd_id = equal + 1;
+
+		/* Find the end of the tupple */
+		comma = strchr(mtdids, ',');
+		if (comma)
+			mtd_id_len = comma - mtd_id;
+		else
+			mtd_id_len = &mtdids[strlen(mtdids)] - mtd_id + 1;
+
+		if (!dev_id_len || !mtd_id_len)
+			return -EINVAL;
+
+		if (dev_id_len + 1 > max_len)
+			continue;
+
+		/* Compare the name we search with the current mtd_id */
+		if (!strncmp(mtdname, mtd_id, mtd_id_len)) {
+			strncpy(altname, dev_id, dev_id_len);
+			altname[dev_id_len] = 0;
+
+			return 0;
+		}
+
+		/* Go to the next tupple */
+		mtdids = comma + 1;
+	} while (comma);
+
+	return -EINVAL;
+}
+
+/* Legacy */
 
 static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
 		loff_t *maxsize, int devtype)
include/linux/mtd/mtd.h +5 -0
index b8c2c3fd59..af6f4a61f8 100644
@@ -549,5 +549,10 @@ int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
 void mtd_get_len_incl_bad(struct mtd_info *mtd, uint64_t offset,
 			  const uint64_t length, uint64_t *len_incl_bad,
 			  int *truncated);
+
+/* drivers/mtd/mtd_uboot.c */
+int mtd_search_alternate_name(const char *mtdname, char *altname,
+			      unsigned int max_len);
+
 #endif
 #endif /* __MTD_MTD_H__ */
Signature · 1 line
2.17.1
author maintainer
#4 lore raw

PATCH v10 4/7 mtd: mtdpart: implement proper partition handling

In reply to Miquel Raynal

Instead of collecting partitions in a flat list, create a hierarchy within the mtd_info structure: use a partitions list to keep track of the partitions of an MTD device (which might be itself a partition of another MTD device), a pointer to the parent device (NULL when the MTD device is the root one, not a partition).

By also saving directly in mtd_info the offset of the partition, we can get rid of the mtd_part structure.

---
 drivers/mtd/mtdcore.c          |   2 +
 drivers/mtd/mtdpart.c          | 413 ++++++++++++++-------------------
 include/linux/mtd/mtd.h        |  31 +++
 include/linux/mtd/partitions.h |   1 -
 4 files changed, 208 insertions(+), 239 deletions(-)
drivers/mtd/mtdcore.c +2 -0
index fb1d68d5e2..fb6c779abb 100644
@@ -426,6 +426,8 @@ int add_mtd_device(struct mtd_info *mtd)
 	mtd->index = i;
 	mtd->usecount = 0;
 
+	INIT_LIST_HEAD(&mtd->partitions);
+
 	/* default value if not set by driver */
 	if (mtd->bitflip_threshold == 0)
 		mtd->bitflip_threshold = mtd->ecc_strength;
drivers/mtd/mtdpart.c +175 -238

758 lines not on this page · raw message

include/linux/mtd/mtd.h +31 -0
index af6f4a61f8..dd3a6f17de 100644
@@ -307,6 +307,27 @@ struct mtd_info {
 	struct udevice *dev;
 #endif
 	int usecount;
+
+	/* MTD devices do not have any parent. MTD partitions do. */
+	struct mtd_info *parent;
+
+	/*
+	 * Offset of the partition relatively to the parent offset.
+	 * Is 0 for real MTD devices (ie. not partitions).
+	 */
+	u64 offset;
+
+	/*
+	 * List node used to add an MTD partition to the parent
+	 * partition list.
+	 */
+	struct list_head node;
+
+	/*
+	 * List of partitions attached to this MTD device (the parent
+	 * MTD device can itself be a partition).
+	 */
+	struct list_head partitions;
 };
 
 #if IS_ENABLED(CONFIG_DM)
@@ -334,6 +355,16 @@ static inline const struct device_node *mtd_get_of_node(struct mtd_info *mtd)
 }
 #endif
 
+static inline bool mtd_is_partition(const struct mtd_info *mtd)
+{
+	return mtd->parent;
+}
+
+static inline bool mtd_has_partitions(const struct mtd_info *mtd)
+{
+	return !list_empty(&mtd->partitions);
+}
+
 int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,
 		      struct mtd_oob_region *oobecc);
 int mtd_ooblayout_find_eccregion(struct mtd_info *mtd, int eccbyte,
include/linux/mtd/partitions.h +0 -1
index 3240869bf9..fb9109bec9 100644
@@ -81,7 +81,6 @@ extern void register_mtd_parser(struct mtd_part_parser *parser);
 extern void deregister_mtd_parser(struct mtd_part_parser *parser);
 #endif
 
-int mtd_is_partition(const struct mtd_info *mtd);
 int mtd_add_partition(struct mtd_info *master, const char *name,
 		      long long offset, long long length);
 int mtd_del_partition(struct mtd_info *master, int partno);
Signature · 1 line
2.17.1
author maintainer
#5 lore raw

PATCH v10 5/7 cmd: mtd: add 'mtd' command

In reply to Miquel Raynal

There should not be a 'nand' command, a 'sf' command and certainly not a new 'spi-nand' command. Write a 'mtd' command instead to manage all MTD devices/partitions at once. This should be the preferred way to access any MTD device.

---
 cmd/Kconfig             |  10 +-
 cmd/Makefile            |   1 +
 cmd/mtd.c               | 471 ++++++++++++++++++++++++++++++++++++++++
 drivers/mtd/Makefile    |   2 +-
 drivers/mtd/mtd_uboot.c | 153 ++++++++++++-
 include/mtd.h           |   1 +
 6 files changed, 634 insertions(+), 4 deletions(-)
 create mode 100644 cmd/mtd.c
cmd/Kconfig +8 -2
index f97d3df328..b5bd978f6d 100644
@@ -854,6 +854,12 @@ config CMD_MMC_SWRITE
 	  Enable support for the "mmc swrite" command to write Android sparse
 	  images to eMMC.
 
+config CMD_MTD
+	bool "mtd"
+	select MTD_PARTITIONS
+	help
+	  MTD commands support.
+
 config CMD_NAND
 	bool "nand"
 	default y if NAND_SUNXI
@@ -1678,14 +1684,14 @@ config CMD_MTDPARTS
 
 config MTDIDS_DEFAULT
 	string "Default MTD IDs"
-	depends on CMD_MTDPARTS || CMD_NAND || CMD_FLASH
+	depends on CMD_MTD || CMD_MTDPARTS || CMD_NAND || CMD_FLASH
 	help
 	  Defines a default MTD IDs list for use with MTD partitions in the
 	  Linux MTD command line partitions format.
 
 config MTDPARTS_DEFAULT
 	string "Default MTD partition scheme"
-	depends on CMD_MTDPARTS || CMD_NAND || CMD_FLASH
+	depends on CMD_MTD || CMD_MTDPARTS || CMD_NAND || CMD_FLASH
 	help
 	  Defines a default MTD partitioning scheme in the Linux MTD command
 	  line partitions format
cmd/Makefile +1 -0
index 414187f073..8107cb0aa8 100644
@@ -91,6 +91,7 @@ obj-$(CONFIG_CMD_MISC) += misc.o
 obj-$(CONFIG_CMD_MMC) += mmc.o
 obj-$(CONFIG_CMD_MMC_SPI) += mmc_spi.o
 obj-$(CONFIG_MP) += mp.o
+obj-$(CONFIG_CMD_MTD) += mtd.o
 obj-$(CONFIG_CMD_MTDPARTS) += mtdparts.o
 obj-$(CONFIG_CMD_NAND) += nand.o
 obj-$(CONFIG_CMD_NET) += net.o
cmd/mtd.c new file +471 -0

471 lines not on this page · raw message

drivers/mtd/Makefile +1 -1
index cdf515256a..22ceda93c0 100644
@@ -3,7 +3,7 @@
 # (C) Copyright 2000-2007
 # Wolfgang Denk, DENX Software Engineering, wd at denx.de.
 
-ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF)))
+ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF)$(CONFIG_CMD_MTD)))
 obj-y += mtdcore.o mtd_uboot.o
 endif
 obj-$(CONFIG_MTD) += mtd-uclass.o
drivers/mtd/mtd_uboot.c +152 -1

166 lines not on this page · raw message

include/mtd.h +1 -0
index 6e6da3002f..04b1c50ac7 100644
@@ -20,5 +20,6 @@ static inline struct mtd_info *mtd_get_info(struct udevice *dev)
 }
 
 int mtd_probe(struct udevice *dev);
+int mtd_probe_devices(void);
 
 #endif	/* _MTD_H_ */
Signature · 1 line
2.17.1
author maintainer
#6 lore raw

PATCH v10 6/7 cmd: ubi: clean the partition handling

In reply to Miquel Raynal

UBI should not mess with MTD partitions, now that the partitions are handled in a clean way, clean the ubi command and avoid using this uneeded extra-glue to reference the devices.

---
 cmd/Kconfig |  2 ++
 cmd/ubi.c   | 96 ++++++++++++++---------------------------------------
 2 files changed, 27 insertions(+), 71 deletions(-)
cmd/Kconfig +2 -0
index b5bd978f6d..f82addca0a 100644
@@ -1822,6 +1822,8 @@ config CMD_UBI
 	  capabilities. Please, consult the MTD web site for more details
 	  (www.linux-mtd.infradead.org). Activate this option if you want
 	  to use U-Boot UBI commands.
+	  It is also strongly encouraged to also enable CONFIG_MTD to get full
+	  partition support.
 
 config CMD_UBIFS
 	tristate "Enable UBIFS - Unsorted block images filesystem commands"
cmd/ubi.c +25 -71

162 lines not on this page · raw message

Signature · 1 line
2.17.1
author maintainer
#7 lore raw

PATCH v10 7/7 cmd: mtdparts: describe as legacy

In reply to Miquel Raynal

The 'mtdparts' command is not needed anymore. While the environment variable is still valid (and useful, along with the 'mtdids' one), the command has been replaced by 'mtd' which is much more close to the MTD stack and do not add its own specific glue.

---
 cmd/Kconfig | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
cmd/Kconfig +5 -1
index f82addca0a..da21d4e010 100644
@@ -1680,7 +1680,11 @@ config CMD_MTDPARTS
 	bool "MTD partition support"
 	select MTD_DEVICE if (CMD_NAND || NAND)
 	help
-	  MTD partition support
+	  MTD partitioning tool support.
+	  It is strongly encouraged to avoid using this command
+	  anymore along with 'sf', 'nand', 'onenand'. One can still
+	  declare the partitions in the mtdparts environment variable
+	  but better use the MTD stack and the 'mtd' command instead.
 
 config MTDIDS_DEFAULT
 	string "Default MTD IDs"
Signature · 1 line
2.17.1
#8 lore raw

v10 cover SPI-NAND support (third batch)

In reply to Miquel Raynal
Quoted 192 lines · Miquel Raynal

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.

cmd/mtd.c:
* The logic in the mtd_is_aligned_with_*() functions was wrong, inversed it so the result is what the reader expects (the logic in the end was valid, though).
* Discriminate two path: for NAND-like devices (pages, OOB, raw mode, bad blocks) and the others.
* Add the "bad" feature to display all bad blocks (if any).
* Fix some typos/display strings.
* Moved the refcounting put_mtd_device() below in the code as suggested by Boris.
* Avoid writing empty pages by default (add an option to force the writing).
* Always skip bad blocks.
* Lightened the code by creating helpers.

Changes since v7:
-----------------
* Added Stefan R-b tags.
* Used tolower() as suggested by Stefan in lib/strto.c.
* Added a mention saying that we continue to abuse the kB suffix in lib/strto.c by not making a difference between kB and kiB which both mean "* 1024" for us. This has been added in the commit log.
* Fixed various bugs in the mtd command and in the parsers, they should be pretty stable now (tested with two MTD devices probed and several different partition configurations).
* mtdids is not deprecated at all as opposed at what I wrote in v6. U-Boot still uses its own MTD names (being <type><idx> like nor0 or spi-nand1) and mtdids is still needed to do the glue.
* Removed a useless patch removing a Kconfig entry I added myself since during a rebase someone else also added this symbol.

Changes since v6:
-----------------
* Squashed Boris' fixes about build issues in Travis.
* Merged Stefan Roese's contributions.
* cmd: mtdparts:
* added fallthrough comments in switch blocks deriving sizes.
* balanced debug messages to compare freed and allocated partitions.
* move mtdparts_init() declaration in mtd/partitions.h to be used in mtd command as well.
* introduced a "compatibility" function to return what the MTD device name could be thanks to the mtdids environment variable (which is useless with the new partitioning logic).
* mtd: mtdpart:
* reworked the way partitions are created/handled.
* cmd: mtd:
* implement a partitioning logic that takes the best out of the MTD layer without re-inventing the wheel. Partitions are all freed correctly when the value of mtdparts changes.
* balance get_mtd_device() by put_mtd_device() calls.
* prevent memory leak by reorganizing the code a bit in do_mtd.
* do not reconstruct partition list when a partition is already in use (complain about that instead).
* add support for the legacy mtdids (not needed anymore if mtdparts directly uses the MTD device names as in Linux.
* cmd: ubi:
* clean and simplify the partition handling a bit to make use the best use of the MTD layer as well and keep the code simple.

Changes since v5:
-----------------
* Included Boris fixup about the build issues.
* Added Rb/Ab tags from Jagan on patchs 20/21.

Changes since v4:
-----------------
* Added Jagan's Acked-by tags to every patch related to the SPI-mem/SPI-NAND addition.
* Rebased on top of master.

Changes since v3:
-----------------
* Fixed the debug messages in spi-mem to print either Rx or Tx data.
* Fixed a Kconfig error that prevented to build mtdparts with plain defconfig.
* Fixed a compilation error due to the above error that prevented one file to be compiled.
* Adapted the mtd command to probe MTD partitions also.
* Declared mtd_probe_devices() in a header so mtdparts or UBI could use it too (to probe all devices and MTD partitions in a clean way).
* As I worked on mtdparts, I found annoying and completely useless the fact that we need to prefix the environment variable with "mtdparts=". Canceled this obligation.
* Added one patch to allow spi-nand devices to be recognized by mtdparts (this is purely useless but needed to be done in order to use this command).
* Removed useless definitions of MTD device types in UBI code.
* Wrote a generic mtdparts environment variable parser, used by the mtd command.
* Used the mtd_probe_devices() function from get_mtd_info() in cmd/mtdparts.c to be sure the desired partition really does not exist (otherwise it will be probed and then found).

Changes since v2:
-----------------
* Rebased on u-boot master branch.
* Removed extra-parenthesis in
"mtd: Fallback to ->_read/write() when ->_read/write_oob() is missing"
* s/fiels/files/ in "mtd: move NAND fiels into a raw/ subdirectory"
* Do not describe generic SPI device properties in SPI NAND bindings.
* Changes in the mtd command:
* Printing more information in 'mtd list' (device type, device characteristics)
* Switch to do_div() instead of '(u32)value64b % value32b' which only worked because value32b was a power of 2.
* Removed erase.chip option.
* By default, erase/read/write happen on the full MTD device while a dump will only work on a single page.

Changes since v1:
-----------------
* Fixed the nand_memorg structure of the MX35LF2GE4AB chip.
* Added Reviewed-by tags from Jagan.
* Backported and squashed two patches fixing things in the SPI NAND core received on the Linux ML.
* Backported more changes in mtdcore.c from Linux.
* Added a patch to add a fallback on mtd->_read/_write() in mtdcore.c when mtd->_read/write_oob() is not supported.
* Removed the DT changes, useless as the DTs are not available in mainline yet.
* Addressed Boris/Stefan comments on the 'mtd' command.
* Added support for multi-pages OOB read/write.

Quoted 8 lines

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

I didn't find this mtdparts fallback change[1] in v10? does this fallback issue fixed differently.

[1] https://github.com/openedev/u-boot-amarula/commit/9edbc2be512c9bd572884c53b5f54b583e897e9b

author maintainer
#9 lore raw

v10 cover SPI-NAND support (third batch)

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:18:49 +0530:

Quoted 68 lines · Miquel Raynal
Quoted 67 lines

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.

[...]

Quoted 9 lines
Quoted 8 lines

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

Quoted 4 lines

I didn't find this mtdparts fallback change[1] in v10? does this fallback issue fixed differently.

[1] https://github.com/openedev/u-boot-amarula/commit/9edbc2be512c9bd572884c53b5f54b583e897e9b

Indeed, I dropped this patch on Boris advice: if we want to deprecate this command, we should not add new features to it (see the above changelog).

Thanks,
Miquèl

#10 lore raw

v10 cover SPI-NAND support (third batch)

Quoted 86 lines · Miquel Raynal

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:18:49 +0530:

Quoted 68 lines · Miquel Raynal
Quoted 67 lines

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.

[...]

Quoted 9 lines
Quoted 8 lines

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

Quoted 8 lines
Quoted 4 lines

I didn't find this mtdparts fallback change[1] in v10? does this fallback issue fixed differently.

[1] https://github.com/openedev/u-boot-amarula/commit/9edbc2be512c9bd572884c53b5f54b583e897e9b

Indeed, I dropped this patch on Boris advice: if we want to deprecate this command, we should not add new features to it (see the above changelog).

OK.

Here are all spi-nand changes[2], I still find the build issues[3], any dependencies other than these changes?

[2] https://github.com/openedev/u-boot-amarula/commits/wip-spi-nand
[3] https://travis-ci.org/openedev/u-boot-amarula/builds/434479310

author maintainer
#11 lore raw

v10 cover SPI-NAND support (third batch)

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:56:43 +0530:

Quoted 97 lines
Quoted 86 lines · Miquel Raynal

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:18:49 +0530:

Quoted 68 lines · Miquel Raynal
Quoted 67 lines

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.

[...]

Quoted 9 lines
Quoted 8 lines

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

Quoted 8 lines
Quoted 4 lines

I didn't find this mtdparts fallback change[1] in v10? does this fallback issue fixed differently.

[1] https://github.com/openedev/u-boot-amarula/commit/9edbc2be512c9bd572884c53b5f54b583e897e9b

Indeed, I dropped this patch on Boris advice: if we want to deprecate this command, we should not add new features to it (see the above changelog).

Quoted 6 lines

OK.

Here are all spi-nand changes[2], I still find the build issues[3], any dependencies other than these changes?

[2] https://github.com/openedev/u-boot-amarula/commits/wip-spi-nand

Seems good to me!

Quoted 1 line

[3] https://travis-ci.org/openedev/u-boot-amarula/builds/434479310

Indeed, builds are failing because of SZ_4K is not defined (mostly arm boards). For an unknown reason it does not break with my setup (I'm on mips right now).

Let me fix this, I'll keep you udpated.

Thanks,
Miquèl

author maintainer
#12 lore raw

v10 cover SPI-NAND support (third batch)

Hi Miquel,

Miquel Raynal <[email protected]> wrote on Fri, 28 Sep 2018 09:35:02 +0200:

Quoted 111 lines

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:56:43 +0530:

Quoted 97 lines
Quoted 86 lines · Miquel Raynal

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:18:49 +0530:

Quoted 68 lines · Miquel Raynal
Quoted 67 lines

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.

[...]

Quoted 9 lines
Quoted 8 lines

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

Quoted 8 lines
Quoted 4 lines

I didn't find this mtdparts fallback change[1] in v10? does this fallback issue fixed differently.

[1] https://github.com/openedev/u-boot-amarula/commit/9edbc2be512c9bd572884c53b5f54b583e897e9b

Indeed, I dropped this patch on Boris advice: if we want to deprecate this command, we should not add new features to it (see the above changelog).

Quoted 6 lines

OK.

Here are all spi-nand changes[2], I still find the build issues[3], any dependencies other than these changes?

[2] https://github.com/openedev/u-boot-amarula/commits/wip-spi-nand

Seems good to me!

Quoted 7 lines
Quoted 1 line

[3] https://travis-ci.org/openedev/u-boot-amarula/builds/434479310

Indeed, builds are failing because of SZ_4K is not defined (mostly arm boards). For an unknown reason it does not break with my setup (I'm on mips right now).

Let me fix this, I'll keep you udpated.

I fixed the SZ_4K and the dev_uclass_get_priv() issues, I hope there are no more relevant warnings/errors than these two.

Please receive two patches independently with their own changelog, they should replace their counterpart in your spi-nand-wip branch (titles are exactly the same). Please tell me if you have troubles replacing it. Once Travis build is restarted, please share the link, I'll monitore it.

Thanks,
Miquèl

#13 lore raw

v10 cover SPI-NAND support (third batch)

Quoted 125 lines · Miquel Raynal

Hi Miquel,

Miquel Raynal <[email protected]> wrote on Fri, 28 Sep 2018 09:35:02 +0200:

Quoted 111 lines

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:56:43 +0530:

Quoted 97 lines
Quoted 86 lines · Miquel Raynal

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:18:49 +0530:

Quoted 68 lines · Miquel Raynal
Quoted 67 lines

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.

[...]

Quoted 9 lines
Quoted 8 lines

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

Quoted 8 lines
Quoted 4 lines

I didn't find this mtdparts fallback change[1] in v10? does this fallback issue fixed differently.

[1] https://github.com/openedev/u-boot-amarula/commit/9edbc2be512c9bd572884c53b5f54b583e897e9b

Indeed, I dropped this patch on Boris advice: if we want to deprecate this command, we should not add new features to it (see the above changelog).

Quoted 6 lines

OK.

Here are all spi-nand changes[2], I still find the build issues[3], any dependencies other than these changes?

[2] https://github.com/openedev/u-boot-amarula/commits/wip-spi-nand

Seems good to me!

Quoted 7 lines
Quoted 1 line

[3] https://travis-ci.org/openedev/u-boot-amarula/builds/434479310

Indeed, builds are failing because of SZ_4K is not defined (mostly arm boards). For an unknown reason it does not break with my setup (I'm on mips right now).

Let me fix this, I'll keep you udpated.

Quoted 8 lines

I fixed the SZ_4K and the dev_uclass_get_priv() issues, I hope there are no more relevant warnings/errors than these two.

Please receive two patches independently with their own changelog, they should replace their counterpart in your spi-nand-wip branch (titles are exactly the same). Please tell me if you have troubles replacing it. Once Travis build is restarted, please share the link, I'll monitore it.

Yes, replaced.

Here is the build [4], seems not good.

[4] https://travis-ci.org/openedev/u-boot-amarula/builds/434572246

author maintainer
#14 lore raw

v10 cover SPI-NAND support (third batch)

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 19:09:21 +0530:

Quoted 135 lines · Miquel Raynal
Quoted 125 lines

Hi Miquel,

Miquel Raynal <[email protected]> wrote on Fri, 28 Sep 2018 09:35:02 +0200:

Quoted 111 lines

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:56:43 +0530:

Quoted 97 lines
Quoted 86 lines · Miquel Raynal

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:18:49 +0530:

Quoted 68 lines · Miquel Raynal
Quoted 67 lines

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.

[...]

Quoted 9 lines
Quoted 8 lines

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

Quoted 8 lines
Quoted 4 lines

I didn't find this mtdparts fallback change[1] in v10? does this fallback issue fixed differently.

[1] https://github.com/openedev/u-boot-amarula/commit/9edbc2be512c9bd572884c53b5f54b583e897e9b

Indeed, I dropped this patch on Boris advice: if we want to deprecate this command, we should not add new features to it (see the above changelog).

Quoted 6 lines

OK.

Here are all spi-nand changes[2], I still find the build issues[3], any dependencies other than these changes?

[2] https://github.com/openedev/u-boot-amarula/commits/wip-spi-nand

Seems good to me!

Quoted 7 lines
Quoted 1 line

[3] https://travis-ci.org/openedev/u-boot-amarula/builds/434479310

Indeed, builds are failing because of SZ_4K is not defined (mostly arm boards). For an unknown reason it does not break with my setup (I'm on mips right now).

Let me fix this, I'll keep you udpated.

Quoted 8 lines

I fixed the SZ_4K and the dev_uclass_get_priv() issues, I hope there are no more relevant warnings/errors than these two.

Please receive two patches independently with their own changelog, they should replace their counterpart in your spi-nand-wip branch (titles are exactly the same). Please tell me if you have troubles replacing it. Once Travis build is restarted, please share the link, I'll monitore it.

Quoted 5 lines

Yes, replaced.

Here is the build [4], seems not good.

[4] https://travis-ci.org/openedev/u-boot-amarula/builds/434572246

Yes, I added my U-Boot repository to the Travis CI system, still errors... https://travis-ci.org/miquelraynal/u-boot

Working on it.

Thanks,
Miquèl

Signature · 3 lines
Miquel Raynal, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
author maintainer
#15 lore raw

v10 cover SPI-NAND support (third batch)

In reply to Jagan Teki

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 19:09:21 +0530:

Quoted 135 lines · Miquel Raynal
Quoted 125 lines

Hi Miquel,

Miquel Raynal <[email protected]> wrote on Fri, 28 Sep 2018 09:35:02 +0200:

Quoted 111 lines

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:56:43 +0530:

Quoted 97 lines
Quoted 86 lines · Miquel Raynal

Hi Jagan,

Jagan Teki <[email protected]> wrote on Fri, 28 Sep 2018 12:18:49 +0530:

Quoted 68 lines · Miquel Raynal
Quoted 67 lines

During the last months, Boris Brezillon shared his work to support serial flashes within Linux. First, he delivered (and merged) a new layer called spi-mem. He also initiated in Linux MTD subsystem the move of all 'raw' NAND related code to a raw/ subdirectory, adding at the same time a NAND core that would be shared with all NAND devices. Then, he contributed a generic SPI-NAND driver, making use of this NAND core, as well as some vendor code to drive a few chips.

On top of this work, I made some cleanups in the MTD layer and added an 'mtd' U-Boot command to handle all sort of MTD devices. This should become the default command instead of having one per flash flavor ('sf', 'nand', 'spi-nand' ?).

The series has been tested on an Ocelot board PCB123 (VSC7514), featuring a Macronix SPI NAND chip.

TL;DR: the series contains (stripped version since ~30 patches have already been taken):
- Support for spi-nand devices in mtdparts.
- Generics mtdparts/mtdids parsers.
- A new 'mtd' command.
- A note to set mtdparts command legacy.

To test your SPI-NAND device with U-Boot, you can test someting like:

Quoted 4 lines

setenv mtdparts 'spi-nand0:1m(foo),-(bar)'
setenv mtdids 'spi-nand0=spi0.0' # spi0.0 is Linux MTD name for this device
ubi part bar # create a static UBI volume in the bar partition
mtd list # show the current MTD devices/partitions

Thanks,
Miquèl

NB1: If UBI refuses to attach, verify the partition is epty with

     # mtd erase bar

NB2: If your U-Boot crashes and you are using a non SPI-NAND device,
don't forget to probe your device *first* (sf probe, ...).

Changes since v9:
-----------------
* mtd_search_alternate_name() is moved in mtd_uboot.c (generic code, everybody wants to use mtdids).
* mtd_parse_partitions() is still in mtdparts.c because it depends on partitions support, but the header file declaring it (include/linux/mtd/partitions.h) also has a dummy function if #if IS_ENABLED(CONFIG_MTD_PARTITIONS) is false.
* Typo corrected in mtd_parse_partitions prototype (s/_nb_parts/_nparts/).
* Added Boris' R-b tags.

Changes since v8 (called v7 by mistake):
----------------------------------------
* Moved most of the generic logic to the core (mtd_uboot.c) so that it can be reused by other parts of U-Boot without depending on anything else than the MTD core itself.
* Removed the "#ifdef CONFIG_MTD" around mtd_probe_devices() calls now that the code is in the core.
* Created an helper for partitions deletion (as there is one to parse/create partition objects).
* Enhanced a bit the text in Kconfig about deprecating mtdparts.
* Fixed checkpatch.pl warnings in the mtdparts driver.
* Drop "cmd: mtdparts: try to probe the MTD devices as a fallback" to actually deprecate the command.

[...]

Quoted 9 lines
Quoted 8 lines

Miquel Raynal (7):
mtd: uclass: add probe function
mtd: mtdpart: add a generic mtdparts-like parser
mtd: uboot: search for an equivalent MTD name with the mtdids
mtd: mtdpart: implement proper partition handling
cmd: mtd: add 'mtd' command
cmd: ubi: clean the partition handling
cmd: mtdparts: describe as legacy

Quoted 8 lines
Quoted 4 lines

I didn't find this mtdparts fallback change[1] in v10? does this fallback issue fixed differently.

[1] https://github.com/openedev/u-boot-amarula/commit/9edbc2be512c9bd572884c53b5f54b583e897e9b

Indeed, I dropped this patch on Boris advice: if we want to deprecate this command, we should not add new features to it (see the above changelog).

Quoted 6 lines

OK.

Here are all spi-nand changes[2], I still find the build issues[3], any dependencies other than these changes?

[2] https://github.com/openedev/u-boot-amarula/commits/wip-spi-nand

Seems good to me!

Quoted 7 lines
Quoted 1 line

[3] https://travis-ci.org/openedev/u-boot-amarula/builds/434479310

Indeed, builds are failing because of SZ_4K is not defined (mostly arm boards). For an unknown reason it does not break with my setup (I'm on mips right now).

Let me fix this, I'll keep you udpated.

Quoted 8 lines

I fixed the SZ_4K and the dev_uclass_get_priv() issues, I hope there are no more relevant warnings/errors than these two.

Please receive two patches independently with their own changelog, they should replace their counterpart in your spi-nand-wip branch (titles are exactly the same). Please tell me if you have troubles replacing it. Once Travis build is restarted, please share the link, I'll monitore it.

Quoted 5 lines

Yes, replaced.

Here is the build [4], seems not good.

[4] https://travis-ci.org/openedev/u-boot-amarula/builds/434572246

This time I've got a fully working series, see:
https://travis-ci.org/miquelraynal/u-boot/builds/434796123

The only issue (in red) is not related at all.

Please receive the v12 which corresponds exactly to the branch tested in Travis.

Thanks,
Miquèl

Signature · 3 lines
Miquel Raynal, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com