mirror of https://github.com/hak5/openwrt.git
Rewrite of the bootloader runtime detection (Gabor Juhos)
SVN-Revision: 6713lede-17.01
parent
7fb29fc2b9
commit
e5f6938314
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
Loading…
Reference in New Issue