Rewrite of the bootloader runtime detection (Gabor Juhos)
SVN-Revision: 6713
This commit is contained in:
		@@ -2,6 +2,6 @@
 | 
			
		||||
# 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)
 | 
			
		||||
 
 | 
			
		||||
@@ -29,20 +29,12 @@
 | 
			
		||||
#include <asm/bootinfo.h>
 | 
			
		||||
#include <asm/addrspace.h>
 | 
			
		||||
 | 
			
		||||
/* boot loaders specific definitions */
 | 
			
		||||
#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
 | 
			
		||||
#include <adm5120_info.h>
 | 
			
		||||
 | 
			
		||||
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"};
 | 
			
		||||
@@ -106,6 +98,7 @@ char *prom_getenv(char *envname)
 | 
			
		||||
	return(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
/*
 | 
			
		||||
 * initialize the prom module.
 | 
			
		||||
 */
 | 
			
		||||
@@ -115,34 +108,11 @@ void __init prom_init(void)
 | 
			
		||||
	mips_machgroup = MACH_GROUP_ADM_GW;
 | 
			
		||||
	mips_machtype = MACH_ADM_GW_5120;
 | 
			
		||||
	
 | 
			
		||||
	adm5120_info_init();
 | 
			
		||||
 | 
			
		||||
	/* 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();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,8 @@
 | 
			
		||||
#include <asm/io.h>
 | 
			
		||||
#include "adm5120sw.h"
 | 
			
		||||
 | 
			
		||||
#include "adm5120_info.h"
 | 
			
		||||
 | 
			
		||||
MODULE_AUTHOR("Jeroen Vreeken (pe1rxq@amsat.org)");
 | 
			
		||||
MODULE_DESCRIPTION("ADM5120 ethernet switch driver");
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
	int err;
 | 
			
		||||
	struct adm5120_info info;
 | 
			
		||||
	struct adm5120_sw_info info;
 | 
			
		||||
	struct adm5120_sw *priv = netdev_priv(dev);
 | 
			
		||||
 | 
			
		||||
	switch(cmd) {
 | 
			
		||||
@@ -391,7 +393,7 @@ static int __init adm5120_sw_init(void)
 | 
			
		||||
	if (adm5120_get_reg(ADM5120_CODE) & ADM5120_CODE_PQFP)
 | 
			
		||||
		adm5120_nrdevs = 5;
 | 
			
		||||
	/* 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;
 | 
			
		||||
	else
 | 
			
		||||
		adm5120_nrdevs = 6;
 | 
			
		||||
 
 | 
			
		||||
@@ -97,18 +97,10 @@ struct adm5120_sw {
 | 
			
		||||
#define SIOCGMATRIX	SIOCDEVPRIVATE+1
 | 
			
		||||
#define SIOCGADMINFO	SIOCDEVPRIVATE+2
 | 
			
		||||
 | 
			
		||||
struct adm5120_info {
 | 
			
		||||
struct adm5120_sw_info {
 | 
			
		||||
	u16	magic;
 | 
			
		||||
	u16	ports;
 | 
			
		||||
	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_ */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user