| From 7134a2d026d942210b4d26d6059c9d979ca7866e Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> |
| Date: Fri, 12 Mar 2021 14:49:19 +0100 |
| Subject: [PATCH] mtd: parsers: ofpart: support Linksys Northstar partitions |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| This allows extending ofpart parser with support for Linksys Northstar |
| devices. That support uses recently added quirks mechanism. |
| |
| Signed-off-by: Rafał Miłecki <rafal@milecki.pl> |
| Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> |
| Link: https://lore.kernel.org/linux-mtd/20210312134919.7767-2-zajec5@gmail.com |
| --- |
| drivers/mtd/parsers/Kconfig | 10 +++++ |
| drivers/mtd/parsers/Makefile | 1 + |
| drivers/mtd/parsers/ofpart_core.c | 6 +++ |
| drivers/mtd/parsers/ofpart_linksys_ns.c | 50 +++++++++++++++++++++++++ |
| drivers/mtd/parsers/ofpart_linksys_ns.h | 18 +++++++++ |
| 5 files changed, 85 insertions(+) |
| create mode 100644 drivers/mtd/parsers/ofpart_linksys_ns.c |
| create mode 100644 drivers/mtd/parsers/ofpart_linksys_ns.h |
| |
| --- a/drivers/mtd/parsers/Kconfig |
| +++ b/drivers/mtd/parsers/Kconfig |
| @@ -76,6 +76,16 @@ config MTD_OF_PARTS_BCM4908 |
| that can have multiple "firmware" partitions. It takes care of |
| finding currently used one and backup ones. |
| |
| +config MTD_OF_PARTS_LINKSYS_NS |
| + bool "Linksys Northstar partitioning support" |
| + depends on MTD_OF_PARTS && (ARCH_BCM_5301X || ARCH_BCM4908 || COMPILE_TEST) |
| + default ARCH_BCM_5301X |
| + help |
| + This provides partitions parser for Linksys devices based on Broadcom |
| + Northstar architecture. Linksys commonly uses fixed flash layout with |
| + two "firmware" partitions. Currently used firmware has to be detected |
| + using CFE environment variable. |
| + |
| config MTD_PARSER_IMAGETAG |
| tristate "Parser for BCM963XX Image Tag format partitions" |
| depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST |
| --- a/drivers/mtd/parsers/Makefile |
| +++ b/drivers/mtd/parsers/Makefile |
| @@ -6,6 +6,7 @@ obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdl |
| obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o |
| ofpart-y += ofpart_core.o |
| ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o |
| +ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o |
| obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o |
| obj-$(CONFIG_MTD_AFS_PARTS) += afs.o |
| obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o |
| --- a/drivers/mtd/parsers/ofpart_core.c |
| +++ b/drivers/mtd/parsers/ofpart_core.c |
| @@ -17,6 +17,7 @@ |
| #include <linux/mtd/partitions.h> |
| |
| #include "ofpart_bcm4908.h" |
| +#include "ofpart_linksys_ns.h" |
| |
| struct fixed_partitions_quirks { |
| int (*post_parse)(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts); |
| @@ -26,6 +27,10 @@ static struct fixed_partitions_quirks bc |
| .post_parse = bcm4908_partitions_post_parse, |
| }; |
| |
| +static struct fixed_partitions_quirks linksys_ns_partitions_quirks = { |
| + .post_parse = linksys_ns_partitions_post_parse, |
| +}; |
| + |
| static const struct of_device_id parse_ofpart_match_table[]; |
| |
| static bool node_has_compatible(struct device_node *pp) |
| @@ -164,6 +169,7 @@ static const struct of_device_id parse_o |
| { .compatible = "fixed-partitions" }, |
| /* Customized */ |
| { .compatible = "brcm,bcm4908-partitions", .data = &bcm4908_partitions_quirks, }, |
| + { .compatible = "linksys,ns-partitions", .data = &linksys_ns_partitions_quirks, }, |
| {}, |
| }; |
| MODULE_DEVICE_TABLE(of, parse_ofpart_match_table); |
| --- /dev/null |
| +++ b/drivers/mtd/parsers/ofpart_linksys_ns.c |
| @@ -0,0 +1,50 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +/* |
| + * Copyright (C) 2021 Rafał Miłecki <rafal@milecki.pl> |
| + */ |
| + |
| +#include <linux/bcm47xx_nvram.h> |
| +#include <linux/mtd/mtd.h> |
| +#include <linux/mtd/partitions.h> |
| + |
| +#include "ofpart_linksys_ns.h" |
| + |
| +#define NVRAM_BOOT_PART "bootpartition" |
| + |
| +static int ofpart_linksys_ns_bootpartition(void) |
| +{ |
| + char buf[4]; |
| + int bootpartition; |
| + |
| + /* Check CFE environment variable */ |
| + if (bcm47xx_nvram_getenv(NVRAM_BOOT_PART, buf, sizeof(buf)) > 0) { |
| + if (!kstrtoint(buf, 0, &bootpartition)) |
| + return bootpartition; |
| + pr_warn("Failed to parse %s value \"%s\"\n", NVRAM_BOOT_PART, |
| + buf); |
| + } else { |
| + pr_warn("Failed to get NVRAM \"%s\"\n", NVRAM_BOOT_PART); |
| + } |
| + |
| + return 0; |
| +} |
| + |
| +int linksys_ns_partitions_post_parse(struct mtd_info *mtd, |
| + struct mtd_partition *parts, |
| + int nr_parts) |
| +{ |
| + int bootpartition = ofpart_linksys_ns_bootpartition(); |
| + int trx_idx = 0; |
| + int i; |
| + |
| + for (i = 0; i < nr_parts; i++) { |
| + if (of_device_is_compatible(parts[i].of_node, "linksys,ns-firmware")) { |
| + if (trx_idx++ == bootpartition) |
| + parts[i].name = "firmware"; |
| + else |
| + parts[i].name = "backup"; |
| + } |
| + } |
| + |
| + return 0; |
| +} |
| --- /dev/null |
| +++ b/drivers/mtd/parsers/ofpart_linksys_ns.h |
| @@ -0,0 +1,18 @@ |
| +/* SPDX-License-Identifier: GPL-2.0 */ |
| +#ifndef __OFPART_LINKSYS_NS_H |
| +#define __OFPART_LINKSYS_NS_H |
| + |
| +#ifdef CONFIG_MTD_OF_PARTS_LINKSYS_NS |
| +int linksys_ns_partitions_post_parse(struct mtd_info *mtd, |
| + struct mtd_partition *parts, |
| + int nr_parts); |
| +#else |
| +static inline int linksys_ns_partitions_post_parse(struct mtd_info *mtd, |
| + struct mtd_partition *parts, |
| + int nr_parts) |
| +{ |
| + return -EOPNOTSUPP; |
| +} |
| +#endif |
| + |
| +#endif |