diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2008-09-18 12:56:10 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2008-09-18 12:56:10 +0000 |
commit | 0c32489004603464cc4047cd5ed6ef34baed9742 (patch) | |
tree | f662c64becf1d024af8d5a29c78f58e0191531a7 /target/linux/ar71xx/files/arch | |
parent | b28cf847f900886bb49871a9a104d869ee7ec74b (diff) | |
download | upstream-0c32489004603464cc4047cd5ed6ef34baed9742.tar.gz upstream-0c32489004603464cc4047cd5ed6ef34baed9742.tar.bz2 upstream-0c32489004603464cc4047cd5ed6ef34baed9742.zip |
[ar71xx] add MyLoader support
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12627 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/ar71xx/files/arch')
5 files changed, 134 insertions, 41 deletions
diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig b/target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig index 274c3ede10..8640b2cc51 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig @@ -12,6 +12,7 @@ config AR71XX_MACH_GENERIC config AR71XX_MACH_WP543 bool "Compex WP543 board support" + select MYLOADER default y config AR71XX_MACH_RB_4XX diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/platform.c b/target/linux/ar71xx/files/arch/mips/ar71xx/platform.c index db804fbb91..9e62114b1a 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/platform.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/platform.c @@ -414,7 +414,12 @@ err_free_buttons: kfree(p); } -void __init ar71xx_set_mac_base(char *mac_str) +void __init ar71xx_set_mac_base(unsigned char *mac) +{ + memcpy(ar71xx_mac_base, mac, ETH_ALEN); +} + +void __init ar71xx_parse_mac_addr(char *mac_str) { u8 tmp[ETH_ALEN]; int t; @@ -423,7 +428,7 @@ void __init ar71xx_set_mac_base(char *mac_str) &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]); if (t == ETH_ALEN) - memcpy(ar71xx_mac_base, tmp, ETH_ALEN); + ar71xx_set_mac_base(tmp); else printk(KERN_DEBUG "AR71XX: failed to parse mac address " "\"%s\"\n", mac_str); diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c b/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c index 69425d50c0..d22c593e1a 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c @@ -16,6 +16,7 @@ #include <asm/bootinfo.h> #include <asm/addrspace.h> +#include <asm/fw/myloader/myloader.h> #include <asm/mach-ar71xx/ar71xx.h> #include <asm/mach-ar71xx/platform.h> @@ -42,34 +43,31 @@ static struct board_rec boards[] __initdata = { } }; -static __init void routerboot_printargs(void) +static __init char *ar71xx_prom_getargv(const char *name) { + int len = strlen(name); int i; - for (i = 0; i < ar71xx_prom_argc; i++) - printk(KERN_DEBUG "prom: routerboot envp[%d]: %s\n", - i, ar71xx_prom_argv[i]); -} - -static __init char *routerboot_getenv(const char *envname) -{ - int len = strlen(envname); - int i; + if (!ar71xx_prom_argv) + return NULL; for (i = 0; i < ar71xx_prom_argc; i++) { - char *env = ar71xx_prom_argv[i]; - if (strncmp(envname, env, len) == 0 && (env)[len] == '=') - return env + len + 1; + char *argv = ar71xx_prom_argv[i]; + if (strncmp(name, argv, len) == 0 && (argv)[len] == '=') + return argv + len + 1; } return NULL; } -static __init char *redboot_getenv(const char *envname) +static __init char *ar71xx_prom_getenv(const char *envname) { int len = strlen(envname); char **env; + if (!ar71xx_prom_envp) + return NULL; + for (env = ar71xx_prom_envp; *env != NULL; env++) if (strncmp(envname, *env, len) == 0 && (*env)[len] == '=') return *env + len + 1; @@ -88,40 +86,61 @@ static __init unsigned long find_board_byname(char *name) return MACH_AR71XX_GENERIC; } -void __init prom_init(void) +static int ar71xx_prom_init_myloader(void) { - char *board = NULL; - char *mac = NULL; + struct myloader_info *mylo; + + mylo = myloader_get_info(); + if (!mylo) + return 0; + + switch (mylo->did) { + case DEVID_COMPEX_WP543: + mips_machtype = MACH_AR71XX_WP543; + break; + default: + printk(KERN_WARNING "prom: unknown device id: %x\n", + mylo->did); + } + ar71xx_set_mac_base(mylo->macs[0]); + return 1; +} + +static void ar71xx_prom_init_generic(void) +{ + char *p; + + ar71xx_prom_argc = fw_arg0; + ar71xx_prom_argv = (char **)fw_arg1; + ar71xx_prom_envp = (char **)fw_arg2; + + p = ar71xx_prom_getenv("board"); + if (!p) + p = ar71xx_prom_getargv("board"); + if (p) + mips_machtype = find_board_byname(p); + + p = ar71xx_prom_getenv("ethaddr"); + if (!p) + p = ar71xx_prom_getargv("kmac"); + if (p) + ar71xx_parse_mac_addr(p); +} + +void __init prom_init(void) +{ printk(KERN_DEBUG "prom: fw_arg0=%08x, fw_arg1=%08x, " "fw_arg2=%08x, fw_arg3=%08x\n", (unsigned int)fw_arg0, (unsigned int)fw_arg1, (unsigned int)fw_arg2, (unsigned int)fw_arg3); - if ((fw_arg0 == 7) && (fw_arg2 == 0) && (fw_arg3 == 0)) { - /* assume RouterBOOT */ - ar71xx_prom_argc = fw_arg0; - ar71xx_prom_argv = (char **)fw_arg1; - routerboot_printargs(); - board = routerboot_getenv("board"); - mac = routerboot_getenv("kmac"); - } else { - /* assume Redboot */ - ar71xx_prom_argc = fw_arg0; - ar71xx_prom_argv = (char **)fw_arg1; - ar71xx_prom_envp = (char **)fw_arg2; - mac = redboot_getenv("ethaddr"); - } - - if (board) - mips_machtype = find_board_byname(board); - else - mips_machtype = MACH_AR71XX_GENERIC; + mips_machtype = MACH_AR71XX_GENERIC; - if (mac) - ar71xx_set_mac_base(mac); + if (ar71xx_prom_init_myloader()) + return; - ar71xx_print_cmdline(); + ar71xx_prom_init_generic(); } void __init prom_free_prom_memory(void) diff --git a/target/linux/ar71xx/files/arch/mips/fw/myloader/Makefile b/target/linux/ar71xx/files/arch/mips/fw/myloader/Makefile new file mode 100644 index 0000000000..34acfd01cc --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/fw/myloader/Makefile @@ -0,0 +1,5 @@ +# +# Makefile for the Compex's MyLoader support on MIPS architecture +# + +lib-y += myloader.o diff --git a/target/linux/ar71xx/files/arch/mips/fw/myloader/myloader.c b/target/linux/ar71xx/files/arch/mips/fw/myloader/myloader.c new file mode 100644 index 0000000000..a26f9ad3fd --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/fw/myloader/myloader.c @@ -0,0 +1,63 @@ +/* + * Compex's MyLoader specific prom routines + * + * Copyright (C) 2007-2008 Gabor Juhos <juhosg@openwrt.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/types.h> +#include <linux/string.h> + +#include <asm/addrspace.h> +#include <asm/fw/myloader/myloader.h> + +#define SYS_PARAMS_ADDR KSEG1ADDR(0x80000800) +#define BOARD_PARAMS_ADDR KSEG1ADDR(0x80000A00) +#define PART_TABLE_ADDR KSEG1ADDR(0x80000C00) +#define BOOT_PARAMS_ADDR KSEG1ADDR(0x80000E00) + +static struct myloader_info myloader_info __initdata; +static int myloader_found __initdata; + +struct myloader_info * __init myloader_get_info(void) +{ + struct mylo_system_params *sysp; + struct mylo_board_params *boardp; + struct mylo_partition_table *parts; + + if (myloader_found) + return &myloader_info; + + sysp = (struct mylo_system_params *)(SYS_PARAMS_ADDR); + boardp = (struct mylo_board_params *)(BOARD_PARAMS_ADDR); + parts = (struct mylo_partition_table *)(PART_TABLE_ADDR); + + printk(KERN_DEBUG "MyLoader: sysp=%08x, boardp=%08x, parts=%08x\n", + sysp->magic, boardp->magic, parts->magic); + + /* Check for some magic numbers */ + if (sysp->magic != MYLO_MAGIC_SYS_PARAMS || + boardp->magic != MYLO_MAGIC_BOARD_PARAMS || + le32_to_cpu(parts->magic) != MYLO_MAGIC_PARTITIONS) + return NULL; + + printk(KERN_DEBUG "MyLoader: id=%04x:%04x, sub_id=%04x:%04x\n", + sysp->vid, sysp->did, sysp->svid, sysp->sdid); + + myloader_info.vid = sysp->vid; + myloader_info.did = sysp->did; + myloader_info.svid = sysp->svid; + myloader_info.sdid = sysp->sdid; + + memcpy(myloader_info.macs, boardp->addr, sizeof(myloader_info.macs)); + + myloader_found = 1; + + return &myloader_info; +} |