summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-06-16 09:31:22 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2015-06-17 11:39:46 +0200
commit5e55dec814ed3b65888866b893d939c0a502c99a (patch)
tree5086e6aa86aef5443f67807c5748f5037f818086
parentcc3927d20a9667a9efb600e5d919f93fc9dab9dd (diff)
downloadbarebox-5e55dec814ed3b65888866b893d939c0a502c99a.tar.gz
barebox-5e55dec814ed3b65888866b893d939c0a502c99a.tar.xz
blspec: Automatically attach UBI devices
When blspec_scan_cdev finds an UBI device then attach it. This allows us to boot blspec entries found on the UBIFS images inside UBI volumes by pointing to the corresponding mtd partition. With this we can do 'boot nand0.root' or even 'boot=nand0' on the commandline. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--common/blspec.c50
1 files changed, 45 insertions, 5 deletions
diff --git a/common/blspec.c b/common/blspec.c
index 3506388eb5..aef246d7f5 100644
--- a/common/blspec.c
+++ b/common/blspec.c
@@ -30,6 +30,7 @@
#include <of.h>
#include <linux/stat.h>
#include <linux/err.h>
+#include <mtd/ubi-user.h>
/*
* blspec_entry_var_set - set a variable to a value
@@ -436,6 +437,35 @@ err_out:
}
/*
+ * blspec_scan_ubi - scan over a cdev containing UBI volumes
+ *
+ * This function attaches a cdev as UBI devices and collects all blspec
+ * entries found in the UBI volumes
+ *
+ * returns the number of entries found or a negative error code if some unexpected
+ * error occured.
+ */
+static int blspec_scan_ubi(struct blspec *blspec, struct cdev *cdev)
+{
+ struct device_d *child;
+ int ret, found = 0;
+
+ pr_debug("%s: %s\n", __func__, cdev->name);
+
+ ret = ubi_attach_mtd_dev(cdev->mtd, UBI_DEV_NUM_AUTO, 0, 20);
+ if (ret && ret != -EEXIST)
+ return 0;
+
+ device_for_each_child(cdev->dev, child) {
+ ret = blspec_scan_device(blspec, child);
+ if (ret > 0)
+ found += ret;
+ }
+
+ return found;
+}
+
+/*
* blspec_scan_cdev - scan over a cdev
*
* Given a cdev this function mounts the filesystem and collects all blspec
@@ -446,9 +476,9 @@ err_out:
*/
static int blspec_scan_cdev(struct blspec *blspec, struct cdev *cdev)
{
- int ret;
+ int ret, found = 0;
void *buf = xzalloc(512);
- enum filetype type;
+ enum filetype type, filetype;
const char *rootpath;
pr_debug("%s: %s\n", __func__, cdev->name);
@@ -460,16 +490,26 @@ static int blspec_scan_cdev(struct blspec *blspec, struct cdev *cdev)
}
type = file_detect_partition_table(buf, 512);
+ filetype = file_detect_type(buf, 512);
free(buf);
if (type == filetype_mbr || type == filetype_gpt)
return -EINVAL;
+ if (filetype == filetype_ubi && IS_ENABLED(CONFIG_MTD_UBI)) {
+ ret = blspec_scan_ubi(blspec, cdev);
+ if (ret > 0)
+ found += ret;
+ }
+
rootpath = cdev_mount_default(cdev, NULL);
- if (IS_ERR(rootpath))
- return PTR_ERR(rootpath);
+ if (!IS_ERR(rootpath)) {
+ ret = blspec_scan_directory(blspec, rootpath);
+ if (ret > 0)
+ found += ret;
+ }
- return blspec_scan_directory(blspec, rootpath);
+ return found;
}
/*