From e212aad78afecbe74a153ff8be0edff236004a8f Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 25 Aug 2010 19:56:08 +0000 Subject: [brcm63xx] add 2.6.35 support git-svn-id: svn://svn.openwrt.org/openwrt/trunk@22800 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../patches-2.6.35/040-bcm963xx_flashmap.patch | 380 +++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 target/linux/brcm63xx/patches-2.6.35/040-bcm963xx_flashmap.patch (limited to 'target/linux/brcm63xx/patches-2.6.35/040-bcm963xx_flashmap.patch') 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 new file mode 100644 index 000000000..ad7d73ad1 --- /dev/null +++ b/target/linux/brcm63xx/patches-2.6.35/040-bcm963xx_flashmap.patch @@ -0,0 +1,380 @@ +From e734ace5baa04e0e8af1d4483475fbd6bd2b32a1 Mon Sep 17 00:00:00 2001 +From: Axel Gembe +Date: Mon, 12 May 2008 18:54:09 +0200 +Subject: [PATCH] bcm963xx: flashmap support + + +Signed-off-by: Axel Gembe +--- + 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,267 @@ ++/* ++ * Copyright (C) 2006-2008 Florian Fainelli ++ * Mike Albon ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#define BUSWIDTH 2 /* Buswidth */ ++#define EXTENDED_SIZE 0xBFC00000 /* Extended flash address */ ++ ++#define PFX KBUILD_MODNAME ": " ++ ++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, totallen; ++ int namelen = 0; ++ int i; ++ 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); ++ sscanf(buf->totalLength, "%u", &totallen); ++ 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; ++ spareaddr = roundup(totallen, master->erasesize) + master->erasesize; ++ sparelen = master->size - spareaddr - master->erasesize; ++ rootfslen = spareaddr - rootfsaddr; ++ ++ /* 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 "); ++MODULE_AUTHOR("Mike Albon "); +--- 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; -- cgit v1.2.3