summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2021-05-17 16:23:50 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2021-05-17 16:23:50 +0200
commitf647928ca0125002ad57641a66e022b1938ca355 (patch)
tree28ed74afbac092ebff3d3950c9ba3677f9c8eb06
parentca7163dc46ad767f6f33832bc416943f4deba416 (diff)
parentbb4840d2fdf357992815bf3a22b5732c460bc485 (diff)
downloadbarebox-f647928ca0125002ad57641a66e022b1938ca355.tar.gz
barebox-f647928ca0125002ad57641a66e022b1938ca355.tar.xz
Merge branch 'for-next/mci'
-rw-r--r--common/Kconfig21
-rw-r--r--drivers/mci/mci-core.c4
-rw-r--r--fs/fs.c43
-rw-r--r--include/driver.h6
4 files changed, 69 insertions, 5 deletions
diff --git a/common/Kconfig b/common/Kconfig
index bddf802d3b..939cfab4f7 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -704,6 +704,27 @@ config FLEXIBLE_BOOTARGS
to replace parts of the bootargs string without reconstructing it
completely.
+config MMCBLKDEV_ROOTARG
+ bool
+ prompt "Support 'root=mmcblkXpN' cmdline appending"
+ depends on FLEXIBLE_BOOTARGS
+ depends on MCI
+ depends on OFTREE
+ help
+ Enable this option to append 'root=mmcblkXpN' to the cmdline instead
+ of 'root=PARTUUID=XYZ'. Don't enable this option if your used linux
+ kernel doesn't contain commit [1]. The first linux kernel release
+ containing that commit is v5.10-rc1.
+
+ The appending only happen if barebox 'linux.bootargs.bootm.appendroot'
+ variable is set or the used blspec entry contains 'linux-appendroot'.
+
+ Note: It is crucial that the kernel device tree and the barebox device
+ tree uses the same mmc aliases.
+
+ [1] fa2d0aa96941 ("mmc: core: Allow setting slot index via device tree
+ alias")
+
config BAREBOX_UPDATE
bool "In-system barebox update infrastructure"
diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index 017f25d35f..a160b98894 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -426,8 +426,10 @@ static void mci_part_add(struct mci *mci, uint64_t size,
part->part_cfg = part_cfg;
part->idx = idx;
- if (area_type == MMC_BLK_DATA_AREA_MAIN)
+ if (area_type == MMC_BLK_DATA_AREA_MAIN) {
part->blk.cdev.device_node = mci->host->hw_dev->device_node;
+ part->blk.cdev.flags |= DEVFS_IS_MCI_MAIN_PART_DEV;
+ }
mci->nr_parts++;
}
diff --git a/fs/fs.c b/fs/fs.c
index f4baba81e7..73584d57e1 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -2845,6 +2845,33 @@ out:
}
EXPORT_SYMBOL(chdir);
+static char *get_linux_mmcblkdev(struct fs_device_d *fsdev)
+{
+ struct cdev *cdevm, *cdev;
+ int id, partnum;
+
+ cdevm = fsdev->cdev->master;
+ id = of_alias_get_id(cdevm->device_node, "mmc");
+ if (id < 0)
+ return NULL;
+
+ partnum = 1; /* linux partitions are 1 based */
+ list_for_each_entry(cdev, &cdevm->partitions, partition_entry) {
+
+ /*
+ * Partname is not guaranteed but this partition cdev is listed
+ * in the partitions list so we need to count it instead of
+ * skipping it.
+ */
+ if (cdev->partname &&
+ !strcmp(cdev->partname, fsdev->cdev->partname))
+ return basprintf("root=/dev/mmcblk%dp%d", id, partnum);
+ partnum++;
+ }
+
+ return NULL;
+}
+
/*
* Mount a device to a directory.
* We do this by registering a new device on which the filesystem
@@ -2933,11 +2960,19 @@ int mount(const char *device, const char *fsname, const char *pathname,
fsdev->vfsmount.mnt_root = fsdev->sb.s_root;
- if (!fsdev->linux_rootarg && fsdev->cdev && fsdev->cdev->partuuid[0] != 0) {
- char *str = basprintf("root=PARTUUID=%s",
- fsdev->cdev->partuuid);
+ if (!fsdev->linux_rootarg && fsdev->cdev) {
+ char *str = NULL;
+
+ if (IS_ENABLED(CONFIG_MMCBLKDEV_ROOTARG) &&
+ fsdev->cdev->master &&
+ cdev_is_mci_main_part_dev(fsdev->cdev->master))
+ str = get_linux_mmcblkdev(fsdev);
+
+ if (!str && fsdev->cdev->partuuid[0] != 0)
+ str = basprintf("root=PARTUUID=%s", fsdev->cdev->partuuid);
- fsdev_set_linux_rootarg(fsdev, str);
+ if (str)
+ fsdev_set_linux_rootarg(fsdev, str);
}
path_put(&path);
diff --git a/include/driver.h b/include/driver.h
index 0d43b36148..d84fe35d50 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -496,6 +496,7 @@ int cdev_erase(struct cdev *cdev, loff_t count, loff_t offset);
#define DEVFS_PARTITION_READONLY (1U << 1)
#define DEVFS_IS_CHARACTER_DEV (1U << 3)
#define DEVFS_PARTITION_FROM_TABLE (1U << 4)
+#define DEVFS_IS_MCI_MAIN_PART_DEV (1U << 5)
struct cdev *devfs_add_partition(const char *devname, loff_t offset,
loff_t size, unsigned int flags, const char *name);
@@ -509,6 +510,11 @@ static inline void cdev_create_default_automount(struct cdev *cdev)
}
#endif
+static inline bool cdev_is_mci_main_part_dev(struct cdev *cdev)
+{
+ return cdev->flags & DEVFS_IS_MCI_MAIN_PART_DEV;
+}
+
#define DEVFS_PARTITION_APPEND 0
/**