add u-boot argument parser for Marvell ARMADA XP/370.
use 'ethaddr' and 'eth1addr' in u-boot argument to setup MAC address of mvgbe.
This commit is contained in:
parent
e952648134
commit
c3635de7de
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: armadaxp_machdep.c,v 1.8 2014/03/29 15:00:07 matt Exp $ */
|
||||
/* $NetBSD: armadaxp_machdep.c,v 1.9 2015/04/15 10:15:40 hsuenaga Exp $ */
|
||||
/*******************************************************************************
|
||||
Copyright (C) Marvell International Ltd. and its affiliates
|
||||
|
||||
|
@ -37,7 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
*******************************************************************************/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: armadaxp_machdep.c,v 1.8 2014/03/29 15:00:07 matt Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: armadaxp_machdep.c,v 1.9 2015/04/15 10:15:40 hsuenaga Exp $");
|
||||
|
||||
#include "opt_machdep.h"
|
||||
#include "opt_mvsoc.h"
|
||||
|
@ -100,6 +100,8 @@ __KERNEL_RCSID(0, "$NetBSD: armadaxp_machdep.c,v 1.8 2014/03/29 15:00:07 matt Ex
|
|||
#include <dev/ic/comvar.h>
|
||||
#endif
|
||||
|
||||
#include <net/if_ether.h>
|
||||
|
||||
/*
|
||||
* Address to call from cpu_reset() to reset the machine.
|
||||
* This is machine architecture dependent as it varies depending
|
||||
|
@ -110,6 +112,13 @@ BootConfig bootconfig; /* Boot config storage */
|
|||
char *boot_args = NULL;
|
||||
char *boot_file = NULL;
|
||||
|
||||
/*
|
||||
* U-Boot argument buffer
|
||||
*/
|
||||
extern unsigned int uboot_regs_pa[]; /* saved r0, r1, r2, r3 */
|
||||
unsigned int *uboot_regs_va;
|
||||
char boot_argbuf[MAX_BOOT_STRING];
|
||||
|
||||
extern int KERNEL_BASE_phys[];
|
||||
|
||||
/*
|
||||
|
@ -393,6 +402,13 @@ initarm(void *arg)
|
|||
/* we've a specific device_register routine */
|
||||
evbarm_device_register = axp_device_register;
|
||||
|
||||
/* copy U-Boot args from U-Boot heap to kernel memory */
|
||||
uboot_regs_va = (int *)((unsigned int)uboot_regs_pa + KERNEL_BASE);
|
||||
boot_args = (char *)(uboot_regs_va[3] + KERNEL_BASE);
|
||||
strlcpy(boot_argbuf, (char *)boot_args, sizeof(boot_argbuf));
|
||||
boot_args = boot_argbuf;
|
||||
parse_mi_bootargs(boot_args);
|
||||
|
||||
return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
|
||||
}
|
||||
|
||||
|
@ -584,5 +600,30 @@ axp_device_register(device_t dev, void *aux)
|
|||
prop_dictionary_set_uint32(dict,
|
||||
"cache-line-size", arm_dcache_align);
|
||||
}
|
||||
if (device_is_a(dev, "mvgbec")) {
|
||||
uint8_t enaddr[ETHER_ADDR_LEN];
|
||||
char optname[9];
|
||||
int unit = device_unit(dev);
|
||||
|
||||
if (unit > 9)
|
||||
return;
|
||||
switch (unit) {
|
||||
case 0:
|
||||
strlcpy(optname, "ethaddr", sizeof(optname));
|
||||
break;
|
||||
default:
|
||||
/* eth1addr ... eth9addr */
|
||||
snprintf(optname, sizeof(optname),
|
||||
"eth%daddr", unit);
|
||||
break;
|
||||
}
|
||||
if (get_bootconf_option(boot_args, optname,
|
||||
BOOTOPT_TYPE_MACADDR, enaddr)) {
|
||||
prop_data_t pd =
|
||||
prop_data_create_data(enaddr, sizeof(enaddr));
|
||||
|
||||
prop_dictionary_set(dict, "mac-address", pd);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: armadaxp_start.S,v 1.3 2014/03/29 14:53:57 matt Exp $ */
|
||||
/* $NetBSD: armadaxp_start.S,v 1.4 2015/04/15 10:15:40 hsuenaga Exp $ */
|
||||
/*******************************************************************************
|
||||
Copyright (C) Marvell International Ltd. and its affiliates
|
||||
|
||||
|
@ -44,7 +44,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <evbarm/marvell/marvellvar.h>
|
||||
#include "assym.h"
|
||||
|
||||
RCSID("$NetBSD: armadaxp_start.S,v 1.3 2014/03/29 14:53:57 matt Exp $")
|
||||
RCSID("$NetBSD: armadaxp_start.S,v 1.4 2015/04/15 10:15:40 hsuenaga Exp $")
|
||||
|
||||
#ifdef KERNEL_BASES_EQUAL
|
||||
#error KERNEL_BASE_VIRT should not equal KERNEL_BASE_PHYS
|
||||
|
@ -78,6 +78,10 @@ _C_LABEL(armadaxp_start):
|
|||
dsb
|
||||
isb
|
||||
|
||||
/* Save U-Boot arguments */
|
||||
adr r4, uboot_regs_pa
|
||||
stmia r4!, {r0, r1, r2, r3}
|
||||
|
||||
/* build page table from scratch */
|
||||
movw r0, #:lower16:STARTUP_PAGETABLE_ADDR
|
||||
movt r0, #:upper16:STARTUP_PAGETABLE_ADDR
|
||||
|
@ -133,6 +137,10 @@ _C_LABEL(armadaxp_start):
|
|||
|
||||
/* NOTREACHED */
|
||||
|
||||
.global _C_LABEL(uboot_regs_pa)
|
||||
uboot_regs_pa:
|
||||
.space 16 /* r0, r1, r2, r3 */
|
||||
|
||||
#define MMU_INIT(va,pa,n_sec,attr) \
|
||||
.word n_sec ; \
|
||||
.word 4*((va)>>L1_S_SHIFT) ; \
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: if_mvgbe.c,v 1.40 2015/04/13 16:33:24 riastradh Exp $ */
|
||||
/* $NetBSD: if_mvgbe.c,v 1.41 2015/04/15 10:15:40 hsuenaga Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2007, 2008, 2013 KIYOHARA Takashi
|
||||
* All rights reserved.
|
||||
|
@ -25,7 +25,7 @@
|
|||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.40 2015/04/13 16:33:24 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.41 2015/04/15 10:15:40 hsuenaga Exp $");
|
||||
|
||||
#include "opt_multiprocessor.h"
|
||||
|
||||
|
@ -674,6 +674,13 @@ mvgbe_match(device_t parent, cfdata_t match, void *aux)
|
|||
{
|
||||
struct marvell_attach_args *mva = aux;
|
||||
uint32_t pbase, maddrh, maddrl;
|
||||
prop_dictionary_t dict;
|
||||
|
||||
dict = device_properties(parent);
|
||||
if (dict) {
|
||||
if (prop_dictionary_get(dict, "mac-address"))
|
||||
return 1;
|
||||
}
|
||||
|
||||
pbase = MVGBE_PORTR_BASE + mva->mva_unit * MVGBE_PORTR_SIZE;
|
||||
maddrh =
|
||||
|
@ -694,16 +701,25 @@ mvgbe_attach(device_t parent, device_t self, void *aux)
|
|||
struct mvgbe_softc *sc = device_private(self);
|
||||
struct marvell_attach_args *mva = aux;
|
||||
struct mvgbe_txmap_entry *entry;
|
||||
prop_dictionary_t dict;
|
||||
prop_data_t enaddrp;
|
||||
struct ifnet *ifp;
|
||||
bus_dma_segment_t seg;
|
||||
bus_dmamap_t dmamap;
|
||||
int rseg, i;
|
||||
uint32_t maddrh, maddrl;
|
||||
uint8_t enaddr[ETHER_ADDR_LEN];
|
||||
void *kva;
|
||||
|
||||
aprint_naive("\n");
|
||||
aprint_normal("\n");
|
||||
|
||||
dict = device_properties(parent);
|
||||
if (dict)
|
||||
enaddrp = prop_dictionary_get(dict, "mac-address");
|
||||
else
|
||||
enaddrp = NULL;
|
||||
|
||||
sc->sc_dev = self;
|
||||
sc->sc_port = mva->mva_unit;
|
||||
sc->sc_iot = mva->mva_iot;
|
||||
|
@ -751,6 +767,18 @@ mvgbe_attach(device_t parent, device_t self, void *aux)
|
|||
sc->sc_linkup.bit = MVGBE_PS_LINKUP;
|
||||
}
|
||||
|
||||
if (enaddrp) {
|
||||
memcpy(enaddr, prop_data_data_nocopy(enaddrp), ETHER_ADDR_LEN);
|
||||
maddrh = enaddr[0] << 24;
|
||||
maddrh |= enaddr[1] << 16;
|
||||
maddrh |= enaddr[2] << 8;
|
||||
maddrh |= enaddr[3];
|
||||
maddrl = enaddr[4] << 8;
|
||||
maddrl |= enaddr[5];
|
||||
MVGBE_WRITE(sc, MVGBE_MACAH, maddrh);
|
||||
MVGBE_WRITE(sc, MVGBE_MACAL, maddrl);
|
||||
}
|
||||
|
||||
maddrh = MVGBE_READ(sc, MVGBE_MACAH);
|
||||
maddrl = MVGBE_READ(sc, MVGBE_MACAL);
|
||||
sc->sc_enaddr[0] = maddrh >> 24;
|
||||
|
|
Loading…
Reference in New Issue