linux-mips
[Top] [All Lists]

[PATCH 2/7] AR7: mtd

To: linux-mips@linux-mips.org
Subject: [PATCH 2/7] AR7: mtd
From: "Matteo Croce" <technoboy85@gmail.com>
Date: Mon, 3 Sep 2007 15:23:42 +0200
Dkim-signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition; b=bGXT/wT25wckt5wYyHj6gmuNHzL7AB3Fz9x2lK8z6D1UuQaDA1poWZEG/FK3LhKwcHyXbEAbS+tf6U8+i/spSuwASK5QeDckdgYfjjVZ5RocFZgmOWQXejNM8gOTzcyRnoqfJytmjzHgX/t0ReFw/TeT8GuowWduV2FKUaM10Og=
Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition; b=kbpfpMe4N2zYmfiF5VecMfpNFEUuZ2rlrhkXOl4+MGq2AlnyO6HHrdebnF1R/6ZIil6H4G6E/85074pjFrzTxx1ObklwCfx12AS+5YUGCFSR5iukvWBLsz1XoQ4IBIOfW4EXIFs9Piqv4e+j+cZ5Hrr7uL3he9l8+0vlgPLK/NA=
Original-recipient: rfc822;linux-mips@linux-mips.org
Sender: linux-mips-bounce@linux-mips.org
Partition map support

Signed-off-by: Matteo Croce <technoboy85@gmail.com>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Eugene Konev <ejka@imfi.kspu.ru>

diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index fbec8cd..0c72252 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -150,6 +150,12 @@ config MTD_AFS_PARTS
          for your particular device. It won't happen automatically. The
          'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example.

+config MTD_AR7_PARTS
+       tristate "TI AR7 partitioning support"
+       depends on MTD_PARTITIONS
+       ---help---
+         TI AR7 partitioning support
+
 comment "User Modules And Translation Layers"

 config MTD_CHAR
diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index 6d958a4..8451c64 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_MTD_CONCAT)      += mtdconcat.o
 obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
 obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
 obj-$(CONFIG_MTD_AFS_PARTS)    += afs.o
+obj-$(CONFIG_MTD_AR7_PARTS)    += ar7part.o

 # 'Users' - code which presents functionality to userspace.
 obj-$(CONFIG_MTD_CHAR)         += mtdchar.o
diff --git a/drivers/mtd/ar7part.c b/drivers/mtd/ar7part.c
new file mode 100644
index 0000000..508bcec
--- /dev/null
+++ b/drivers/mtd/ar7part.c
@@ -0,0 +1,140 @@
+/*
+ * $Id: ar7part.c 6948 2007-04-15 04:01:45Z ejka $
+ *
+ * Copyright (C) 2007 OpenWrt.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * TI AR7 flash partition table.
+ * Based on ar7 map by Felix Fietkau.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/slab.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/bootmem.h>
+#include <linux/squashfs_fs.h>
+
+struct ar7_bin_rec {
+       unsigned int checksum;
+       unsigned int length;
+       unsigned int address;
+};
+
+static struct mtd_partition ar7_parts[5];
+
+static int create_mtd_partitions(struct mtd_info *master,
+                                struct mtd_partition **pparts,
+                                unsigned long origin)
+{
+       struct ar7_bin_rec header;
+       unsigned int offset, len;
+       unsigned int pre_size = master->erasesize, post_size = 0,
+               root_offset = 0xe0000;
+       int retries = 10;
+
+       printk("Parsing AR7 partition map...\n");
+
+       ar7_parts[0].name = "loader";
+       ar7_parts[0].offset = 0;
+       ar7_parts[0].size = master->erasesize;
+       ar7_parts[0].mask_flags = MTD_WRITEABLE;
+
+       ar7_parts[1].name = "config";
+       ar7_parts[1].offset = 0;
+       ar7_parts[1].size = master->erasesize;
+       ar7_parts[1].mask_flags = 0;
+
+       do {
+               offset = pre_size;
+               master->read(master, offset, sizeof(header), &len, (u_char 
*)&header);
+               if (!strncmp((char *)&header, "TIENV0.8", 8))
+                       ar7_parts[1].offset = pre_size;
+               if (header.checksum == 0xfeedfa42)
+                       break;
+               if (header.checksum == 0xfeed1281)
+                       break;
+               pre_size += master->erasesize;
+       } while (retries--);
+
+       pre_size = offset;
+
+       if (!ar7_parts[1].offset) {
+               ar7_parts[1].offset = master->size - master->erasesize;
+               post_size = master->erasesize;
+       }
+
+       switch (header.checksum) {
+       case 0xfeedfa42:
+               while (header.length) {
+                       offset += sizeof(header) + header.length;
+                       master->read(master, offset, sizeof(header),
+                                    &len, (u_char *)&header);
+               }
+               root_offset = offset + sizeof(header) + 4;
+               break;
+       case 0xfeed1281:
+               while (header.length) {
+                       offset += sizeof(header) + header.length;
+                       master->read(master, offset, sizeof(header),
+                                    &len, (u_char *)&header);
+               }
+               root_offset = offset + sizeof(header) + 4 + 0xff;
+               root_offset &= ~(u32)0xff;
+               break;
+       default:
+               printk("Unknown magic: %08x\n", header.checksum);
+               break;
+       }
+
+       master->read(master, root_offset, sizeof(header), &len, (u_char 
*)&header);
+       if (header.checksum != SQUASHFS_MAGIC) {
+               root_offset += master->erasesize - 1;
+               root_offset &= ~(master->erasesize - 1);
+       }
+
+       ar7_parts[2].name = "linux";
+       ar7_parts[2].offset = pre_size;
+       ar7_parts[2].size = master->size - pre_size - post_size;
+       ar7_parts[2].mask_flags = 0;
+
+       ar7_parts[3].name = "rootfs";
+       ar7_parts[3].offset = root_offset;
+       ar7_parts[3].size = master->size - root_offset - post_size;
+       ar7_parts[3].mask_flags = 0;
+
+       *pparts = ar7_parts;
+       return 4;
+}
+
+static struct mtd_part_parser ar7_parser = {
+       .owner = THIS_MODULE,
+       .parse_fn = create_mtd_partitions,
+       .name = "ar7part",
+};
+
+static int __init ar7_parser_init(void)
+{
+       return register_mtd_parser(&ar7_parser);
+}
+
+module_init(ar7_parser_init);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Felix Fietkau, Eugene Konev");
+MODULE_DESCRIPTION("MTD partitioning for TI AR7");
diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c
index 28c5ffd..fa0de6a 100644
--- a/drivers/mtd/maps/physmap.c
+++ b/drivers/mtd/maps/physmap.c
@@ -74,7 +74,7 @@ static int physmap_flash_remove(struct platform_device *dev)

 static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe",
"map_rom", NULL };
 #ifdef CONFIG_MTD_PARTITIONS
-static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
+static const char *part_probe_types[] = { "cmdlinepart", "RedBoot",
"ar7part", NULL };
 #endif

 static int physmap_flash_probe(struct platform_device *dev)

<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH 2/7] AR7: mtd, Matteo Croce <=