Module Name: src Committed By: skrll Date: Wed Mar 4 17:02:17 UTC 2015
Modified Files: src/sys/arch/arm/broadcom: bcm2835_intr.c bcm2835_obio.c src/sys/arch/arm/cortex: a9_mpsubr.S src/sys/arch/evbarm/conf: RPI2 src/sys/arch/evbarm/rpi: rpi_machdep.c Log Message: Spin up the non-boot CPUs, but don't allow cpu_boot_secondary_processors to see them for now. RPI2 nows works well with only the boot cpu. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/broadcom/bcm2835_intr.c cvs rdiff -u -r1.23 -r1.24 src/sys/arch/arm/broadcom/bcm2835_obio.c cvs rdiff -u -r1.29 -r1.30 src/sys/arch/arm/cortex/a9_mpsubr.S cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbarm/conf/RPI2 cvs rdiff -u -r1.57 -r1.58 src/sys/arch/evbarm/rpi/rpi_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/broadcom/bcm2835_intr.c diff -u src/sys/arch/arm/broadcom/bcm2835_intr.c:1.5 src/sys/arch/arm/broadcom/bcm2835_intr.c:1.6 --- src/sys/arch/arm/broadcom/bcm2835_intr.c:1.5 Sat Feb 28 09:34:34 2015 +++ src/sys/arch/arm/broadcom/bcm2835_intr.c Wed Mar 4 17:02:17 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_intr.c,v 1.5 2015/02/28 09:34:34 skrll Exp $ */ +/* $NetBSD: bcm2835_intr.c,v 1.6 2015/03/04 17:02:17 skrll Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.5 2015/02/28 09:34:34 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.6 2015/03/04 17:02:17 skrll Exp $"); #define _INTR_PRIVATE @@ -67,12 +67,14 @@ static int bcm2836mp_pic_find_pending_ir static void bcm2836mp_pic_establish_irq(struct pic_softc *, struct intrsource *); static void bcm2836mp_pic_source_name(struct pic_softc *, int, char *, size_t); +#if 0 #ifdef MULTIPROCESSOR int bcm2836mp_ipi_handler(void *); static void bcm2836mp_cpu_init(struct pic_softc *, struct cpu_info *); static void bcm2836mp_send_ipi(struct pic_softc *, const kcpuset_t *, u_long); #endif #endif +#endif static int bcm2835_icu_match(device_t, cfdata_t, void *); @@ -99,7 +101,7 @@ static struct pic_ops bcm2836mp_picops = .pic_find_pending_irqs = bcm2836mp_pic_find_pending_irqs, .pic_establish_irq = bcm2836mp_pic_establish_irq, .pic_source_name = bcm2836mp_pic_source_name, -#ifdef MULTIPROCESSOR +#if 0 && defined(MULTIPROCESSOR) .pic_cpu_init = bcm2836mp_cpu_init, .pic_ipi_send = bcm2836mp_send_ipi, #endif @@ -203,7 +205,7 @@ bcm2835_icu_attach(device_t parent, devi pic_add(sc->sc_pic, 0); #if defined(BCM2836) -#ifdef MULTIPROCESSOR +#if 0 && defined(MULTIPROCESSOR) aprint_normal(": Multiprocessor"); #endif pic_add(&bcm2836mp_pic, BCM2836_INT_LOCALBASE); Index: src/sys/arch/arm/broadcom/bcm2835_obio.c diff -u src/sys/arch/arm/broadcom/bcm2835_obio.c:1.23 src/sys/arch/arm/broadcom/bcm2835_obio.c:1.24 --- src/sys/arch/arm/broadcom/bcm2835_obio.c:1.23 Sat Feb 28 09:34:34 2015 +++ src/sys/arch/arm/broadcom/bcm2835_obio.c Wed Mar 4 17:02:17 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_obio.c,v 1.23 2015/02/28 09:34:34 skrll Exp $ */ +/* $NetBSD: bcm2835_obio.c,v 1.24 2015/03/04 17:02:17 skrll Exp $ */ /*- * Copyright (c) 2012, 2014 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_obio.c,v 1.23 2015/02/28 09:34:34 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_obio.c,v 1.24 2015/03/04 17:02:17 skrll Exp $"); #include "locators.h" #include "obio.h" @@ -309,3 +309,10 @@ obio_print(void *aux, const char *name) return UNCONF; } + +#ifdef MULTIPROCESSOR +void +bcm2836_cpu_hatch(struct cpu_info *ci) +{ +} +#endif Index: src/sys/arch/arm/cortex/a9_mpsubr.S diff -u src/sys/arch/arm/cortex/a9_mpsubr.S:1.29 src/sys/arch/arm/cortex/a9_mpsubr.S:1.30 --- src/sys/arch/arm/cortex/a9_mpsubr.S:1.29 Fri Feb 27 18:52:20 2015 +++ src/sys/arch/arm/cortex/a9_mpsubr.S Wed Mar 4 17:02:17 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: a9_mpsubr.S,v 1.29 2015/02/27 18:52:20 jmcneill Exp $ */ +/* $NetBSD: a9_mpsubr.S,v 1.30 2015/03/04 17:02:17 skrll Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -518,6 +518,10 @@ cortex_mpfault: // Secondary processors come here after exiting the SKU ROM. // Switches to kernel's endian almost immediately. // + + .global cortex_mpstart + .type cortex_mpstart,%object + cortex_mpstart: #ifndef MULTIPROCESSOR // Index: src/sys/arch/evbarm/conf/RPI2 diff -u src/sys/arch/evbarm/conf/RPI2:1.1 src/sys/arch/evbarm/conf/RPI2:1.2 --- src/sys/arch/evbarm/conf/RPI2:1.1 Sat Feb 28 09:34:34 2015 +++ src/sys/arch/evbarm/conf/RPI2 Wed Mar 4 17:02:17 2015 @@ -1,5 +1,5 @@ # -# $NetBSD: RPI2,v 1.1 2015/02/28 09:34:34 skrll Exp $ +# $NetBSD: RPI2,v 1.2 2015/03/04 17:02:17 skrll Exp $ # # RPi2 -- Raspberry Pi 2 # @@ -13,7 +13,7 @@ no makeoptions CPUFLAGS options BCM2836 options CPU_CORTEXA7 -#options MULTIPROCESSOR +options MULTIPROCESSOR options CORTEX_PMC options TPIDRPRW_IS_CURCPU makeoptions CPUFLAGS="-mcpu=cortex-a7 -mfpu=neon" Index: src/sys/arch/evbarm/rpi/rpi_machdep.c diff -u src/sys/arch/evbarm/rpi/rpi_machdep.c:1.57 src/sys/arch/evbarm/rpi/rpi_machdep.c:1.58 --- src/sys/arch/evbarm/rpi/rpi_machdep.c:1.57 Sat Feb 28 09:34:34 2015 +++ src/sys/arch/evbarm/rpi/rpi_machdep.c Wed Mar 4 17:02:17 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: rpi_machdep.c,v 1.57 2015/02/28 09:34:34 skrll Exp $ */ +/* $NetBSD: rpi_machdep.c,v 1.58 2015/03/04 17:02:17 skrll Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -30,10 +30,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rpi_machdep.c,v 1.57 2015/02/28 09:34:34 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rpi_machdep.c,v 1.58 2015/03/04 17:02:17 skrll Exp $"); #include "opt_arm_debug.h" #include "opt_bcm283x.h" +#include "opt_cpuoptions.h" #include "opt_ddb.h" #include "opt_evbarm_boardtype.h" #include "opt_kgdb.h" @@ -489,6 +490,59 @@ rpi_bootparams(void) #endif } + +static void +rpi_bootstrap(void) +{ +#if defined(BCM2836) + arm_cpu_max = 4; + extern int cortex_mmuinfo; + bus_space_tag_t iot = &bcm2835_bs_tag; + bus_space_handle_t ioh = BCM2836_ARM_LOCAL_VBASE; + +#ifdef VERBOSE_INIT_ARM + printf("%s: %d cpus present\n", __func__, arm_cpu_max); +#endif + + extern void cortex_mpstart(void); + cortex_mmuinfo = armreg_ttbr_read(); + + for (size_t i = 1; i < arm_cpu_max; i++) { + bus_space_write_4(iot, ioh, + BCM2836_LOCAL_MAILBOX3_SETN(i), + (uint32_t)cortex_mpstart); + + int timeout = 20; + while (timeout-- > 0) { + uint32_t val; + + val = bus_space_read_4(iot, ioh, + BCM2836_LOCAL_MAILBOX3_CLRN(i)); + if (val == 0) + break; + } + } + + for (int loop = 0; loop < 16; loop++) { + if (arm_cpu_hatched == __BITS(arm_cpu_max - 1, 1)) + break; + gtmr_delay(10000); + } + + for (size_t i = 1; i < arm_cpu_max; i++) { + if ((arm_cpu_hatched & (1 << i)) == 0) { + printf("%s: warning: cpu%zu failed to hatch\n", + __func__, i); + } + } + + /* + * XXXNH: Disable non-boot CPUs for now + */ + arm_cpu_hatched = 0; +#endif +} + /* * Static device mappings. These peripheral registers are mapped at * fixed virtual addresses very early in initarm() so that we can use @@ -571,6 +625,8 @@ initarm(void *arg) rpi_bootparams(); + rpi_bootstrap(); + if (vcprop_tag_success_p(&vb.vbt_armclockrate.tag)) { curcpu()->ci_data.cpu_cc_freq = vb.vbt_armclockrate.rate; #ifdef VERBOSE_INIT_ARM