Commit 99352afe authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Brian Norris
Browse files

mtd: extract TRX parser out of bcm47xxpart into a separated module



This makes TRX parsing code reusable with other platforms and parsers.

Please note this patch doesn't really change anything in the existing
code, just moves it. There is still some place for improvement (e.g.
working on non-hacky method of checking rootfs format) but it's not
really a subject of this change.

Signed-off-by: default avatarRafał Miłecki <rafal@milecki.pl>
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
parent 1a0915be
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -155,6 +155,10 @@ config MTD_BCM47XX_PARTS
	  This provides partitions parser for devices based on BCM47xx
	  boards.

menu "Partition parsers"
source "drivers/mtd/parsers/Kconfig"
endmenu

comment "User Modules And Translation Layers"

#
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
obj-$(CONFIG_MTD_AR7_PARTS)	+= ar7part.o
obj-$(CONFIG_MTD_BCM63XX_PARTS)	+= bcm63xxpart.o
obj-$(CONFIG_MTD_BCM47XX_PARTS)	+= bcm47xxpart.o
obj-y				+= parsers/

# 'Users' - code which presents functionality to userspace.
obj-$(CONFIG_MTD_BLKDEVS)	+= mtd_blkdevs.o
+5 −94
Original line number Diff line number Diff line
@@ -43,7 +43,8 @@
#define ML_MAGIC2			0x26594131
#define TRX_MAGIC			0x30524448
#define SHSQ_MAGIC			0x71736873	/* shsq (weird ZTE H218N endianness) */
#define UBI_EC_MAGIC			0x23494255	/* UBI# */

static const char * const trx_types[] = { "trx", NULL };

struct trx_header {
	uint32_t magic;
@@ -62,89 +63,6 @@ static void bcm47xxpart_add_part(struct mtd_partition *part, const char *name,
	part->mask_flags = mask_flags;
}

static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
						  size_t offset)
{
	uint32_t buf;
	size_t bytes_read;
	int err;

	err  = mtd_read(master, offset, sizeof(buf), &bytes_read,
			(uint8_t *)&buf);
	if (err && !mtd_is_bitflip(err)) {
		pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
			offset, err);
		goto out_default;
	}

	if (buf == UBI_EC_MAGIC)
		return "ubi";

out_default:
	return "rootfs";
}

static int bcm47xxpart_parse_trx(struct mtd_info *master,
				 struct mtd_partition *trx,
				 struct mtd_partition *parts,
				 size_t parts_len)
{
	struct trx_header header;
	size_t bytes_read;
	int curr_part = 0;
	int i, err;

	if (parts_len < 3) {
		pr_warn("No enough space to add TRX partitions!\n");
		return -ENOMEM;
	}

	err = mtd_read(master, trx->offset, sizeof(header), &bytes_read,
		       (uint8_t *)&header);
	if (err && !mtd_is_bitflip(err)) {
		pr_err("mtd_read error while reading TRX header: %d\n", err);
		return err;
	}

	i = 0;

	/* We have LZMA loader if offset[2] points to sth */
	if (header.offset[2]) {
		bcm47xxpart_add_part(&parts[curr_part++], "loader",
				     trx->offset + header.offset[i], 0);
		i++;
	}

	if (header.offset[i]) {
		bcm47xxpart_add_part(&parts[curr_part++], "linux",
				     trx->offset + header.offset[i], 0);
		i++;
	}

	if (header.offset[i]) {
		size_t offset = trx->offset + header.offset[i];
		const char *name = bcm47xxpart_trx_data_part_name(master,
								  offset);

		bcm47xxpart_add_part(&parts[curr_part++], name, offset, 0);
		i++;
	}

	/*
	 * Assume that every partition ends at the beginning of the one it is
	 * followed by.
	 */
	for (i = 0; i < curr_part; i++) {
		u64 next_part_offset = (i < curr_part - 1) ?
					parts[i + 1].offset :
					trx->offset + trx->size;

		parts[i].size = next_part_offset - parts[i].offset;
	}

	return curr_part;
}

/**
 * bcm47xxpart_bootpartition - gets index of TRX partition used by bootloader
 *
@@ -362,18 +280,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
	for (i = 0; i < trx_num; i++) {
		struct mtd_partition *trx = &parts[trx_parts[i]];

		if (i == bcm47xxpart_bootpartition()) {
			int num_parts;

			num_parts = bcm47xxpart_parse_trx(master, trx,
							  parts + curr_part,
							  BCM47XXPART_MAX_PARTS - curr_part);
			if (num_parts > 0)
				curr_part += num_parts;
		} else {
		if (i == bcm47xxpart_bootpartition())
			trx->types = trx_types;
		else
			trx->name = "failsafe";
	}
	}

	*pparts = parts;
	return curr_part;
+8 −0
Original line number Diff line number Diff line
config MTD_PARSER_TRX
	tristate "Parser for TRX format partitions"
	depends on MTD && (BCM47XX || ARCH_BCM_5301X || COMPILE_TEST)
	help
	  TRX is a firmware format used by Broadcom on their devices. It
	  may contain up to 3/4 partitions (depending on the version).
	  This driver will parse TRX header and report at least two partitions:
	  kernel and rootfs.
+1 −0
Original line number Diff line number Diff line
obj-$(CONFIG_MTD_PARSER_TRX)		+= parser_trx.o
Loading