diff options
author | Florian Fainelli <florian@openwrt.org> | 2007-03-22 22:43:11 +0000 |
---|---|---|
committer | Florian Fainelli <florian@openwrt.org> | 2007-03-22 22:43:11 +0000 |
commit | 2c6347fcbc88bc5220f4bdc4d7a17ea6d95c34ec (patch) | |
tree | d36e2541559e1b6b785f3a507b188573fc23a2dc /target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c | |
parent | 20cf5f8f684e28d04527b7899f66bed65af8fb69 (diff) | |
download | upstream-2c6347fcbc88bc5220f4bdc4d7a17ea6d95c34ec.tar.gz upstream-2c6347fcbc88bc5220f4bdc4d7a17ea6d95c34ec.tar.bz2 upstream-2c6347fcbc88bc5220f4bdc4d7a17ea6d95c34ec.zip |
Add CFE runtime detection
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@6641 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c')
-rw-r--r-- | target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c | 34 |
1 files changed, 34 insertions, 0 deletions
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 2ba3311c54..9067fcd976 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 <asm/bootinfo.h> #include <asm/addrspace.h> +/* 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(); } |