diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2021-05-17 16:23:50 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2021-05-17 16:23:50 +0200 |
commit | f647928ca0125002ad57641a66e022b1938ca355 (patch) | |
tree | 28ed74afbac092ebff3d3950c9ba3677f9c8eb06 | |
parent | ca7163dc46ad767f6f33832bc416943f4deba416 (diff) | |
parent | bb4840d2fdf357992815bf3a22b5732c460bc485 (diff) | |
download | barebox-f647928ca0125002ad57641a66e022b1938ca355.tar.gz barebox-f647928ca0125002ad57641a66e022b1938ca355.tar.xz |
Merge branch 'for-next/mci'
-rw-r--r-- | common/Kconfig | 21 | ||||
-rw-r--r-- | drivers/mci/mci-core.c | 4 | ||||
-rw-r--r-- | fs/fs.c | 43 | ||||
-rw-r--r-- | include/driver.h | 6 |
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++; } @@ -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 /** |