Add CFE runtime detection
authorflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 22 Mar 2007 22:43:11 +0000 (22:43 +0000)
committerflorian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 22 Mar 2007 22:43:11 +0000 (22:43 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@6641 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c

index 2ba3311..9067fcd 100644 (file)
 #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();
 }