|
|
@@ -0,0 +1,156 @@
|
|
|
+From 7134a2d026d942210b4d26d6059c9d979ca7866e Mon Sep 17 00:00:00 2001
|
|
|
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
|
|
|
+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 <[email protected]>
|
|
|
+Signed-off-by: Miquel Raynal <[email protected]>
|
|
|
+Link: https://lore.kernel.org/linux-mtd/[email protected]
|
|
|
+---
|
|
|
+ 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)
|
|
|
+@@ -167,6 +172,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 <[email protected]>
|
|
|
++ */
|
|
|
++
|
|
|
++#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
|