mtd: parsers: ofpart: support Linksys Northstar partitions
authorRafał Miłecki <rafal@milecki.pl>
Fri, 12 Mar 2021 13:49:19 +0000 (14:49 +0100)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Sun, 28 Mar 2021 17:27:02 +0000 (19:27 +0200)
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
drivers/mtd/parsers/Makefile
drivers/mtd/parsers/ofpart_core.c
drivers/mtd/parsers/ofpart_linksys_ns.c [new file with mode: 0644]
drivers/mtd/parsers/ofpart_linksys_ns.h [new file with mode: 0644]

index 0528855..9babe67 100644 (file)
@@ -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
index 2dfe9fb..2e98aa0 100644 (file)
@@ -6,6 +6,7 @@ obj-$(CONFIG_MTD_CMDLINE_PARTS)         += cmdlinepart.o
 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
index 2cef527..0fd8d2a 100644 (file)
@@ -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 bcm4908_partitions_quirks = {
        .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)
@@ -167,6 +172,7 @@ static const struct of_device_id parse_ofpart_match_table[] = {
        { .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);
diff --git a/drivers/mtd/parsers/ofpart_linksys_ns.c b/drivers/mtd/parsers/ofpart_linksys_ns.c
new file mode 100644 (file)
index 0000000..318c42d
--- /dev/null
@@ -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;
+}
diff --git a/drivers/mtd/parsers/ofpart_linksys_ns.h b/drivers/mtd/parsers/ofpart_linksys_ns.h
new file mode 100644 (file)
index 0000000..730c468
--- /dev/null
@@ -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