kernel: split out mtd hack for CONFIG_FIT_PARTITION + rootfs
authorRafał Miłecki <rafal@milecki.pl>
Mon, 7 Nov 2022 22:39:52 +0000 (23:39 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Mon, 21 Nov 2022 13:05:50 +0000 (14:05 +0100)
This is some hack on top of our old hack. Use separated patch for it so
it's easier to understand and actually possible to describe. We should
ideally get rid of this (and we actually did with kernels 5.15+).

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
(cherry picked from commit 6a64eb2664c13bc7d6800747066603c27fcad8e0)

target/linux/generic/hack-5.10/420-mtd-set-rootfs-to-be-root-dev.patch
target/linux/generic/hack-5.10/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch [deleted file]
target/linux/generic/hack-5.10/421-mtd-fix-squashfs-root-on-targets-with-CONFIG_FIT_PAR.patch [new file with mode: 0644]
target/linux/generic/hack-5.10/422-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch [new file with mode: 0644]

index fa3b175dcf0748fd43b5e8c7ce6e8bfaa66af47c..a70d8af4c262ebcd4ae5059fb73ba1429932e754 100644 (file)
@@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  #include <linux/nvmem-provider.h>
  
  #include <linux/mtd/mtd.h>
-@@ -759,6 +760,19 @@ int add_mtd_device(struct mtd_info *mtd)
+@@ -759,6 +760,16 @@ int add_mtd_device(struct mtd_info *mtd)
           of this try_ nonsense, and no bitching about it
           either. :) */
        __module_get(THIS_MODULE);
@@ -31,9 +31,6 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 +              unsigned int index = mtd->index;
 +              pr_notice("mtd: device %d (%s) set to be root filesystem\n",
 +                        mtd->index, mtd->name);
-+#ifdef CONFIG_FIT_PARTITION
-+              index <<= 2;
-+#endif
 +              ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, index);
 +      }
 +
diff --git a/target/linux/generic/hack-5.10/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch b/target/linux/generic/hack-5.10/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch
deleted file mode 100644 (file)
index 965a331..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-From 6fa9e3678eb002246df1280322b6a024853950a5 Mon Sep 17 00:00:00 2001
-From: Ansuel Smith <ansuelsmth@gmail.com>
-Date: Mon, 11 Oct 2021 00:53:14 +0200
-Subject: [PATCH] drivers: mtd: parsers: add nvmem support to cmdlinepart
-
-Assuming cmdlinepart is only one level deep partition scheme and that
-static partition are also defined in DTS, we can assign an of_node for
-partition declared from bootargs. cmdlinepart have priority than
-fiexed-partition parser so in this specific case the parser doesn't
-assign an of_node. Fix this by searching a defined of_node using a
-similar fixed_partition parser and if a partition is found with the same
-label, check that it has the same offset and size and return the DT
-of_node to correctly use NVMEM cells.
-
-Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
----
- drivers/mtd/parsers/cmdlinepart.c | 71 +++++++++++++++++++++++++++++++
- 1 file changed, 71 insertions(+)
-
---- a/drivers/mtd/parsers/cmdlinepart.c
-+++ b/drivers/mtd/parsers/cmdlinepart.c
-@@ -43,6 +43,7 @@
- #include <linux/mtd/partitions.h>
- #include <linux/module.h>
- #include <linux/err.h>
-+#include <linux/of.h>
- /* debug macro */
- #if 0
-@@ -323,6 +324,68 @@ static int mtdpart_setup_real(char *s)
-       return 0;
- }
-+static int search_fixed_partition(struct mtd_info *master,
-+                                struct mtd_partition *target_part,
-+                                struct mtd_partition *fixed_part)
-+{
-+      struct device_node *mtd_node;
-+      struct device_node *ofpart_node;
-+      struct device_node *pp;
-+      struct mtd_partition part;
-+      const char *partname;
-+
-+      mtd_node = mtd_get_of_node(master);
-+      if (!mtd_node)
-+              return -EINVAL;
-+
-+      ofpart_node = of_get_child_by_name(mtd_node, "partitions");
-+
-+      for_each_child_of_node(ofpart_node,  pp) {
-+              const __be32 *reg;
-+              int len;
-+              int a_cells, s_cells;
-+
-+              reg = of_get_property(pp, "reg", &len);
-+              if (!reg) {
-+                      pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n",
-+                               master->name, pp,
-+                               mtd_node);
-+                      continue;
-+              }
-+
-+              a_cells = of_n_addr_cells(pp);
-+              s_cells = of_n_size_cells(pp);
-+              if (len / 4 != a_cells + s_cells) {
-+                      pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n",
-+                               master->name, pp,
-+                               mtd_node);
-+                      continue;
-+              }
-+
-+              part.offset = of_read_number(reg, a_cells);
-+              part.size = of_read_number(reg + a_cells, s_cells);
-+              part.of_node = pp;
-+
-+              partname = of_get_property(pp, "label", &len);
-+              if (!partname)
-+                      partname = of_get_property(pp, "name", &len);
-+              part.name = partname;
-+
-+              if (!strncmp(target_part->name, part.name, len)) {
-+                      if (part.offset != target_part->offset)
-+                              return -EINVAL;
-+
-+                      if (part.size != target_part->size)
-+                              return -EINVAL;
-+
-+                      memcpy(fixed_part, &part, sizeof(struct mtd_partition));
-+                      return 0;
-+              }
-+      }
-+
-+      return -EINVAL;
-+}
-+
- /*
-  * Main function to be called from the MTD mapping driver/device to
-  * obtain the partitioning information. At this point the command line
-@@ -338,6 +401,7 @@ static int parse_cmdline_partitions(stru
-       int i, err;
-       struct cmdline_mtd_partition *part;
-       const char *mtd_id = master->name;
-+      struct mtd_partition fixed_part;
-       /* parse command line */
-       if (!cmdline_parsed) {
-@@ -382,6 +446,13 @@ static int parse_cmdline_partitions(stru
-                               sizeof(*part->parts) * (part->num_parts - i));
-                       i--;
-               }
-+
-+              err = search_fixed_partition(master, &part->parts[i], &fixed_part);
-+              if (!err) {
-+                      part->parts[i].of_node = fixed_part.of_node;
-+                      pr_info("Found partition defined in DT for %s. Assigning OF node to support nvmem.",
-+                              part->parts[i].name);
-+              }
-       }
-       *pparts = kmemdup(part->parts, sizeof(*part->parts) * part->num_parts,
diff --git a/target/linux/generic/hack-5.10/421-mtd-fix-squashfs-root-on-targets-with-CONFIG_FIT_PAR.patch b/target/linux/generic/hack-5.10/421-mtd-fix-squashfs-root-on-targets-with-CONFIG_FIT_PAR.patch
new file mode 100644 (file)
index 0000000..2f7da2a
--- /dev/null
@@ -0,0 +1,19 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat Apr 10 17:00:57 2021 +0200
+Subject: [PATCH] mtd: fix squashfs root on targets with CONFIG_FIT_PARTITION
+
+Fix assumption about the block device index
+---
+
+--- a/drivers/mtd/mtdcore.c
++++ b/drivers/mtd/mtdcore.c
+@@ -767,6 +767,9 @@ int add_mtd_device(struct mtd_info *mtd)
+               unsigned int index = mtd->index;
+               pr_notice("mtd: device %d (%s) set to be root filesystem\n",
+                         mtd->index, mtd->name);
++#ifdef CONFIG_FIT_PARTITION
++              index <<= 2;
++#endif
+               ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, index);
+       }
diff --git a/target/linux/generic/hack-5.10/422-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch b/target/linux/generic/hack-5.10/422-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch
new file mode 100644 (file)
index 0000000..965a331
--- /dev/null
@@ -0,0 +1,120 @@
+From 6fa9e3678eb002246df1280322b6a024853950a5 Mon Sep 17 00:00:00 2001
+From: Ansuel Smith <ansuelsmth@gmail.com>
+Date: Mon, 11 Oct 2021 00:53:14 +0200
+Subject: [PATCH] drivers: mtd: parsers: add nvmem support to cmdlinepart
+
+Assuming cmdlinepart is only one level deep partition scheme and that
+static partition are also defined in DTS, we can assign an of_node for
+partition declared from bootargs. cmdlinepart have priority than
+fiexed-partition parser so in this specific case the parser doesn't
+assign an of_node. Fix this by searching a defined of_node using a
+similar fixed_partition parser and if a partition is found with the same
+label, check that it has the same offset and size and return the DT
+of_node to correctly use NVMEM cells.
+
+Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+---
+ drivers/mtd/parsers/cmdlinepart.c | 71 +++++++++++++++++++++++++++++++
+ 1 file changed, 71 insertions(+)
+
+--- a/drivers/mtd/parsers/cmdlinepart.c
++++ b/drivers/mtd/parsers/cmdlinepart.c
+@@ -43,6 +43,7 @@
+ #include <linux/mtd/partitions.h>
+ #include <linux/module.h>
+ #include <linux/err.h>
++#include <linux/of.h>
+ /* debug macro */
+ #if 0
+@@ -323,6 +324,68 @@ static int mtdpart_setup_real(char *s)
+       return 0;
+ }
++static int search_fixed_partition(struct mtd_info *master,
++                                struct mtd_partition *target_part,
++                                struct mtd_partition *fixed_part)
++{
++      struct device_node *mtd_node;
++      struct device_node *ofpart_node;
++      struct device_node *pp;
++      struct mtd_partition part;
++      const char *partname;
++
++      mtd_node = mtd_get_of_node(master);
++      if (!mtd_node)
++              return -EINVAL;
++
++      ofpart_node = of_get_child_by_name(mtd_node, "partitions");
++
++      for_each_child_of_node(ofpart_node,  pp) {
++              const __be32 *reg;
++              int len;
++              int a_cells, s_cells;
++
++              reg = of_get_property(pp, "reg", &len);
++              if (!reg) {
++                      pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n",
++                               master->name, pp,
++                               mtd_node);
++                      continue;
++              }
++
++              a_cells = of_n_addr_cells(pp);
++              s_cells = of_n_size_cells(pp);
++              if (len / 4 != a_cells + s_cells) {
++                      pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n",
++                               master->name, pp,
++                               mtd_node);
++                      continue;
++              }
++
++              part.offset = of_read_number(reg, a_cells);
++              part.size = of_read_number(reg + a_cells, s_cells);
++              part.of_node = pp;
++
++              partname = of_get_property(pp, "label", &len);
++              if (!partname)
++                      partname = of_get_property(pp, "name", &len);
++              part.name = partname;
++
++              if (!strncmp(target_part->name, part.name, len)) {
++                      if (part.offset != target_part->offset)
++                              return -EINVAL;
++
++                      if (part.size != target_part->size)
++                              return -EINVAL;
++
++                      memcpy(fixed_part, &part, sizeof(struct mtd_partition));
++                      return 0;
++              }
++      }
++
++      return -EINVAL;
++}
++
+ /*
+  * Main function to be called from the MTD mapping driver/device to
+  * obtain the partitioning information. At this point the command line
+@@ -338,6 +401,7 @@ static int parse_cmdline_partitions(stru
+       int i, err;
+       struct cmdline_mtd_partition *part;
+       const char *mtd_id = master->name;
++      struct mtd_partition fixed_part;
+       /* parse command line */
+       if (!cmdline_parsed) {
+@@ -382,6 +446,13 @@ static int parse_cmdline_partitions(stru
+                               sizeof(*part->parts) * (part->num_parts - i));
+                       i--;
+               }
++
++              err = search_fixed_partition(master, &part->parts[i], &fixed_part);
++              if (!err) {
++                      part->parts[i].of_node = fixed_part.of_node;
++                      pr_info("Found partition defined in DT for %s. Assigning OF node to support nvmem.",
++                              part->parts[i].name);
++              }
+       }
+       *pparts = kmemdup(part->parts, sizeof(*part->parts) * part->num_parts,