1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-11-19 08:39:43 +02:00

Rewrite of the bootloader runtime detection (Gabor Juhos)

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@6713 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
florian 2007-03-26 07:37:31 +00:00
parent 0704011af8
commit 3f8c5b95ad
4 changed files with 10 additions and 46 deletions

View File

@ -2,6 +2,6 @@
# Makefile for the ADMtek ADM5120 SoC specific parts of the kernel # Makefile for the ADMtek ADM5120 SoC specific parts of the kernel
# #
obj-y := setup.o prom.o irq.o memory.o mipsIRQ.o obj-y := setup.o prom.o irq.o memory.o mipsIRQ.o adm5120_info.o
EXTRA_AFLAGS := $(CFLAGS) EXTRA_AFLAGS := $(CFLAGS)

View File

@ -29,20 +29,12 @@
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/addrspace.h> #include <asm/addrspace.h>
/* boot loaders specific definitions */ #include <adm5120_info.h>
#define CFE_EPTSEAL 0x43464531 /* CFE1 is the magic number to recognize CFE from other bootloaders */
#define CFE 1
#define UBOOT 2
#define MYLOADER 3
#define UNKNOWN 0
void setup_prom_printf(int); void setup_prom_printf(int);
void prom_printf(char *, ...); void prom_printf(char *, ...);
void prom_meminit(void); void prom_meminit(void);
/* we assume we don't know the boot loader by default */
int boot_loader_type = UNKNOWN;
#define ADM5120_ENVC 1 #define ADM5120_ENVC 1
char *adm5120_envp[2*ADM5120_ENVC] = {"memsize","0x001000000"}; char *adm5120_envp[2*ADM5120_ENVC] = {"memsize","0x001000000"};
@ -106,6 +98,7 @@ char *prom_getenv(char *envname)
return(NULL); return(NULL);
} }
/* /*
* initialize the prom module. * initialize the prom module.
*/ */
@ -115,34 +108,11 @@ void __init prom_init(void)
mips_machgroup = MACH_GROUP_ADM_GW; mips_machgroup = MACH_GROUP_ADM_GW;
mips_machtype = MACH_ADM_GW_5120; mips_machtype = MACH_ADM_GW_5120;
adm5120_info_init();
/* init command line, register a default kernel command line */ /* init command line, register a default kernel command line */
strcpy(&(arcs_cmdline[0]), "console=ttyS0,115200 rootfstype=squashfs,jffs2 init=/etc/preinit"); 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 */ /* init memory map */
prom_meminit(); prom_meminit();
} }

View File

@ -20,6 +20,8 @@
#include <asm/io.h> #include <asm/io.h>
#include "adm5120sw.h" #include "adm5120sw.h"
#include "adm5120_info.h"
MODULE_AUTHOR("Jeroen Vreeken (pe1rxq@amsat.org)"); MODULE_AUTHOR("Jeroen Vreeken (pe1rxq@amsat.org)");
MODULE_DESCRIPTION("ADM5120 ethernet switch driver"); MODULE_DESCRIPTION("ADM5120 ethernet switch driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
@ -316,7 +318,7 @@ static int adm5120_sw_set_mac_address(struct net_device *dev, void *p)
static int adm5120_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) static int adm5120_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{ {
int err; int err;
struct adm5120_info info; struct adm5120_sw_info info;
struct adm5120_sw *priv = netdev_priv(dev); struct adm5120_sw *priv = netdev_priv(dev);
switch(cmd) { switch(cmd) {
@ -391,7 +393,7 @@ static int __init adm5120_sw_init(void)
if (adm5120_get_reg(ADM5120_CODE) & ADM5120_CODE_PQFP) if (adm5120_get_reg(ADM5120_CODE) & ADM5120_CODE_PQFP)
adm5120_nrdevs = 5; adm5120_nrdevs = 5;
/* CFE based devices only have two enet ports */ /* CFE based devices only have two enet ports */
else if (boot_loader_type == CFE) else if (adm5120_info.boot_loader == BOOT_LOADER_CFE)
adm5120_nrdevs = 2; adm5120_nrdevs = 2;
else else
adm5120_nrdevs = 6; adm5120_nrdevs = 6;

View File

@ -97,18 +97,10 @@ struct adm5120_sw {
#define SIOCGMATRIX SIOCDEVPRIVATE+1 #define SIOCGMATRIX SIOCDEVPRIVATE+1
#define SIOCGADMINFO SIOCDEVPRIVATE+2 #define SIOCGADMINFO SIOCDEVPRIVATE+2
struct adm5120_info { struct adm5120_sw_info {
u16 magic; u16 magic;
u16 ports; u16 ports;
u16 vlan; u16 vlan;
}; };
#define UNKNOWN 0
#define CFE 1
#define UBOOT 2
#define MYLOADER 3
/* Type of boot loader, detected by the prom */
extern boot_loader_type;
#endif /* _INCLUDE_ADM5120SW_H_ */ #endif /* _INCLUDE_ADM5120SW_H_ */