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 <[email protected]>
+ * 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 <[email protected]>
+ * 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 $@ [email protected]; \
+ ${OBJCOPY} -S -O binary $@ [email protected]; \
+ echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_NONE} [email protected] [email protected]; \
+ ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_NONE} [email protected] [email protected]; \
+ echo ${TOOL_GZIP} -c [email protected] > [email protected]; \
+ ${TOOL_GZIP} -c [email protected] > [email protected]; \
+ echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_GZ} [email protected] [email protected]; \
+ ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_GZ} [email protected] [email protected]
+
+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"
+