Thread (10 messages) 10 messages, 2 authors, 2021-05-06

Re: [PATCH 3/3] fs: add linux_rootarg 'root=mmcblkXpN' support

From: Marco Felsch <hidden>
Date: 2021-05-06 13:31:34

Hi Ahmad,

On 21-05-06 14:19, Ahmad Fatoum wrote:
Hello Marco,

On 06.05.21 13:22, Marco Felsch wrote:
quoted
Since commit fa2d0aa96941 ("mmc: core: Allow setting slot index via
device tree alias") the kernel supports stable mmc device names. Since
the barebox mmc device names matches the one from the kernel we can pass
the 'root=mmcblkXpN' argument on commandline to refer to the correct
boot medium.

This patch adds the support to store the above commandline as
linux_rootarg if enabled. Use the partuuid as fallback since it is not
as unique as the mmcblkXpN scheme. Add a own build option since the
system integrator needs to check if the used kernel contains the above
commit.

Signed-off-by: Marco Felsch <redacted>
---
Hi all,

I know that:
8<-----------------
+		if (!str && fsdev->cdev->partuuid[0] != 0)
+			str = basprintf("root=PARTUUID=%s", fsdev->cdev->partuuid);
8<-----------------
is longer than 80char but for the sake of readability I kept that
oneliner. Should we update checkpatch accordingly to match the new linux
rule?
Yes, I already adhere to the new Linux convention in my barebox code.
quoted
Regards,
  Marco


 common/Kconfig | 15 +++++++++++++++
 fs/fs.c        | 48 ++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 59 insertions(+), 4 deletions(-)
diff --git a/common/Kconfig b/common/Kconfig
index 6b3c1701be..a09a1d9456 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -700,6 +700,21 @@ config FLEXIBLE_BOOTARGS
 	  to replace parts of the bootargs string without reconstructing it
 	  completely.
 
+config MMCBLKDEV_ROOTARG
+	bool
+	prompt "Support 'root=mmcblkXpN' cmdline appending"
+	help
+	  Enable this option to append 'root=mmcblkXpN' to the kernel cmdline
+	  instead of 'root=PARTUUID=XYZ'. Don't enale this option if your used
+	  kernel don't contain commit [1].
Could you add the first mainline Linux release that includes the commit?
Yep, will add it.
quoted
+
+	  The appending only happen if barebox 'linux.bootargs.bootm.appendroot'
+	  variable is set or the used blspec entry contains 'linux-appendroot'.
+
+	  [1] fa2d0aa96941 ("mmc: core: Allow setting slot index via device tree
+	      alias")
+
+
 config BAREBOX_UPDATE
 	bool "In-system barebox update infrastructure"
 
diff --git a/fs/fs.c b/fs/fs.c
index 881dc2fca0..8ee1e7febe 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -2831,6 +2831,39 @@ out:
 }
 EXPORT_SYMBOL(chdir);
 
+static char *get_linux_mmcblkdev(struct fs_device_d *fsdev)
+{
+	struct cdev *cdevm, *cdev;
+	int id, partnum;
+	bool found = false;
+
+	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)) {
+			found = true;
You can return the basprintf() here directly
You're right.
quoted
+			break;
+		}
+		partnum++;
+	}
+
+	if (!found)
+		return NULL;
+
+	return basprintf("root=/dev/mmcblk%dp%d", id, partnum);
Then you can return NULL here and drop found.
quoted
+}
+
 /*
  * Mount a device to a directory.
  * We do this by registering a new device on which the filesystem
@@ -2919,11 +2952,18 @@ 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) &&
+		    cdev_is_mci_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);
This assumes that barebox aliases align with those of the kernel. I think this
is at least worth a mention in the Kconfig text.
IMHO mention it within the Kconfig should be enough, since in an ideal
world the barebox-dt should be used by kernel as well.
For an alternative, see f382be77f8c0 ("boot: introduce option to pass
barebox-enabled watchdog to systemd"), which parses the aliases out of the
kernel device tree without depending on the barebox ones.
That's interessint as well, but spreads the logic around. Therefore I
would keep my solution an add a note within the Kconfig. Is that OK for
you?

Regards,
  Marco

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help