mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 23:12:32 +00:00
b5b5f5dfa6
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>
(cherry picked from commit 2a598bbaa3
)
95 lines
2.8 KiB
Diff
95 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);
|