summaryrefslogtreecommitdiffstats
path: root/sys/mips
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2016-05-17 00:00:01 +0000
committeradrian <adrian@FreeBSD.org>2016-05-17 00:00:01 +0000
commiteb431f83e144a239b97c844663cf58d5ca061b63 (patch)
treef00335f8e2ff9167552a455ebf7a7f240c36eab3 /sys/mips
parentaa53a333b4f2abae9d1b2edc130cc99cb5231b2c (diff)
downloadFreeBSD-src-eb431f83e144a239b97c844663cf58d5ca061b63.zip
FreeBSD-src-eb431f83e144a239b97c844663cf58d5ca061b63.tar.gz
[mips/broadcom] Add initial support for Broadcom MIPS processor
Relies on BHND(4) driver. There files contains machine-dependent code for Broadcom MIPS processor and provide UART driver. This is a work in progress; it and the current bhnd code is enough to boot on the ASUS RT-N16 and RT-N53 platforms. Submitted by: Michael Zhilin <mizhka@gmail.com> Differential Revision: https://reviews.freebsd.org/D6251
Diffstat (limited to 'sys/mips')
-rw-r--r--sys/mips/broadcom/bcm_machdep.c221
-rw-r--r--sys/mips/broadcom/bcm_socinfo.c90
-rw-r--r--sys/mips/broadcom/bcm_socinfo.h59
-rw-r--r--sys/mips/broadcom/files.broadcom47
-rw-r--r--sys/mips/broadcom/std.broadcom7
-rw-r--r--sys/mips/broadcom/uart_bus_chipc.c121
-rw-r--r--sys/mips/broadcom/uart_cpu_chipc.c78
-rw-r--r--sys/mips/conf/BCM95
-rw-r--r--sys/mips/conf/BCM.hints6
9 files changed, 724 insertions, 0 deletions
diff --git a/sys/mips/broadcom/bcm_machdep.c b/sys/mips/broadcom/bcm_machdep.c
new file mode 100644
index 0000000..d535db3
--- /dev/null
+++ b/sys/mips/broadcom/bcm_machdep.c
@@ -0,0 +1,221 @@
+/*-
+ * Copyright (c) 2007 Bruce M. Simpson.
+ * Copyright (c) 2016 Michael Zhilin <mizhka@gmail.com>
+ *
+ * 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 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 AUTHOR 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_ddb.h"
+
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/systm.h>
+#include <sys/imgact.h>
+#include <sys/bio.h>
+#include <sys/buf.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/cons.h>
+#include <sys/exec.h>
+#include <sys/ucontext.h>
+#include <sys/proc.h>
+#include <sys/kdb.h>
+#include <sys/ptrace.h>
+#include <sys/reboot.h>
+#include <sys/signalvar.h>
+#include <sys/sysent.h>
+#include <sys/sysproto.h>
+#include <sys/user.h>
+
+#include <vm/vm.h>
+#include <vm/vm_object.h>
+#include <vm/vm_page.h>
+
+#include <machine/cache.h>
+#include <machine/clock.h>
+#include <machine/cpu.h>
+#include <machine/cpuinfo.h>
+#include <machine/cpufunc.h>
+#include <machine/cpuregs.h>
+#include <machine/hwfunc.h>
+#include <machine/intr_machdep.h>
+#include <machine/locore.h>
+#include <machine/md_var.h>
+#include <machine/pte.h>
+#include <machine/sigframe.h>
+#include <machine/trap.h>
+#include <machine/vmparam.h>
+
+#include <mips/sentry5/s5reg.h>
+#include "bcm_socinfo.h"
+
+#ifdef CFE
+#include <dev/cfe/cfe_api.h>
+#endif
+
+#if 0
+#define BROADCOM_TRACE 0
+#endif
+
+extern int *edata;
+extern int *end;
+
+void
+platform_cpu_init()
+{
+ /* Nothing special */
+}
+
+static void
+mips_init(void)
+{
+ int i, j;
+
+ printf("entry: mips_init()\n");
+
+#ifdef CFE
+ /*
+ * Query DRAM memory map from CFE.
+ */
+ physmem = 0;
+ for (i = 0; i < 10; i += 2) {
+ int result;
+ uint64_t addr, len, type;
+
+ result = cfe_enummem(i / 2, 0, &addr, &len, &type);
+ if (result < 0) {
+#ifdef BROADCOM_TRACE
+ printf("There is no phys memory for: %d\n", i);
+#endif
+ phys_avail[i] = phys_avail[i + 1] = 0;
+ break;
+ }
+ if (type != CFE_MI_AVAILABLE){
+#ifdef BROADCOM_TRACE
+ printf("phys memory is not available: %d\n", i);
+#endif
+ continue;
+ }
+
+ phys_avail[i] = addr;
+ if (i == 0 && addr == 0) {
+ /*
+ * If this is the first physical memory segment probed
+ * from CFE, omit the region at the start of physical
+ * memory where the kernel has been loaded.
+ */
+ phys_avail[i] += MIPS_KSEG0_TO_PHYS(kernel_kseg0_end);
+ }
+#ifdef BROADCOM_TRACE
+ printf("phys memory is available for: %d\n", i);
+ printf(" => addr = %jx\n", addr);
+ printf(" => len = %jd\n", len);
+#endif
+ phys_avail[i + 1] = addr + len;
+ physmem += len;
+ }
+
+#ifdef BROADCOM_TRACE
+ printf("Total phys memory is : %ld\n", physmem);
+#endif
+
+ realmem = btoc(physmem);
+#endif
+
+ for (j = 0; j < i; j++)
+ dump_avail[j] = phys_avail[j];
+
+ physmem = realmem;
+
+ init_param1();
+ init_param2(physmem);
+ mips_cpu_init();
+ pmap_bootstrap();
+ mips_proc0_init();
+ mutex_init();
+ kdb_init();
+#ifdef KDB
+ if (boothowto & RB_KDB)
+ kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger");
+#endif
+}
+
+#define BCM_REG_CHIPC 0x18000000
+
+
+void
+platform_reset(void)
+{
+ printf("bcm::platform_reset()\n");
+ intr_disable();
+ BCM_WRITE_REG32(BCM_REG_CHIPC_PMUWD_OFFS, 2); /* PMU watchdog */
+ for (;;);
+}
+
+void
+platform_start(__register_t a0, __register_t a1, __register_t a2,
+ __register_t a3)
+{
+ vm_offset_t kernend;
+ uint64_t platform_counter_freq;
+ struct bcm_socinfo *socinfo;
+
+ /* clear the BSS and SBSS segments */
+ kernend = (vm_offset_t)&end;
+ memset(&edata, 0, kernend - (vm_offset_t)(&edata));
+
+ mips_postboot_fixup();
+
+ /* Initialize pcpu stuff */
+ mips_pcpu0_init();
+
+ socinfo = bcm_get_socinfo();
+ platform_counter_freq = socinfo->cpurate * 1000 * 1000; /* BCM4718 is 480MHz */
+
+ mips_timer_early_init(platform_counter_freq);
+
+#ifdef CFE
+ /*
+ * Initialize CFE firmware trampolines before
+ * we initialize the low-level console.
+ *
+ * CFE passes the following values in registers:
+ * a0: firmware handle
+ * a2: firmware entry point
+ * a3: entry point seal
+ */
+ if (a3 == CFE_EPTSEAL)
+ cfe_init(a0, a2);
+#endif
+ cninit();
+
+ mips_init();
+
+ /* BCM471x timer is 1/2 of Clk */
+ mips_timer_init_params(platform_counter_freq, 1);
+}
diff --git a/sys/mips/broadcom/bcm_socinfo.c b/sys/mips/broadcom/bcm_socinfo.c
new file mode 100644
index 0000000..7e5fa04
--- /dev/null
+++ b/sys/mips/broadcom/bcm_socinfo.c
@@ -0,0 +1,90 @@
+/*-
+ * Copyright (c) 2016 Michael Zhilin <mizhka@gmail.com>
+ *
+ * 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 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 AUTHOR 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include "bcm_socinfo.h"
+
+/* found on https://wireless.wiki.kernel.org/en/users/drivers/b43/soc */
+struct bcm_socinfo bcm_socinfos[] = {
+ {0x00005300, 600, 25000000}, /* BCM4706 to check */
+ {0x0022B83A, 300, 20000000}, /* BCM4716B0 ASUS RT-N12 */
+ {0x00914716, 354, 20000000}, /* BCM4717A1 to check */
+ {0x00A14716, 480, 20000000}, /* BCM4718A1 ASUS RT-N16 */
+ {0x00435356, 300, 25000000}, /* BCM5356A1 (RT-N10, WNR1000v3) */
+ {0x00825357, 500, 20000000}, /* BCM5358UB0 ASUS RT-N53A1 */
+ {0x00845357, 300, 20000000}, /* BCM5357B0 to check */
+ {0x00945357, 500, 20000000}, /* BCM5358 */
+ {0x00A45357, 500, 20000000}, /* BCM47186B0 Tenda N60 */
+ {0x0085D144, 300, 20000000}, /* BCM5356C0 */
+ {0x00B5D144, 300, 20000000}, /* BCM5357C0 */
+ {0,0,0}
+};
+
+/* Most popular BCM SoC info */
+struct bcm_socinfo BCM_DEFAULT_SOCINFO = {0x0, 300, 20000000};
+
+struct bcm_socinfo*
+bcm_get_socinfo_by_socid(uint32_t key)
+{
+ struct bcm_socinfo* start;
+
+ if(!key)
+ return (NULL);
+
+ for(start = bcm_socinfos; start->id > 0; start++)
+ if(start->id == key)
+ return (start);
+
+ return (NULL);
+}
+
+struct bcm_socinfo*
+bcm_get_socinfo(void)
+{
+ uint32_t socid;
+ struct bcm_socinfo *socinfo;
+
+ /*
+ * We need Chip ID + Revision + Package
+ * --------------------------------------------------------------
+ * | Mask | Usage |
+ * --------------------------------------------------------------
+ * | 0x0000FFFF | Chip ID |
+ * | 0x000F0000 | Chip Revision |
+ * | 0x00F00000 | Package Options |
+ * | 0x0F000000 | Number of Cores (ChipCommon Rev. >= 4)|
+ * | 0xF0000000 | Chip Type |
+ * --------------------------------------------------------------
+ */
+
+ socid = BCM_READ_REG32(BCM_REG_CHIPC_ID) & 0x00FFFFFF;
+ socinfo = bcm_get_socinfo_by_socid(socid);
+ return (socinfo != NULL) ? socinfo : &BCM_DEFAULT_SOCINFO;
+}
diff --git a/sys/mips/broadcom/bcm_socinfo.h b/sys/mips/broadcom/bcm_socinfo.h
new file mode 100644
index 0000000..adf4124
--- /dev/null
+++ b/sys/mips/broadcom/bcm_socinfo.h
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (c) 2016 Michael Zhilin <mizhka@gmail.com>
+ *
+ * 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 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 AUTHOR 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.
+ */
+
+/*
+ * $FreeBSD$
+ */
+
+#ifndef _MIPS_BROADCOM_BCM_SOCINFO_H_
+#define _MIPS_BROADCOM_BCM_SOCINFO_H_
+
+#include <machine/cpuregs.h>
+
+struct bcm_socinfo {
+ uint32_t id;
+ uint32_t cpurate; /* in MHz */
+ uint32_t uartrate; /* in Hz */
+};
+
+struct bcm_socinfo* bcm_get_socinfo_by_socid(uint32_t key);
+struct bcm_socinfo* bcm_get_socinfo(void);
+
+#define BCM_SOCADDR 0x18000000
+#define BCM_REG_CHIPC_ID 0x0
+#define BCM_REG_CHIPC_UART 0x300
+#define BCM_REG_CHIPC_PMUWD_OFFS 0x634
+#define BCM_SOCREG(reg) \
+ MIPS_PHYS_TO_KSEG1((BCM_SOCADDR + (reg)))
+#define BCM_READ_REG32(reg) \
+ *((volatile uint32_t *)BCM_SOCREG(reg))
+#define BCM_WRITE_REG32(reg, value) \
+ do { \
+ writel((void*)BCM_SOCREG((reg)),value); \
+ } while (0);
+
+#endif /* _MIPS_BROADCOM_BCM_SOCINFO_H_ */
diff --git a/sys/mips/broadcom/files.broadcom b/sys/mips/broadcom/files.broadcom
new file mode 100644
index 0000000..ac5c645
--- /dev/null
+++ b/sys/mips/broadcom/files.broadcom
@@ -0,0 +1,47 @@
+# $FreeBSD$
+
+# TODO: Add attachment elsewhere in the tree
+# for USB 1.1 OHCI, Ethernet and IPSEC cores
+# which are believed to be devices we have drivers for
+# which just need to be tweaked for attachment to an BHND system bus.
+mips/broadcom/bcm_machdep.c standard
+mips/mips/tick.c standard
+mips/mips/mips_pic.c standard
+kern/subr_intr.c standard
+kern/pic_if.m standard
+
+kern/msi_if.m optional intrng
+
+mips/broadcom/uart_cpu_chipc.c optional uart
+mips/broadcom/uart_bus_chipc.c optional uart
+mips/broadcom/bcm_socinfo.c standard
+mips/broadcom/bcm_mipscore.c standard
+
+#
+geom/geom_flashmap.c standard
+#
+dev/bhnd/bhnd.c standard
+dev/bhnd/bhnd_subr.c standard
+dev/bhnd/bhnd_bus_if.m standard
+dev/bhnd/bhndb/bhndb_if.m standard
+dev/bhnd/bhndb/bhndb_bus_if.m standard
+dev/bhnd/bcma/bcma.c standard
+dev/bhnd/bcma/bcma_nexus.c standard
+#dev/bhnd/bcma/bcma_bhndb.c standard
+dev/bhnd/bcma/bcma_erom.c standard
+dev/bhnd/bcma/bcma_subr.c standard
+dev/bhnd/cores/chipc/chipc_subr.c standard
+dev/bhnd/cores/chipc/chipc_cfi.c optional cfi
+dev/bhnd/cores/chipc/chipc_spi.c optional spibus
+dev/bhnd/cores/chipc/chipc_slicer.c optional cfi | spibus
+dev/bhnd/cores/chipc/chipc.c standard
+#to remove
+#dev/bhnd/cores/chipc/chipcbus.c standard
+dev/bhnd/cores/chipc/bhnd_chipc_if.m standard
+dev/bhnd/nvram/bhnd_nvram_if.m standard
+#dev/bhnd/siba/siba.c standard
+#dev/bhnd/siba/siba_bhndb.c standard
+#dev/bhnd/siba/siba_nexus.c standard
+#dev/bhnd/siba/siba_subr.c standard
+dev/bhnd/soc/bhnd_soc.c standard
+# \ No newline at end of file
diff --git a/sys/mips/broadcom/std.broadcom b/sys/mips/broadcom/std.broadcom
new file mode 100644
index 0000000..448a094
--- /dev/null
+++ b/sys/mips/broadcom/std.broadcom
@@ -0,0 +1,7 @@
+# $FreeBSD$
+#
+
+machine mips mipsel
+
+cpu CPU_MIPS74K
+files "../broadcom/files.broadcom"
diff --git a/sys/mips/broadcom/uart_bus_chipc.c b/sys/mips/broadcom/uart_bus_chipc.c
new file mode 100644
index 0000000..fa2fa2d
--- /dev/null
+++ b/sys/mips/broadcom/uart_bus_chipc.c
@@ -0,0 +1,121 @@
+/*-
+ * Copyright (c) 2016 Michael Zhilin <mizhka@gmail.com>
+ *
+ * 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 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 AUTHOR 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_uart.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/rman.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+
+#include <dev/uart/uart.h>
+#include <dev/uart/uart_bus.h>
+#include <dev/uart/uart_cpu.h>
+
+#include "uart_if.h"
+#include "bhnd_chipc_if.h"
+
+static int uart_chipc_probe(device_t dev);
+
+extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs;
+
+static void
+uart_chipc_identify(driver_t *driver, device_t parent)
+{
+ struct chipc_capabilities *caps;
+
+ caps = BHND_CHIPC_GET_CAPABILITIES(parent);
+
+ if (caps->num_uarts == 0)
+ return;
+
+ /*
+ * TODO: add more than one UART
+ */
+ BUS_ADD_CHILD(parent, 0, "uart", -1);
+}
+
+static int
+uart_chipc_probe(device_t dev)
+{
+ struct uart_softc *sc;
+ struct resource *res;
+ int rid;
+
+ rid = 0;
+ res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
+ if (res == NULL) {
+ device_printf(dev, "can't allocate main resource\n");
+ return (ENXIO);
+ }
+
+ sc = device_get_softc(dev);
+ sc->sc_class = &uart_ns8250_class;
+ sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs);
+ if (sc->sc_sysdev == NULL) {
+ device_printf(dev, "missing sysdev\n");
+ return (EINVAL);
+ }
+
+ bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas));
+
+ sc->sc_sysdev->bas.bst = rman_get_bustag(res);
+ sc->sc_sysdev->bas.bsh = rman_get_bushandle(res);
+ sc->sc_bas.bst = sc->sc_sysdev->bas.bst;
+ sc->sc_bas.bsh = sc->sc_sysdev->bas.bsh;
+
+ bus_release_resource(dev, SYS_RES_MEMORY, rid, res);
+
+ /* We use internal SoC clock generator with non-standart freq MHz */
+ return (uart_bus_probe(dev, 0, sc->sc_sysdev->bas.rclk, 0, 0));
+}
+
+static device_method_t uart_chipc_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_identify, uart_chipc_identify),
+ DEVMETHOD(device_probe, uart_chipc_probe),
+ DEVMETHOD(device_attach, uart_bus_attach),
+ DEVMETHOD(device_detach, uart_bus_detach),
+ { 0, 0 }
+};
+
+static driver_t uart_chipc_driver = {
+ uart_driver_name,
+ uart_chipc_methods,
+ sizeof(struct uart_softc),
+};
+
+DRIVER_MODULE(uart, bhnd_chipc, uart_chipc_driver, uart_devclass, 0, 0);
diff --git a/sys/mips/broadcom/uart_cpu_chipc.c b/sys/mips/broadcom/uart_cpu_chipc.c
new file mode 100644
index 0000000..14cc9f3
--- /dev/null
+++ b/sys/mips/broadcom/uart_cpu_chipc.c
@@ -0,0 +1,78 @@
+/*-
+ * Copyright (c) 2016 Michael Zhilin <mizhka@gmail.com>
+ *
+ * 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 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 AUTHOR 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_uart.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/cons.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
+#include <machine/bus.h>
+
+#include <dev/uart/uart.h>
+#include <dev/uart/uart_bus.h>
+#include <dev/uart/uart_cpu.h>
+
+#include "bcm_socinfo.h"
+
+bus_space_tag_t uart_bus_space_io;
+bus_space_tag_t uart_bus_space_mem;
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+}
+
+int
+uart_cpu_getdev(int devtype, struct uart_devinfo *di)
+{
+ struct uart_class *class;
+ struct bcm_socinfo *socinfo;
+
+ socinfo = bcm_get_socinfo();
+ class = &uart_ns8250_class;
+ di->ops = uart_getops(class);
+ di->bas.chan = 0;
+ di->bas.bst = mips_bus_space_generic;
+ di->bas.bsh = (bus_space_handle_t)BCM_SOCREG(BCM_REG_CHIPC_UART);
+ di->bas.regshft = 0;
+ di->bas.rclk = socinfo->uartrate; /* in Hz */
+ di->baudrate = 115200;
+ di->databits = 8;
+ di->stopbits = 1;
+ di->parity = UART_PARITY_NONE;
+ uart_bus_space_io = NULL;
+ uart_bus_space_mem = mips_bus_space_generic;
+ return (0);
+}
diff --git a/sys/mips/conf/BCM b/sys/mips/conf/BCM
new file mode 100644
index 0000000..788bbd8
--- /dev/null
+++ b/sys/mips/conf/BCM
@@ -0,0 +1,95 @@
+#
+# $FreeBSD$
+#
+# The Broadcom 470x/471x/535x series of processors and boards is very commonly
+# used in COTS hardware including the ASUS RT-N12, RT-N16, RT-N53.
+#
+
+ident BCM
+
+hints "BCM.hints"
+include "../broadcom/std.broadcom"
+
+# ships with cfe firmware
+options CFE
+options ALT_BREAK_TO_DEBUGGER
+options BREAK_TO_DEBUGGER
+options BOOTVERBOSE=0
+
+makeoptions INTRNG
+options INTRNG
+
+makeoptions TRAMPLOADADDR=0x80800000
+makeoptions DEBUG="-g3" #Build kernel with gdb(1) debug symbols
+makeoptions MODULES_OVERRIDE=""
+
+options DDB
+options KDB
+
+options SCHED_4BSD #4BSD scheduler
+options INET #InterNETworking
+options NFSCL #Network Filesystem Client
+#options NFS_ROOT #NFS usable as /, requires NFSCL
+options PSEUDOFS #Pseudo-filesystem framework
+options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions
+
+options FFS #Berkeley Fast Filesystem
+options SOFTUPDATES #Enable FFS soft updates support
+options UFS_ACL #Support for access control lists
+options UFS_DIRHASH #Improve performance on big directories
+
+device geom_uzip
+options GEOM_UZIP
+options GEOM_LABEL # Providers labelization.
+options ROOTDEVNAME=\"ufs:ufs/FBSD\" # assumes FW built by
+ # freebsd-build-wifi
+
+# Debugging for use in -current
+#options DEADLKRES
+options INVARIANTS
+options INVARIANT_SUPPORT
+
+#options BHND_LOGLEVEL=BHND_DEBUG_LEVEL
+#options BUS_DEBUG
+#makeoptions BUS_DEBUG
+#options VERBOSE_SYSINIT
+#makeoptions VERBOSE_SYSINIT
+
+device pci
+
+#device bgmac # Broadcom GMAC - not yet
+device bhnd
+
+device mdio
+
+#Flash
+device spibus
+device mx25l # Serial Flash
+device cfi # Parallel Flash
+device cfid
+
+#UART
+device uart
+
+#Base
+device loop
+device ether
+device random
+device md
+
+#Performance
+#options HWPMC_HOOKS
+#device hwpmc
+#device hwpmc_mips74k
+
+#Ethernet
+# device bfe # XXX will build both pci and siba
+device miibus # attachments
+
+# pci devices
+
+# USB is not yet ready
+#options USB_DEBUG # enable debug msgs
+#device usb # USB Bus (required)
+#device uhci # UHCI PCI->USB interface
+#device ehci # EHCI PCI->USB interface (USB 2.0)
diff --git a/sys/mips/conf/BCM.hints b/sys/mips/conf/BCM.hints
new file mode 100644
index 0000000..5fdd240
--- /dev/null
+++ b/sys/mips/conf/BCM.hints
@@ -0,0 +1,6 @@
+# $FreeBSD$
+hint.bhnd_soc.0.at="nexus0"
+# XXX ?
+hint.bhnd_soc.0.maddr="0x00000000"
+hint.bhnd_soc.0.msize="0x20000000"
+
OpenPOWER on IntegriCloud