Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/evbarm Add support for the BCM95301X development board



details:   https://anonhg.NetBSD.org/src/rev/320b356facfc
branches:  trunk
changeset: 781320:320b356facfc
user:      matt <matt%NetBSD.org@localhost>
date:      Sat Sep 01 00:15:11 2012 +0000

description:
Add support for the BCM95301X development board

diffstat:

 sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c |  268 +++++++++++++++
 sys/arch/evbarm/bcm53xx/bcm53xx_start.S   |  525 ++++++++++++++++++++++++++++++
 sys/arch/evbarm/bcm53xx/genassym.cf       |   47 ++
 sys/arch/evbarm/bcm53xx/platform.h        |   54 +++
 sys/arch/evbarm/conf/BCM5301X             |  262 ++++++++++++++
 sys/arch/evbarm/conf/files.bcm53xx        |   12 +
 sys/arch/evbarm/conf/mk.bcm53xx           |   34 +
 sys/arch/evbarm/conf/std.bcm53xx          |   30 +
 8 files changed, 1232 insertions(+), 0 deletions(-)

diffs (truncated from 1264 to 300 lines):

diff -r 08455e9849f2 -r 320b356facfc sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/evbarm/bcm53xx/bcm53xx_machdep.c Sat Sep 01 00:15:11 2012 +0000
@@ -0,0 +1,268 @@
+/*     $NetBSD: bcm53xx_machdep.c,v 1.1 2012/09/01 00:15:11 matt Exp $ */
+
+/*-
+ * Copyright (c) 2012 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * 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.
+ */
+
+#define CCA_PRIVATE
+#define IDM_PRIVATE
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: bcm53xx_machdep.c,v 1.1 2012/09/01 00:15:11 matt Exp $");
+
+#include "opt_evbarm_boardtype.h"
+#include "opt_broadcom.h"
+#include "opt_kgdb.h"
+#include "com.h"
+#include "bcmrng_ccb.h"
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/atomic.h>
+#include <sys/device.h>
+#include <sys/kernel.h>
+#include <sys/reboot.h>
+#include <sys/termios.h>
+
+#include <dev/cons.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <arm/db_machdep.h>
+#include <arm/undefined.h>
+#include <arm/arm32/machdep.h>
+
+#include <machine/autoconf.h>
+#include <machine/bootconfig.h>
+
+#define CCA_PRIVATE
+
+#include <arm/cortex/scu_reg.h>
+#include <arm/broadcom/bcm53xx_var.h>
+
+#include <evbarm/bcm53xx/platform.h>
+
+#if NCOM == 0
+#error missing COM device for console
+#endif
+
+#include <dev/ic/comreg.h>
+#include <dev/ic/comvar.h>
+
+extern int _end[];
+extern int KERNEL_BASE_phys[];
+extern int KERNEL_BASE_virt[];
+
+BootConfig bootconfig;
+static char bootargs[MAX_BOOT_STRING];
+char *boot_args = NULL;     
+
+static void bcm53xx_system_reset(void);
+
+/*
+ * Macros to translate between physical and virtual for a subset of the
+ * kernel address space.  *Not* for general use.
+ */
+#define        KERN_VTOPDIFF   ((vaddr_t)KERNEL_BASE_phys - (vaddr_t)KERNEL_BASE_virt)
+#define KERN_VTOPHYS(va) ((paddr_t)((vaddr_t)va + KERN_VTOPDIFF))
+#define KERN_PHYSTOV(pa) ((vaddr_t)((paddr_t)pa - KERN_VTOPDIFF))
+
+#ifndef CONADDR
+#define CONADDR                (BCM53XX_IOREG_PBASE + CCA_UART0_BASE)
+#endif
+#ifndef CONSPEED
+#define CONSPEED B115200
+#endif
+#ifndef CONMODE
+#define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
+#endif
+
+#if (NCOM > 0)
+static const bus_addr_t comcnaddr = (bus_addr_t)CONADDR;
+
+int comcnspeed = CONSPEED;
+int comcnmode = CONMODE | CLOCAL;
+#endif
+
+#ifdef KGDB
+#include <sys/kgdb.h>
+#endif
+
+/*
+ * Static device mappings. These peripheral registers are mapped at
+ * fixed virtual addresses very early in initarm() so that we can use
+ * them while booting the kernel, and stay at the same address
+ * throughout whole kernel's life time.
+ *
+ * We use this table twice; once with bootstrap page table, and once
+ * with kernel's page table which we build up in initarm().
+ *
+ * Since we map these registers into the bootstrap page table using
+ * pmap_devmap_bootstrap() which calls pmap_map_chunk(), we map
+ * registers segment-aligned and segment-rounded in order to avoid
+ * using the 2nd page tables.
+ */
+
+static const struct pmap_devmap devmap[] = {
+       {
+               KERNEL_IO_VBASE,
+               BCM53XX_IOREG_PBASE,            /* 0x18000000 */
+               BCM53XX_IOREG_SIZE,             /* 2MB */
+               VM_PROT_READ|VM_PROT_WRITE,
+               PTE_NOCACHE,
+       },
+       {
+               KERNEL_IO_VBASE + BCM53XX_IOREG_SIZE,
+               BCM53XX_ARMCORE_PBASE,          /* 0x19000000 */
+               BCM53XX_ARMCORE_SIZE,           /* 16MB */
+               VM_PROT_READ|VM_PROT_WRITE,
+               PTE_NOCACHE,
+       },
+       { 0, 0, 0, 0, 0 }
+};
+
+/*
+ * u_int initarm(...)
+ *
+ * Initial entry point on startup. This gets called before main() is
+ * entered.
+ * It should be responsible for setting up everything that must be
+ * in place when main is called.
+ * This includes
+ *   Taking a copy of the boot configuration structure.
+ *   Initialising the physical console so characters can be printed.
+ *   Setting up page tables for the kernel
+ */
+u_int
+initarm(void *arg)
+{
+       pmap_devmap_register(devmap);
+       bcm53xx_bootstrap(KERNEL_IO_VBASE);
+
+#ifdef MULTIPROCESSOR
+       uint32_t scu_cfg = bus_space_read_4(bcm53xx_armcore_bst, bcm53xx_armcore_bsh,
+           ARMCORE_SCU_BASE + SCU_CFG);
+       arm_cpu_max = scu_cfg & SCU_CFG_CPUMAX;
+       membar_producer();
+#endif
+       /*
+        * Heads up ... Setup the CPU / MMU / TLB functions
+        */
+       if (set_cpufuncs())             // starts PMC counter
+               panic("cpu not recognized!");
+
+       cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT);
+
+       consinit();
+
+       bcm53xx_cpu_softc_init(curcpu());
+       bcm53xx_print_clocks();
+
+#if NBCMRNG_CCB > 0
+       /*
+        * Start this early since it takes a while to startup up.
+        */
+       bcm53xx_rng_start(bcm53xx_ioreg_bst, bcm53xx_ioreg_bsh);
+#endif
+
+       /* Talk to the user */
+       printf("\nNetBSD/evbarm (" ___STRING(EVBARM_BOARDTYPE) ") booting ...\n");
+
+       bootargs[0] = '\0';
+
+#if defined(VERBOSE_INIT_ARM) || 1
+       printf("initarm: Configuring system");
+#ifdef MULTIPROCESSOR
+       printf(" (%u cpu%s, hatched %#x)",
+           arm_cpu_max + 1, arm_cpu_max + 1 ? "s" : "",
+           arm_cpu_hatched);
+#endif
+       printf("\n");
+#endif
+
+       arm32_bootmem_init(KERN_VTOPHYS(KERNEL_BASE), bcm53xx_memprobe(),
+           (paddr_t)KERNEL_BASE_phys);
+
+       /*
+        * This is going to do all the hard work of setting up the first and
+        * and second level page tables.  Pages of memory will be allocated
+        * and mapped for other structures that are required for system
+        * operation.  When it returns, physical_freestart and free_pages will
+        * have been updated to reflect the allocations that were made.  In
+        * addition, kernel_l1pt, kernel_pt_table[], systempage, irqstack,
+        * abtstack, undstack, kernelstack, msgbufphys will be set to point to
+        * the memory that was allocated for them.
+        */
+       arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_HIGH, 0, devmap, true);
+
+       cpu_reset_address = bcm53xx_system_reset;
+       /* we've a specific device_register routine */
+       evbarm_device_register = bcm53xx_device_register;
+
+       return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
+}
+
+void
+consinit(void)
+{
+       static bool consinit_called = false;
+       uint32_t v;
+       if (consinit_called)
+               return;
+
+       consinit_called = true;
+
+       /*
+        * Force UART clock to the reference clock
+        */
+       v = bus_space_read_4(bcm53xx_ioreg_bst, bcm53xx_ioreg_bsh,
+           IDM_BASE + IDM_APBX_BASE + IDM_IO_CONTROL_DIRECT);
+       v &= ~IO_CONTROL_DIRECT_UARTCLKSEL;
+       bus_space_write_4(bcm53xx_ioreg_bst, bcm53xx_ioreg_bsh,
+           IDM_BASE + IDM_APBX_BASE + IDM_IO_CONTROL_DIRECT, v);
+
+       /*
+        * Switch to the reference clock
+        */
+       v = bus_space_read_4(bcm53xx_ioreg_bst, bcm53xx_ioreg_bsh,
+           CCA_MISC_BASE + MISC_CORECTL);
+       v &= ~CORECTL_UART_CLK_OVERRIDE;
+       bus_space_write_4(bcm53xx_ioreg_bst, bcm53xx_ioreg_bsh,
+           CCA_MISC_BASE + MISC_CORECTL, v);
+
+        if (comcnattach(bcm53xx_ioreg_bst, comcnaddr, comcnspeed,
+                        BCM53XX_REF_CLK, COM_TYPE_NORMAL, comcnmode))
+                panic("Serial console can not be initialized.");
+}
+
+static void
+bcm53xx_system_reset(void)
+{
+       bus_space_write_4(bcm53xx_ioreg_bst, bcm53xx_ioreg_bsh,
+           MISC_WATCHDOG, 1);
+}
diff -r 08455e9849f2 -r 320b356facfc sys/arch/evbarm/bcm53xx/bcm53xx_start.S
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/evbarm/bcm53xx/bcm53xx_start.S   Sat Sep 01 00:15:11 2012 +0000
@@ -0,0 +1,525 @@
+/*     $NetBSD: bcm53xx_start.S,v 1.1 2012/09/01 00:15:11 matt Exp $   */
+/*-
+ * Copyright (c) 2012 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * 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



Home | Main Index | Thread Index | Old Index