Module Name:    src
Committed By:   aymeric
Date:           Wed Sep 19 17:31:39 UTC 2018

Added Files:
        src/sys/arch/arm/altera: cycv_clkmgr.c cycv_dwcmmc.c cycv_gmac.c
            cycv_intr.h cycv_platform.c cycv_reg.h cycv_rstmgr.c cycv_var.h
            files.altera
        src/sys/arch/arm/dts: socfpga_cyclone5_de0_sockit.dts
        src/sys/arch/evbarm/altera: altera_start.S genassym.cf platform.h
        src/sys/arch/evbarm/conf: NANOSOC files.altera mk.altera std.altera

Log Message:
Add support for the DE0 NanoSoC board.

It's Cyclone V based and thus includes a dual-core Cortex A9 @925MHz.
Most standard peripherals are supported (USB, SDCard, Ethernet) and
no unusual peripheral is supported yet (FPGA, GPIO, ...)


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/altera/cycv_clkmgr.c \
    src/sys/arch/arm/altera/cycv_dwcmmc.c src/sys/arch/arm/altera/cycv_gmac.c \
    src/sys/arch/arm/altera/cycv_intr.h \
    src/sys/arch/arm/altera/cycv_platform.c \
    src/sys/arch/arm/altera/cycv_reg.h src/sys/arch/arm/altera/cycv_rstmgr.c \
    src/sys/arch/arm/altera/cycv_var.h src/sys/arch/arm/altera/files.altera
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/dts/socfpga_cyclone5_de0_sockit.dts
cvs rdiff -u -r0 -r1.1 src/sys/arch/evbarm/altera/altera_start.S \
    src/sys/arch/evbarm/altera/genassym.cf \
    src/sys/arch/evbarm/altera/platform.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/evbarm/conf/NANOSOC \
    src/sys/arch/evbarm/conf/files.altera src/sys/arch/evbarm/conf/mk.altera \
    src/sys/arch/evbarm/conf/std.altera

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Added files:

Index: src/sys/arch/arm/altera/cycv_clkmgr.c
diff -u /dev/null src/sys/arch/arm/altera/cycv_clkmgr.c:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/cycv_clkmgr.c	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,660 @@
+/* $NetBSD: cycv_clkmgr.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+
+/* This file is in the public domain. */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: cycv_clkmgr.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/atomic.h>
+#include <sys/kmem.h>
+
+#include <dev/clk/clk_backend.h>
+
+#include <arm/altera/cycv_reg.h>
+#include <arm/altera/cycv_var.h>
+
+#include <dev/fdt/fdtvar.h>
+
+#define CYCV_CLOCK_OSC1		25000000
+
+static int cycv_clkmgr_match(device_t, cfdata_t, void *);
+static void cycv_clkmgr_attach(device_t, device_t, void *);
+
+static struct clk *cycv_clkmgr_clock_decode(device_t, int, const void *,
+					    size_t);
+
+static const struct fdtbus_clock_controller_func cycv_clkmgr_fdtclock_funcs = {
+	.decode = cycv_clkmgr_clock_decode
+};
+
+static struct clk *cycv_clkmgr_clock_get(void *, const char *);
+static void cycv_clkmgr_clock_put(void *, struct clk *);
+static u_int cycv_clkmgr_clock_get_rate(void *, struct clk *);
+static int cycv_clkmgr_clock_set_rate(void *, struct clk *, u_int);
+static int cycv_clkmgr_clock_enable(void *, struct clk *);
+static int cycv_clkmgr_clock_disable(void *, struct clk *);
+static int cycv_clkmgr_clock_set_parent(void *, struct clk *, struct clk *);
+static struct clk *cycv_clkmgr_clock_get_parent(void *, struct clk *);
+
+static const struct clk_funcs cycv_clkmgr_clock_funcs = {
+	.get = cycv_clkmgr_clock_get,
+	.put = cycv_clkmgr_clock_put,
+	.get_rate = cycv_clkmgr_clock_get_rate,
+	.set_rate = cycv_clkmgr_clock_set_rate,
+	.enable = cycv_clkmgr_clock_enable,
+	.disable = cycv_clkmgr_clock_disable,
+	.get_parent = cycv_clkmgr_clock_get_parent,
+	.set_parent = cycv_clkmgr_clock_set_parent,
+};
+
+struct cycv_clk {
+	struct clk base;
+
+	int id;
+	u_int refcnt;
+
+	struct cycv_clk *parent;	/* cached and valid if not NULL */
+	/* parent_id is not zero and filled with dtb if only one parent clock */
+	int parent_id;
+
+	int type;
+#define CYCV_CLK_TYPE_PLL	0x0001
+#define CYCV_CLK_TYPE_FIXED	0x0002
+#define CYCV_CLK_TYPE_FIXED_DIV	0x0003
+#define CYCV_CLK_TYPE_DIV	0x0004
+
+	int flags;
+#define CYCV_CLK_FLAG_HAVE_GATE	0x0001
+#define CYCV_CLK_FLAG_IS_AVAIL	0x0002
+
+	union {
+		bus_addr_t pll_addr;
+		uint32_t fixed_freq;
+		uint32_t fixed_div;
+		struct {
+			bus_addr_t addr;
+			uint32_t mask;
+			int shift;
+		} div;
+	} u;
+
+	bus_addr_t gate_addr;
+	int gate_shift;
+};
+
+struct cycv_clkmgr_softc {
+	device_t sc_dev;
+	struct clk_domain sc_clkdom;
+
+	bus_space_tag_t sc_bst;
+	bus_space_handle_t sc_bsh;
+
+	struct cycv_clk *sc_clocks;
+	u_int sc_nclocks;
+};
+
+static void cycv_clkmgr_init(struct cycv_clkmgr_softc *, int);
+static void cycv_clkmgr_clock_parse(struct cycv_clkmgr_softc *, int, u_int);
+static u_int cycv_clkmgr_clocks_traverse(struct cycv_clkmgr_softc *, int,
+	void (*)(struct cycv_clkmgr_softc *, int, u_int), u_int);
+static struct cycv_clk_mux_info *cycv_clkmgr_get_mux_info(const char *);
+static void cycv_clkmgr_clock_print(struct cycv_clkmgr_softc *,
+	struct cycv_clk *);
+
+CFATTACH_DECL_NEW(cycvclkmgr, sizeof (struct cycv_clkmgr_softc),
+	cycv_clkmgr_match, cycv_clkmgr_attach, NULL, NULL);
+
+static int
+cycv_clkmgr_match(device_t parent, cfdata_t cf, void *aux)
+{
+	const char *compatible[] = { "altr,clk-mgr", NULL };
+	struct fdt_attach_args *faa = aux;
+
+	return of_match_compatible(faa->faa_phandle, compatible);
+}
+
+static void
+cycv_clkmgr_attach(device_t parent, device_t self, void *aux)
+{
+	struct cycv_clkmgr_softc *sc = device_private(self);
+	struct fdt_attach_args *faa = aux;
+	int phandle = faa->faa_phandle;
+	bus_addr_t addr;
+	bus_size_t size;
+	int error;
+
+	if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
+		aprint_error(": couldn't get registers\n");
+		return;
+	}
+
+	sc->sc_dev = self;
+	sc->sc_bst = faa->faa_bst;
+	error = bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh);
+	if (error) {
+		aprint_error(": couldn't map %#llx: %d",
+			     (uint64_t) addr, error);
+		return;
+	}
+
+	aprint_normal(": clock manager\n");
+
+	sc->sc_clkdom.funcs = &cycv_clkmgr_clock_funcs;
+	sc->sc_clkdom.priv = sc;
+
+	cycv_clkmgr_init(sc, phandle);
+}
+
+static void
+cycv_clkmgr_init(struct cycv_clkmgr_softc *sc, int clkmgr_handle)
+{
+	int clocks_handle;
+
+	clocks_handle = of_find_firstchild_byname(clkmgr_handle, "clocks");
+	if (clocks_handle == -1) {
+		aprint_error_dev(sc->sc_dev, "no clocks property\n");
+		return;
+	}
+
+	sc->sc_nclocks = cycv_clkmgr_clocks_traverse(sc, clocks_handle, NULL,
+						     0);
+
+	sc->sc_clocks = kmem_zalloc(sc->sc_nclocks * sizeof *sc->sc_clocks,
+				    KM_NOSLEEP);
+	if (sc->sc_clocks == NULL) {
+		aprint_error_dev(sc->sc_dev, "no memory\n");
+		sc->sc_nclocks = 0;
+		return;
+	}
+
+	cycv_clkmgr_clocks_traverse(sc, clocks_handle, cycv_clkmgr_clock_parse,
+				    0);
+
+#if 1
+	for (int i = 0; i < sc->sc_nclocks; i++)
+		cycv_clkmgr_clock_print(sc, &sc->sc_clocks[i]);
+#else
+	(void) cycv_clkmgr_clock_print;
+#endif
+}
+
+#define CYCV_CLK_MAX_PARENTS 3
+
+static struct cycv_clk_mux_info {
+	const char *name;
+	const char *parents[CYCV_CLK_MAX_PARENTS];
+	int nparents;
+	bus_addr_t addr;
+	uint32_t mask;
+} cycv_clk_mux_tree[] = {
+	{ "periph_pll", { "osc1", "osc2", "f2s_periph_ref_clk" }, 3,
+		0x80, 0x00c00000 },
+	{ "sdram_pll", { "osc1", "osc2", "f2s_sdram_ref_clk" }, 3,
+		0xc0, 0x00c00000 },
+	{ "l4_mp_clk", { "mainclk", "per_base_clk" }, 2, 0x70, 0x00000001 },
+	{ "l4_sp_clk", { "mainclk", "per_base_clk" }, 2, 0x70, 0x00000002 },
+	{ "sdmmc_clk",
+	    { "f2s_periph_ref_clk", "main_nand_sdmmc_clk", "per_nand_mmc_clk" },
+	    3, 0xac, 0x00000003 },
+	{ "nand_x_clk",
+	    { "f2s_periph_ref_clk", "main_nand_sdmmc_clk", "per_nand_mmc_clk" },
+	    3, 0xac, 0x0000000c },
+	{ "qspi_clk", { "f2s_periph_ref_clk", "main_qspi_clk", "per_qsi_clk" },
+	    3, 0xac, 0x00000030 },
+
+	/* Don't special case bypass */
+	{ "dbg_base_clk", { "main_pll" }, 1, 0, 0 },
+	/* Bug in dtb */
+	{ "nand_clk", { "nand_x_clk" }, 1, 0, 0 },
+};
+
+static const char * const cycv_clkmgr_compat_fixed[] = { "fixed-clock", NULL };
+static const char * const cycv_clkmgr_compat_pll[] = { "altr,socfpga-pll-clock",
+	NULL };
+static const char * const cycv_clkmgr_compat_perip[] = {
+	"altr,socfpga-perip-clk",
+	"altr,socfpga-gate-clk",
+	NULL
+};
+
+static void
+cycv_clkmgr_clock_parse(struct cycv_clkmgr_softc *sc, int handle, u_int clkno)
+{
+	struct cycv_clk *clk = &sc->sc_clocks[clkno];
+	int flags = 0;
+	const uint8_t *buf;
+	int len;
+
+	clk->base.domain = &sc->sc_clkdom;
+	clk->base.name = fdtbus_get_string(handle, "name");
+	clk->base.flags = 0;
+
+	clk->id = handle;
+	clk->parent = NULL;
+	clk->parent_id = 0;
+	clk->refcnt = 0;
+
+	if (of_compatible(handle, cycv_clkmgr_compat_fixed) != -1) {
+		clk->type = CYCV_CLK_TYPE_FIXED;
+		if (of_getprop_uint32(handle, "clock-frequency",
+				      &clk->u.fixed_freq) == 0) {
+			flags |= CYCV_CLK_FLAG_IS_AVAIL;
+		}
+	} else if (of_compatible(handle, cycv_clkmgr_compat_pll) != -1) {
+		if (fdtbus_get_reg(handle, 0, &clk->u.pll_addr, NULL) != 0)
+			goto err;
+		clk->type = CYCV_CLK_TYPE_PLL;
+		flags |= CYCV_CLK_FLAG_IS_AVAIL;
+	} else if (of_compatible(handle, cycv_clkmgr_compat_perip) != -1) {
+		if (of_getprop_uint32(handle, "fixed-divider",
+				      &clk->u.fixed_div) == 0) {
+			clk->type = CYCV_CLK_TYPE_FIXED_DIV;
+		} else if (fdtbus_get_reg(handle, 0, &clk->u.div.addr, NULL) ==
+				0) {
+			clk->type = CYCV_CLK_TYPE_DIV;
+			clk->u.div.shift = 0;
+			clk->u.div.mask = 0xff;
+		} else if ((buf = fdtbus_get_prop(handle, "div-reg", &len)) !=
+				NULL) {
+			if (len != 3 * 4)
+				goto err;
+
+			clk->type = CYCV_CLK_TYPE_DIV;
+			clk->u.div.addr = of_decode_int(buf);
+			clk->u.div.shift = of_decode_int(buf + 4);
+			clk->u.div.mask = ((1 << of_decode_int(buf + 8)) - 1) <<
+				clk->u.div.shift;
+		} else {
+			/* Simply a gate and/or a mux */
+			clk->type = CYCV_CLK_TYPE_FIXED_DIV;
+			clk->u.fixed_div = 1;
+		}
+		flags |= CYCV_CLK_FLAG_IS_AVAIL;
+	} else
+		goto err;
+
+	if ((buf = fdtbus_get_prop(handle, "clk-gate", &len)) != NULL) {
+		clk->gate_addr = of_decode_int(buf);
+		clk->gate_shift = of_decode_int(buf + 4);
+		flags |= CYCV_CLK_FLAG_HAVE_GATE;
+	}
+
+	buf = fdtbus_get_prop(handle, "clocks", &len);
+	if (buf != NULL && len == sizeof (uint32_t)) {
+		clk->parent_id =
+			fdtbus_get_phandle_from_native(of_decode_int(buf));
+	}
+
+	clk->flags = flags;
+
+	fdtbus_register_clock_controller(sc->sc_dev, handle,
+		&cycv_clkmgr_fdtclock_funcs);
+
+	return;
+err:
+	aprint_debug_dev(sc->sc_dev, "(%s) error parsing phandle %d\n",
+		clk->base.name, handle);
+}
+
+static u_int
+cycv_clkmgr_clocks_traverse(struct cycv_clkmgr_softc *sc, int clocks_handle,
+			    void func(struct cycv_clkmgr_softc *, int, u_int),
+			    u_int nclocks)
+{
+	int clk_handle;
+
+	for (clk_handle = OF_child(clocks_handle); clk_handle != 0;
+					clk_handle = OF_peer(clk_handle)) {
+		if (func != NULL)
+			func(sc, clk_handle, nclocks);
+		nclocks++;
+
+		nclocks = cycv_clkmgr_clocks_traverse(sc, clk_handle, func,
+						      nclocks);
+	}
+
+	return nclocks;
+}
+
+static struct cycv_clk_mux_info *
+cycv_clkmgr_get_mux_info(const char *name) {
+	size_t i;
+
+	for (i = 0; i < __arraycount(cycv_clk_mux_tree); i++) {
+		struct cycv_clk_mux_info *cand = &cycv_clk_mux_tree[i];
+		if (strncmp(name, cand->name, strlen(cand->name)) == 0)
+			return cand;
+	}
+
+	return NULL;
+}
+
+static struct cycv_clk *
+cycv_clkmgr_clock_lookup_by_id(struct cycv_clkmgr_softc *sc, int id)
+{
+	size_t i;
+
+	for (i = 0; i < sc->sc_nclocks; i++) {
+		if (sc->sc_clocks[i].id == id)
+			return &sc->sc_clocks[i];
+	}
+
+	return NULL;
+}
+
+static struct cycv_clk *
+cycv_clkmgr_clock_lookup_by_name(struct cycv_clkmgr_softc *sc, const char *name)
+{
+	size_t i;
+
+	for (i = 0; i < sc->sc_nclocks; i++) {
+		struct cycv_clk *cand = &sc->sc_clocks[i];
+		if (strncmp(cand->base.name, name, strlen(name)) == 0)
+			return cand;
+	}
+
+	return NULL;
+}
+
+static void
+cycv_clkmgr_clock_print(struct cycv_clkmgr_softc *sc, struct cycv_clk *clk) {
+	uint32_t numer;
+	uint32_t denom;
+	uint32_t tmp;
+
+	aprint_debug("clock %s, id %d, frequency %uHz:\n", clk->base.name,
+		     clk->id, cycv_clkmgr_clock_get_rate(sc, &clk->base));
+	if (clk->parent != NULL)
+		aprint_debug("parent: %s", clk->parent->base.name);
+	else
+		aprint_debug("parent_id: %d", clk->parent_id);
+	aprint_debug(", flags: %d\n", clk->flags);
+	switch (clk->type) {
+	case CYCV_CLK_TYPE_PLL:
+		tmp = bus_space_read_4(sc->sc_bst, sc->sc_bsh, clk->u.pll_addr);
+		numer = __SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_NUMER) + 1;
+		denom = __SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_DENOM) + 1;
+		aprint_debug(" PLL num = %u, den = %u\n", numer, denom);
+		break;
+	case CYCV_CLK_TYPE_FIXED:
+		aprint_debug(" Fixed frequency = %u\n", clk->u.fixed_freq);
+		break;
+	case CYCV_CLK_TYPE_FIXED_DIV:
+		aprint_debug(" Fixed divisor = %u\n", clk->u.fixed_div);
+		break;
+	case CYCV_CLK_TYPE_DIV:
+		tmp = bus_space_read_4(sc->sc_bst, sc->sc_bsh, clk->u.div.addr);
+		tmp = (tmp & clk->u.div.mask) >> clk->u.div.shift;
+		if (__SHIFTOUT_MASK(clk->u.div.mask) > 0xf)
+			tmp += 1;
+		else
+			tmp = (1 << tmp);
+		aprint_debug(" Divisor = %u\n", tmp);
+		break;
+	default:
+		aprint_debug(" Unknown!!!\n");
+		break;
+	}
+
+	if (clk->flags & CYCV_CLK_FLAG_HAVE_GATE) {
+		tmp = bus_space_read_4(sc->sc_bst, sc->sc_bsh, clk->gate_addr);
+		tmp &= (1 << clk->gate_shift);
+		aprint_debug(" Gate %s\n", tmp? "on" : "off");
+	}
+
+
+}
+
+static struct clk *
+cycv_clkmgr_clock_decode(device_t dev, int cc_phandle, const void *data,
+			 size_t len)
+{
+	struct cycv_clkmgr_softc *sc = device_private(dev);
+	struct cycv_clk *clk;
+
+	if (data != NULL || len != 0) {
+		aprint_debug_dev(dev, "can't decode clock entry\n");
+		return NULL;
+	}
+
+	clk = cycv_clkmgr_clock_lookup_by_id(sc, cc_phandle);
+
+	return clk == NULL? NULL : &clk->base;
+}
+
+static struct clk *
+cycv_clkmgr_clock_get(void *priv, const char *name)
+{
+	aprint_debug("%s: called and not implemented\n", __func__);
+	(void) cycv_clkmgr_get_mux_info;
+	(void) cycv_clkmgr_clock_lookup_by_name;
+
+	return NULL;
+}
+
+static void
+cycv_clkmgr_clock_put(void *priv, struct clk *clk)
+{
+	aprint_debug("%s: called and not implemented\n", __func__);
+}
+
+static u_int
+cycv_clkmgr_clock_get_rate(void *priv, struct clk *base_clk)
+{
+	struct cycv_clkmgr_softc *sc = priv;
+	struct cycv_clk *clk = (struct cycv_clk *) base_clk;
+	struct cycv_clk *parent;
+	uint32_t parent_rate = 0;
+	uint32_t divisor = 0;
+	uint32_t numer;
+	uint32_t tmp;
+
+	if (clk->type == CYCV_CLK_TYPE_FIXED)
+		return clk->u.fixed_freq;
+
+	parent = (struct cycv_clk *)
+		cycv_clkmgr_clock_get_parent(priv, base_clk);
+	if (parent == NULL) {
+		aprint_debug_dev(sc->sc_dev, "can't get parent of clock %s\n",
+				 clk->base.name);
+		return 0;
+	}
+	parent_rate = cycv_clkmgr_clock_get_rate(priv, &parent->base);
+
+	if (strncmp(clk->base.name, "mpuclk@", strlen("mpuclk@")) == 0)
+		parent_rate /= 2;
+	else if (strncmp(clk->base.name, "mainclk@", strlen("mainclk@")) == 0)
+		parent_rate /= 4;
+	else if (strncmp(clk->base.name, "dbgatclk@", strlen("dbgatclk@")) == 0)
+		parent_rate /= 4;
+
+	switch (clk->type) {
+	case CYCV_CLK_TYPE_FIXED_DIV:
+		return parent_rate / clk->u.fixed_div;
+
+	case CYCV_CLK_TYPE_DIV:
+		divisor = bus_space_read_4(sc->sc_bst, sc->sc_bsh,
+					   clk->u.div.addr);
+		divisor = (divisor & clk->u.div.mask) >> clk->u.div.shift;
+		if (__SHIFTOUT_MASK(clk->u.div.mask) > 0xf)
+			divisor += 1;
+		else
+			divisor = (1 << divisor);
+
+		return parent_rate / divisor;
+
+	case CYCV_CLK_TYPE_PLL:
+		tmp = bus_space_read_4(sc->sc_bst, sc->sc_bsh, clk->u.pll_addr);
+		numer = __SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_NUMER) + 1;
+		divisor = __SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_DENOM) + 1;
+
+		return (uint64_t) parent_rate * numer / divisor;
+	}
+
+	aprint_debug_dev(sc->sc_dev, "unknown clock type %d\n", clk->type);
+
+	return 0;
+}
+
+static int
+cycv_clkmgr_clock_set_rate(void *priv, struct clk *clk, u_int rate)
+{
+	aprint_debug("%s: called and not implemented\n", __func__);
+	return EINVAL;
+}
+
+static int
+cycv_clkmgr_clock_set(void *priv, struct clk *base_clk, int val) {
+	struct cycv_clkmgr_softc *sc = priv;
+	struct cycv_clk *clk = (struct cycv_clk *) base_clk;
+
+	if (clk->flags & CYCV_CLK_FLAG_HAVE_GATE) {
+		uint32_t tmp = bus_space_read_4(sc->sc_bst, sc->sc_bsh,
+			clk->gate_addr);
+		tmp &= ~(1 << clk->gate_shift);
+		tmp |= val << clk->gate_shift;
+		bus_space_write_4(sc->sc_bst, sc->sc_bsh, clk->gate_addr, tmp);
+	} else
+		/* XXX should iterate to the root of the clock domain */
+		return 0;
+
+	return 0;
+}
+
+static int
+cycv_clkmgr_clock_enable(void *priv, struct clk *clk)
+{
+	return cycv_clkmgr_clock_set(priv, clk, 1);
+}
+
+static int
+cycv_clkmgr_clock_disable(void *priv, struct clk *clk)
+{
+	return cycv_clkmgr_clock_set(priv, clk, 0);
+}
+
+static int
+cycv_clkmgr_clock_set_parent(void *priv, struct clk *clk,
+    struct clk *clk_parent)
+{
+	/* lookup clk in muxinfo table */
+	/* if not found, parent is not settable */
+	/* check if clk_parent can be a parent (by name) */
+	/* beware of special case where there is only one parent in mux */
+	/* enact reparenting h/w wise, update clk->parent */
+	aprint_debug("%s: called and not implemented\n", __func__);
+	return EINVAL;
+}
+
+static struct clk *
+cycv_clkmgr_clock_get_parent(void *priv, struct clk *base_clk)
+{
+	struct cycv_clkmgr_softc *sc = priv;
+	struct cycv_clk *clk = (struct cycv_clk *) base_clk;
+	struct cycv_clk_mux_info *mux;
+	struct cycv_clk *parent = clk->parent;
+	int parent_index;
+	uint32_t tmp;
+
+	if (parent != NULL)
+		goto update;
+
+	if (clk->parent_id != 0) {
+		parent = cycv_clkmgr_clock_lookup_by_id(sc, clk->parent_id);
+		goto update;
+	}
+
+	mux = cycv_clkmgr_get_mux_info(clk->base.name);
+
+	if (mux == NULL)
+		goto update;
+
+	if (mux->nparents == 1)
+		parent_index = 0;
+	else {
+		tmp = bus_space_read_4(sc->sc_bst, sc->sc_bsh, mux->addr);
+		parent_index = __SHIFTOUT(tmp, mux->mask);
+	}
+
+	if (parent_index >= mux->nparents) {
+		aprint_error_dev(sc->sc_dev,
+				 "clock %s parent has non existent index %d\n",
+				 clk->base.name, parent_index);
+		goto update;
+	}
+
+	parent = cycv_clkmgr_clock_lookup_by_name(sc,
+						  mux->parents[parent_index]);
+
+update:
+	clk->parent = parent;
+	return &parent->base;
+}
+
+/*
+ * Functions called during early startup, possibly before autoconfiguration.
+ */
+
+uint32_t
+cycv_clkmgr_early_get_mpu_clk(void) {
+	bus_space_tag_t bst = &armv7_generic_bs_tag;
+	bus_space_handle_t bsh;
+	uint32_t tmp;
+	uint64_t vco;
+
+	bus_space_map(bst, CYCV_CLKMGR_BASE, CYCV_CLKMGR_SIZE, 0, &bsh);
+
+	tmp = bus_space_read_4(bst, bsh, CYCV_CLKMGR_MAIN_PLL_VCO);
+	vco = (uint64_t) CYCV_CLOCK_OSC1 *
+		(__SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_NUMER) + 1) /
+		(__SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_DENOM) + 1);
+	tmp = bus_space_read_4(bst, bsh, CYCV_CLKMGR_MAIN_PLL_MPUCLK);
+
+	return vco / 2 / (__SHIFTOUT(tmp, CYCV_CLKMGR_MAIN_PLL_MPUCLK_CNT) + 1);
+}
+
+uint32_t
+cycv_clkmgr_early_get_l4_sp_clk(void) {
+	bus_space_tag_t bst = &armv7_generic_bs_tag;
+	bus_space_handle_t bsh;
+	uint32_t tmp;
+	uint32_t res;
+	uint64_t vco;
+
+	bus_space_map(bst, CYCV_CLKMGR_BASE, CYCV_CLKMGR_SIZE, 0, &bsh);
+
+	tmp = bus_space_read_4(bst, bsh, CYCV_CLKMGR_MAIN_PLL_L4SRC);
+	if (__SHIFTOUT(tmp, CYCV_CLKMGR_MAIN_PLL_L4SRC_L4SP) == 0) {
+		/* L4 SP clock driven by main clock */
+		vco = (uint64_t) CYCV_CLOCK_OSC1 *
+			(__SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_NUMER) + 1) /
+			(__SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_DENOM) + 1);
+		tmp = bus_space_read_4(bst, bsh, CYCV_CLKMGR_MAIN_PLL_MAINCLK);
+		tmp = __SHIFTOUT(tmp, CYCV_CLKMGR_MAIN_PLL_MAINCLK_CNT);
+
+		res = vco / 4 / (tmp + 1);
+	} else {
+		/* L4 SP clock driven by periph clock */
+		vco = (uint64_t) CYCV_CLOCK_OSC1 *
+			(__SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_NUMER) + 1) /
+			(__SHIFTOUT(tmp, CYCV_CLKMGR_PLL_VCO_DENOM) + 1);
+		tmp = bus_space_read_4(bst, bsh,
+			CYCV_CLKMGR_PERI_PLL_PERBASECLK);
+		tmp = __SHIFTOUT(tmp, CYCV_CLKMGR_PERI_PLL_PERBASECLK_CNT);
+
+		res = vco / (tmp + 1);
+	}
+
+	tmp = bus_space_read_4(bst, bsh, CYCV_CLKMGR_MAIN_PLL_MAINDIV);
+	tmp = __SHIFTOUT(tmp, CYCV_CLKMGR_MAIN_PLL_MAINDIV_L4SP);
+
+	printf("%s: returning %u\n", __func__, (uint32_t)
+		(res / (1 << tmp)));
+	return res / (1 << tmp);
+}
Index: src/sys/arch/arm/altera/cycv_dwcmmc.c
diff -u /dev/null src/sys/arch/arm/altera/cycv_dwcmmc.c:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/cycv_dwcmmc.c	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,163 @@
+/* $NetBSD: cycv_dwcmmc.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+
+/*-
+ * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: cycv_dwcmmc.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+
+#include <dev/ic/dwc_mmc_reg.h>
+#include <dev/ic/dwc_mmc_var.h>
+#include <dev/fdt/fdtvar.h>
+
+#define	FIFO_REG	0x200
+
+static int	cycv_dwcmmc_match(device_t, cfdata_t, void *);
+static void	cycv_dwcmmc_attach(device_t, device_t, void *);
+
+static int	cycv_dwcmmc_card_detect(struct dwc_mmc_softc *);
+
+struct cycv_dwcmmc_softc {
+	struct dwc_mmc_softc	sc;
+	struct clk		*sc_clk_biu;
+	struct clk		*sc_clk_ciu;
+};
+
+CFATTACH_DECL_NEW(cycv_dwcmmc, sizeof(struct dwc_mmc_softc),
+	cycv_dwcmmc_match, cycv_dwcmmc_attach, NULL, NULL);
+
+static const char * const cycv_dwcmmc_compat[] = {
+	"altr,socfpga-dw-mshc",
+	NULL
+};
+
+static int
+cycv_dwcmmc_match(device_t parent, cfdata_t cf, void *aux)
+{
+	struct fdt_attach_args * const faa = aux;
+
+	return of_match_compatible(faa->faa_phandle, cycv_dwcmmc_compat);
+}
+
+static void
+cycv_dwcmmc_attach(device_t parent, device_t self, void *aux)
+{
+	struct cycv_dwcmmc_softc *esc = device_private(self);
+	struct dwc_mmc_softc *sc = &esc->sc;
+	struct fdt_attach_args * const faa = aux;
+	const int phandle = faa->faa_phandle;
+	char intrstr[128];
+	bus_addr_t addr;
+	bus_size_t size;
+	u_int fifo_depth;
+	int error;
+
+	if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
+		aprint_error(": couldn't get registers\n");
+		return;
+	}
+
+	if (of_getprop_uint32(phandle, "fifo-depth", &fifo_depth)) {
+		fifo_depth = 64;
+	}
+
+	esc->sc_clk_biu = fdtbus_clock_get(phandle, "biu");
+	if (esc->sc_clk_biu == NULL) {
+		aprint_error(": couldn't get clock biu\n");
+		return;
+	}
+	esc->sc_clk_ciu = fdtbus_clock_get(phandle, "ciu");
+	if (esc->sc_clk_ciu == NULL) {
+		aprint_error(": couldn't get clock ciu\n");
+		return;
+	}
+
+	error = clk_enable(esc->sc_clk_biu);
+	if (error) {
+		aprint_error(": couldn't enable clock biu: %d\n", error);
+		return;
+	}
+	error = clk_enable(esc->sc_clk_ciu);
+	if (error) {
+		aprint_error(": couldn't enable clock ciu: %d\n", error);
+		return;
+	}
+
+	sc->sc_dev = self;
+	sc->sc_bst = faa->faa_bst;
+	sc->sc_dmat = faa->faa_dmat;
+	error = bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh);
+	if (error) {
+		aprint_error(": couldn't map %#llx: %d\n",
+		    (uint64_t)addr, error);
+		return;
+	}
+
+	sc->sc_clock_freq = clk_get_rate(esc->sc_clk_ciu);
+	sc->sc_fifo_depth = fifo_depth;
+	sc->sc_fifo_reg = FIFO_REG;
+	sc->sc_flags = DWC_MMC_F_USE_HOLD_REG | DWC_MMC_F_DMA;
+
+	sc->sc_card_detect = cycv_dwcmmc_card_detect;
+	sc->sc_write_protect = NULL;
+
+	aprint_naive("\n");
+	aprint_normal(": MHS (%u Hz)\n", sc->sc_clock_freq);
+
+	if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof(intrstr))) {
+		aprint_error_dev(self, "failed to decode interrupt\n");
+		return;
+	}
+
+	if (dwc_mmc_init(sc) != 0)
+		return;
+
+	sc->sc_ih = fdtbus_intr_establish(phandle, 0, IPL_BIO, 0,
+	    dwc_mmc_intr, sc);
+	if (sc->sc_ih == NULL) {
+		aprint_error_dev(self, "couldn't establish interrupt on %s\n",
+		    intrstr);
+		return;
+	}
+	aprint_normal_dev(self, "interrupting on %s\n", intrstr);
+}
+
+static int
+cycv_dwcmmc_card_detect(struct dwc_mmc_softc *sc)
+{
+	/* Card detection is broken on the nanosoc. Pretend it's present. */
+
+	return 0;
+}
Index: src/sys/arch/arm/altera/cycv_gmac.c
diff -u /dev/null src/sys/arch/arm/altera/cycv_gmac.c:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/cycv_gmac.c	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,143 @@
+/* $NetBSD: cycv_gmac.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+
+/*-
+ * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* Taken from sunxi_gmac.c */
+
+#include <sys/cdefs.h>
+
+__KERNEL_RCSID(0, "$NetBSD: cycv_gmac.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/gpio.h>
+
+#include <net/if.h>
+#include <net/if_ether.h>
+#include <net/if_media.h>
+
+#include <dev/mii/miivar.h>
+
+#include <dev/ic/dwc_gmac_var.h>
+#include <dev/ic/dwc_gmac_reg.h>
+
+#include <dev/fdt/fdtvar.h>
+
+static const char * compatible[] = { "altr,socfpga-stmmac", NULL };
+
+static int
+cycv_gmac_intr(void *arg)
+{
+	return dwc_gmac_intr(arg);
+}
+
+static int
+cycv_gmac_match(device_t parent, cfdata_t cf, void *aux)
+{
+	struct fdt_attach_args * const faa = aux;
+
+	return of_match_compatible(faa->faa_phandle, compatible);
+}
+
+static void
+cycv_gmac_attach(device_t parent, device_t self, void *aux)
+{
+	struct dwc_gmac_softc * const sc = device_private(self);
+	struct fdt_attach_args * const faa = aux;
+	const int phandle = faa->faa_phandle;
+	struct clk *clk_gmac;
+	struct fdtbus_reset *rst_gmac;
+	const char *phy_mode;
+	char intrstr[128];
+	bus_addr_t addr;
+	bus_size_t size;
+
+	if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
+		aprint_error(": couldn't get registers\n");
+		return;
+	}
+
+	sc->sc_dev = self;
+	sc->sc_bst = faa->faa_bst;
+	if (bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh) != 0) {
+		aprint_error(": couldn't map registers\n");
+		return;
+	}
+	sc->sc_dmat = faa->faa_dmat;
+
+	if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof intrstr)) {
+		aprint_error(": failed to decode interrupt\n");
+		return;
+	}
+
+	clk_gmac = fdtbus_clock_get(phandle, "stmmaceth");
+	if (clk_gmac == NULL) {
+		aprint_error(": couldn't get clock\n");
+		return;
+	}
+
+	rst_gmac = fdtbus_reset_get(phandle, "stmmaceth");
+	if (rst_gmac == NULL) {
+		aprint_error(": couldn't get reset\n");
+		return;
+	}
+
+	phy_mode = fdtbus_get_string(phandle, "phy-mode");
+	if (phy_mode == NULL) {
+		aprint_error(": missing 'phy-mode' property\n");
+		return;
+	}
+
+	if (clk_enable(clk_gmac) != 0) {
+		aprint_error(": couldn't enable clocks\n");
+		return;
+	}
+
+	if (rst_gmac != NULL && fdtbus_reset_deassert(rst_gmac) != 0) {
+		aprint_error(": couldn't de-assert reset\n");
+		return;
+	}
+
+	aprint_naive("\n");
+	aprint_normal(": GMAC\n");
+
+	if (fdtbus_intr_establish(phandle, 0, IPL_NET, 0,
+				  cycv_gmac_intr, sc) == NULL) {
+		aprint_error_dev(self, "failed to establish interrupt on %s\n",
+				 intrstr);
+		return;
+	}
+	aprint_normal_dev(self, "interrupting on %s\n", intrstr);
+
+	dwc_gmac_attach(sc, GMAC_MII_CLK_150_250M_DIV102);
+}
+
+CFATTACH_DECL_NEW(cycv_gmac, sizeof(struct dwc_gmac_softc),
+	cycv_gmac_match, cycv_gmac_attach, NULL, NULL);
Index: src/sys/arch/arm/altera/cycv_intr.h
diff -u /dev/null src/sys/arch/arm/altera/cycv_intr.h:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/cycv_intr.h	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,5 @@
+/* $NetBSD: cycv_intr.h,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+
+#include <arm/fdt/fdt_intr.h>
+#include <arm/cortex/gic_intr.h>
+#include <arm/cortex/a9tmr_intr.h>
Index: src/sys/arch/arm/altera/cycv_platform.c
diff -u /dev/null src/sys/arch/arm/altera/cycv_platform.c:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/cycv_platform.c	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,145 @@
+/* $NetBSD: cycv_platform.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+
+/* This file is in the public domain. */
+
+#include "arml2cc.h"
+#include "opt_multiprocessor.h"
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: cycv_platform.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $");
+
+#define	_ARM32_BUS_DMA_PRIVATE
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/device.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <arm/altera/cycv_reg.h>
+#include <arm/altera/cycv_var.h>
+#include <arm/cortex/a9tmr_var.h>
+#include <arm/cortex/pl310_var.h>
+#include <arm/cortex/scu_reg.h>
+
+#include <arm/bootconfig.h>
+#include <arm/cpufunc.h>
+
+#include <arm/fdt/arm_fdtvar.h>
+#include <dev/fdt/fdtvar.h>
+
+static void cycv_platform_early_putchar(char);
+
+static const struct pmap_devmap *
+cycv_platform_devmap(void) {
+	static const struct pmap_devmap devmap[] = {
+		DEVMAP_ENTRY(CYCV_PERIPHERAL_VBASE,
+				CYCV_PERIPHERAL_BASE,
+				CYCV_PERIPHERAL_SIZE),
+		DEVMAP_ENTRY_END
+	};
+
+	return devmap;
+}
+
+extern void cortex_mpstart(void);
+
+static void
+cycv_platform_bootstrap(void) {
+	uint32_t startfunc = (uint32_t) cortex_mpstart;
+	bus_space_tag_t bst = &armv7_generic_bs_tag;
+	bus_space_handle_t bsh_l2c;
+	bus_space_handle_t bsh_rst;
+	bus_space_handle_t bsh_scu;
+
+	bus_space_map(bst, CYCV_L2CACHE_BASE, CYCV_L2CACHE_SIZE, 0, &bsh_l2c);
+	bus_space_map(bst, CYCV_RSTMGR_BASE, CYCV_RSTMGR_SIZE, 0, &bsh_rst);
+	bus_space_map(bst, CYCV_SCU_BASE, CYCV_SCU_SIZE, 0, &bsh_scu);
+
+	/* Enable Snoop Control Unit */
+	bus_space_write_4(bst, bsh_rst, SCU_CTL,
+		bus_space_read_4(bst, bsh_rst, SCU_CTL) | SCU_CTL_SCU_ENA);
+
+#if NARML2CC > 0
+	arml2cc_init(bst, bsh_l2c, 0);
+#endif
+
+	/*
+	 * We place a "B cortex_mpstart" at address 0 in order to bootstrap
+	 * CPU 1. We can't use the similar feature of the Boot ROM because
+	 * it was unmapped by u-boot in favor of the SDRAM. Plus the dtb is
+	 * stored very low in RAM so we can't re-map the Boot ROM easily.
+	 */
+
+	*(volatile uint32_t *) 0x0 = 0xea000000 | ((startfunc - 8 - 0x0) >> 2);
+
+	arm_cpu_max = 2;
+
+	arm_dsb();
+
+	armv7_dcache_wbinv_all();
+
+	bus_space_write_4(bst, bsh_rst, CYCV_RSTMGR_MPUMODRST,
+		bus_space_read_4(bst, bsh_rst, CYCV_RSTMGR_MPUMODRST) &
+			~CYCV_RSTMGR_MPUMODRST_CPU1);
+}
+
+static void
+cycv_platform_init_attach_args(struct fdt_attach_args *faa) {
+	faa->faa_bst = &armv7_generic_bs_tag;
+	faa->faa_a4x_bst = &armv7_generic_a4x_bs_tag;
+	faa->faa_dmat = &arm_generic_dma_tag;
+}
+
+static void
+cycv_platform_early_putchar(char c) {
+#ifdef CONSADDR
+#define CONSADDR_VA (CONSADDR - CYCV_PERIPHERAL_BASE + CYCV_PERIPHERAL_VBASE)
+	volatile uint32_t *uartaddr = (volatile uint32_t *) CONSADDR_VA;
+
+	while ((uartaddr[com_lsr] & LSR_TXRDY) == 0)
+		;
+
+	uartaddr[com_data] = c;
+#endif
+}
+
+static void
+cycv_platform_device_register(device_t dev, void *aux) {
+	prop_dictionary_t dict = device_properties(dev);
+
+	if (device_is_a(dev, "arma9tmr")) {
+		prop_dictionary_set_uint32(dict, "frequency",
+			cycv_clkmgr_early_get_mpu_clk() / 4);
+	}
+}
+
+static void
+cycv_platform_reset(void) {
+	bus_space_tag_t bst = &armv7_generic_bs_tag;
+	bus_space_handle_t bsh;
+	uint32_t val;
+
+	bus_space_map(bst, CYCV_RSTMGR_BASE, CYCV_RSTMGR_SIZE, 0, &bsh);
+	val = bus_space_read_4(bst, bsh, CYCV_RSTMGR_CTRL);
+	bus_space_write_4(bst, bsh, CYCV_RSTMGR_CTRL,
+		val | CYCV_RSTMGR_CTRL_SWCOLDRSTREQ);
+}
+
+static u_int
+cycv_platform_uart_freq(void) {
+	return cycv_clkmgr_early_get_l4_sp_clk();
+}
+
+static const struct arm_platform cycv_platform = {
+	.ap_devmap = cycv_platform_devmap,
+	.ap_bootstrap = cycv_platform_bootstrap,
+	.ap_init_attach_args = cycv_platform_init_attach_args,
+	.ap_early_putchar = cycv_platform_early_putchar,
+	.ap_device_register = cycv_platform_device_register,
+	.ap_reset = cycv_platform_reset,
+	.ap_delay = a9tmr_delay,
+	.ap_uart_freq = cycv_platform_uart_freq,
+};
+
+ARM_PLATFORM(cycv, "altr,socfpga-cyclone5", &cycv_platform);
Index: src/sys/arch/arm/altera/cycv_reg.h
diff -u /dev/null src/sys/arch/arm/altera/cycv_reg.h:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/cycv_reg.h	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,117 @@
+/* $NetBSD: cycv_reg.h,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+#ifndef _ARM_ALTERA_CYCV_REG_H
+#define _ARM_ALTERA_CYCV_REG_H
+
+#define CYCV_SDRAM_BASE		0x0
+
+#define CYCV_PERIPHERAL_BASE	0xFC000000
+#define CYCV_PERIPHERAL_SIZE	(64 * 1024 * 1024)
+
+#define CYCV_PERIPHERAL_VBASE	CYCV_PERIPHERAL_BASE
+
+/* Clock manager */
+
+#define CYCV_CLKMGR_BASE			0xFFD04000
+#define CYCV_CLKMGR_SIZE			0x1000
+
+#define CYCV_CLKMGR_CTRL			0x00
+#define CYCV_CLKMGR_CTRL_SAFEMODE			__BIT(0)
+#define CYCV_CLKMGR_CTRL_ENSFMDWR			__BIT(2)
+
+#define CYCV_CLKMGR_BYPASS			0x04
+#define CYCV_CLKMGR_BYPASS_MAINPLL			__BIT(0)
+#define CYCV_CLKMGR_BYPASS_SDRPLL			__BIT(1)
+#define CYCV_CLKMGR_BYPASS_SDRPLLSRC			__BIT(2)
+#define CYCV_CLKMGR_BYPASS_PERPLL			__BIT(3)
+#define CYCV_CLKMGR_BYPASS_PERPLLSRC			__BIT(4)
+
+#define CYCV_CLKMGR_INTER			0x08
+#define CYCV_CLKMGR_INT_MAINPLLACHIEVED			__BIT(0)
+#define CYCV_CLKMGR_INT_PERPLLACHIEVED			__BIT(1)
+#define CYCV_CLKMGR_INT_SDRPLLACHIEVED			__BIT(2)
+#define CYCV_CLKMGR_INT_MAINPLLLOST			__BIT(3)
+#define CYCV_CLKMGR_INT_PERPLLLOST			__BIT(4)
+#define CYCV_CLKMGR_INT_SDRPLLLOST			__BIT(5)
+#define CYCV_CLKMGR_INTER_MAINPLLLOCKED			__BIT(6)
+#define CYCV_CLKMGR_INTER_PERPLLLOCKED			__BIT(7)
+#define CYCV_CLKMGR_INTER_SDRPLLLOCKED			__BIT(8)
+
+#define CYCV_CLKMGR_INTREN			0x0C
+/* See CYCV_CLKMGR_INT_* above */
+
+#define CYCV_CLKMGR_DBCTRL			0x10
+#define CYCV_CLKMGR_STAT			0x14
+
+#define CYCV_CLKMGR_MAIN_PLL_VCO		0x40
+#define CYCV_CLKMGR_PLL_VCO_NUMER			__BITS(3, 15)
+#define CYCV_CLKMGR_PLL_VCO_DENOM			__BITS(16, 21)
+#define CYCV_CLKMGR_MAIN_PLL_MISC		0x44
+#define CYCV_CLKMGR_MAIN_PLL_MPUCLK		0x48
+#define CYCV_CLKMGR_MAIN_PLL_MPUCLK_CNT			__BITS(0, 8)
+#define CYCV_CLKMGR_MAIN_PLL_MAINCLK		0x4C
+#define CYCV_CLKMGR_MAIN_PLL_MAINCLK_CNT		__BITS(0, 8)
+#define CYCV_CLKMGR_MAIN_PLL_DBGATCLK		0x50
+#define CYCV_CLKMGR_MAIN_PLL_MAINQSPICLK	0x54
+#define CYCV_CLKMGR_MAIN_PLL_MAINNANDSDMMCCLK	0x58
+#define CYCV_CLKMGR_MAIN_PLL_CFGS2FUSER0CLK	0x5C
+#define CYCV_CLKMGR_MAIN_PLL_EN			0x60
+#define CYCV_CLKMGR_MAIN_PLL_MAINDIV		0x64
+#define CYCV_CLKMGR_MAIN_PLL_MAINDIV_L4SP		__BITS(7, 9)
+#define CYCV_CLKMGR_MAIN_PLL_DBGDIV		0x68
+#define CYCV_CLKMGR_MAIN_PLL_TRACEDIV		0x6C
+#define CYCV_CLKMGR_MAIN_PLL_L4SRC		0x70
+#define CYCV_CLKMGR_MAIN_PLL_L4SRC_L4SP			__BIT(1)
+#define CYCV_CLKMGR_MAIN_PLL_L4SRC_L4MP			__BIT(0)
+#define CYCV_CLKMGR_MAIN_PLL_STAT		0x74
+
+#define CYCV_CLKMGR_PERI_PLL_VCO		0x80
+#define CYCV_CLKMGR_PERI_PLL_MISC		0x84
+#define CYCV_CLKMGR_PERI_PLL_EMAC0CLK		0x88
+#define CYCV_CLKMGR_PERI_PLL_EMAC1CLK		0x8C
+#define CYCV_CLKMGR_PERI_PLL_PERQSPICLK		0x90
+#define CYCV_CLKMGR_PERI_PLL_PERNANDSDMMCCLK	0x94
+#define CYCV_CLKMGR_PERI_PLL_PERBASECLK		0x98
+#define CYCV_CLKMGR_PERI_PLL_PERBASECLK_CNT		__BITS(0, 8)
+#define CYCV_CLKMGR_PERI_PLL_H2FUSER1CLK	0x9C
+#define CYCV_CLKMGR_PERI_PLL_EN			0xA0
+#define CYCV_CLKMGR_PERI_PLL_DIV		0xA4
+#define CYCV_CLKMGR_PERI_PLL_GPIODIV		0xA8
+#define CYCV_CLKMGR_PERI_PLL_SRC		0xAC
+#define CYCV_CLKMGR_PERI_PLL_STAT		0xB0
+
+#define CYCV_CLKMGR_SDRAM_PLL_VCO		0xC0
+#define CYCV_CLKMGR_SDRAM_PLL_CTRL		0xC4
+#define CYCV_CLKMGR_SDRAM_PLL_DDRDQSCLK		0xC8
+#define CYCV_CLKMGR_SDRAM_PLL_DDR2XDQSCLK	0xCC
+#define CYCV_CLKMGR_SDRAM_PLL_DDRDQCLK		0xD0
+#define CYCV_CLKMGR_SDRAM_PLL_S2FUSER2CLK	0xD4
+#define CYCV_CLKMGR_SDRAM_PLL_EN		0xD8
+#define CYCV_CLKMGR_SDRAM_PLL_STAT		0xDC
+
+/* Reset manager */
+
+#define CYCV_RSTMGR_BASE			0xFFD05000
+#define CYCV_RSTMGR_SIZE			0x24
+
+#define CYCV_RSTMGR_STAT			0x00
+#define CYCV_RSTMGR_CTRL			0x04
+#define CYCV_RSTMGR_CTRL_SWCOLDRSTREQ			__BIT(0)
+#define CYCV_RSTMGR_COUNTS			0x08
+#define CYCV_RSTMGR_MPUMODRST			0x10
+#define CYCV_RSTMGR_MPUMODRST_CPU1			__BIT(1)
+#define CYCV_RSTMGR_PERMODRST			0x14
+#define CYCV_RSTMGR_PER2MODRST			0x18
+#define CYCV_RSTMGR_BRGMODRST			0x1C
+#define CYCV_RSTMGR_MISCMODRST			0x20
+
+/* Snoop Control Unit */
+
+#define CYCV_SCU_BASE				0xFFFEC000
+#define CYCV_SCU_SIZE				0x100
+
+/* Level 2 Cache */
+
+#define CYCV_L2CACHE_BASE			0xFFFEF000
+#define CYCV_L2CACHE_SIZE			0x1000
+
+#endif /* _ARM_ALTERA_CYCV_REG_H */
Index: src/sys/arch/arm/altera/cycv_rstmgr.c
diff -u /dev/null src/sys/arch/arm/altera/cycv_rstmgr.c:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/cycv_rstmgr.c	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,147 @@
+/* $NetBSD: cycv_rstmgr.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+
+/* This file is in the public domain. */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: cycv_rstmgr.c,v 1.1 2018/09/19 17:31:38 aymeric Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/atomic.h>
+#include <sys/kmem.h>
+
+#include <arm/altera/cycv_reg.h>
+#include <arm/altera/cycv_var.h>
+
+#include <dev/fdt/fdtvar.h>
+
+static int cycv_rstmgr_match(device_t, cfdata_t, void *);
+static void cycv_rstmgr_attach(device_t, device_t, void *);
+
+static void *cycv_rst_acquire(device_t, const void *, size_t);
+static void cycv_rst_release(device_t, void *);
+static int cycv_rst_reset_assert(device_t, void *);
+static int cycv_rst_reset_deassert(device_t, void *);
+
+static const struct fdtbus_reset_controller_func cycv_rstmgr_funcs = {
+	cycv_rst_acquire, cycv_rst_release,
+	cycv_rst_reset_assert, cycv_rst_reset_deassert
+};
+
+struct cycv_rstmgr_softc {
+	device_t sc_dev;
+
+	bus_space_tag_t sc_bst;
+	bus_space_handle_t sc_bsh;
+};
+
+struct cycv_reset {
+	bus_addr_t address;
+	uint32_t mask;
+};
+
+CFATTACH_DECL_NEW(cycvrstmgr, sizeof (struct cycv_rstmgr_softc),
+	cycv_rstmgr_match, cycv_rstmgr_attach, NULL, NULL);
+
+static struct cycv_rstmgr_softc *cycv_rstmgr_sc;
+
+static int
+cycv_rstmgr_match(device_t parent, cfdata_t cf, void *aux)
+{
+	const char *compatible[] = { "altr,rst-mgr", NULL };
+	struct fdt_attach_args *faa = aux;
+
+	return of_match_compatible(faa->faa_phandle, compatible);
+}
+
+static void
+cycv_rstmgr_attach(device_t parent, device_t self, void *aux)
+{
+	struct cycv_rstmgr_softc *sc = device_private(self);
+	struct fdt_attach_args *faa = aux;
+	int phandle = faa->faa_phandle;
+	bus_addr_t addr;
+	bus_size_t size;
+	int error;
+
+	if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
+		aprint_error(": couldn't get registers\n");
+		return;
+	}
+
+	sc->sc_dev = self;
+	sc->sc_bst = faa->faa_bst;
+	error = bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh);
+	if (error) {
+		aprint_error(": couldn't map %#llx: %d",
+			     (uint64_t) addr, error);
+		return;
+	}
+
+	aprint_normal(": reset manager\n");
+
+	fdtbus_register_reset_controller(self, phandle, &cycv_rstmgr_funcs);
+	cycv_rstmgr_sc = sc;
+}
+
+static void *
+cycv_rst_acquire(device_t dev, const void *data, size_t len) {
+	struct cycv_reset *reset = NULL;
+	uint32_t value;
+
+	if (len != sizeof value)
+		goto err_decode;
+
+	value = of_decode_int(data);
+	if (value < 0 || value >
+	    (CYCV_RSTMGR_MISCMODRST - CYCV_RSTMGR_PERMODRST + 4) / 4 * 32)
+		goto err_decode;
+
+	reset = kmem_alloc(sizeof *reset, KM_SLEEP);
+	reset->address = CYCV_RSTMGR_PERMODRST + value / 32 * 4;
+	reset->mask = 1 << (value % 32);
+
+	if (0) {
+err_decode:
+		aprint_debug_dev(dev, "couln't decode reset\n");
+	}
+	return reset;
+}
+
+static void
+cycv_rst_release(device_t dev, void *r) {
+	kmem_free(r, sizeof (struct cycv_reset));
+}
+
+static void
+cycv_rst_reset_set(device_t dev, struct cycv_reset *reset, int set) {
+	struct cycv_rstmgr_softc *sc = device_private(dev);
+	uint32_t val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, reset->address);
+
+	if (set)
+		val |= reset->mask;
+	else
+		val &= ~reset->mask;
+
+	bus_space_write_4(sc->sc_bst, sc->sc_bsh, reset->address, val);
+}
+
+static int
+cycv_rst_reset_assert(device_t dev, void *r) {
+
+	cycv_rst_reset_set(dev, r, 1);
+
+	return 0;
+}
+
+static int
+cycv_rst_reset_deassert(device_t dev, void *r) {
+
+	cycv_rst_reset_set(dev, r, 0);
+
+	return 0;
+}
Index: src/sys/arch/arm/altera/cycv_var.h
diff -u /dev/null src/sys/arch/arm/altera/cycv_var.h:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/cycv_var.h	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,18 @@
+/* $NetBSD: cycv_var.h,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+#ifndef _ARM_ALTERA_CYCV_VAR_H
+#define _ARM_ALTERA_CYCV_VAR_H
+
+#include <sys/types.h>
+#include <sys/bus.h>
+
+extern struct bus_space armv7_generic_bs_tag;
+extern struct bus_space armv7_generic_a4x_bs_tag;
+extern struct arm32_bus_dma_tag arm_generic_dma_tag;
+
+void cycv_bootstrap(void);
+void cycv_cpuinit(void);
+
+uint32_t cycv_clkmgr_early_get_mpu_clk(void);
+uint32_t cycv_clkmgr_early_get_l4_sp_clk(void);
+
+#endif /* _ARM_ALTERA_CYCV_VAR_H */
Index: src/sys/arch/arm/altera/files.altera
diff -u /dev/null src/sys/arch/arm/altera/files.altera:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/altera/files.altera	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,37 @@
+#	$NetBSD: files.altera,v 1.1 2018/09/19 17:31:38 aymeric Exp $
+#
+# Configuration for Altera SoC
+#
+
+file 	arch/arm/arm32/arm32_boot.c
+file 	arch/arm/arm32/arm32_kvminit.c
+file 	arch/arm/arm32/arm32_reboot.c
+file 	arch/arm/arm32/irq_dispatch.S
+
+file 	arch/arm/arm32/armv7_generic_space.c
+file 	arch/arm/arm/arm_generic_dma.c
+file 	arch/arm/arm/bus_space_a4x.S
+
+file 	arch/arm/altera/cycv_platform.c
+
+device 	cycvfdt : bus_space_generic, fdtbus
+attach 	cycvfdt at mainbus with cycv_fdt
+file 	arch/arm/altera/cycv_fdt.c			cycv_fdt
+
+# Clock manager
+device 	cycvclkmgr : fdtbus
+attach 	cycvclkmgr at fdt
+file 	arch/arm/altera/cycv_clkmgr.c			cycvclkmgr
+
+# Reset manager
+device 	cycvrstmgr : fdtbus
+attach 	cycvrstmgr at fdt
+file 	arch/arm/altera/cycv_rstmgr.c			cycvrstmgr
+
+# GMAC
+attach	awge at fdt with cycv_gmac
+file	arch/arm/altera/cycv_gmac.c			cycv_gmac
+
+# SD/MMC Host Controller
+attach	dwcmmc at fdt with cycv_dwcmmc
+file	arch/arm/altera/cycv_dwcmmc.c			cycv_dwcmmc

Index: src/sys/arch/arm/dts/socfpga_cyclone5_de0_sockit.dts
diff -u /dev/null src/sys/arch/arm/dts/socfpga_cyclone5_de0_sockit.dts:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/arm/dts/socfpga_cyclone5_de0_sockit.dts	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,17 @@
+
+
+#include "../../../external/gpl2/dts/dist/arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dts"
+
+/ {
+	soc {
+		gtimer@fffec200 {
+			compatible = "arm,cortex-a9-global-timer";
+			reg = <0xfffec200 0x20>;
+			clocks = <&mpu_periph_clk>;
+			interrupts = <1 11 0x301>;
+		};
+		usb@ffb40000 {
+			dr_mode = "host";
+		};
+	};
+};

Index: src/sys/arch/evbarm/altera/altera_start.S
diff -u /dev/null src/sys/arch/evbarm/altera/altera_start.S:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/evbarm/altera/altera_start.S	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,126 @@
+/*	$NetBSD: altera_start.S,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+
+#include "opt_arm_debug.h"
+#include "opt_fdt.h"
+
+#include <arm/armreg.h>
+#include <arm/asm.h>
+
+#include <arm/altera/cycv_reg.h>
+#include <evbarm/altera/platform.h>
+
+#include "assym.h"
+
+RCSID("$NetBSD: altera_start.S,v 1.1 2018/09/19 17:31:38 aymeric Exp $")
+
+#define MD_CPU_HATCH _C_LABEL(arm_fdt_cpu_hatch)
+
+#define INIT_MEMSIZE 128
+
+#define TEMP_L1_TABLE (KERNEL_BASE - KERNEL_BASE_VOFFSET + \
+				INIT_MEMSIZE * L1_S_SIZE - L1_TABLE_SIZE)
+
+#ifdef VERBOSE_INIT_ARM
+
+#ifndef CONADDR
+#define CONADDR 0xFFC02000
+#endif
+#define COM_MULT 4
+#ifdef __ARMEB__
+#define COM_BSWAP
+#endif
+
+#define XPUTC_COM
+#define XPUTC(x)	mov r0, x; bl xputc
+#else
+#define XPUTC(x)
+
+#endif /* VERBOSE_INIT_ARM */
+
+	.section .start, "ax", %progbits
+
+	.global	_C_LABEL(nanosoc_start)
+_C_LABEL(nanosoc_start):
+#ifdef __ARMEB__
+	setend	be
+#endif
+
+	mov	r9, #KERNEL_BASE_VOFFSET
+
+	cpsid	if, #PSR_SVC32_MODE
+
+	movw	r4, #:lower16:uboot_args
+	movt	r4, #:upper16:uboot_args
+	sub	r4, r4, r9
+	stmia	r4, {r0-r3}
+
+#ifdef FDT
+	/*
+	 * ARM boot protocol has FDT address in r2
+	 */
+	movw	r4, #:lower16:fdt_addr_r
+	movt	r4, #:upper16:fdt_addr_r
+	sub	r4, r4, r9
+	str	r2, [r4]
+#endif
+
+	bl	cortex_init
+
+	movw	r0, #:lower16:TEMP_L1_TABLE
+	movt	r0, #:upper16:TEMP_L1_TABLE
+	movw	r1, #:lower16:.Lmmu_init_table
+	movt	r1, #:upper16:.Lmmu_init_table
+	bl	arm_boot_l1pt_init
+
+	XPUTC(#'D')
+
+	movw	r0, #:lower16:TEMP_L1_TABLE
+	movt	r0, #:upper16:TEMP_L1_TABLE
+#ifdef KERNEL_BASES_EQUAL
+	bl	arm_cpuinit
+#else
+#ifdef VERBOSE_INIT_ARM
+	adr	r11, xputc
+#endif
+	movw	lr, #:lower16:1f
+	movt	lr, #:upper16:1f
+	b	arm_cpuinit
+	.pushsection .start, "ax", %progbits
+1:
+#endif
+/*
+	XPUTC2(#'Z')
+*/
+
+	b	start
+	/* NOTREACHED */
+
+#ifdef KERNEL_BASES_EQUAL
+	.popsection
+#endif
+
+#include <arm/cortex/a9_mpsubr.S>
+
+.Lmmu_init_table:
+	/* Map reset vector to bootstrap secondary cpu */
+	MMU_INIT(0, 0, 1, L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+
+	MMU_INIT(KERNEL_BASE, KERNEL_BASE - KERNEL_BASE_VOFFSET, INIT_MEMSIZE,
+		L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+
+#if KERNEL_BASE_VOFFSET != 0
+	/* Map KERNEL_BASE VA to SDRAM PA, write-back cacheable, shareable */
+	MMU_INIT(KERNEL_BASE - KERNEL_BASE_VOFFSET,
+		KERNEL_BASE - KERNEL_BASE_VOFFSET, INIT_MEMSIZE,
+		L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+#endif
+
+	/* Map peripherals */
+	MMU_INIT(CYCV_PERIPHERAL_VBASE, CYCV_PERIPHERAL_BASE,
+		(CYCV_PERIPHERAL_SIZE + L1_S_SIZE - 1) / L1_S_SIZE,
+		L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_V6_XN)
+
+	/* end of table */
+	MMU_INIT(0, 0, 0, 0)
+
+END(_C_LABEL(nanosoc_start))
Index: src/sys/arch/evbarm/altera/genassym.cf
diff -u /dev/null src/sys/arch/evbarm/altera/genassym.cf:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/evbarm/altera/genassym.cf	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,7 @@
+include <dev/ic/ns16550reg.h>
+include <dev/ic/comreg.h>
+
+define 	LSR_TSRE		LSR_TSRE
+define 	LSR_TXRDY		LSR_TXRDY
+define 	COM_DATA		com_data
+define 	COM_LSR			com_lsr
Index: src/sys/arch/evbarm/altera/platform.h
diff -u /dev/null src/sys/arch/evbarm/altera/platform.h:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/evbarm/altera/platform.h	Wed Sep 19 17:31:38 2018
@@ -0,0 +1,4 @@
+/* $NetBSD: platform.h,v 1.1 2018/09/19 17:31:38 aymeric Exp $ */
+
+#define KERNEL_VM_BASE	0x80000000
+#define KERNEL_VM_SIZE	0x40000000

Index: src/sys/arch/evbarm/conf/NANOSOC
diff -u /dev/null src/sys/arch/evbarm/conf/NANOSOC:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/evbarm/conf/NANOSOC	Wed Sep 19 17:31:39 2018
@@ -0,0 +1,65 @@
+#
+#	$NetBSD: NANOSOC,v 1.1 2018/09/19 17:31:39 aymeric Exp $
+#
+#	Altera DE0 Nano SoC
+#
+
+include	"arch/evbarm/conf/std.altera"
+include	"arch/evbarm/conf/GENERIC.common"
+
+makeoptions	DTSGNUARCH="arm"
+makeoptions	DTSSUBDIR="socfpga"
+makeoptions	DTS="socfpga_cyclone5_de0_sockit.dts"
+
+options 	CPU_CORTEXA9
+options 	MULTIPROCESSOR
+#options 	MEMSIZE=1024
+
+#options 	DEBUG
+#options 	LOCKDEBUG
+#options 	PMAP_DEBUG	# Enable pmap_debug_level code
+#options 	IPKDB		# remote kernel debugging
+#options 	VERBOSE_INIT_ARM # verbose bootstraping messages
+makeoptions	DEBUG="-g"	# compile full symbol table
+makeoptions	COPY_SYMTAB=1
+
+config		netbsd		root on ? type ?
+
+armfdt0		at root
+simplebus* 	at fdt? pass 0
+
+cpus*		at fdt? pass 0
+cpu*		at fdt? pass 0
+
+cycvrstmgr0 	at fdt? pass 0
+
+gic0		at fdt? pass 1
+armgic0		at gic?
+
+cycvclkmgr0 	at fdt? pass 1
+
+a9tmr0		at fdt? pass 2
+arma9tmr0	at a9tmr0
+
+l2cc0		at fdt? pass 2
+arml2cc0	at l2cc0
+
+com*		at fdt?
+options 	CONSADDR=0xFFC02000, CONSPEED=115200
+
+awge* 		at fdt?
+#micphy* 	at mii? phy?
+ukphy* 		at mii? phy?
+
+dwcmmc* 	at fdt?
+sdmmc*		at dwcmmc?
+ld*		at sdmmc?
+
+dwctwo* 	at fdt?
+usb*		at dwctwo?
+
+include "dev/usb/usbdevices.config"
+
+no umidi
+
+cinclude "arch/evbarm/conf/NANOSOC.local"
Index: src/sys/arch/evbarm/conf/files.altera
diff -u /dev/null src/sys/arch/evbarm/conf/files.altera:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/evbarm/conf/files.altera	Wed Sep 19 17:31:39 2018
@@ -0,0 +1,9 @@
+#	$NetBSD: files.altera,v 1.1 2018/09/19 17:31:39 aymeric Exp $
+#
+# Altera SoC configuration
+
+include "arch/arm/pic/files.pic"
+include "arch/arm/cortex/files.cortex"
+
+include "arch/evbarm/conf/files.fdt"
+include "arch/arm/altera/files.altera"
Index: src/sys/arch/evbarm/conf/mk.altera
diff -u /dev/null src/sys/arch/evbarm/conf/mk.altera:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/evbarm/conf/mk.altera	Wed Sep 19 17:31:39 2018
@@ -0,0 +1,30 @@
+#	$NetBSD: mk.altera,v 1.1 2018/09/19 17:31:39 aymeric Exp $
+CPPFLAGS+=		-mcpu=cortex-a9 -mfpu=neon
+
+SYSTEM_FIRST_OBJ=	altera_start.o
+SYSTEM_FIRST_SFILE=	${THISARM}/altera/altera_start.S
+
+GENASSYM_EXTRAS+=	${THISARM}/altera/genassym.cf
+
+_OSRELEASE!=		${HOST_SH} $S/conf/osrelease.sh
+
+MKUBOOTIMAGEARGS=	-A arm -T kernel -O linux
+MKUBOOTIMAGEARGS+=	-a $(KERNEL_BASE_PHYS) -e $(KERNEL_BASE_PHYS)
+MKUBOOTIMAGEARGS+=	-n "NetBSD/$(BOARDTYPE) ${_OSRELEASE}"
+MKUBOOTIMAGEARGS_NONE=	${MKUBOOTIMAGEARGS} -C none
+MKUBOOTIMAGEARGS_GZ=	${MKUBOOTIMAGEARGS} -C gz
+
+SYSTEM_LD_TAIL_EXTRA+=; \
+	echo ${OBJCOPY} -S -O binary $@ $@.bin; \
+	${OBJCOPY} -S -O binary $@ $@.bin; \
+	echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_NONE} $@.bin $@.ub; \
+	${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_NONE} $@.bin $@.ub; \
+	echo ${TOOL_GZIP} -c $@.bin > $@.bin.gz; \
+	${TOOL_GZIP} -c $@.bin > $@.bin.gz; \
+	echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_GZ} $@.bin.gz $@.gz.ub; \
+	${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_GZ} $@.bin.gz $@.gz.ub
+
+EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.bin@}
+EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.ub@}
+EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.bin.gz@}
+EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.gz.ub@}
Index: src/sys/arch/evbarm/conf/std.altera
diff -u /dev/null src/sys/arch/evbarm/conf/std.altera:1.1
--- /dev/null	Wed Sep 19 17:31:39 2018
+++ src/sys/arch/evbarm/conf/std.altera	Wed Sep 19 17:31:39 2018
@@ -0,0 +1,28 @@
+# $NetBSD: std.altera,v 1.1 2018/09/19 17:31:39 aymeric Exp $
+
+machine 	evbarm	arm
+
+include 	"arch/evbarm/conf/std.evbarm"
+include 	"arch/evbarm/conf/files.altera"
+
+options 	FDT
+options 	DRAM_BLOCKS=256
+options 	FPU_VFP
+options 	TPIDRPRW_IS_CURCPU
+options 	ARM_HAS_VBAR
+options 	ARM_GENERIC_TODR
+options 	ARM_INTR_IMPL="<arch/arm/fdt/fdt_intr.h>"
+options 	__HAVE_FAST_SOFTINTS
+options 	__HAVE_CPU_COUNTER
+options 	__HAVE_CPU_UAREA_ALLOC_IDLELWP
+options 	__HAVE_MM_MD_DIRECT_MAPPED_PHYS
+options 	__BUS_SPACE_HAS_STREAM_METHODS
+
+options 	KERNEL_BASE_EXT=0x80000000
+
+makeoptions 	KERNEL_BASE_PHYS="0x10000"
+makeoptions 	KERNEL_BASE_VIRT="0x80010000"
+
+makeoptions 	BOARDTYPE="nanosoc"
+makeoptions 	BOARDMKFRAG="${THISARM}/conf/mk.altera"
+

Reply via email to