summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2007-03-22 22:43:11 +0000
committerflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>2007-03-22 22:43:11 +0000
commit8107ba4c06251523e2f33ab42168e628322ce72d (patch)
treed36e2541559e1b6b785f3a507b188573fc23a2dc
parentdfa4027af6dfc6303b474edb94e450ead42e69b3 (diff)
Add CFE runtime detection
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@6641 3c298f89-4303-0410-b956-a3cf2f4a3e73
-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();
}