2a598bbaa3
This is a new & warm feature that allows nesting partiitons in DT and mixing their types (e.g. static vs. dynamic). It's very useful for boards that have most partitions static but some of them require extra parsing (e.g. a "firmware" partition). It's required to successfully backport support for new devices using that new syntax in their DT files. Since brcm63xx has a custom alternative patch the upstream one is being reverted for it. The plan is to make brcm63xx use the upstream implementation. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
94 lines
2.8 KiB
Diff
94 lines
2.8 KiB
Diff
From: Gabor Juhos <juhosg@openwrt.org>
|
|
Subject: kernel/3.10: add separate rootfs partition parser
|
|
|
|
lede-commit: daec7ad7688415156e2730e401503d09bd3acf91
|
|
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
|
---
|
|
drivers/mtd/mtdpart.c | 29 +++++++++++++++++++++++++++++
|
|
include/linux/mtd/mtd.h | 18 ++++++++++++++++++
|
|
include/linux/mtd/partitions.h | 2 ++
|
|
3 files changed, 49 insertions(+)
|
|
|
|
--- a/drivers/mtd/mtdpart.c
|
|
+++ b/drivers/mtd/mtdpart.c
|
|
@@ -763,6 +763,17 @@ run_parsers_by_type(struct mtd_part *sla
|
|
return nr_parts;
|
|
}
|
|
|
|
+static inline unsigned long
|
|
+mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
|
|
+{
|
|
+ unsigned long mask = mtd->erasesize - 1;
|
|
+
|
|
+ len += offset & mask;
|
|
+ len = (len + mask) & ~mask;
|
|
+ len -= offset & mask;
|
|
+ return len;
|
|
+}
|
|
+
|
|
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
|
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
|
#else
|
|
@@ -1225,6 +1236,24 @@ int mtd_is_partition(const struct mtd_in
|
|
}
|
|
EXPORT_SYMBOL_GPL(mtd_is_partition);
|
|
|
|
+struct mtd_info *mtdpart_get_master(const struct mtd_info *mtd)
|
|
+{
|
|
+ if (!mtd_is_partition(mtd))
|
|
+ return (struct mtd_info *)mtd;
|
|
+
|
|
+ return mtd_to_part(mtd)->parent;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(mtdpart_get_master);
|
|
+
|
|
+uint64_t mtdpart_get_offset(const struct mtd_info *mtd)
|
|
+{
|
|
+ if (!mtd_is_partition(mtd))
|
|
+ return 0;
|
|
+
|
|
+ return mtd_to_part(mtd)->offset;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(mtdpart_get_offset);
|
|
+
|
|
/* Returns the size of the entire flash chip */
|
|
uint64_t mtd_get_device_size(const struct mtd_info *mtd)
|
|
{
|
|
--- a/include/linux/mtd/mtd.h
|
|
+++ b/include/linux/mtd/mtd.h
|
|
@@ -485,6 +485,24 @@ static inline uint32_t mtd_mod_by_eb(uin
|
|
return do_div(sz, mtd->erasesize);
|
|
}
|
|
|
|
+static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd)
|
|
+{
|
|
+ if (mtd_mod_by_eb(sz, mtd) == 0)
|
|
+ return sz;
|
|
+
|
|
+ /* Round up to next erase block */
|
|
+ return (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize;
|
|
+}
|
|
+
|
|
+static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd)
|
|
+{
|
|
+ if (mtd_mod_by_eb(sz, mtd) == 0)
|
|
+ return sz;
|
|
+
|
|
+ /* Round down to the start of the current erase block */
|
|
+ return (mtd_div_by_eb(sz, mtd)) * mtd->erasesize;
|
|
+}
|
|
+
|
|
static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd)
|
|
{
|
|
if (mtd->writesize_shift)
|
|
--- a/include/linux/mtd/partitions.h
|
|
+++ b/include/linux/mtd/partitions.h
|
|
@@ -115,6 +115,8 @@ int mtd_is_partition(const struct mtd_in
|
|
int mtd_add_partition(struct mtd_info *master, const char *name,
|
|
long long offset, long long length);
|
|
int mtd_del_partition(struct mtd_info *master, int partno);
|
|
+struct mtd_info *mtdpart_get_master(const struct mtd_info *mtd);
|
|
+uint64_t mtdpart_get_offset(const struct mtd_info *mtd);
|
|
uint64_t mtd_get_device_size(const struct mtd_info *mtd);
|
|
extern void __weak arch_split_mtd_part(struct mtd_info *master,
|
|
const char *name, int offset, int size);
|