Module Name: src Committed By: snj Date: Fri Feb 26 22:52:53 UTC 2016
Modified Files: src/external/broadcom/rpi-firmware/dist [netbsd-7]: LICENCE.broadcom bootcode.bin fixup.dat fixup_cd.dat start.elf start_cd.elf src/sys/arch/arm/broadcom [netbsd-7]: bcm2835_emmc.c bcm2835_gpio.c bcm2835_gpio_subr.c bcm2835_space.c bcm2835reg.h src/sys/arch/arm/cortex [netbsd-7]: a9_mpsubr.S src/sys/arch/evbarm/conf [netbsd-7]: CUBIEBOARD std.awin src/sys/arch/evbarm/rpi [netbsd-7]: rpi2_start.S rpi_machdep.c Log Message: Pull up following revision(s) (requested by skrll in ticket #1107): external/broadcom/rpi-firmware/dist/LICENCE.broadcom: revision 1.2 external/broadcom/rpi-firmware/dist/bootcode.bin: revision 1.8 external/broadcom/rpi-firmware/dist/fixup.dat: revision 1.8 external/broadcom/rpi-firmware/dist/fixup_cd.dat: revision 1.8 external/broadcom/rpi-firmware/dist/start.elf: revision 1.8 external/broadcom/rpi-firmware/dist/start_cd.elf: revision 1.8 sys/arch/arm/broadcom/bcm2835_emmc.c: revision 1.29 sys/arch/arm/broadcom/bcm2835_gpio.c: revision 1.3 sys/arch/arm/broadcom/bcm2835_gpio_subr.c: revision 1.4 sys/arch/arm/broadcom/bcm2835_space.c: revision 1.9, 1.10 sys/arch/arm/broadcom/bcm2835reg.h: patch sys/arch/arm/cortex/a9_mpsubr.S: revisions 1.45, 1.46 sys/arch/evbarm/conf/CUBIEBOARD: revision 1.45 sys/arch/evbarm/conf/std.awin: revision 1.9 sys/arch/evbarm/rpi/rpi2_start.S: revision 1.3 sys/arch/evbarm/rpi/rpi_machdep.c: revision 1.68 Check for hypervisor mode in cortex_init and exit if the cpu started there. Needed by latest RPI firmware. -- Fix up bus_space_map for latest RPI firmware which now passes the FB address in the mailbox properties as a bus address. -- Update RPI firmware to version after the following commit commit 224c75602b8bae1a9e942b4f1c7ed3aa8e0f0ec8 Author: popcornmix<popcorn...@gmail.com> Date: Tue Dec 8 14:48:57 2015 +0000 -- Deal with kernel builds where virtualisation isn't available -- Tweak CPUFLAGS to cover all CPUs -- Fix up bcm283[56] bus_space(4) to really use bus addresses for peripherals, etc Simplifies the code in various places and uses the abstraction in more places. (bcm2835_gpio_subr.c still doesn't) To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.1.14.1 \ src/external/broadcom/rpi-firmware/dist/LICENCE.broadcom cvs rdiff -u -r1.5.2.1 -r1.5.2.2 \ src/external/broadcom/rpi-firmware/dist/bootcode.bin \ src/external/broadcom/rpi-firmware/dist/fixup.dat \ src/external/broadcom/rpi-firmware/dist/fixup_cd.dat \ src/external/broadcom/rpi-firmware/dist/start.elf \ src/external/broadcom/rpi-firmware/dist/start_cd.elf cvs rdiff -u -r1.9.4.4 -r1.9.4.5 src/sys/arch/arm/broadcom/bcm2835_emmc.c cvs rdiff -u -r1.2 -r1.2.6.1 src/sys/arch/arm/broadcom/bcm2835_gpio.c cvs rdiff -u -r1.3 -r1.3.2.1 src/sys/arch/arm/broadcom/bcm2835_gpio_subr.c cvs rdiff -u -r1.6.10.2 -r1.6.10.3 src/sys/arch/arm/broadcom/bcm2835_space.c cvs rdiff -u -r1.10.12.4 -r1.10.12.5 src/sys/arch/arm/broadcom/bcm2835reg.h cvs rdiff -u -r1.18.2.3 -r1.18.2.4 src/sys/arch/arm/cortex/a9_mpsubr.S cvs rdiff -u -r1.12.2.5 -r1.12.2.6 src/sys/arch/evbarm/conf/CUBIEBOARD cvs rdiff -u -r1.1.2.5 -r1.1.2.6 src/sys/arch/evbarm/conf/std.awin cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/arch/evbarm/rpi/rpi2_start.S cvs rdiff -u -r1.43.2.5 -r1.43.2.6 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/external/broadcom/rpi-firmware/dist/LICENCE.broadcom diff -u src/external/broadcom/rpi-firmware/dist/LICENCE.broadcom:1.1 src/external/broadcom/rpi-firmware/dist/LICENCE.broadcom:1.1.14.1 --- src/external/broadcom/rpi-firmware/dist/LICENCE.broadcom:1.1 Fri Oct 26 10:22:42 2012 +++ src/external/broadcom/rpi-firmware/dist/LICENCE.broadcom Fri Feb 26 22:52:52 2016 @@ -1,4 +1,5 @@ Copyright (c) 2006, Broadcom Corporation. +Copyright (c) 2015, Raspberry Pi (Trading) Ltd All rights reserved. Redistribution. Redistribution and use in binary form, without Index: src/external/broadcom/rpi-firmware/dist/bootcode.bin Binary files are different Index: src/external/broadcom/rpi-firmware/dist/fixup.dat Binary files are different Index: src/external/broadcom/rpi-firmware/dist/fixup_cd.dat Binary files are different Index: src/external/broadcom/rpi-firmware/dist/start.elf Binary files are different Index: src/external/broadcom/rpi-firmware/dist/start_cd.elf Binary files are different Index: src/sys/arch/arm/broadcom/bcm2835_emmc.c diff -u src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.9.4.4 src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.9.4.5 --- src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.9.4.4 Mon Dec 15 11:53:58 2014 +++ src/sys/arch/arm/broadcom/bcm2835_emmc.c Fri Feb 26 22:52:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_emmc.c,v 1.9.4.4 2014/12/15 11:53:58 martin Exp $ */ +/* $NetBSD: bcm2835_emmc.c,v 1.9.4.5 2016/02/26 22:52:53 snj Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.9.4.4 2014/12/15 11:53:58 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.9.4.5 2016/02/26 22:52:53 snj Exp $"); #include "bcmdmac.h" @@ -60,6 +60,7 @@ struct bcmemmc_softc { bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; + bus_addr_t sc_iob; bus_size_t sc_ios; struct sdhc_host *sc_hosts[1]; void *sc_ih; @@ -74,8 +75,6 @@ struct bcmemmc_softc { bus_dmamap_t sc_dmamap; bus_dma_segment_t sc_segs[1]; /* XXX assumes enough descriptors fit in one page */ struct bcm_dmac_conblk *sc_cblk; - - uint32_t sc_physaddr; }; static int bcmemmc_match(device_t, struct cfdata *, void *); @@ -137,8 +136,8 @@ bcmemmc_attach(device_t parent, device_t "can't map registers for %s: %d\n", aaa->aaa_name, error); return; } + sc->sc_iob = aaa->aaa_addr; sc->sc_ios = aaa->aaa_size; - sc->sc_physaddr = aaa->aaa_addr; aprint_naive(": SDHC controller\n"); aprint_normal(": SDHC controller\n"); @@ -265,8 +264,7 @@ bcmemmc_xfer_data_dma(struct sdhc_softc sc->sc_cblk[seg].cb_ti |= DMAC_TI_DEST_WIDTH; sc->sc_cblk[seg].cb_ti |= DMAC_TI_SRC_DREQ; sc->sc_cblk[seg].cb_source_ad = - BCM2835_PERIPHERALS_TO_BUS(sc->sc_physaddr + - SDHC_DATA); + sc->sc_iob + SDHC_DATA; sc->sc_cblk[seg].cb_dest_ad = cmd->c_dmamap->dm_segs[seg].ds_addr; } else { @@ -282,8 +280,7 @@ bcmemmc_xfer_data_dma(struct sdhc_softc sc->sc_cblk[seg].cb_source_ad = cmd->c_dmamap->dm_segs[seg].ds_addr; sc->sc_cblk[seg].cb_dest_ad = - BCM2835_PERIPHERALS_TO_BUS(sc->sc_physaddr + - SDHC_DATA); + sc->sc_iob + SDHC_DATA; } sc->sc_cblk[seg].cb_stride = 0; if (seg == cmd->c_dmamap->dm_nsegs - 1) { Index: src/sys/arch/arm/broadcom/bcm2835_gpio.c diff -u src/sys/arch/arm/broadcom/bcm2835_gpio.c:1.2 src/sys/arch/arm/broadcom/bcm2835_gpio.c:1.2.6.1 --- src/sys/arch/arm/broadcom/bcm2835_gpio.c:1.2 Mon May 19 08:33:41 2014 +++ src/sys/arch/arm/broadcom/bcm2835_gpio.c Fri Feb 26 22:52:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_gpio.c,v 1.2 2014/05/19 08:33:41 skrll Exp $ */ +/* $NetBSD: bcm2835_gpio.c,v 1.2.6.1 2016/02/26 22:52:53 snj Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_gpio.c,v 1.2 2014/05/19 08:33:41 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_gpio.c,v 1.2.6.1 2016/02/26 22:52:53 snj Exp $"); /* * Driver for BCM2835 GPIO @@ -101,9 +101,11 @@ bcmgpio_attach(device_t parent, device_t { struct bcmgpio_softc * const sc = device_private(self); #if NGPIO > 0 + struct amba_attach_args *aaa = aux; + struct gpiobus_attach_args gba; int pin, minpin, maxpin; u_int func; - struct gpiobus_attach_args gba; + int error; #endif sc->sc_dev = self; @@ -124,10 +126,15 @@ bcmgpio_attach(device_t parent, device_t aprint_naive("\n"); aprint_normal(": GPIO [%d...%d]\n", minpin, maxpin); - /* already mapped - nothing to gain from struct amba_attach_args */ - sc->sc_iot = &bcm2835_bs_tag; - sc->sc_ioh = BCM2835_IOPHYSTOVIRT(BCM2835_GPIO_BASE); - + sc->sc_iot = aaa->aaa_iot; + error = bus_space_map(sc->sc_iot, aaa->aaa_addr, aaa->aaa_size, 0, + &sc->sc_ioh); + if (error) { + aprint_error_dev(self, + "can't map registers for %s: %d\n", aaa->aaa_name, error); + return; + } + for (pin = minpin; pin <= maxpin; pin++) { int epin = pin - minpin; Index: src/sys/arch/arm/broadcom/bcm2835_gpio_subr.c diff -u src/sys/arch/arm/broadcom/bcm2835_gpio_subr.c:1.3 src/sys/arch/arm/broadcom/bcm2835_gpio_subr.c:1.3.2.1 --- src/sys/arch/arm/broadcom/bcm2835_gpio_subr.c:1.3 Tue Apr 22 18:51:35 2014 +++ src/sys/arch/arm/broadcom/bcm2835_gpio_subr.c Fri Feb 26 22:52:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_gpio_subr.c,v 1.3 2014/04/22 18:51:35 kardel Exp $ */ +/* $NetBSD: bcm2835_gpio_subr.c,v 1.3.2.1 2016/02/26 22:52:53 snj Exp $ */ /* * Copyright (c) 2013 Jonathan A. Kollasch @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_gpio_subr.c,v 1.3 2014/04/22 18:51:35 kardel Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_gpio_subr.c,v 1.3.2.1 2016/02/26 22:52:53 snj Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -43,8 +43,9 @@ __KERNEL_RCSID(0, "$NetBSD: bcm2835_gpio void bcm2835gpio_function_select(u_int pin, u_int func) { + const paddr_t iop = BCM2835_PERIPHERALS_BUS_TO_PHYS(BCM2835_GPIO_BASE); const bus_space_tag_t iot = &bcm2835_bs_tag; - const bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(BCM2835_GPIO_BASE); + const bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(iop); const u_int mask = (1 << BCM2835_GPIO_GPFSEL_BITS_PER_PIN) - 1; const u_int regid = (pin / BCM2835_GPIO_GPFSEL_PINS_PER_REGISTER); const u_int shift = (pin % BCM2835_GPIO_GPFSEL_PINS_PER_REGISTER) * @@ -70,8 +71,9 @@ bcm2835gpio_function_select(u_int pin, u u_int bcm2835gpio_function_read(u_int pin) { + const paddr_t iop = BCM2835_PERIPHERALS_BUS_TO_PHYS(BCM2835_GPIO_BASE); const bus_space_tag_t iot = &bcm2835_bs_tag; - const bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(BCM2835_GPIO_BASE); + const bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(iop); const u_int mask = (1 << BCM2835_GPIO_GPFSEL_BITS_PER_PIN) - 1; const u_int regid = (pin / BCM2835_GPIO_GPFSEL_PINS_PER_REGISTER); const u_int shift = (pin % BCM2835_GPIO_GPFSEL_PINS_PER_REGISTER) * Index: src/sys/arch/arm/broadcom/bcm2835_space.c diff -u src/sys/arch/arm/broadcom/bcm2835_space.c:1.6.10.2 src/sys/arch/arm/broadcom/bcm2835_space.c:1.6.10.3 --- src/sys/arch/arm/broadcom/bcm2835_space.c:1.6.10.2 Wed May 27 05:33:29 2015 +++ src/sys/arch/arm/broadcom/bcm2835_space.c Fri Feb 26 22:52:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_space.c,v 1.6.10.2 2015/05/27 05:33:29 msaitoh Exp $ */ +/* $NetBSD: bcm2835_space.c,v 1.6.10.3 2016/02/26 22:52:53 snj Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_space.c,v 1.6.10.2 2015/05/27 05:33:29 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_space.c,v 1.6.10.3 2016/02/26 22:52:53 snj Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -290,20 +290,32 @@ bcm2835_bs_map(void *t, bus_addr_t ba, b vaddr_t va; const struct pmap_devmap *pd; int pmap_flags; + bool match = false; - -#if defined(BCM2836) - pa = ba; -#else - pa = ba & ~BCM2835_BUSADDR_CACHE_MASK; + /* Attempt to find the PA device mapping */ + if (ba >= BCM2835_PERIPHERALS_BASE_BUS && + ba < BCM2835_PERIPHERALS_BASE_BUS + BCM2835_PERIPHERALS_SIZE) { + match = true; + pa = BCM2835_PERIPHERALS_BUS_TO_PHYS(ba); + + } +#ifdef BCM2836 + if (ba >= BCM2836_ARM_LOCAL_BASE && + ba < BCM2836_ARM_LOCAL_BASE + BCM2836_ARM_LOCAL_SIZE) { + match = true; + pa = ba; + } #endif - /* this does device addresses */ - if ((pd = pmap_devmap_find_pa(pa, size)) != NULL) { + + if (match && (pd = pmap_devmap_find_pa(pa, size)) != NULL) { /* Device was statically mapped. */ *bshp = pd->pd_va + (pa - pd->pd_pa); return 0; } + /* Now assume bus address so convert to PA */ + pa = ba & ~BCM2835_BUSADDR_CACHE_MASK; + startpa = trunc_page(pa); endpa = round_page(pa + size); Index: src/sys/arch/arm/broadcom/bcm2835reg.h diff -u src/sys/arch/arm/broadcom/bcm2835reg.h:1.10.12.4 src/sys/arch/arm/broadcom/bcm2835reg.h:1.10.12.5 --- src/sys/arch/arm/broadcom/bcm2835reg.h:1.10.12.4 Thu Jul 30 09:37:37 2015 +++ src/sys/arch/arm/broadcom/bcm2835reg.h Fri Feb 26 22:52:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835reg.h,v 1.10.12.4 2015/07/30 09:37:37 martin Exp $ */ +/* $NetBSD: bcm2835reg.h,v 1.10.12.5 2016/02/26 22:52:53 snj Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ /* * Reference: BCM2835 ARM Periperhals * - * http://dmkenr5gtnd8f.cloudfront.net/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf + * http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf */ #ifndef _BCM2835REG_H_ @@ -46,38 +46,45 @@ #define BCM2835_PERIPHERALS_BASE 0x20000000 #endif #define BCM2835_PERIPHERALS_SIZE 0x01000000 /* 16MBytes */ + #define BCM2835_PERIPHERALS_BASE_BUS 0x7e000000 -#define BCM2835_PERIPHERALS_TO_BUS(a) \ +#define BCM2835_PERIPHERALS_PHYS_TO_BUS(a) \ ((a) - BCM2835_PERIPHERALS_BASE + BCM2835_PERIPHERALS_BASE_BUS) +#define BCM2835_PERIPHERALS_BUS_TO_PHYS(a) \ + ((a) - BCM2835_PERIPHERALS_BASE_BUS + BCM2835_PERIPHERALS_BASE) -#define BCM2835_STIMER_BASE (BCM2835_PERIPHERALS_BASE + 0x00003000) -#define BCM2835_DMA0_BASE (BCM2835_PERIPHERALS_BASE + 0x00007000) -#define BCM2835_ARM_BASE (BCM2835_PERIPHERALS_BASE + 0x0000B000) -#define BCM2835_PM_BASE (BCM2835_PERIPHERALS_BASE + 0x00100000) -#define BCM2835_RNG_BASE (BCM2835_PERIPHERALS_BASE + 0x00104000) -#define BCM2835_GPIO_BASE (BCM2835_PERIPHERALS_BASE + 0x00200000) -#define BCM2835_UART0_BASE (BCM2835_PERIPHERALS_BASE + 0x00201000) -#define BCM2835_PCM_BASE (BCM2835_PERIPHERALS_BASE + 0x00203000) -#define BCM2835_SPI0_BASE (BCM2835_PERIPHERALS_BASE + 0x00204000) -#define BCM2835_BSC0_BASE (BCM2835_PERIPHERALS_BASE + 0x00205000) -#define BCM2835_BSCSPISLV_BASE (BCM2835_PERIPHERALS_BASE + 0x00214000) -#define BCM2835_AUX_BASE (BCM2835_PERIPHERALS_BASE + 0x00215000) -#define BCM2835_EMMC_BASE (BCM2835_PERIPHERALS_BASE + 0x00300000) -#define BCM2835_BSC1_BASE (BCM2835_PERIPHERALS_BASE + 0x00804000) -#define BCM2835_BSC2_BASE (BCM2835_PERIPHERALS_BASE + 0x00805000) -#define BCM2835_USB_BASE (BCM2835_PERIPHERALS_BASE + 0x00980000) -#define BCM2835_DMA15_BASE (BCM2835_PERIPHERALS_BASE + 0x00E05000) +#define BCM2835_STIMER_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00003000) +#define BCM2835_DMA0_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00007000) +#define BCM2835_ARM_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x0000B000) +#define BCM2835_PM_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00100000) +#define BCM2835_CM_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00101000) +#define BCM2835_RNG_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00104000) +#define BCM2835_GPIO_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00200000) +#define BCM2835_UART0_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00201000) +#define BCM2835_PCM_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00203000) +#define BCM2835_SPI0_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00204000) +#define BCM2835_BSC0_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00205000) +#define BCM2835_PWM_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x0020C000) +#define BCM2835_BSCSPISLV_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00214000) +#define BCM2835_AUX_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00215000) +#define BCM2835_EMMC_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00300000) +#define BCM2835_BSC1_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00804000) +#define BCM2835_BSC2_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00805000) +#define BCM2835_USB_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00980000) +#define BCM2835_DMA15_BASE (BCM2835_PERIPHERALS_BASE_BUS + 0x00E05000) #define BCM2835_STIMER_SIZE 0x1c #define BCM2835_DMA0_SIZE 0x1000 #define BCM2835_ARM_SIZE 0x1000 #define BCM2835_PM_SIZE 0x1000 +#define BCM2835_CM_SIZE 0xa8 #define BCM2835_RNG_SIZE 0x1000 #define BCM2835_GPIO_SIZE 0x1000 #define BCM2835_UART0_SIZE 0x90 #define BCM2835_PCM_SIZE 0x1000 #define BCM2835_SPI0_SIZE 0x1000 #define BCM2835_BSC_SIZE 0x1000 +#define BCM2835_PWM_SIZE 0x28 #define BCM2835_AUX_SIZE 0x1000 #define BCM2835_EMMC_SIZE 0x1000 #define BCM2835_USB_SIZE 0x20000 @@ -94,10 +101,6 @@ #define BCM2835_PERIPHERALS_VBASE \ BCM2835_IOPHYSTOVIRT(BCM2835_PERIPHERALS_BASE) -#define BCM2835_STIMER_VBASE BCM2835_IOPHYSTOVIRT(BCM2835_ST_BASE) -#define BCM2835_PM_VBASE BCM2835_IOPHYSTOVIRT(BCM2835_PM_BASE) -#define BCM2835_UART0_VBASE BCM2835_IOPHYSTOVIRT(BCM2835_UART0_BASE) -#define BCM2835_EMMC_VBASE BCM2835_IOPHYSTOVIRT(BCM2835_EMMC_BASE) #define BCM2835_ARMICU_BASE (BCM2835_ARM_BASE + 0x0200) #define BCM2835_ARMICU_SIZE 0x200 @@ -108,8 +111,6 @@ #define BCM2835_ARMMBOX_BASE (BCM2835_ARM_BASE + 0x0880) #define BCM2835_ARMMBOX_SIZE 0x40 -#define BCM2835_ARMICU_VBASE BCM2835_IOPHYSTOVIRT(BCM2835_ARMICU_BASE) - #define BCM2835_INTC_BASE (0x0) /* Relative to BCM2835_ARMICU_BASE */ /* Interrupt controller */ @@ -151,7 +152,10 @@ #define BCM2836_INT_TIMER 11 #define BCM2836_INT_NLOCAL 12 +#define BCM2836_INT_CNTPSIRQ_CPUN(n) (BCM2836_INT_BASECPUN(n) + BCM2836_INT_CNTPSIRQ) +#define BCM2836_INT_CNTPNSIRQ_CPUN(n) (BCM2836_INT_BASECPUN(n) + BCM2836_INT_CNTPNSIRQ) #define BCM2836_INT_CNTVIRQ_CPUN(n) (BCM2836_INT_BASECPUN(n) + BCM2836_INT_CNTVIRQ) +#define BCM2836_INT_CNTHPIRQ_CPUN(n) (BCM2836_INT_BASECPUN(n) + BCM2836_INT_CNTHPIRQ) #define BCM2836_INT_MAILBOX0_CPUN(n) (BCM2836_INT_BASECPUN(n) + BCM2836_INT_MAILBOX0) #else #define BCM2835_INT_BASE 0 Index: src/sys/arch/arm/cortex/a9_mpsubr.S diff -u src/sys/arch/arm/cortex/a9_mpsubr.S:1.18.2.3 src/sys/arch/arm/cortex/a9_mpsubr.S:1.18.2.4 --- src/sys/arch/arm/cortex/a9_mpsubr.S:1.18.2.3 Sat Mar 21 08:51:18 2015 +++ src/sys/arch/arm/cortex/a9_mpsubr.S Fri Feb 26 22:52:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: a9_mpsubr.S,v 1.18.2.3 2015/03/21 08:51:18 snj Exp $ */ +/* $NetBSD: a9_mpsubr.S,v 1.18.2.4 2016/02/26 22:52:53 snj Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -331,9 +331,31 @@ xputc: cortex_init: mov r10, lr // save lr +#if defined(CPU_CORTEXA7) || defined(CPU_CORTEXA15) || defined(CPU_CORTEXA17) + /* Leave HYP mode and move into supervisor mode with IRQs/FIQs disabled. */ + mrs r0, cpsr + and r0, r0, #(PSR_MODE) /* Mode is in the low 5 bits of CPSR */ + teq r0, #(PSR_HYP32_MODE) /* Hyp Mode? */ + bne 1f + + /* Ensure that IRQ, and FIQ will be disabled after eret */ + mrs r0, cpsr + bic r0, r0, #(PSR_MODE) + orr r0, r0, #(PSR_SVC32_MODE) + orr r0, r0, #(I32_bit | F32_bit) + msr spsr_cxsf, r0 + /* Exit hypervisor mode */ + adr lr, 2f + msr elr_hyp, lr + eret +#endif + +1: cpsid if, #PSR_SVC32_MODE // SVC32 with no interrupts - mov r0, #0 - msr spsr_sxc, r0 // set SPSR[23:8] to known value + +2: + mov r0, #0 + msr spsr_sxc, r0 // set SPSR[23:8] to known value XPUTC(#64) #if defined(CPU_CORTEXA7) || defined(CPU_CORTEXA15) || defined(CPU_CORTEXA17) Index: src/sys/arch/evbarm/conf/CUBIEBOARD diff -u src/sys/arch/evbarm/conf/CUBIEBOARD:1.12.2.5 src/sys/arch/evbarm/conf/CUBIEBOARD:1.12.2.6 --- src/sys/arch/evbarm/conf/CUBIEBOARD:1.12.2.5 Sun Nov 16 10:33:57 2014 +++ src/sys/arch/evbarm/conf/CUBIEBOARD Fri Feb 26 22:52:53 2016 @@ -1,5 +1,5 @@ # -# $NetBSD: CUBIEBOARD,v 1.12.2.5 2014/11/16 10:33:57 martin Exp $ +# $NetBSD: CUBIEBOARD,v 1.12.2.6 2016/02/26 22:52:53 snj Exp $ # # CUBIEBOARD -- Allwinner A10/A20 Eval Board Kernel # @@ -19,6 +19,8 @@ options RTC_OFFSET=0 # hardware clock i no makeoptions BOARDTYPE makeoptions BOARDTYPE="cubieboard" +no makeoptions CPUFLAGS +makeoptions CPUFLAGS="-mcpu=cortex-a7 -mfpu=neon" #options UVMHIST,UVMHIST_PRINT options CPU_CORTEXA8 options CPU_CORTEXA7 Index: src/sys/arch/evbarm/conf/std.awin diff -u src/sys/arch/evbarm/conf/std.awin:1.1.2.5 src/sys/arch/evbarm/conf/std.awin:1.1.2.6 --- src/sys/arch/evbarm/conf/std.awin:1.1.2.5 Thu Nov 13 09:55:45 2014 +++ src/sys/arch/evbarm/conf/std.awin Fri Feb 26 22:52:53 2016 @@ -1,4 +1,4 @@ -# $NetBSD: std.awin,v 1.1.2.5 2014/11/13 09:55:45 martin Exp $ +# $NetBSD: std.awin,v 1.1.2.6 2016/02/26 22:52:53 snj Exp $ # # standard NetBSD/evbarm for Allwinner based options @@ -26,7 +26,7 @@ makeoptions KERNEL_BASE_PHYS="0x40007800 makeoptions KERNEL_BASE_VIRT="0x80007800" makeoptions BOARDTYPE="awin" makeoptions BOARDMKFRAG="${THISARM}/conf/mk.awin" -makeoptions CPUFLAGS="-mcpu=cortex-a8 -mfpu=neon" +makeoptions CPUFLAGS="-mcpu=generic-armv7-a -mfpu=neon" options ARM_INTR_IMPL="<arch/arm/allwinner/awin_intr.h>" options ARM_GENERIC_TODR Index: src/sys/arch/evbarm/rpi/rpi2_start.S diff -u src/sys/arch/evbarm/rpi/rpi2_start.S:1.1.2.2 src/sys/arch/evbarm/rpi/rpi2_start.S:1.1.2.3 --- src/sys/arch/evbarm/rpi/rpi2_start.S:1.1.2.2 Wed Mar 11 20:22:56 2015 +++ src/sys/arch/evbarm/rpi/rpi2_start.S Fri Feb 26 22:52:53 2016 @@ -38,7 +38,7 @@ #include "assym.h" -RCSID("$NetBSD: rpi2_start.S,v 1.1.2.2 2015/03/11 20:22:56 snj Exp $") +RCSID("$NetBSD: rpi2_start.S,v 1.1.2.3 2016/02/26 22:52:53 snj Exp $") #if defined(VERBOSE_INIT_ARM) #define XPUTC(n) mov r0, n; bl plputc @@ -78,11 +78,6 @@ _C_LABEL(rpi_start): #ifdef __ARMEB__ setend be /* force big endian */ #endif - mov r9, #0 - - /* Move into supervisor mode and disable IRQs/FIQs. */ - cpsid if, #PSR_SVC32_MODE - /* * Save any arguments passed to us. */ @@ -101,7 +96,7 @@ _C_LABEL(rpi_start): stmia r4, {r0-r3} // Save the arguments /* - * Turn on the SMP bit + * Setup the CPU */ bl cortex_init Index: src/sys/arch/evbarm/rpi/rpi_machdep.c diff -u src/sys/arch/evbarm/rpi/rpi_machdep.c:1.43.2.5 src/sys/arch/evbarm/rpi/rpi_machdep.c:1.43.2.6 --- src/sys/arch/evbarm/rpi/rpi_machdep.c:1.43.2.5 Thu Jul 30 09:37:37 2015 +++ src/sys/arch/evbarm/rpi/rpi_machdep.c Fri Feb 26 22:52:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: rpi_machdep.c,v 1.43.2.5 2015/07/30 09:37:37 martin Exp $ */ +/* $NetBSD: rpi_machdep.c,v 1.43.2.6 2016/02/26 22:52:53 snj Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rpi_machdep.c,v 1.43.2.5 2015/07/30 09:37:37 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rpi_machdep.c,v 1.43.2.6 2016/02/26 22:52:53 snj Exp $"); #include "opt_arm_debug.h" #include "opt_bcm283x.h" @@ -130,15 +130,7 @@ static void rpi_device_register(device_t #define RPI_FB_HEIGHT 720 #endif -#if 0 #define PLCONADDR BCM2835_UART0_BASE -#endif - -#ifdef BCM2836 -#define PLCONADDR 0x3f201000 -#else -#define PLCONADDR 0x20201000 -#endif #ifndef CONSDEVNAME #define CONSDEVNAME "plcom" @@ -387,8 +379,9 @@ extern void bcmgenfb_ddb_trap_callback(i static void rpi_bootparams(void) { - bus_space_tag_t iot = &bcm2835_bs_tag; - bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(BCM2835_ARMMBOX_BASE); + const paddr_t pa = BCM2835_PERIPHERALS_BUS_TO_PHYS(BCM2835_ARMMBOX_BASE); + const bus_space_tag_t iot = &bcm2835_bs_tag; + const bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(pa); uint32_t res; bcm2835_mbox_write(iot, ioh, BCMMBOX_CHANPM, (