Commit 7134a2d0 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Miquel Raynal
Browse files

mtd: parsers: ofpart: support Linksys Northstar partitions



This allows extending ofpart parser with support for Linksys Northstar
devices. That support uses recently added quirks mechanism.

Signed-off-by: default avatarRafał Miłecki <rafal@milecki.pl>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20210312134919.7767-2-zajec5@gmail.com
parent 2fa72941
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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
+6 −0
Original line number Diff line number Diff line
@@ -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);
+50 −0
Original line number Diff line number Diff line
// 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;
}
+18 −0
Original line number Diff line number Diff line
/* 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