kernel: Copy patches from kernel 4.14 to 4.19
[openwrt/staging/jogo.git] / target / linux / generic / pending-4.19 / 400-mtd-add-rootfs-split-support.patch
diff --git a/target/linux/generic/pending-4.19/400-mtd-add-rootfs-split-support.patch b/target/linux/generic/pending-4.19/400-mtd-add-rootfs-split-support.patch
new file mode 100644 (file)
index 0000000..5f8899e
--- /dev/null
@@ -0,0 +1,108 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: make rootfs split/detection more generic - patch can be moved to generic-2.6 after testing on other platforms
+
+lede-commit: 328e660b31f0937d52c5ae3d6e7029409918a9df
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/Kconfig            | 17 +++++++++++++++++
+ drivers/mtd/mtdpart.c          | 35 +++++++++++++++++++++++++++++++++++
+ include/linux/mtd/partitions.h |  2 ++
+ 3 files changed, 54 insertions(+)
+
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -12,6 +12,23 @@ menuconfig MTD
+ if MTD
++menu "OpenWrt specific MTD options"
++
++config MTD_ROOTFS_ROOT_DEV
++      bool "Automatically set 'rootfs' partition to be root filesystem"
++      default y
++
++config MTD_SPLIT_FIRMWARE
++      bool "Automatically split firmware partition for kernel+rootfs"
++      default y
++
++config MTD_SPLIT_FIRMWARE_NAME
++      string "Firmware partition name"
++      depends on MTD_SPLIT_FIRMWARE
++      default "firmware"
++
++endmenu
++
+ config MTD_TESTS
+       tristate "MTD tests support (DANGEROUS)"
+       depends on m
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -29,11 +29,13 @@
+ #include <linux/kmod.h>
+ #include <linux/mtd/mtd.h>
+ #include <linux/mtd/partitions.h>
++#include <linux/magic.h>
+ #include <linux/of.h>
+ #include <linux/err.h>
+ #include <linux/of.h>
+ #include "mtdcore.h"
++#include "mtdsplit/mtdsplit.h"
+ /* Our partition linked list */
+ static LIST_HEAD(mtd_partitions);
+@@ -53,6 +55,8 @@ struct mtd_part {
+       struct list_head list;
+ };
++static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part);
++
+ /*
+  * Given a pointer to the MTD object in the mtd_part structure, we can retrieve
+  * the pointer to that structure.
+@@ -668,6 +672,7 @@ int mtd_add_partition(struct mtd_info *p
+       mutex_unlock(&mtd_partitions_mutex);
+       add_mtd_device(&new->mtd);
++      mtd_partition_split(parent, new);
+       mtd_add_partition_attrs(new);
+@@ -746,6 +751,29 @@ int mtd_del_partition(struct mtd_info *m
+ }
+ EXPORT_SYMBOL_GPL(mtd_del_partition);
++#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
++#define SPLIT_FIRMWARE_NAME   CONFIG_MTD_SPLIT_FIRMWARE_NAME
++#else
++#define SPLIT_FIRMWARE_NAME   "unused"
++#endif
++
++static void split_firmware(struct mtd_info *master, struct mtd_part *part)
++{
++}
++
++static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part)
++{
++      static int rootfs_found = 0;
++
++      if (rootfs_found)
++              return;
++
++      if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
++          !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
++          !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL))
++              split_firmware(master, part);
++}
++
+ /*
+  * This function, given a master MTD object and a partition table, creates
+  * and registers slave MTD objects which are bound to the master according to
+@@ -777,6 +805,7 @@ int add_mtd_partitions(struct mtd_info *
+               mutex_unlock(&mtd_partitions_mutex);
+               add_mtd_device(&slave->mtd);
++              mtd_partition_split(master, slave);
+               mtd_add_partition_attrs(slave);
+               /* Look for subpartitions */
+               parse_mtd_partitions(&slave->mtd, parts[i].types, NULL);