summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-06-06 22:22:09 +0000
committerflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-06-06 22:22:09 +0000
commit00d2ae45f081ee06d26fca775cf8bb30f8d5b61a (patch)
tree4e0e4042ced554194c14b4b285f835dd1eb32be9
parent055ba13e4e1420ba859040269553a2d335a3a33b (diff)
brcm63xx: add Broadcom cable modem firmware format header
Signed-off-by: Florian Fainelli <florian@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36875 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--target/linux/brcm63xx/patches-3.8/425-bcm933xx_hcs.patch65
-rw-r--r--target/linux/brcm63xx/patches-3.9/425-bcm933xx_hcs.patch65
2 files changed, 130 insertions, 0 deletions
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
index 0000000000..79533fb64e
--- /dev/null
+++ b/target/linux/brcm63xx/patches-3.8/425-bcm933xx_hcs.patch
@@ -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
index 0000000000..79533fb64e
--- /dev/null
+++ b/target/linux/brcm63xx/patches-3.9/425-bcm933xx_hcs.patch
@@ -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 */