diff --git a/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c b/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c index 2ba3311c5..9067fcd97 100644 --- a/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c +++ b/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c @@ -29,10 +29,19 @@ #include #include +/* boot loaders specific definitions */ +#define CFE_EPTSEAL 0x43464531 +#define CFE 1 +#define MYLOADER 2 +#define UNKNOWN 0 + void setup_prom_printf(int); void prom_printf(char *, ...); void prom_meminit(void); +/* we assume we don't know the boot loader by default */ +int boot_loader_type = UNKNOWN; + #define ADM5120_ENVC 1 char *adm5120_envp[2*ADM5120_ENVC] = {"memsize","0x001000000"}; @@ -108,6 +117,31 @@ void __init prom_init(void) /* init command line, register a default kernel command line */ strcpy(&(arcs_cmdline[0]), "console=ttyS0,115200 rootfstype=squashfs,jffs2 init=/etc/preinit"); + /* check for CFE by finding the CFE magic number */ + int *prom_vec = (int *) fw_arg3; + int argc = fw_arg0; + unsigned int cfe_eptseal; + + if (argc < 0) + cfe_eptseal = (uint32_t)(unsigned long)prom_vec; + else { + if ((int32_t)(long)prom_vec < 0) + /* + * Old loaders all it gives us is the handle, + * so assume the seal. + */ + cfe_eptseal = CFE_EPTSEAL; + else + /* + * Newer loaders bundle the handle/ept/eptseal + */ + cfe_eptseal = (unsigned int)((uint32_t *)prom_vec)[3]; + } + if (cfe_eptseal == CFE_EPTSEAL) { + boot_loader_type = CFE; + printk("adm5120 : CFE boot loader\n"); + } + /* init memory map */ prom_meminit(); }