aboutsummaryrefslogtreecommitdiffstats
path: root/target
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
commitdd5488dd3f936201e6562fe77a5b17b484a56935 (patch)
tree9ec15ef6ef4100eaac011861f78ecec3929e3dac /target
parent4bb721a186df4bc21b9b31944517ba4c6771c7c2 (diff)
downloadupstream-dd5488dd3f936201e6562fe77a5b17b484a56935.tar.gz
upstream-dd5488dd3f936201e6562fe77a5b17b484a56935.tar.bz2
upstream-dd5488dd3f936201e6562fe77a5b17b484a56935.zip
Add CFE runtime detection
SVN-Revision: 6641
Diffstat (limited to 'target')
-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();
}