MIPS: BCM63XX: recognize Cable Modem firmware format
authorFlorian Fainelli <florian@openwrt.org>
Tue, 18 Jun 2013 16:55:41 +0000 (16:55 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Mon, 1 Jul 2013 13:10:53 +0000 (15:10 +0200)
Add the firmware header format which is used by Broadcom Cable Modem
SoCs such as the BCM3368 SoC. We export the bcm_hcs firmware format
structure because it is used by user-land tools to create firmware
images for these SoCs and will later be used by a corresponding MTD
parser.

Signed-off-by: Florian Fainelli <florian@openwrt.org>
Cc: linux-mips@linux-mips.org
Cc: cernekee@gmail.com
Cc: jogo@openwrt.org
Patchwork: https://patchwork.linux-mips.org/patch/5496/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/bcm63xx/boards/board_bcm963xx.c
include/uapi/linux/Kbuild
include/uapi/linux/bcm933xx_hcs.h [new file with mode: 0644]

index a9505c4867e8dd1054646643abdf1640172b0dce..46eabb9aff51a0d38554890954c9f7d1d5a77131 100644 (file)
 #include <bcm63xx_dev_usb_usbd.h>
 #include <board_bcm963xx.h>
 
+#include <uapi/linux/bcm933xx_hcs.h>
+
 #define PFX    "board_bcm963xx: "
 
+#define HCS_OFFSET_128K                        0x20000
+
 static struct board_info board;
 
 /*
@@ -722,8 +726,9 @@ void __init board_prom_init(void)
        unsigned int i;
        u8 *boot_addr, *cfe;
        char cfe_version[32];
-       char *board_name;
+       char *board_name = NULL;
        u32 val;
+       struct bcm_hcs *hcs;
 
        /* read base address of boot chip select (0)
         * 6328/6362 do not have MPI but boot from a fixed address
@@ -747,7 +752,12 @@ void __init board_prom_init(void)
 
        bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET);
 
-       board_name = bcm63xx_nvram_get_name();
+       if (BCMCPU_IS_3368()) {
+               hcs = (struct bcm_hcs *)boot_addr;
+               board_name = hcs->filename;
+       } else {
+               board_name = bcm63xx_nvram_get_name();
+       }
        /* find board by name */
        for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) {
                if (strncmp(board_name, bcm963xx_boards[i]->name, 16))
index ab5d4992e568f31109c41c505c3d919216a61acb..ba1c11ab0d113aabf4fa2dea78490613bffed8ed 100644 (file)
@@ -62,6 +62,7 @@ header-y += auxvec.h
 header-y += ax25.h
 header-y += b1lli.h
 header-y += baycom.h
+header-y += bcm933xx_hcs.h
 header-y += bfs_fs.h
 header-y += binfmts.h
 header-y += blkpg.h
diff --git a/include/uapi/linux/bcm933xx_hcs.h b/include/uapi/linux/bcm933xx_hcs.h
new file mode 100644 (file)
index 0000000..d228218
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Broadcom Cable Modem firmware format
+ */
+
+#ifndef __BCM933XX_HCS_H
+#define __BCM933XX_HCS_H
+
+#include <linux/types.h>
+
+struct bcm_hcs {
+       __u16 magic;
+       __u16 control;
+       __u16 rev_maj;
+       __u16 rev_min;
+       __u32 build_date;
+       __u32 filelen;
+       __u32 ldaddress;
+       char filename[64];
+       __u16 hcs;
+       __u16 her_znaet_chto;
+       __u32 crc;
+};
+
+#endif /* __BCM933XX_HCS */