diff options
Diffstat (limited to 'target/linux/brcm63xx/patches-2.6.35/040-bcm963xx_flashmap.patch')
-rw-r--r-- | target/linux/brcm63xx/patches-2.6.35/040-bcm963xx_flashmap.patch | 389 |
1 files changed, 0 insertions, 389 deletions
diff --git a/target/linux/brcm63xx/patches-2.6.35/040-bcm963xx_flashmap.patch b/target/linux/brcm63xx/patches-2.6.35/040-bcm963xx_flashmap.patch deleted file mode 100644 index 29c4f8582e..0000000000 --- a/target/linux/brcm63xx/patches-2.6.35/040-bcm963xx_flashmap.patch +++ /dev/null @@ -1,389 +0,0 @@ -From e734ace5baa04e0e8af1d4483475fbd6bd2b32a1 Mon Sep 17 00:00:00 2001 -From: Axel Gembe <ago@bastart.eu.org> -Date: Mon, 12 May 2008 18:54:09 +0200 -Subject: [PATCH] bcm963xx: flashmap support - - -Signed-off-by: Axel Gembe <ago@bastart.eu.org> ---- - drivers/mtd/maps/Kconfig | 7 +++++++ - drivers/mtd/maps/Makefile | 1 + - drivers/mtd/redboot.c | 13 ++++++++++--- - 3 files changed, 18 insertions(+), 3 deletions(-) - ---- a/drivers/mtd/maps/Kconfig -+++ b/drivers/mtd/maps/Kconfig -@@ -251,6 +251,13 @@ config MTD_NETtel - help - Support for flash chips on NETtel/SecureEdge/SnapGear boards. - -+config MTD_BCM963XX -+ tristate "BCM963xx Flash device" -+ depends on MIPS && BCM63XX -+ help -+ Flash memory access on BCM963xx boards. Currently only works with -+ RedBoot and CFE. -+ - config MTD_DILNETPC - tristate "CFI Flash device mapped on DIL/Net PC" - depends on X86 && MTD_CONCAT && MTD_PARTITIONS && MTD_CFI_INTELEXT && BROKEN ---- a/drivers/mtd/redboot.c -+++ b/drivers/mtd/redboot.c -@@ -39,7 +39,7 @@ static inline int redboot_checksum(struc - return 1; - } - --static int parse_redboot_partitions(struct mtd_info *master, -+int parse_redboot_partitions(struct mtd_info *master, - struct mtd_partition **pparts, - unsigned long fis_origin) - { -@@ -162,6 +162,14 @@ static int parse_redboot_partitions(stru - goto out; - } - -+ if (!fis_origin) { -+ for (i = 0; i < numslots; i++) { -+ if (!strncmp(buf[i].name, "RedBoot", 8)) { -+ fis_origin = (buf[i].flash_base & (master->size << 1) - 1); -+ } -+ } -+ } -+ - for (i = 0; i < numslots; i++) { - struct fis_list *new_fl, **prev; - -@@ -184,9 +192,8 @@ static int parse_redboot_partitions(stru - new_fl->img = &buf[i]; - if (fis_origin) { - buf[i].flash_base -= fis_origin; -- } else { -- buf[i].flash_base &= master->size-1; - } -+ buf[i].flash_base &= (master->size << 1) - 1; - - /* I'm sure the JFFS2 code has done me permanent damage. - * I now think the following is _normal_ ---- a/drivers/mtd/maps/Makefile -+++ b/drivers/mtd/maps/Makefile -@@ -59,3 +59,4 @@ obj-$(CONFIG_MTD_BFIN_ASYNC) += bfin-asy - obj-$(CONFIG_MTD_RBTX4939) += rbtx4939-flash.o - obj-$(CONFIG_MTD_VMU) += vmu-flash.o - obj-$(CONFIG_MTD_GPIO_ADDR) += gpio-addr-flash.o -+obj-$(CONFIG_MTD_BCM963XX) += bcm963xx-flash.o ---- /dev/null -+++ b/drivers/mtd/maps/bcm963xx-flash.c -@@ -0,0 +1,276 @@ -+/* -+ * Copyright (C) 2006-2008 Florian Fainelli <florian@openwrt.org> -+ * Mike Albon <malbon@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 -+ */ -+ -+#include <linux/init.h> -+#include <linux/kernel.h> -+#include <linux/mtd/map.h> -+#include <linux/mtd/mtd.h> -+#include <linux/mtd/partitions.h> -+#include <linux/slab.h> -+#include <linux/vmalloc.h> -+#include <linux/platform_device.h> -+#include <linux/magic.h> -+#include <linux/jffs2.h> -+ -+#include <bcm_tag.h> -+#include <asm/io.h> -+ -+#define BUSWIDTH 2 /* Buswidth */ -+#define EXTENDED_SIZE 0xBFC00000 /* Extended flash address */ -+ -+#define PFX KBUILD_MODNAME ": " -+ -+struct squashfs_super_block { -+ __le32 s_magic; -+ __le32 pad0[9]; -+ __le64 bytes_used; -+}; -+ -+extern int parse_redboot_partitions(struct mtd_info *master, struct mtd_partition **pparts, unsigned long fis_origin); -+static struct mtd_partition *parsed_parts; -+ -+static struct mtd_info *bcm963xx_mtd_info; -+ -+static struct map_info bcm963xx_map = { -+ .name = "bcm963xx", -+ .bankwidth = BUSWIDTH, -+}; -+ -+static int parse_cfe_partitions( struct mtd_info *master, struct mtd_partition **pparts) -+{ -+ int nrparts = 3, curpart = 0; /* CFE,NVRAM and global LINUX are always present. */ -+ struct bcm_tag *buf; -+ struct mtd_partition *parts; -+ int ret; -+ size_t retlen; -+ unsigned int rootfsaddr, kerneladdr, spareaddr; -+ unsigned int rootfslen, kernellen, sparelen; -+ int namelen = 0; -+ int i, offset; -+ char *boardid; -+ char *tagversion; -+ -+ /* Allocate memory for buffer */ -+ buf = vmalloc(sizeof(struct bcm_tag)); -+ if (!buf) -+ return -ENOMEM; -+ -+ /* Get the tag */ -+ ret = master->read(master, master->erasesize, sizeof(struct bcm_tag), &retlen, (void *)buf); -+ if (retlen != sizeof(struct bcm_tag)){ -+ vfree(buf); -+ return -EIO; -+ } -+ -+ sscanf(buf->kernelAddress, "%u", &kerneladdr); -+ sscanf(buf->kernelLength, "%u", &kernellen); -+ rootfslen = *(uint32_t *)(&(buf->rootLength[0])); -+ tagversion = &(buf->tagVersion[0]); -+ boardid = &(buf->boardid[0]); -+ -+ printk(KERN_INFO PFX "CFE boot tag found with version %s and board type %s\n",tagversion, boardid); -+ -+ kerneladdr = kerneladdr - EXTENDED_SIZE; -+ rootfsaddr = kerneladdr + kernellen; -+ -+ rootfslen = ( ( rootfslen % master->erasesize ) > 0 ? (((rootfslen / master->erasesize) + 1 ) * master->erasesize) : rootfslen); -+ -+ spareaddr = rootfsaddr + rootfslen; -+ sparelen = master->size - spareaddr - master->erasesize; -+ -+ /* Determine number of partitions */ -+ namelen = 8; -+ if (rootfslen > 0){ -+ nrparts++; -+ namelen =+ 6; -+ }; -+ if (kernellen > 0) { -+ nrparts++; -+ namelen =+ 6; -+ }; -+ -+ /* Ask kernel for more memory */ -+ parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL); -+ if (!parts) { -+ vfree(buf); -+ return -ENOMEM; -+ }; -+ -+ /* Start building partition list */ -+ parts[curpart].name = "CFE"; -+ parts[curpart].offset = 0; -+ parts[curpart].size = master->erasesize; -+ curpart++; -+ -+ if (kernellen > 0) { -+ parts[curpart].name = "kernel"; -+ parts[curpart].offset = kerneladdr; -+ parts[curpart].size = kernellen; -+ curpart++; -+ }; -+ -+ if (rootfslen > 0) { -+ parts[curpart].name = "rootfs"; -+ parts[curpart].offset = rootfsaddr; -+ parts[curpart].size = rootfslen; -+ if (sparelen > 0) -+ parts[curpart].size += sparelen; -+ curpart++; -+ }; -+ -+ parts[curpart].name = "nvram"; -+ parts[curpart].offset = master->size - master->erasesize; -+ parts[curpart].size = master->erasesize; -+ -+ /* Global partition "linux" to make easy firmware upgrade */ -+ curpart++; -+ parts[curpart].name = "linux"; -+ parts[curpart].offset = parts[0].size; -+ parts[curpart].size = master->size - parts[0].size - parts[3].size; -+ -+ for (i = 0; i < nrparts; i++) -+ printk(KERN_INFO PFX "Partition %d is %s offset %lx and length %lx\n", i, parts[i].name, (long unsigned int)(parts[i].offset), (long unsigned int)(parts[i].size)); -+ -+ printk(KERN_INFO PFX "Spare partition is %x offset and length %x\n", spareaddr, sparelen); -+ *pparts = parts; -+ vfree(buf); -+ -+ return nrparts; -+}; -+ -+static int bcm963xx_detect_cfe(struct mtd_info *master) -+{ -+ int idoffset = 0x4e0; -+ static char idstring[8] = "CFE1CFE1"; -+ char buf[9]; -+ int ret; -+ size_t retlen; -+ -+ ret = master->read(master, idoffset, 8, &retlen, (void *)buf); -+ buf[retlen] = 0; -+ printk(KERN_INFO PFX "Read Signature value of %s\n", buf); -+ -+ return strncmp(idstring, buf, 8); -+} -+ -+static int bcm963xx_probe(struct platform_device *pdev) -+{ -+ int err = 0; -+ int parsed_nr_parts = 0; -+ char *part_type; -+ struct resource *r; -+ -+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ bcm963xx_map.phys = r->start; -+ bcm963xx_map.size = (r->end - r->start) + 1; -+ bcm963xx_map.virt = ioremap(r->start, r->end - r->start + 1); -+ -+ if (!bcm963xx_map.virt) { -+ printk(KERN_ERR PFX "Failed to ioremap\n"); -+ return -EIO; -+ } -+ printk(KERN_INFO PFX "0x%08lx at 0x%08x\n", bcm963xx_map.size, bcm963xx_map.phys); -+ -+ simple_map_init(&bcm963xx_map); -+ -+ bcm963xx_mtd_info = do_map_probe("cfi_probe", &bcm963xx_map); -+ if (!bcm963xx_mtd_info) { -+ printk(KERN_ERR PFX "Failed to probe using CFI\n"); -+ err = -EIO; -+ goto err_probe; -+ } -+ -+ bcm963xx_mtd_info->owner = THIS_MODULE; -+ -+ /* This is mutually exclusive */ -+ if (bcm963xx_detect_cfe(bcm963xx_mtd_info) == 0) { -+ printk(KERN_INFO PFX "CFE bootloader detected\n"); -+ if (parsed_nr_parts == 0) { -+ int ret = parse_cfe_partitions(bcm963xx_mtd_info, &parsed_parts); -+ if (ret > 0) { -+ part_type = "CFE"; -+ parsed_nr_parts = ret; -+ } -+ } -+ } else { -+ printk(KERN_INFO PFX "assuming RedBoot bootloader\n"); -+ if (bcm963xx_mtd_info->size > 0x00400000) { -+ printk(KERN_INFO PFX "Support for extended flash memory size : 0x%lx ; ONLY 64MBIT SUPPORT\n", bcm963xx_mtd_info->size); -+ bcm963xx_map.virt = (u32)(EXTENDED_SIZE); -+ } -+ -+#ifdef CONFIG_MTD_REDBOOT_PARTS -+ if (parsed_nr_parts == 0) { -+ int ret = parse_redboot_partitions(bcm963xx_mtd_info, &parsed_parts, 0); -+ if (ret > 0) { -+ part_type = "RedBoot"; -+ parsed_nr_parts = ret; -+ } -+ } -+#endif -+ } -+ -+ return add_mtd_partitions(bcm963xx_mtd_info, parsed_parts, parsed_nr_parts); -+ -+err_probe: -+ iounmap(bcm963xx_map.virt); -+ return err; -+} -+ -+static int bcm963xx_remove(struct platform_device *pdev) -+{ -+ if (bcm963xx_mtd_info) { -+ del_mtd_partitions(bcm963xx_mtd_info); -+ map_destroy(bcm963xx_mtd_info); -+ } -+ -+ if (bcm963xx_map.virt) { -+ iounmap(bcm963xx_map.virt); -+ bcm963xx_map.virt = 0; -+ } -+ -+ return 0; -+} -+ -+static struct platform_driver bcm63xx_mtd_dev = { -+ .probe = bcm963xx_probe, -+ .remove = bcm963xx_remove, -+ .driver = { -+ .name = "bcm963xx-flash", -+ .owner = THIS_MODULE, -+ }, -+}; -+ -+static int __init bcm963xx_mtd_init(void) -+{ -+ return platform_driver_register(&bcm63xx_mtd_dev); -+} -+ -+static void __exit bcm963xx_mtd_exit(void) -+{ -+ platform_driver_unregister(&bcm63xx_mtd_dev); -+} -+ -+module_init(bcm963xx_mtd_init); -+module_exit(bcm963xx_mtd_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_DESCRIPTION("Broadcom BCM63xx MTD partition parser/mapping for CFE and RedBoot"); -+MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); -+MODULE_AUTHOR("Mike Albon <malbon@openwrt.org>"); ---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c -+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c -@@ -816,20 +816,6 @@ void __init board_setup(void) - panic("unexpected CPU for bcm963xx board"); - } - --static struct mtd_partition mtd_partitions[] = { -- { -- .name = "cfe", -- .offset = 0x0, -- .size = 0x40000, -- } --}; -- --static struct physmap_flash_data flash_data = { -- .width = 2, -- .nr_parts = ARRAY_SIZE(mtd_partitions), -- .parts = mtd_partitions, --}; -- - static struct resource mtd_resources[] = { - { - .start = 0, /* filled at runtime */ -@@ -839,12 +825,9 @@ static struct resource mtd_resources[] = - }; - - static struct platform_device mtd_dev = { -- .name = "physmap-flash", -+ .name = "bcm963xx-flash", - .resource = mtd_resources, - .num_resources = ARRAY_SIZE(mtd_resources), -- .dev = { -- .platform_data = &flash_data, -- }, - }; - - static struct gpio_led_platform_data bcm63xx_led_data; |