brcm63xx: add Broadcom cable modem firmware format header
authorFlorian Fainelli <florian@openwrt.org>
Thu, 6 Jun 2013 22:22:09 +0000 (22:22 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Thu, 6 Jun 2013 22:22:09 +0000 (22:22 +0000)
Signed-off-by: Florian Fainelli <florian@openwrt.org>
SVN-Revision: 36875

target/linux/brcm63xx/patches-3.8/425-bcm933xx_hcs.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.9/425-bcm933xx_hcs.patch [new file with mode: 0644]

diff --git a/target/linux/brcm63xx/patches-3.8/425-bcm933xx_hcs.patch b/target/linux/brcm63xx/patches-3.8/425-bcm933xx_hcs.patch
new file mode 100644 (file)
index 0000000..79533fb
--- /dev/null
@@ -0,0 +1,65 @@
+--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
+@@ -37,6 +37,7 @@
+ #include <pci_rt2x00_fixup.h>
+ #include <uapi/linux/bcm963xx_tag.h>
++#include <uapi/linux/bcm933xx_hcs.h>
+ #define PFX   "board_bcm963xx: "
+@@ -45,6 +46,7 @@
+ #define CFE_OFFSET_64K                        0x10000
+ #define CFE_OFFSET_128K                       0x20000
++#define HCS_OFFSET_128K                       0x20000
+ static struct board_info board;
+@@ -782,8 +784,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
+@@ -812,9 +815,13 @@ void __init board_prom_init(void)
+       if (strcmp(cfe_version, "unknown") != 0) {
+               /* cfe present */
+               boardid_fixup(boot_addr);
++
++              board_name = bcm63xx_nvram_get_name();
++      } else if (BCMCPU_IS_3368()) {
++              hcs = (struct bcm_hcs *)KSEG1ADDR(0x1fc00000 + HCS_OFFSET_128K);
++              board_name = hcs->filename;
+       }
+-      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))
+--- /dev/null
++++ b/include/uapi/linux/bcm933xx_hcs.h
+@@ -0,0 +1,18 @@
++#ifndef __BCM_HCS_H
++#define __BCM_HCS_H
++
++struct bcm_hcs {
++      uint16_t magic;
++      uint16_t control;
++      uint16_t rev_maj;
++      uint16_t rev_min;
++      uint32_t build_date;
++      uint32_t filelen;
++      uint32_t ldaddress;
++      char filename[64];
++      uint16_t hcs;
++      uint16_t her_znaet_chto;
++      uint32_t crc;
++};
++
++#endif /* __BCM_HCS */
diff --git a/target/linux/brcm63xx/patches-3.9/425-bcm933xx_hcs.patch b/target/linux/brcm63xx/patches-3.9/425-bcm933xx_hcs.patch
new file mode 100644 (file)
index 0000000..79533fb
--- /dev/null
@@ -0,0 +1,65 @@
+--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
+@@ -37,6 +37,7 @@
+ #include <pci_rt2x00_fixup.h>
+ #include <uapi/linux/bcm963xx_tag.h>
++#include <uapi/linux/bcm933xx_hcs.h>
+ #define PFX   "board_bcm963xx: "
+@@ -45,6 +46,7 @@
+ #define CFE_OFFSET_64K                        0x10000
+ #define CFE_OFFSET_128K                       0x20000
++#define HCS_OFFSET_128K                       0x20000
+ static struct board_info board;
+@@ -782,8 +784,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
+@@ -812,9 +815,13 @@ void __init board_prom_init(void)
+       if (strcmp(cfe_version, "unknown") != 0) {
+               /* cfe present */
+               boardid_fixup(boot_addr);
++
++              board_name = bcm63xx_nvram_get_name();
++      } else if (BCMCPU_IS_3368()) {
++              hcs = (struct bcm_hcs *)KSEG1ADDR(0x1fc00000 + HCS_OFFSET_128K);
++              board_name = hcs->filename;
+       }
+-      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))
+--- /dev/null
++++ b/include/uapi/linux/bcm933xx_hcs.h
+@@ -0,0 +1,18 @@
++#ifndef __BCM_HCS_H
++#define __BCM_HCS_H
++
++struct bcm_hcs {
++      uint16_t magic;
++      uint16_t control;
++      uint16_t rev_maj;
++      uint16_t rev_min;
++      uint32_t build_date;
++      uint32_t filelen;
++      uint32_t ldaddress;
++      char filename[64];
++      uint16_t hcs;
++      uint16_t her_znaet_chto;
++      uint32_t crc;
++};
++
++#endif /* __BCM_HCS */