diff --git a/sys/arch/evbarm/odroid/genassym.cf b/sys/arch/evbarm/odroid/genassym.cf index d878ae4c1bc6..27f092586f35 100644 --- a/sys/arch/evbarm/odroid/genassym.cf +++ b/sys/arch/evbarm/odroid/genassym.cf @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.1 2014/04/13 02:26:26 matt Exp $ +# $NetBSD: genassym.cf,v 1.2 2014/08/04 18:14:43 reinoud Exp $ #- # Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,8 +30,10 @@ # include +include define UTRSTAT_TXEMPTY UTRSTAT_TXEMPTY define UTRSTAT_TXSHIFTER_EMPTY UTRSTAT_TXSHIFTER_EMPTY define SSCOM_UTXH SSCOM_UTXH define SSCOM_UTRSTAT SSCOM_UTRSTAT +define MAX_BOOT_STRING MAX_BOOT_STRING diff --git a/sys/arch/evbarm/odroid/odroid_machdep.c b/sys/arch/evbarm/odroid/odroid_machdep.c index e912bb5aaf40..2b935cd024ef 100644 --- a/sys/arch/evbarm/odroid/odroid_machdep.c +++ b/sys/arch/evbarm/odroid/odroid_machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: odroid_machdep.c,v 1.23 2014/08/04 11:32:27 reinoud Exp $ */ +/* $NetBSD: odroid_machdep.c,v 1.24 2014/08/04 18:14:43 reinoud Exp $ */ /* * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: odroid_machdep.c,v 1.23 2014/08/04 11:32:27 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: odroid_machdep.c,v 1.24 2014/08/04 18:14:43 reinoud Exp $"); #include "opt_evbarm_boardtype.h" #include "opt_exynos.h" @@ -92,6 +92,7 @@ __KERNEL_RCSID(0, "$NetBSD: odroid_machdep.c,v 1.23 2014/08/04 11:32:27 reinoud #include #include +#include /* serial console stuff */ #include "sscom.h" @@ -178,9 +179,10 @@ uintptr_t uboot_args[4] = { 0 }; * argument and boot configure storage */ BootConfig bootconfig; /* for pmap's sake */ -//static char bootargs[MAX_BOOT_STRING]; /* copied string from uboot */ +char bootargs[MAX_BOOT_STRING] = ""; /* copied string from uboot */ char *boot_args = NULL; /* MI bootargs */ char *boot_file = NULL; /* MI bootfile */ +uint8_t uboot_enaddr[ETHER_ADDR_LEN] = {}; /* @@ -203,6 +205,7 @@ void consinit(void); static void kgdb_port_init(void); #endif static void exynos_usb_powercycle_lan9730(device_t self); +static void exynos_extract_mac_adress(void); void odroid_device_register(device_t self, void *aux); void odroid_device_register_post_config(device_t self, void *aux); @@ -356,6 +359,9 @@ curcpu()->ci_data.cpu_cc_freq = 1*1000*1000*1000; /* XXX hack XXX */ char mi_bootargs[] = BOOT_ARGS; parse_mi_bootargs(mi_bootargs); #endif + boot_args = bootargs; + parse_mi_bootargs(boot_args); + exynos_extract_mac_adress(); /* * Determine physical memory by looking at the PoP package. This PoP @@ -474,6 +480,48 @@ consinit(void) } +/* extract ethernet mac address from bootargs */ +static void +exynos_extract_mac_adress(void) +{ + char *str, *ptr; + int i, v1, v2, val; + +#define EXPECT_COLON() {\ + v1 = *ptr++; \ + if (v1 != ':') break; \ + } +#define EXPECT_HEX(v) {\ + (v) = (v) >= '0' && (v) <= '9'? (v) - '0' : \ + (v) >= 'a' && (v) <= 'f'? (v) - 'a' + 10 : \ + (v) >= 'A' && (v) <= 'F'? (v) - 'A' + 10 : -1; \ + if ((v) < 0) break; \ + } +#define EXPECT_2HEX(val) {\ + v1 = *ptr++; EXPECT_HEX(v1); \ + v2 = *ptr++; EXPECT_HEX(v2); \ + val = (v1 << 4) | v2; \ + } + if (get_bootconf_option(boot_args, "ethaddr", + BOOTOPT_TYPE_STRING, &str)) { + for (i = 0, ptr = str; i < sizeof(uboot_enaddr); i++) { + if (i) + EXPECT_COLON(); + EXPECT_2HEX(val); + uboot_enaddr[i] = val; + } + if (i != sizeof(uboot_enaddr)) { + printf( "Ignoring invalid MAC address '%s' passed " + "as boot paramter `ethaddr'\n", str); + memset((char *) uboot_enaddr, 0, sizeof(uboot_enaddr)); + } + } +#undef EXPECT_2HEX +#undef EXPECT_HEX +#undef EXPECT_COLON +} + + #ifdef EXYNOS4 static void odroid_exynos4_gpio_ncs(device_t self, prop_dictionary_t dict) { @@ -574,6 +622,16 @@ odroid_device_register(device_t self, void *aux) prop_dictionary_set_cstring(dict, "lan_power", "p3v3_en"); } + if (device_is_a(self, "usmsc")) { + prop_data_t blob = + prop_data_create_data(uboot_enaddr, ETHER_ADDR_LEN); + if (prop_dictionary_set(dict, "mac-address", blob) == false) { + aprint_error_dev(self, + "WARNING: unable to set mac-address property\n"); + } + prop_object_release(blob); + } + #ifdef EXYNOS4 if (device_is_a(self, "exyogpio") && (IS_EXYNOS4_P())) { /* unused bits */ diff --git a/sys/arch/evbarm/odroid/odroid_start.S b/sys/arch/evbarm/odroid/odroid_start.S index ada58bbe1222..472db2becf42 100644 --- a/sys/arch/evbarm/odroid/odroid_start.S +++ b/sys/arch/evbarm/odroid/odroid_start.S @@ -1,4 +1,4 @@ -/* $NetBSD: odroid_start.S,v 1.2 2014/04/14 19:45:40 reinoud Exp $ */ +/* $NetBSD: odroid_start.S,v 1.3 2014/08/04 18:14:43 reinoud Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -46,7 +46,7 @@ #include -RCSID("$NetBSD: odroid_start.S,v 1.2 2014/04/14 19:45:40 reinoud Exp $") +RCSID("$NetBSD: odroid_start.S,v 1.3 2014/08/04 18:14:43 reinoud Exp $") #if defined(VERBOSE_INIT_ARM) @@ -94,6 +94,63 @@ _C_LABEL(odroid_start): sub r4, r4, #KERNEL_BASE_VOFFSET stmia r4, {r0-r3} // Save the arguments + /* + * Rescue passed "bootargs" env variable. This is not trivial + * since we can be booted using either `go' or trough `bootm'. + * + * 'go' passes R0 = argc, R1 = argv + * 'bootm' passes R0 = uboot_bootinfo, R3 = bootargs + */ + + movw r4, #:lower16:bootargs + movt r4, #:upper16:bootargs + sub r4, r4, #KERNEL_BASE_VOFFSET + + cmp r0, #0 + beq 1f + cmp r0, #MAX_BOOT_STRING + bge 1f + + /* `go' method */ + cmp r0, #1 // extra argument? + beq 3f + ldr r5, [r1, #4] // load argv[1] +2: + ldrb r0, [r5], #1 + strb r0, [r4], #1 + teq r0, #0 + bne 2b + + b 3f +1: + /* `bootm' method */ + mov r6, r0 // save binfo pointer + + cmp r3, #0 + beq 1f +2: + ldrb r0, [r3], #1 + strb r0, [r4], #1 + teq r0, #0 + bne 2b + +1: + cmp r6, #0 // binfo passed? + beq 3f + + add r6, r6, #0x250 // to eth addr + + movw r4, #:lower16:uboot_enaddr + movt r4, #:upper16:uboot_enaddr + mov r2, #6 +2: + ldrb r0, [r6], #1 + strb r0, [r4], #1 + subs r2, r2, #1 + bne 2b + +3: + /* * For easy and early SoC / PoP dependency, retrieve the IDs */