7e88753ace
This helper uses hierarchical partitions layout following the way upstream parsers work. It's closer to what we should use when mainlining our solutions. It also doesn't require hacky casting of struct mtd_partition to the const. THIS WILL AFFECT KERNEL PRINTING PARTITIONS IN THE LOG Something like: [ 3.930158] 0x0000004e0000-0x000001fb0000 : "rootfs_data" will get replaced by: [ 3.907338] Creating 1 MTD partitions on "rootfs": [ 3.912142] 0x00000031d400-0x000001ded400 : "rootfs_data" It's important to understand that "rootfs_data" in above example is a *subpartition* of the "rootfs" now. To get absolute addresses (e.g. for some debugging purposes) one has to add them to the "rootfs", e.g. [ 3.912548] 0x0000001c2c00-0x000001fb0000 : "rootfs" (0x1c2c00 + 0x31d400 = 0x4e0000) Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
76 lines
2.3 KiB
Diff
76 lines
2.3 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
|
|
@@ -1227,6 +1227,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
|
|
@@ -494,6 +494,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
|
|
@@ -116,6 +116,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);
|
|
|
|
#endif
|