kernel: don't auto-split "firmware" if it has "compatible" DT property
If "compatible" is being used that should trigger a proper parser directly. It's more reliable thanks to not trying parsers one by one. In such case partition shouldn't be split automatically to avoid parsing it twice. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
6680fab947
commit
934edb764d
8 changed files with 20 additions and 18 deletions
|
@ -68,7 +68,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
|
||||||
mtd_add_partition_attrs(new);
|
mtd_add_partition_attrs(new);
|
||||||
|
|
||||||
@@ -736,6 +741,35 @@ int mtd_del_partition(struct mtd_info *m
|
@@ -736,6 +741,36 @@ int mtd_del_partition(struct mtd_info *m
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mtd_del_partition);
|
EXPORT_SYMBOL_GPL(mtd_del_partition);
|
||||||
|
|
||||||
|
@ -94,8 +94,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
+ if (rootfs_found)
|
+ if (rootfs_found)
|
||||||
+ return;
|
+ return;
|
||||||
+
|
+
|
||||||
+ if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
|
+ if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
|
||||||
+ 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);
|
+ split_firmware(master, part);
|
||||||
+
|
+
|
||||||
+ arch_split_mtd_part(master, part->mtd.name, part->offset,
|
+ arch_split_mtd_part(master, part->mtd.name, part->offset,
|
||||||
|
@ -104,7 +105,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
/*
|
/*
|
||||||
* This function, given a master MTD object and a partition table, creates
|
* 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
|
* and registers slave MTD objects which are bound to the master according to
|
||||||
@@ -767,6 +801,7 @@ int add_mtd_partitions(struct mtd_info *
|
@@ -767,6 +802,7 @@ int add_mtd_partitions(struct mtd_info *
|
||||||
mutex_unlock(&mtd_partitions_mutex);
|
mutex_unlock(&mtd_partitions_mutex);
|
||||||
|
|
||||||
add_mtd_device(&slave->mtd);
|
add_mtd_device(&slave->mtd);
|
||||||
|
|
|
@ -57,7 +57,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||||
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
||||||
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
||||||
#else
|
#else
|
||||||
@@ -1118,6 +1152,61 @@ void mtd_part_parser_cleanup(struct mtd_
|
@@ -1119,6 +1153,61 @@ void mtd_part_parser_cleanup(struct mtd_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,9 +28,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||||
+ rootfs_found = 1;
|
+ rootfs_found = 1;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
|
if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
|
||||||
IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE))
|
!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
|
||||||
split_firmware(master, part);
|
!of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL))
|
||||||
--- a/include/linux/mtd/partitions.h
|
--- a/include/linux/mtd/partitions.h
|
||||||
+++ b/include/linux/mtd/partitions.h
|
+++ b/include/linux/mtd/partitions.h
|
||||||
@@ -75,6 +75,8 @@ struct mtd_part_parser_data {
|
@@ -75,6 +75,8 @@ struct mtd_part_parser_data {
|
||||||
|
|
|
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||||
|
|
||||||
--- a/drivers/mtd/mtdpart.c
|
--- a/drivers/mtd/mtdpart.c
|
||||||
+++ b/drivers/mtd/mtdpart.c
|
+++ b/drivers/mtd/mtdpart.c
|
||||||
@@ -1231,6 +1231,24 @@ int mtd_is_partition(const struct mtd_in
|
@@ -1232,6 +1232,24 @@ int mtd_is_partition(const struct mtd_in
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mtd_is_partition);
|
EXPORT_SYMBOL_GPL(mtd_is_partition);
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
|
||||||
mtd_add_partition_attrs(new);
|
mtd_add_partition_attrs(new);
|
||||||
|
|
||||||
@@ -728,6 +733,35 @@ int mtd_del_partition(struct mtd_info *m
|
@@ -728,6 +733,36 @@ int mtd_del_partition(struct mtd_info *m
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mtd_del_partition);
|
EXPORT_SYMBOL_GPL(mtd_del_partition);
|
||||||
|
|
||||||
|
@ -94,8 +94,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
+ if (rootfs_found)
|
+ if (rootfs_found)
|
||||||
+ return;
|
+ return;
|
||||||
+
|
+
|
||||||
+ if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
|
+ if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
|
||||||
+ 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);
|
+ split_firmware(master, part);
|
||||||
+
|
+
|
||||||
+ arch_split_mtd_part(master, part->mtd.name, part->offset,
|
+ arch_split_mtd_part(master, part->mtd.name, part->offset,
|
||||||
|
@ -104,7 +105,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
/*
|
/*
|
||||||
* This function, given a master MTD object and a partition table, creates
|
* 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
|
* and registers slave MTD objects which are bound to the master according to
|
||||||
@@ -759,6 +793,7 @@ int add_mtd_partitions(struct mtd_info *
|
@@ -759,6 +794,7 @@ int add_mtd_partitions(struct mtd_info *
|
||||||
mutex_unlock(&mtd_partitions_mutex);
|
mutex_unlock(&mtd_partitions_mutex);
|
||||||
|
|
||||||
add_mtd_device(&slave->mtd);
|
add_mtd_device(&slave->mtd);
|
||||||
|
|
|
@ -57,7 +57,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||||
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
||||||
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
||||||
#else
|
#else
|
||||||
@@ -1115,6 +1149,61 @@ void mtd_part_parser_cleanup(struct mtd_
|
@@ -1116,6 +1150,61 @@ void mtd_part_parser_cleanup(struct mtd_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,9 +28,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||||
+ rootfs_found = 1;
|
+ rootfs_found = 1;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
|
if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
|
||||||
IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE))
|
!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
|
||||||
split_firmware(master, part);
|
!of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL))
|
||||||
--- a/include/linux/mtd/partitions.h
|
--- a/include/linux/mtd/partitions.h
|
||||||
+++ b/include/linux/mtd/partitions.h
|
+++ b/include/linux/mtd/partitions.h
|
||||||
@@ -75,6 +75,8 @@ struct mtd_part_parser_data {
|
@@ -75,6 +75,8 @@ struct mtd_part_parser_data {
|
||||||
|
|
|
@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||||
|
|
||||||
--- a/drivers/mtd/mtdpart.c
|
--- a/drivers/mtd/mtdpart.c
|
||||||
+++ b/drivers/mtd/mtdpart.c
|
+++ b/drivers/mtd/mtdpart.c
|
||||||
@@ -1228,6 +1228,24 @@ int mtd_is_partition(const struct mtd_in
|
@@ -1229,6 +1229,24 @@ int mtd_is_partition(const struct mtd_in
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mtd_is_partition);
|
EXPORT_SYMBOL_GPL(mtd_is_partition);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue