aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux
diff options
context:
space:
mode:
authorFlorian Fainelli <florian@openwrt.org>2007-03-22 22:43:11 +0000
committerFlorian Fainelli <florian@openwrt.org>2007-03-22 22:43:11 +0000
commit2c6347fcbc88bc5220f4bdc4d7a17ea6d95c34ec (patch)
treed36e2541559e1b6b785f3a507b188573fc23a2dc /target/linux
parent20cf5f8f684e28d04527b7899f66bed65af8fb69 (diff)
downloadupstream-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')
-rw-r--r--target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c34
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();
}