--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c @@ -37,6 +37,7 @@ #include #include +#include #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 */