? sys/arch/evbarm/conf/BLA ? sys/arch/evbarm/conf/EGGHED ? sys/arch/evbarm/conf/EGGHED64 ? sys/arch/evbarm/conf/HOPPA ? sys/arch/evbarm/conf/JOWLSON ? sys/arch/evbarm/conf/TWITTY ? sys/arch/evbarm/rpi/pitfthat.c ? sys/arch/evbarm/rpi/rpi_machdep.c.DELETEDBYIDIOT ? sys/arch/evbarm/rpi/rpi_machdep.c.ORIG ? sys/arch/evbarm/rpi/unicornhat.c ? sys/dev/sdmmc/ChangeLog Index: sys/arch/arm/arm32/arm32_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/arm32/arm32_machdep.c,v retrieving revision 1.128 diff -p -u -r1.128 arm32_machdep.c --- sys/arch/arm/arm32/arm32_machdep.c 10 May 2019 16:43:09 -0000 1.128 +++ sys/arch/arm/arm32/arm32_machdep.c 27 Jul 2019 13:09:18 -0000 @@ -729,7 +729,9 @@ cpu_init_secondary_processor(int cpuinde // pmap_kernel has been sucessfully built and we can switch to it cpu_domains(DOMAIN_DEFAULT); +#if 0 cpu_idcache_wbinv_all(); +#endif VPRINTS("index: "); VPRINTX(cpuindex); @@ -754,7 +756,11 @@ cpu_init_secondary_processor(int cpuinde cpu_setttb(pmap_kernel()->pm_l1->l1_physaddr, true); #endif +#if 0 cpu_tlb_flushID(); +#else + armv7up_tlb_flushID(); +#endif VPRINTS(" (TTBR0="); VPRINTX(armreg_ttbr_read()); Index: sys/arch/arm/broadcom/bcm2835_cm.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_cm.c,v retrieving revision 1.2 diff -p -u -r1.2 bcm2835_cm.c --- sys/arch/arm/broadcom/bcm2835_cm.c 10 Dec 2017 21:38:26 -0000 1.2 +++ sys/arch/arm/broadcom/bcm2835_cm.c 27 Jul 2019 13:09:18 -0000 @@ -118,14 +118,15 @@ bcmcm_wait(struct bcm2835cm_softc *sc, i int i; uint32_t r; - for (i=0; i<100; ++i) { + for (i=0; i<1000; ++i) { r = CM_READ(sc, ctlreg); if (((r & CM_CTL_BUSY) != 0) == onoff) break; delay(10); } - if (i >= 100) { - device_printf(sc->sc_dev, "busy (addr=%#x)\n", ctlreg); + if (i >= 1000) { + device_printf(sc->sc_dev, "%s (addr=%#x)\n", + onoff ? "stopped" : "busy", ctlreg); return EIO; } @@ -187,7 +188,8 @@ bcm_cm_set(enum bcm_cm_clock clk, uint32 CM_WRITE(sc, ctlreg, r); } - bcmcm_wait(sc, ctlreg, 0); + if (bcmcm_wait(sc, ctlreg, 0)) + return EIO; /* configure new divider, mode, don't enable */ CM_WRITE(sc, divreg, div); Index: sys/arch/arm/broadcom/bcm2835_cm.h =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_cm.h,v retrieving revision 1.2 diff -p -u -r1.2 bcm2835_cm.h --- sys/arch/arm/broadcom/bcm2835_cm.h 19 Oct 2017 05:45:37 -0000 1.2 +++ sys/arch/arm/broadcom/bcm2835_cm.h 27 Jul 2019 13:09:18 -0000 @@ -34,6 +34,7 @@ #define CM_CTL_MASH __BITS(9,10) #define CM_CTL_FLIP __BIT(8) #define CM_CTL_BUSY __BIT(7) +#define CM_CTL_GATE __BIT(6) #define CM_CTL_KILL __BIT(5) #define CM_CTL_ENAB __BIT(4) #define CM_CTL_SRC __BIT(0,3) @@ -51,6 +52,16 @@ #define CM_PWMCTL 0xa0 #define CM_PWMDIV 0xa4 +#define A2W_XOSC_CTRL 0x1190 +#define A2W_XOSC_CTRL_PLLB __BIT(7) +#define A2W_XOSC_CTRL_PLLA __BIT(6) +#define A2W_XOSC_CTRL_PLLD __BIT(5) +#define A2W_XOSC_CTRL_DDR __BIT(4) +#define A2W_XOSC_CTRL_CPR1 __BIT(3) +#define A2W_XOSC_CTRL_USB __BIT(2) +#define A2W_XOSC_CTRL_HDMI __BIT(1) +#define A2W_XOSC_CTRL_PLLC __BIT(0) + #define CM_PASSWD 0x5a /* clock sources (frequencies for RPI) */ @@ -62,6 +73,8 @@ #define CM_CTL_SRC_PLLC 5 /* 1000MHz (changes with overclock) */ #define CM_CTL_SRC_PLLD 6 /* 500MHz core clock */ #define CM_CTL_SRC_HDMIAUX 7 /* 216MHz HDMI auxiliary */ +#define CM_CTL_SRC_CORE1 8 +#define CM_CTL_SRC_CORE2 9 #if 0 #define CM_GNRICCTL 0x00 @@ -142,6 +155,8 @@ #define CM_OSCCOUNT 0x100 #define CM_PLLA 0x104 #define CM_PLLB 0x170 +#define CM_PLLB_HOLDARM __BIT(1) +#define CM_PLLB_LOADARM __BIT(0) #define CM_PLLC 0x108 #define CM_PLLD 0x10c #define CM_PLLH 0x110 @@ -161,6 +176,56 @@ #define CM_BURSTCTL 0x148 #define CM_BURSTCNT 0x14C +#define A2W_PLLA_CTRL 0x1100 +#define A2W_PLLC_CTRL 0x1120 +#define A2W_PLLD_CTRL 0x1140 +#define A2W_PLLH_CTRL 0x1160 +#define A2W_PLLB_CTRL 0x11e0 + +#define A2W_PLLA_ANA0 0x1010 +#define A2W_PLLC_ANA0 0x1030 +#define A2W_PLLD_ANA0 0x1050 +#define A2W_PLLH_ANA0 0x1070 +#define A2W_PLLB_ANA0 0x10f0 + +#define A2W_PLLA_FRAC 0x1200 +#define A2W_PLLC_FRAC 0x1220 +#define A2W_PLLD_FRAC 0x1240 +#define A2W_PLLH_FRAC 0x1260 +#define A2W_PLLB_FRAC 0x12e0 + +#define A2W_PLLA_DSI0 0x1300 +#define A2W_PLLA_CORE 0x1400 +#define A2W_PLLA_PER 0x1500 +#define A2W_PLLA_CCP2 0x1600 + +#define A2W_PLLC_CORE2 0x1320 +#define A2W_PLLC_CORE1 0x1420 +#define A2W_PLLC_PER 0x1520 +#define A2W_PLLC_CORE0 0x1620 + +#define A2W_PLLD_DSI0 0x1340 +#define A2W_PLLD_CORE 0x1440 +#define A2W_PLLD_PER 0x1540 +#define A2W_PLLD_DSI1 0x1640 + +#define A2W_PLLH_AUX 0x1360 +#define A2W_PLLH_RCAL 0x1460 +#define A2W_PLLH_PIX 0x1560 +#define A2W_PLLH_STS 0x1660 + +#define A2W_PLLH_CTRLR 0x1960 +#define A2W_PLLH_FRACR 0x1a60 +#define A2W_PLLH_AUXR 0x1b60 +#define A2W_PLLH_RCALR 0x1c60 +#define A2W_PLLH_PIXR 0x1d60 +#define A2W_PLLH_STSR 0x1e60 + +#define A2W_PLLB_ARM 0x13e0 +#define A2W_PLLB_SP0 0x14e0 +#define A2W_PLLB_SP1 0x15e0 +#define A2W_PLLB_SP2 0x16e0 + #endif enum bcm_cm_clock { Index: sys/arch/arm/broadcom/bcm2835_cprman.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_cprman.c,v retrieving revision 1.2 diff -p -u -r1.2 bcm2835_cprman.c --- sys/arch/arm/broadcom/bcm2835_cprman.c 9 Sep 2018 07:21:17 -0000 1.2 +++ sys/arch/arm/broadcom/bcm2835_cprman.c 27 Jul 2019 13:09:18 -0000 @@ -56,6 +56,7 @@ enum { CPRMAN_CLOCK_PERIIMAGE = 29, CPRMAN_CLOCK_PWM = 30, CPRMAN_CLOCK_PCM = 31, + CPRMAN_CLOCK_EMMC2 = 51, CPRMAN_NCLOCK }; @@ -133,6 +134,8 @@ cprman_get_rate(void *priv, struct clk * return bcm283x_clk_get_rate_vpu(); case CPRMAN_CLOCK_EMMC: return bcm283x_clk_get_rate_emmc(); + case CPRMAN_CLOCK_EMMC2: + return bcm283x_clk_get_rate_emmc2(); default: panic("unsupported clock id %d\n", clk->id); } @@ -155,7 +158,11 @@ cprman_add_clock(struct cprman_softc *sc static int cprman_match(device_t parent, cfdata_t cf, void *aux) { - const char * const compatible[] = { "brcm,bcm2835-cprman", NULL }; + const char * const compatible[] = { + "brcm,bcm2835-cprman", + "brcm,bcm2838-cprman", + NULL + }; const struct fdt_attach_args *faa = aux; return of_match_compatible(faa->faa_phandle, compatible); @@ -176,6 +183,7 @@ cprman_attach(device_t parent, device_t cprman_add_clock(sc, CPRMAN_CLOCK_UART, "uart"); cprman_add_clock(sc, CPRMAN_CLOCK_VPU, "vpu"); cprman_add_clock(sc, CPRMAN_CLOCK_EMMC, "emmc"); + cprman_add_clock(sc, CPRMAN_CLOCK_EMMC2, "emmc2"); aprint_naive("\n"); aprint_normal(": BCM283x Clock Controller\n"); Index: sys/arch/arm/broadcom/bcm2835_dmac.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_dmac.c,v retrieving revision 1.16 diff -p -u -r1.16 bcm2835_dmac.c --- sys/arch/arm/broadcom/bcm2835_dmac.c 10 Dec 2017 21:38:26 -0000 1.16 +++ sys/arch/arm/broadcom/bcm2835_dmac.c 27 Jul 2019 13:09:18 -0000 @@ -48,7 +48,10 @@ __KERNEL_RCSID(0, "$NetBSD: bcm2835_dmac #include -#define BCM_DMAC_CHANNELMASK 0x00000fff +#include "ioconf.h" + +#define BCM_DMAC_NCHANNELS 12 +#define BCM_DMAC_CHANNELMASK __BITS(BCM_DMAC_NCHANNELS-1,0) struct bcm_dmac_softc; @@ -77,6 +80,7 @@ struct bcm_dmac_softc { struct bcm_dmac_channel *sc_channels; int sc_nchannels; uint32_t sc_channelmask; + int sc_first; }; #define DMAC_READ(sc, reg) \ @@ -101,6 +105,7 @@ bcm_dmac_match(device_t parent, cfdata_t { const char * const compatible[] = { "brcm,bcm2835-dma", + "brcm,bcm2838-dma", NULL }; struct fdt_attach_args * const faa = aux; @@ -137,12 +142,33 @@ bcm_dmac_attach(device_t parent, device_ return; } + + /* + * Get combined channel mask from mailbox interface, we + * assume that there are two DMA controllers and + * brcm,bcm2838-dma is the second. + * + * The masks are also provided (one per DMA controller) + * by fdt property brcm,dma-channel-mask + */ + const char * const second_dmac[] = { "brcm,bcm2838-dma", NULL }; + if (of_match_compatible(faa->faa_phandle, second_dmac)) + sc->sc_first = BCM_DMAC_NCHANNELS; prop_dictionary_get_uint32(cfg, "chanmask", &sc->sc_channelmask); +printf(": chanmask=%x", sc->sc_channelmask); sc->sc_channelmask &= BCM_DMAC_CHANNELMASK; + sc->sc_channelmask >>= sc->sc_first; +printf(" shifted=%x", sc->sc_channelmask); mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SCHED); - sc->sc_nchannels = 31 - __builtin_clz(sc->sc_channelmask); + sc->sc_nchannels = ffs(sc->sc_channelmask); +printf(" ffs=%u", sc->sc_nchannels); + if (sc->sc_nchannels == 0) { + aprint_error(": all channels masked\n"); + return; + } + sc->sc_channels = kmem_alloc( sizeof(*sc->sc_channels) * sc->sc_nchannels, KM_SLEEP); @@ -157,7 +183,8 @@ bcm_dmac_attach(device_t parent, device_ if ((__BIT(index) & sc->sc_channelmask) == 0) continue; - aprint_normal(" DMA%d", index); + /* fdt has names for this */ + aprint_normal(" DMA%d", index + sc->sc_first); ch->ch_debug = DMAC_READ(sc, DMAC_DEBUG(index)); @@ -197,29 +224,32 @@ bcm_dmac_alloc(enum bcm_dmac_type type, { struct bcm_dmac_softc *sc; struct bcm_dmac_channel *ch = NULL; - device_t dev; - int index; + int index, unit; - dev = device_find_by_driver_unit("bcmdmac", 0); - if (dev == NULL) - return NULL; - sc = device_private(dev); - - mutex_enter(&sc->sc_lock); - for (index = 0; index < sc->sc_nchannels; index++) { - if ((sc->sc_channelmask & __BIT(index)) == 0) - continue; - if (DMAC_CHANNEL_TYPE(&sc->sc_channels[index]) != type) - continue; - if (DMAC_CHANNEL_USED(&sc->sc_channels[index])) + for (unit = 0; unit < bcmdmac_cd.cd_ndevs; ++unit) { + sc = device_lookup_private(&bcmdmac_cd, unit); + if (sc == NULL) continue; - ch = &sc->sc_channels[index]; - ch->ch_callback = cb; - ch->ch_callbackarg = cbarg; - break; + mutex_enter(&sc->sc_lock); + for (index = 0; index < sc->sc_nchannels; index++) { + if ((sc->sc_channelmask & __BIT(index)) == 0) + continue; + if (DMAC_CHANNEL_TYPE(&sc->sc_channels[index]) != type) + continue; + if (DMAC_CHANNEL_USED(&sc->sc_channels[index])) + continue; + + ch = &sc->sc_channels[index]; + ch->ch_callback = cb; + ch->ch_callbackarg = cbarg; + break; + } + mutex_exit(&sc->sc_lock); + + if (ch != NULL) + break; } - mutex_exit(&sc->sc_lock); if (ch == NULL) return NULL; @@ -253,9 +283,18 @@ bcm_dmac_free(struct bcm_dmac_channel *c { struct bcm_dmac_softc *sc = ch->ch_sc; uint32_t val; + int i; bcm_dmac_halt(ch); + /* wait for chip to stop */ + for (i=0; i<10000; ++i) { + val = DMAC_READ(sc, DMAC_CS(ch->ch_index)); + if (!(val & DMAC_CS_ACTIVE)) + break; + DELAY(1); + } + /* reset chip */ val = DMAC_READ(sc, DMAC_CS(ch->ch_index)); val |= DMAC_CS_RESET; @@ -299,13 +338,23 @@ bcm_dmac_halt(struct bcm_dmac_channel *c { struct bcm_dmac_softc *sc = ch->ch_sc; uint32_t val; + int i; /* pause DMA */ val = DMAC_READ(sc, DMAC_CS(ch->ch_index)); val &= ~DMAC_CS_ACTIVE; DMAC_WRITE(sc, DMAC_CS(ch->ch_index), val); - /* wait for paused state ? */ + /* wait for paused state to end */ + for (i=0; i<10000; ++i) { + val = DMAC_READ(sc, DMAC_CS(ch->ch_index)); + if (!(val & DMAC_CS_PAUSED)) + break; + } + if (i >= 10000) { + device_printf(sc->sc_dev, "DMA doesn't finish\n"); + return; + } /* end descriptor chain */ DMAC_WRITE(sc, DMAC_NEXTCONBK(ch->ch_index), 0); @@ -320,23 +369,26 @@ void bcm_dmac_dump_regs(void) { struct bcm_dmac_softc *sc; - device_t dev; - int index; - - dev = device_find_by_driver_unit("bcmdmac", 0); - if (dev == NULL) - return; - sc = device_private(dev); + int index, unit; + const char *prefix; - for (index = 0; index < sc->sc_nchannels; index++) { - if ((sc->sc_channelmask & __BIT(index)) == 0) + for (unit = 0; unit < bcmdmac_cd.cd_ndevs; ++unit) { + sc = device_lookup_private(&bcmdmac_cd, unit); + if (sc == NULL) continue; - printf("%d_CS: %08X\n", index, - DMAC_READ(sc, DMAC_CS(index))); - printf("%d_CONBLK_AD: %08X\n", index, - DMAC_READ(sc, DMAC_CONBLK_AD(index))); - printf("%d_DEBUG: %08X\n", index, - DMAC_READ(sc, DMAC_DEBUG(index))); + + for (index = 0; index < sc->sc_nchannels; index++) { + if ((sc->sc_channelmask & __BIT(index)) == 0) + prefix = "GPU"; + else + prefix = "ARM"; + printf("%s %d_CS: %08X\n", prefix, index, + DMAC_READ(sc, DMAC_CS(index))); + printf("%s %d_CONBLK_AD: %08X\n", prefix, index, + DMAC_READ(sc, DMAC_CONBLK_AD(index))); + printf("%s %d_DEBUG: %08X\n", prefix, index, + DMAC_READ(sc, DMAC_DEBUG(index))); + } } } #endif Index: sys/arch/arm/broadcom/bcm2835_emmc.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_emmc.c,v retrieving revision 1.33 diff -p -u -r1.33 bcm2835_emmc.c --- sys/arch/arm/broadcom/bcm2835_emmc.c 19 Aug 2018 09:18:48 -0000 1.33 +++ sys/arch/arm/broadcom/bcm2835_emmc.c 27 Jul 2019 13:09:18 -0000 @@ -97,6 +97,7 @@ bcmemmc_match(device_t parent, struct cf { const char * const compatible[] = { "brcm,bcm2835-sdhci", + "brcm,bcm2711-emmc2", NULL }; struct fdt_attach_args * const faa = aux; @@ -155,7 +156,6 @@ bcmemmc_attach(device_t parent, device_t if (i == 0) sc->sc.sc_clkbase = clk_get_rate(clk) / 1000; } - aprint_debug_dev(self, "ref freq %u kHz\n", sc->sc.sc_clkbase); error = bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh); if (error) { @@ -168,6 +168,8 @@ bcmemmc_attach(device_t parent, device_t aprint_naive(": SDHC controller\n"); aprint_normal(": SDHC controller\n"); + aprint_debug_dev(self, "ref freq %u kHz\n", sc->sc.sc_clkbase); + char intrstr[128]; if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof(intrstr))) { aprint_error(": failed to decode interrupt\n"); Index: sys/arch/arm/broadcom/bcm2835_intr.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_intr.c,v retrieving revision 1.20 diff -p -u -r1.20 bcm2835_intr.c --- sys/arch/arm/broadcom/bcm2835_intr.c 27 Mar 2019 05:47:50 -0000 1.20 +++ sys/arch/arm/broadcom/bcm2835_intr.c 27 Jul 2019 13:09:18 -0000 @@ -59,6 +59,8 @@ __KERNEL_RCSID(0, "$NetBSD: bcm2835_intr #include +#include "ioconf.h" + static void bcm2835_irq_handler(void *); static void bcm2836mp_intr_init(void *, struct cpu_info *); @@ -170,8 +172,8 @@ struct bcm2835icu_softc { int sc_phandle; }; -struct bcm2835icu_softc *bcml1icu_sc; -struct bcm2835icu_softc *bcmicu_sc; +static struct bcm2835icu_softc *bcml1icu_sc; +static struct bcm2835icu_softc *bcmicu_sc; #define read_bcm2835reg(o) \ bus_space_read_4(bcmicu_sc->sc_iot, bcmicu_sc->sc_ioh, (o)) @@ -277,10 +279,10 @@ bcm2835_icu_attach(device_t parent, devi BCM2836_LOCAL_CONTROL, 0); bus_space_write_4(sc->sc_iot, sc->sc_ioh, BCM2836_LOCAL_PRESCALER, 0x80000000); - ifuncs = &bcm2836mpicu_fdt_funcs; - +#if !defined(SOC_BCM2838) bcm2836mp_intr_init(self, curcpu()); +#endif arm_fdt_cpu_hatch_register(self, bcm2836mp_intr_init); } else { if (bcml1icu_sc == NULL) @@ -309,6 +311,8 @@ bcm2835_irq_handler(void *frame) const uint32_t oldipl_mask = __BIT(oldipl); int ipl_mask = 0; + KASSERT(cpuid < BCM2836_NCPUS); + ci->ci_data.cpu_nintr++; bcm2835_barrier(); @@ -479,6 +483,7 @@ bcm2836mp_pic_unblock_irqs(struct pic_so const bus_space_handle_t ioh = bcml1icu_sc->sc_ioh; const cpuid_t cpuid = pic - &bcm2836mp_pic[0]; + KASSERT(cpuid < BCM2836_NCPUS); KASSERT(irqbase == 0); if (irq_mask & BCM2836MP_TIMER_IRQS) { @@ -525,6 +530,7 @@ bcm2836mp_pic_block_irqs(struct pic_soft const bus_space_handle_t ioh = bcml1icu_sc->sc_ioh; const cpuid_t cpuid = pic - &bcm2836mp_pic[0]; + KASSERT(cpuid < BCM2836_NCPUS); KASSERT(irqbase == 0); if (irq_mask & BCM2836MP_TIMER_IRQS) { @@ -547,7 +553,7 @@ bcm2836mp_pic_block_irqs(struct pic_soft } if (irq_mask & BCM2836MP_PMU_IRQ) { bus_space_write_4(iot, ioh, BCM2836_LOCAL_PM_ROUTING_CLR, - __BIT(cpuid)); + __BIT(cpuid)); } bcm2835_barrier(); @@ -562,6 +568,7 @@ bcm2836mp_pic_find_pending_irqs(struct p uint32_t lpending; int ipl = 0; + KASSERT(cpuid < BCM2836_NCPUS); KASSERT(pic == &bcm2836mp_pic[cpuid]); bcm2835_barrier(); @@ -598,10 +605,13 @@ bcm2836mp_pic_source_name(struct pic_sof #if defined(MULTIPROCESSOR) static void bcm2836mp_cpu_init(struct pic_softc *pic, struct cpu_info *ci) { + const cpuid_t cpuid = ci->ci_core_id; + + KASSERT(cpuid < BCM2836_NCPUS); /* Enable IRQ and not FIQ */ bus_space_write_4(bcml1icu_sc->sc_iot, bcml1icu_sc->sc_ioh, - BCM2836_LOCAL_MAILBOX_IRQ_CONTROLN(ci->ci_core_id), 1); + BCM2836_LOCAL_MAILBOX_IRQ_CONTROLN(cpuid), 1); } static void @@ -612,6 +622,7 @@ bcm2836mp_send_ipi(struct pic_softc *pic KASSERT(pic->pic_cpus != NULL); const cpuid_t cpuid = pic - &bcm2836mp_pic[0]; + KASSERT(cpuid < BCM2836_NCPUS); bus_space_write_4(bcml1icu_sc->sc_iot, bcml1icu_sc->sc_ioh, BCM2836_LOCAL_MAILBOX0_SETN(cpuid), __BIT(ipi)); @@ -624,6 +635,8 @@ bcm2836mp_ipi_handler(void *priv) const cpuid_t cpuid = ci->ci_core_id; uint32_t ipimask, bit; + KASSERT(cpuid < BCM2836_NCPUS); + ipimask = bus_space_read_4(bcml1icu_sc->sc_iot, bcml1icu_sc->sc_ioh, BCM2836_LOCAL_MAILBOX0_CLRN(cpuid)); bus_space_write_4(bcml1icu_sc->sc_iot, bcml1icu_sc->sc_ioh, @@ -671,6 +684,8 @@ bcm2836mp_intr_init(void *priv, struct c const cpuid_t cpuid = ci->ci_core_id; struct pic_softc * const pic = &bcm2836mp_pic[cpuid]; + KASSERT(cpuid < BCM2836_NCPUS); + #if defined(MULTIPROCESSOR) pic->pic_cpus = ci->ci_kcpuset; @@ -705,6 +720,7 @@ bcm2836mp_intr_init(void *priv, struct c static int bcm2836mp_icu_fdt_decode_irq(u_int *specifier) { + if (!specifier) return -1; return be32toh(specifier[0]); Index: sys/arch/arm/broadcom/bcm2835_mbox.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_mbox.c,v retrieving revision 1.13 diff -p -u -r1.13 bcm2835_mbox.c --- sys/arch/arm/broadcom/bcm2835_mbox.c 19 Aug 2018 09:18:48 -0000 1.13 +++ sys/arch/arm/broadcom/bcm2835_mbox.c 27 Jul 2019 13:09:18 -0000 @@ -75,7 +75,11 @@ CFATTACH_DECL_NEW(bcmmbox, sizeof(struct static int bcmmbox_match(device_t parent, cfdata_t match, void *aux) { - const char * const compatible[] = { "brcm,bcm2835-mbox", NULL }; + const char * const compatible[] = { + "brcm,bcm2835-mbox", + "brcm,bcm2838-vchiq", + NULL + }; struct fdt_attach_args * const faa = aux; return of_match_compatible(faa->faa_phandle, compatible); Index: sys/arch/arm/broadcom/bcm2835_pwm.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_pwm.c,v retrieving revision 1.3 diff -p -u -r1.3 bcm2835_pwm.c --- sys/arch/arm/broadcom/bcm2835_pwm.c 10 Dec 2017 21:38:26 -0000 1.3 +++ sys/arch/arm/broadcom/bcm2835_pwm.c 27 Jul 2019 13:09:18 -0000 @@ -234,9 +234,9 @@ bcm_pwm_control(struct bcm_pwm_channel * w = PWM_READ(pwm->sc, PWM_CTL); ctl = (w & ~pwm->ctlmask) | __SHIFTIN(ctl, pwm->ctlmask); - /* when FIFO usage gets enabled but wasn't clear the FIFO */ - if ((w & (PWM_CTL_USEF1|PWM_CTL_USEF2)) == 0 && - (ctl & (PWM_CTL_USEF1|PWM_CTL_USEF2)) != 0) + /* when FIFO usage changes clear the FIFO */ + if ((w & (PWM_CTL_USEF1|PWM_CTL_USEF2)) != + (ctl & (PWM_CTL_USEF1|PWM_CTL_USEF2))) ctl |= PWM_CTL_CLRF1; PWM_WRITE(sc, pwm->rng, rng); @@ -329,19 +329,18 @@ void bcm_pwm_dma_enable(struct bcm_pwm_channel *pwm, bool enable) { struct bcm2835pwm_softc *sc = pwm->sc; - uint32_t w; + uint32_t w, dreq, panic; + + /* when to refill */ + dreq = 7; + + /* when to request bus priority */ + panic = 7; -#if 0 - w = PWM_READ(sc, PWM_DMAC); - if (enable) - w |= PWM_DMAC_ENAB; - else - w &= ~PWM_DMAC_ENAB; -#else w = (enable ? PWM_DMAC_ENAB : 0) - | __SHIFTIN(7, PWM_DMAC_PANIC) - | __SHIFTIN(7, PWM_DMAC_DREQ); -#endif + | __SHIFTIN(panic, PWM_DMAC_PANIC) + | __SHIFTIN(dreq, PWM_DMAC_DREQ); + PWM_WRITE(sc, PWM_DMAC, w & ~PWM_DMAC_WRITEZERO); } Index: sys/arch/arm/broadcom/bcm2835_sdhost.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_sdhost.c,v retrieving revision 1.4 diff -p -u -r1.4 bcm2835_sdhost.c --- sys/arch/arm/broadcom/bcm2835_sdhost.c 10 Dec 2017 21:38:26 -0000 1.4 +++ sys/arch/arm/broadcom/bcm2835_sdhost.c 27 Jul 2019 13:09:18 -0000 @@ -358,6 +358,8 @@ sdhost_dma_transfer(struct sdhost_softc KASSERT(mutex_owned(&sc->sc_intr_lock)); +KASSERT(cmd->c_dmamap->dm_nsegs <= PAGE_SIZE / sizeof(struct bcm_dmac_conblk)); + for (seg = 0; seg < cmd->c_dmamap->dm_nsegs; seg++) { sc->sc_cblk[seg].cb_ti = __SHIFTIN(13, DMAC_TI_PERMAP); /* SD HOST */ Index: sys/arch/arm/broadcom/bcm2835reg.h =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835reg.h,v retrieving revision 1.23 diff -p -u -r1.23 bcm2835reg.h --- sys/arch/arm/broadcom/bcm2835reg.h 10 Sep 2018 11:05:12 -0000 1.23 +++ sys/arch/arm/broadcom/bcm2835reg.h 27 Jul 2019 13:09:18 -0000 @@ -38,17 +38,25 @@ #ifndef _BCM2835REG_H_ #define _BCM2835REG_H_ +#ifdef _KERNEL_OPT #include "opt_bcm283x.h" +#endif #if defined(SOC_BCM2835) + defined(SOC_BCM2836) != 1 #error Must define SOC_BCM2835 or SOC_BCM2836, and not both #endif +#define BCM2838_PERIPHERALS_BASE 0xfe000000 #define BCM2836_PERIPHERALS_BASE 0x3f000000 #define BCM2835_PERIPHERALS_BASE 0x20000000 #define BCM2835_PERIPHERALS_SIZE 0x01000000 /* 16MBytes */ #define BCM2835_PERIPHERALS_BASE_BUS 0x7e000000 +#define BCM2838_PERIPHERALS_PHYS_TO_BUS(a) \ + ((a) - BCM2838_PERIPHERALS_BASE + BCM2835_PERIPHERALS_BASE_BUS) +#define BCM2838_PERIPHERALS_BUS_TO_PHYS(a) \ + ((a) - BCM2835_PERIPHERALS_BASE_BUS + BCM2838_PERIPHERALS_BASE) + #define BCM2836_PERIPHERALS_PHYS_TO_BUS(a) \ ((a) - BCM2836_PERIPHERALS_BASE + BCM2835_PERIPHERALS_BASE_BUS) #define BCM2836_PERIPHERALS_BUS_TO_PHYS(a) \ @@ -89,6 +97,7 @@ #define BCM2835_RNG_SIZE 0x1000 #define BCM2835_GPIO_SIZE 0x1000 #define BCM2835_UART0_SIZE 0x90 +#define BCM2835_SDHOST_SIZE 0x1000 #define BCM2835_PCM_SIZE 0x1000 #define BCM2835_SPI0_SIZE 0x1000 #define BCM2835_BSC_SIZE 0x1000 @@ -134,7 +143,7 @@ #define BCM2835_INTC_DISABLEBASE (BCM2835_INTC_BASE + 0x1c) #if defined(SOC_BCM2836) -#define BCM2835_INT_BASE BCM2836_NIRQ +#define BCM2835_INT_BASE BCM2836_INT_BASECPUN(BCM2836_NCPUS) #else #define BCM2835_INT_BASE 0 #endif /* !BCM2836 */ @@ -142,7 +151,7 @@ #define BCM2836_NCPUS 4 #define BCM2836_NIRQPERCPU 32 -#define BCM2836_INT_LOCALBASE 0 +#define BCM2836_INT_LOCALBASE 1024 #define BCM2836_INT_BASECPUN(n) (BCM2836_INT_LOCALBASE + ((n) * BCM2836_NIRQPERCPU)) #define BCM2836_NIRQ (BCM2836_NIRQPERCPU * BCM2836_NCPUS) @@ -206,6 +215,9 @@ #define BCM2835_UART0_CLK 3000000 +#define BCM2838_ARM_LOCAL_BASE 0xff800000 +#define BCM2838_ARM_LOCAL_SIZE 0x00100000 /* 1MByte */ + #define BCM2836_ARM_LOCAL_BASE 0x40000000 #define BCM2836_ARM_LOCAL_SIZE 0x00001000 /* 4KBytes */ Index: sys/arch/arm/broadcom/bcm2835var.h =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835var.h,v retrieving revision 1.4 diff -p -u -r1.4 bcm2835var.h --- sys/arch/arm/broadcom/bcm2835var.h 1 Apr 2018 04:35:03 -0000 1.4 +++ sys/arch/arm/broadcom/bcm2835var.h 27 Jul 2019 13:09:18 -0000 @@ -49,5 +49,6 @@ void bcm2836_cpu_hatch(struct cpu_info * u_int bcm283x_clk_get_rate_uart(void); u_int bcm283x_clk_get_rate_vpu(void); u_int bcm283x_clk_get_rate_emmc(void); +u_int bcm283x_clk_get_rate_emmc2(void); #endif /* _ARM_BROADCOM_BCM2835_VAR_H_ */ Index: sys/arch/arm/broadcom/bcm283x_platform.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm283x_platform.c,v retrieving revision 1.23 diff -p -u -r1.23 bcm283x_platform.c --- sys/arch/arm/broadcom/bcm283x_platform.c 3 Jan 2019 12:52:40 -0000 1.23 +++ sys/arch/arm/broadcom/bcm283x_platform.c 27 Jul 2019 13:09:18 -0000 @@ -113,14 +113,24 @@ __KERNEL_RCSID(0, "$NetBSD: bcm283x_plat void bcm2835_platform_early_putchar(char c); void bcm2836_platform_early_putchar(char c); void bcm2837_platform_early_putchar(char c); +void bcm2838_platform_early_putchar(char c); extern void bcmgenfb_set_console_dev(device_t dev); void bcmgenfb_set_ioctl(int(*)(void *, void *, u_long, void *, int, struct lwp *)); extern void bcmgenfb_ddb_trap_callback(int where); static int rpi_ioctl(void *, void *, u_long, void *, int, lwp_t *); +#if defined(__aarch64__) +extern struct bus_space aarch64_generic_dsb_bs_tag; +extern struct bus_space aarch64_generic_a4x_dsb_bs_tag; +#define ARM_GENERIC_BS_TAG aarch64_generic_dsb_bs_tag +#define ARM_GENERIC_A4X_BS_TAG aarch64_generic_a4x_dsb_bs_tag +#else extern struct bus_space arm_generic_bs_tag; extern struct bus_space arm_generic_a4x_bs_tag; +#define ARM_GENERIC_BS_TAG arm_generic_bs_tag +#define ARM_GENERIC_A4X_BS_TAG arm_generic_a4x_bs_tag +#endif /* Prototypes for all the bus_space structure functions */ bs_protos(arm_generic); @@ -129,14 +139,19 @@ bs_protos(bcm2835); bs_protos(bcm2835_a4x); bs_protos(bcm2836); bs_protos(bcm2836_a4x); +bs_protos(bcm2838); +bs_protos(bcm2838_a4x); struct bus_space bcm2835_bs_tag; struct bus_space bcm2835_a4x_bs_tag; struct bus_space bcm2836_bs_tag; struct bus_space bcm2836_a4x_bs_tag; +struct bus_space bcm2838_bs_tag; +struct bus_space bcm2838_a4x_bs_tag; static paddr_t bcm2835_bus_to_phys(bus_addr_t); static paddr_t bcm2836_bus_to_phys(bus_addr_t); +static paddr_t bcm2838_bus_to_phys(bus_addr_t); #ifdef VERBOSE_INIT_ARM #define VPRINTF(...) printf(__VA_ARGS__) @@ -172,13 +187,33 @@ bcm2836_bus_to_phys(bus_addr_t ba) return ba & ~BCM2835_BUSADDR_CACHE_MASK; } +static paddr_t +bcm2838_bus_to_phys(bus_addr_t ba) +{ + + /* Attempt to find the PA device mapping */ + if (ba >= BCM2835_PERIPHERALS_BASE_BUS && + ba < BCM2835_PERIPHERALS_BASE_BUS + BCM2835_PERIPHERALS_SIZE) + return BCM2838_PERIPHERALS_BUS_TO_PHYS(ba); + + if (ba >= BCM2838_ARM_LOCAL_BASE && + ba < BCM2838_ARM_LOCAL_BASE + BCM2838_ARM_LOCAL_SIZE) + return ba; + + if (ba >= BCM2836_ARM_LOCAL_BASE && + ba < BCM2836_ARM_LOCAL_BASE + BCM2838_ARM_LOCAL_SIZE) + return (ba - BCM2836_ARM_LOCAL_BASE) + BCM2838_ARM_LOCAL_BASE; + + return ba & ~BCM2835_BUSADDR_CACHE_MASK; +} + int bcm2835_bs_map(void *t, bus_addr_t ba, bus_size_t size, int flag, bus_space_handle_t *bshp) { const paddr_t pa = bcm2835_bus_to_phys(ba); - return bus_space_map(&arm_generic_bs_tag, pa, size, flag, bshp); + return bus_space_map(&ARM_GENERIC_BS_TAG, pa, size, flag, bshp); } paddr_t @@ -186,7 +221,7 @@ bcm2835_bs_mmap(void *t, bus_addr_t ba, { const paddr_t pa = bcm2835_bus_to_phys(ba); - return bus_space_mmap(&arm_generic_bs_tag, pa, offset, prot, flags); + return bus_space_mmap(&ARM_GENERIC_BS_TAG, pa, offset, prot, flags); } paddr_t @@ -202,7 +237,7 @@ bcm2836_bs_map(void *t, bus_addr_t ba, b { const paddr_t pa = bcm2836_bus_to_phys(ba); - return bus_space_map(&arm_generic_bs_tag, pa, size, flag, bshp); + return bus_space_map(&ARM_GENERIC_BS_TAG, pa, size, flag, bshp); } paddr_t @@ -210,7 +245,7 @@ bcm2836_bs_mmap(void *t, bus_addr_t ba, { const paddr_t pa = bcm2836_bus_to_phys(ba); - return bus_space_mmap(&arm_generic_bs_tag, pa, offset, prot, flags); + return bus_space_mmap(&ARM_GENERIC_BS_TAG, pa, offset, prot, flags); } paddr_t @@ -220,6 +255,30 @@ bcm2836_a4x_bs_mmap(void *t, bus_addr_t return bcm2836_bs_mmap(t, ba, 4 * offset, prot, flags); } +int +bcm2838_bs_map(void *t, bus_addr_t ba, bus_size_t size, int flag, + bus_space_handle_t *bshp) +{ + const paddr_t pa = bcm2838_bus_to_phys(ba); + + return bus_space_map(&ARM_GENERIC_BS_TAG, pa, size, flag, bshp); +} + +paddr_t +bcm2838_bs_mmap(void *t, bus_addr_t ba, off_t offset, int prot, int flags) +{ + const paddr_t pa = bcm2838_bus_to_phys(ba); + + return bus_space_mmap(&ARM_GENERIC_BS_TAG, pa, offset, prot, flags); +} + +paddr_t +bcm2838_a4x_bs_mmap(void *t, bus_addr_t ba, off_t offset, int prot, int flags) +{ + + return bcm2838_bs_mmap(t, ba, 4 * offset, prot, flags); +} + struct arm32_dma_range bcm2835_dma_ranges[] = { [0] = { .dr_sysbase = 0, @@ -234,6 +293,13 @@ struct arm32_dma_range bcm2836_dma_range } }; +struct arm32_dma_range bcm2838_dma_ranges[] = { + [0] = { + .dr_sysbase = 0, + .dr_busbase = BCM2835_BUSADDR_CACHE_DIRECT, + } +}; + #if defined(SOC_BCM2835) static const struct pmap_devmap * @@ -257,13 +323,31 @@ bcm2836_platform_devmap(void) static const struct pmap_devmap devmap[] = { DEVMAP_ENTRY(BCM2836_PERIPHERALS_VBASE, BCM2836_PERIPHERALS_BASE, BCM2835_PERIPHERALS_SIZE), /* 16Mb */ - DEVMAP_ENTRY(BCM2836_ARM_LOCAL_VBASE, BCM2836_ARM_LOCAL_BASE, BCM2836_ARM_LOCAL_SIZE), #if defined(MULTIPROCESSOR) && defined(__aarch64__) /* for fdt cpu spin-table */ - DEVMAP_ENTRY(BCM2836_ARM_SMP_VBASE, BCM2836_ARM_SMP_BASE, - BCM2836_ARM_SMP_SIZE), + DEVMAP_ENTRY_PAGES(BCM2836_ARM_SMP_VBASE, BCM2836_ARM_SMP_BASE, + BCM2836_ARM_SMP_SIZE), +#endif + DEVMAP_ENTRY_END + }; + + return devmap; +} + +static const struct pmap_devmap * +bcm2838_platform_devmap(void) +{ + static const struct pmap_devmap devmap[] = { + DEVMAP_ENTRY(BCM2838_PERIPHERALS_VBASE, BCM2838_PERIPHERALS_BASE, + BCM2835_PERIPHERALS_SIZE), /* 16Mb */ + DEVMAP_ENTRY(BCM2838_ARM_LOCAL_VBASE, BCM2838_ARM_LOCAL_BASE, + BCM2838_ARM_LOCAL_SIZE), +#if defined(MULTIPROCESSOR) && defined(__aarch64__) + /* for fdt cpu spin-table */ + DEVMAP_ENTRY_PAGES(BCM2836_ARM_SMP_VBASE, BCM2836_ARM_SMP_BASE, + BCM2836_ARM_SMP_SIZE), #endif DEVMAP_ENTRY_END }; @@ -330,6 +414,7 @@ static struct { struct vcprop_tag_clockrate vbt_emmcclockrate; struct vcprop_tag_clockrate vbt_armclockrate; struct vcprop_tag_clockrate vbt_vpuclockrate; + struct vcprop_tag_clockrate vbt_emmc2clockrate; struct vcprop_tag end; } vb __cacheline_aligned = { .vb_hdr = { @@ -416,6 +501,14 @@ static struct { }, .id = VCPROP_CLK_CORE }, + .vbt_emmc2clockrate = { + .tag = { + .vpt_tag = VCPROPTAG_GET_CLOCKRATE, + .vpt_len = VCPROPTAG_LEN(vb.vbt_emmc2clockrate), + .vpt_rcode = VCPROPTAG_REQUEST + }, + .id = VCPROP_CLK_EMMC2 + }, .end = { .vpt_tag = VCPROPTAG_NULL } @@ -567,6 +660,17 @@ bcm283x_clk_get_rate_emmc(void) return 0; } +u_int +bcm283x_clk_get_rate_emmc2(void) +{ + + if (vcprop_tag_success_p(&vb.vbt_emmc2clockrate.tag) && + vb.vbt_emmc2clockrate.rate > 0) { + return vb.vbt_emmc2clockrate.rate; + } + return 0; +} + static void @@ -607,6 +711,16 @@ bcm2836_uartinit(void) bcm283x_uartinit(iot, ioh); } + +static void +bcm2838_uartinit(void) +{ + const paddr_t pa = BCM2838_PERIPHERALS_BUS_TO_PHYS(BCM2835_ARMMBOX_BASE); + const bus_space_tag_t iot = &bcm2838_bs_tag; + const bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(pa); + + bcm283x_uartinit(iot, ioh); +} #endif #define BCM283x_MINIMUM_SPLIT (128U * 1024 * 1024) @@ -637,10 +751,11 @@ bcm283x_bootparams(bus_space_tag_t iot, #endif 0) << 4); + cpu_dcache_wbinv_range((vaddr_t)&vb, sizeof(vb)); bcm2835_mbox_write(iot, ioh, BCMMBOX_CHANARM2VC, KERN_VTOPHYS((vaddr_t)&vb)); - bcm2835_mbox_read(iot, ioh, BCMMBOX_CHANARM2VC, &res); + cpu_dcache_wbinv_range((vaddr_t)&vb, sizeof(vb)); if (!vcprop_buffer_success_p(&vb.vb_hdr)) { bootconfig.dramblocks = 1; @@ -664,7 +779,8 @@ bcm283x_bootparams(bus_space_tag_t iot, bcm283x_memorysize += vptp_mem->mem[i].size; } - } + } else + printf("%s: failed to query memory\n",__func__); if (vcprop_tag_success_p(&vb.vbt_armclockrate.tag)) curcpu()->ci_data.cpu_cc_freq = vb.vbt_armclockrate.rate; @@ -676,6 +792,12 @@ bcm283x_bootparams(bus_space_tag_t iot, if (vcprop_tag_success_p(&vb.vbt_armclockrate.tag)) printf("%s: arm clock %d\n", __func__, vb.vbt_armclockrate.rate); + if (vcprop_tag_success_p(&vb.vbt_vpuclockrate.tag)) + printf("%s: vpu clock %d\n", __func__, + vb.vbt_vpuclockrate.rate); + if (vcprop_tag_success_p(&vb.vbt_emmcclockrate.tag)) + printf("%s: emmc clock %d\n", __func__, + vb.vbt_emmcclockrate.rate); if (vcprop_tag_success_p(&vb.vbt_fwrev.tag)) printf("%s: firmware rev %x\n", __func__, vb.vbt_fwrev.rev); @@ -724,6 +846,16 @@ bcm2836_bootparams(void) bcm283x_bootparams(iot, ioh); } +static void +bcm2838_bootparams(void) +{ + const paddr_t pa = BCM2838_PERIPHERALS_BUS_TO_PHYS(BCM2835_ARMMBOX_BASE); + const bus_space_tag_t iot = &bcm2838_bs_tag; + const bus_space_handle_t ioh = BCM2835_IOPHYSTOVIRT(pa); + + bcm283x_bootparams(iot, ioh); +} + #if defined(MULTIPROCESSOR) static int cpu_enable_bcm2836(int phandle) @@ -1080,6 +1212,87 @@ rpi_ioctl(void *v, void *vs, u_long cmd, #endif +static struct rpi_info { + int model, pcbrev, memsize, manufacturer, processor, warranty; +} revtbl[] = { + { -1, }, + { -1, }, + { RPI_MODEL_B, 1, RPI_MEMSIZE_256, -1, }, + { RPI_MODEL_B, 1, RPI_MEMSIZE_256, -1, }, + { RPI_MODEL_B, 2, RPI_MEMSIZE_256, RPI_MANUF_SONY, }, + { RPI_MODEL_B, 2, RPI_MEMSIZE_256, RPI_MANUF_QISDA, }, + { RPI_MODEL_B, 2, RPI_MEMSIZE_256, RPI_MANUF_EGOMAN, }, + { RPI_MODEL_A, 2, RPI_MEMSIZE_256, RPI_MANUF_EGOMAN, }, + { RPI_MODEL_A, 2, RPI_MEMSIZE_256, RPI_MANUF_SONY, }, + { RPI_MODEL_A, 2, RPI_MEMSIZE_256, RPI_MANUF_QISDA, }, + { -1, }, + { -1, }, + { -1, }, + { RPI_MODEL_B, 2, RPI_MEMSIZE_512, RPI_MANUF_EGOMAN, }, + { RPI_MODEL_B, 2, RPI_MEMSIZE_512, RPI_MANUF_SONY, }, + { RPI_MODEL_B, 2, RPI_MEMSIZE_512, RPI_MANUF_QISDA, }, + { RPI_MODEL_B_PLUS, 1, RPI_MEMSIZE_512, RPI_MANUF_SONY, }, + { RPI_MODEL_COMPUTE, 1, RPI_MEMSIZE_512, RPI_MANUF_SONY, }, + { RPI_MODEL_A_PLUS, 1, RPI_MEMSIZE_256, RPI_MANUF_SONY, }, + { RPI_MODEL_B_PLUS, 1, RPI_MEMSIZE_512, RPI_MANUF_EMBEST, }, + { RPI_MODEL_COMPUTE, 1, RPI_MEMSIZE_512, RPI_MANUF_SONY, }, + { RPI_MODEL_A_PLUS, 1, RPI_MEMSIZE_256, RPI_MANUF_SONY, } +}; + +static void +rev2info(unsigned rev, struct rpi_info *info) +{ + + if (rev & VCPROP_REV_ENCFLAG) { + info->pcbrev = __SHIFTOUT(rev, VCPROP_REV_PCBREV), + info->model = __SHIFTOUT(rev, VCPROP_REV_MODEL), + info->processor = __SHIFTOUT(rev, VCPROP_REV_PROCESSOR), + info->manufacturer = __SHIFTOUT(rev, VCPROP_REV_MANUF), + info->memsize = __SHIFTOUT(rev, VCPROP_REV_MEMSIZE), + info->warranty = __SHIFTOUT(rev, VCPROP_REV_WARRANTY); + } else if (rev < __arraycount(revtbl)) { + info->pcbrev = revtbl[rev].pcbrev; + info->model = revtbl[rev].model; + info->processor = RPI_PROCESSOR_BCM2835; + info->manufacturer = revtbl[rev].manufacturer; + info->memsize = revtbl[rev].memsize; + info->warranty = __SHIFTOUT(rev, VCPROP_REV_WARRANTY); + } else { + info->pcbrev = -1; + info->model = -1; + info->processor = -1; + info->manufacturer = -1; + info->memsize = -1; + info->warranty = __SHIFTOUT(rev, VCPROP_REV_WARRANTY); + } +} + +static int +rpi_boardinfo_helper(SYSCTLFN_ARGS) +{ + struct rpi_info info; + char buf[100]; + int error; + + rev2info(vb.vbt_boardrev.rev, &info); + + snprintf(buf, sizeof(buf), + "pcbrev:%d model:%d processor:%d manufacturer:%d" + " memsize:%d warrantyvoid:%d", + info.pcbrev, + info.model, + info.processor, + info.manufacturer, + info.memsize, + info.warranty); + + if (oldp && (error = copyoutstr(buf, oldp, sizeof(buf), NULL)) != 0) + return error; + + *oldlenp = strlen(buf)+1; + return 0; +} + SYSCTL_SETUP(sysctl_machdep_rpi, "sysctl machdep subtree setup (rpi)") { sysctl_createv(clog, 0, NULL, NULL, @@ -1105,6 +1318,12 @@ SYSCTL_SETUP(sysctl_machdep_rpi, "sysctl CTLFLAG_PERMANENT|CTLFLAG_READONLY|CTLFLAG_HEX|CTLFLAG_PRIVATE, CTLTYPE_QUAD, "serial", NULL, NULL, 0, &vb.vbt_serial.sn, 0, CTL_MACHDEP, CTL_CREATE, CTL_EOL); + + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READONLY, + CTLTYPE_STRING, "board_info", "RPI Board Information", + rpi_boardinfo_helper, 0, + NULL, 0, CTL_MACHDEP, CTL_CREATE, CTL_EOL); } #if defined(SOC_BCM2835) @@ -1112,8 +1331,8 @@ static void bcm2835_platform_bootstrap(void) { - bcm2835_bs_tag = arm_generic_bs_tag; - bcm2835_a4x_bs_tag = arm_generic_a4x_bs_tag; + bcm2835_bs_tag = ARM_GENERIC_BS_TAG; + bcm2835_a4x_bs_tag = ARM_GENERIC_A4X_BS_TAG; bcm2835_bs_tag.bs_map = bcm2835_bs_map; bcm2835_bs_tag.bs_mmap = bcm2835_bs_mmap; @@ -1133,8 +1352,8 @@ static void bcm2836_platform_bootstrap(void) { - bcm2836_bs_tag = arm_generic_bs_tag; - bcm2836_a4x_bs_tag = arm_generic_a4x_bs_tag; + bcm2836_bs_tag = ARM_GENERIC_BS_TAG; + bcm2836_a4x_bs_tag = ARM_GENERIC_A4X_BS_TAG; bcm2836_bs_tag.bs_map = bcm2836_bs_map; bcm2836_bs_tag.bs_mmap = bcm2836_bs_mmap; @@ -1152,6 +1371,30 @@ bcm2836_platform_bootstrap(void) arm_fdt_cpu_bootstrap(); #endif } + +static void +bcm2838_platform_bootstrap(void) +{ + + bcm2838_bs_tag = ARM_GENERIC_BS_TAG; + bcm2838_a4x_bs_tag = ARM_GENERIC_A4X_BS_TAG; + + bcm2838_bs_tag.bs_map = bcm2838_bs_map; + bcm2838_bs_tag.bs_mmap = bcm2838_bs_mmap; + bcm2838_a4x_bs_tag.bs_map = bcm2838_bs_map; + bcm2838_a4x_bs_tag.bs_mmap = bcm2838_a4x_bs_mmap; + + fdtbus_set_decoderegprop(false); + + bcm2838_uartinit(); + + bcm2838_bootparams(); + +#ifdef MULTIPROCESSOR + arm_cpu_max = RPI_CPU_MAX; + arm_fdt_cpu_bootstrap(); +#endif +} #endif #if defined(SOC_BCM2835) @@ -1182,6 +1425,19 @@ bcm2836_platform_init_attach_args(struct bcm2835_bus_dma_tag._nranges = __arraycount(bcm2836_dma_ranges); bcm2836_dma_ranges[0].dr_len = bcm283x_memorysize; } + +static void +bcm2838_platform_init_attach_args(struct fdt_attach_args *faa) +{ + + faa->faa_bst = &bcm2838_bs_tag; + faa->faa_a4x_bst = &bcm2838_a4x_bs_tag; + faa->faa_dmat = &bcm2835_bus_dma_tag; + + bcm2835_bus_dma_tag._ranges = bcm2838_dma_ranges; + bcm2835_bus_dma_tag._nranges = __arraycount(bcm2838_dma_ranges); + bcm2838_dma_ranges[0].dr_len = bcm283x_memorysize; +} #endif @@ -1223,6 +1479,24 @@ bcm2836_platform_early_putchar(char c) #define BCM283x_REF_FREQ 19200000 void +bcm2838_platform_early_putchar(char c) +{ +#define AUCONSADDR_PA BCM2838_PERIPHERALS_BUS_TO_PHYS(BCM2835_AUX_UART_BASE) +#define AUCONSADDR_VA BCM2835_IOPHYSTOVIRT(AUCONSADDR_PA) + volatile uint32_t *uartaddr = + cpu_earlydevice_va_p() ? + (volatile uint32_t *)AUCONSADDR_VA : + (volatile uint32_t *)AUCONSADDR_PA; + + while ((uartaddr[com_lsr] & LSR_TXRDY) == 0) + ; + + uartaddr[com_data] = c; +#undef AUCONSADDR_VA +#undef AUCONSADDR_PA +} + +void bcm2837_platform_early_putchar(char c) { #define AUCONSADDR_PA BCM2836_PERIPHERALS_BUS_TO_PHYS(BCM2835_AUX_UART_BASE) @@ -1236,6 +1510,8 @@ bcm2837_platform_early_putchar(char c) ; uartaddr[com_data] = c; +#undef AUCONSADDR_VA +#undef AUCONSADDR_PA } static void @@ -1353,6 +1629,18 @@ static const struct arm_platform bcm2837 .ap_mpstart = arm_fdt_cpu_mpstart, }; +static const struct arm_platform bcm2838_platform = { + .ap_devmap = bcm2838_platform_devmap, + .ap_bootstrap = bcm2838_platform_bootstrap, + .ap_init_attach_args = bcm2838_platform_init_attach_args, + .ap_device_register = bcm283x_platform_device_register, + .ap_reset = bcm2835_system_reset, + .ap_delay = gtmr_delay, + .ap_uart_freq = bcm2837_platform_uart_freq, + .ap_mpstart = arm_fdt_cpu_mpstart, +}; + ARM_PLATFORM(bcm2836, "brcm,bcm2836", &bcm2836_platform); ARM_PLATFORM(bcm2837, "brcm,bcm2837", &bcm2837_platform); +ARM_PLATFORM(bcm2838, "brcm,bcm2838", &bcm2838_platform); #endif Index: sys/arch/arm/broadcom/bcm283x_platform.h =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm283x_platform.h,v retrieving revision 1.2 diff -p -u -r1.2 bcm283x_platform.h --- sys/arch/arm/broadcom/bcm283x_platform.h 10 Sep 2018 11:05:12 -0000 1.2 +++ sys/arch/arm/broadcom/bcm283x_platform.h 27 Jul 2019 13:09:18 -0000 @@ -34,8 +34,25 @@ #include +/* + * map physical IO address + * + * 00xxxxxx -> vbase | 00xxxxxx (SMP page) + * 20xxxxxx -> vbase | 02xxxxxx (RPI1 periph) + * 30xxxxxx -> vbase | 03xxxxxx (RPI2/3 local) + * 7exxxxxx -> vbase | 07xxxxxx (RPI2/3 periph) + * fexxxxxx -> vbase | 07xxxxxx (RPI4 periph) + * ffxxxxxx -> vbase | 06xxxxxx (RPI4 local) + * + */ #define BCM2835_IOPHYSTOVIRT(a) \ - ((KERNEL_IO_VBASE | (((a) & 0xf0000000) >> 4)) + ((a) & ~0xff000000)) + ( \ + KERNEL_IO_VBASE \ + | ( \ + (((a) & 0x70000000) >> 4) \ + ^ (((a) & 0x01000000) >> 0) \ + ) | ((a) & ~0xff000000) \ + ) #define BCM2835_PERIPHERALS_VBASE \ BCM2835_IOPHYSTOVIRT(BCM2835_PERIPHERALS_BASE) @@ -43,9 +60,15 @@ #define BCM2836_PERIPHERALS_VBASE \ BCM2835_IOPHYSTOVIRT(BCM2836_PERIPHERALS_BASE) +#define BCM2838_PERIPHERALS_VBASE \ + BCM2835_IOPHYSTOVIRT(BCM2838_PERIPHERALS_BASE) + #define BCM2836_ARM_LOCAL_VBASE \ BCM2835_IOPHYSTOVIRT(BCM2836_ARM_LOCAL_BASE) +#define BCM2838_ARM_LOCAL_VBASE \ + BCM2835_IOPHYSTOVIRT(BCM2838_ARM_LOCAL_BASE) + #define BCM2836_ARM_SMP_VBASE \ BCM2835_IOPHYSTOVIRT(BCM2836_ARM_SMP_BASE) Index: sys/arch/arm/cortex/gic.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/cortex/gic.c,v retrieving revision 1.38 diff -p -u -r1.38 gic.c --- sys/arch/arm/cortex/gic.c 16 Nov 2018 23:25:09 -0000 1.38 +++ sys/arch/arm/cortex/gic.c 27 Jul 2019 13:09:18 -0000 @@ -320,7 +320,6 @@ armgic_irq_handler(void *tf) #ifdef DEBUG size_t n = 0; #endif - ci->ci_data.cpu_nintr++; for (;;) { Index: sys/arch/arm/cortex/gtmr.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/cortex/gtmr.c,v retrieving revision 1.40 diff -p -u -r1.40 gtmr.c --- sys/arch/arm/cortex/gtmr.c 16 Jun 2019 10:57:59 -0000 1.40 +++ sys/arch/arm/cortex/gtmr.c 27 Jul 2019 13:09:18 -0000 @@ -42,6 +42,11 @@ __KERNEL_RCSID(0, "$NetBSD: gtmr.c,v 1.4 #include #include +#include +#include +#include +#include + #include #include @@ -250,11 +255,54 @@ gtmr_delay(unsigned int n) } } +static void +gtmr_recover(uint32_t *base) +{ + struct cpu_info * const ci = curcpu(); + struct gtmr_softc * const sc = >mr_sc; + uint64_t now; + + if (base == NULL) + return; + + now = gtmr_read_cntvct(sc); + + if (now < ci->ci_lastintr) { + printf("cntv was reset to %"PRIx64"\n", now); + now = ci->ci_lastintr + sc->sc_autoinc; + printf("restoring to %"PRIx64" + %lx = %"PRIx64"\n", + ci->ci_lastintr, sc->sc_autoinc, now); + + /* BCM2836_LOCAL_TIMER_LS */ + base[7] = now & 0xffffffff; + arm_isb(); + /* BCM2836_LOCAL_TIMER_MS */ + base[8] = now >> 32; + arm_isb(); + + now = gtmr_read_cntvct(sc); + printf("read 1 value %"PRIx64"\n",now); + now = gtmr_read_cntvct(sc); + printf("read 2 value %"PRIx64"\n",now); + now = gtmr_read_cntvct(sc); + printf("read 3 value %"PRIx64"\n",now); + + /* BCM2836_LOCAL_PRESCALER */ + base[2] = 0x80000000; + arm_isb(); + + now = gtmr_read_cntvct(sc); + printf("read 4 value %"PRIx64"\n",now); + } +} + /* * gtmr_intr: * * Handle the hardclock interrupt. */ +volatile unsigned int the_gtmr_interrupts; +volatile unsigned int the_gtmr_counts; int gtmr_intr(void *arg) { @@ -262,6 +310,8 @@ gtmr_intr(void *arg) struct clockframe * const cf = arg; struct gtmr_softc * const sc = >mr_sc; + atomic_inc_uint(&the_gtmr_interrupts); + arm_isb(); const uint32_t ctl = gtmr_cntv_ctl_read(); @@ -271,7 +321,10 @@ gtmr_intr(void *arg) arm_isb(); gtmr_cntv_ctl_write(0); + atomic_inc_uint(&the_gtmr_counts); + const uint64_t now = gtmr_read_cntvct(sc); + uint64_t delta = now - ci->ci_lastintr; #ifdef DIAGNOSTIC @@ -341,3 +394,61 @@ gtmr_get_timecount(struct timecounter *t arm_isb(); // we want the time NOW, not some instructions later. return (u_int) gtmr_read_cntvct(sc); } + + + +static int gtmr_debug_helper(SYSCTLFN_PROTO); +static bool gtmr_debug_flag = false; + +static int +gtmr_debug_helper(SYSCTLFN_ARGS) +{ + struct sysctlnode node; + int error; + bool t; + + node = *rnode; + node.sysctl_data = &t; + error = sysctl_lookup(SYSCTLFN_CALL(&node)); + if (error || newp == NULL) + return (error); + + uint32_t *base = (uint32_t *)BCM2836_ARM_LOCAL_VBASE; + unsigned i; + + if (pmap_devmap_find_va((vaddr_t)base, 0x100) == NULL) + base = NULL; + + gtmr_recover(base); + + printf("cntfrq %" PRIx32 "\n", gtmr_cntfrq_read()); + printf("cntk_ctl %" PRIx32 "\n", gtmr_cntk_ctl_read()); + printf("cntpct %" PRIx64 "\n", gtmr_cntpct_read()); + printf("cntvct %" PRIx64 "\n", gtmr_cntvct_read()); + printf("cntvct_ctl %" PRIx32 "\n", gtmr_cntv_ctl_read()); + printf("cntvct_tval %" PRIx32 "\n", gtmr_cntv_tval_read()); + printf("cntvct_cval %" PRIx64 "\n", gtmr_cntv_cval_read()); + + if (base) + for (i=0; i<32; ++i) + printf("local[%3u] %" PRIx32 "\n",i,base[i]); + + printf("ci_nintr[%3u] %" PRIx64 "\n", + curcpu()->ci_data.cpu_index, + curcpu()->ci_data.cpu_nintr); + + return 0; +} + +SYSCTL_SETUP(sysctl_gtmr_debug, "GTMR debug trigger") +{ + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT, CTLTYPE_NODE, "machdep", NULL, + NULL, 0, NULL, 0, CTL_MACHDEP, CTL_EOL); + + sysctl_createv(clog, 0, NULL, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READWRITE, + CTLTYPE_BOOL, "gtmrdebug", "GTMR Debug Trigger", + gtmr_debug_helper, 0, + >mr_debug_flag, 0, CTL_MACHDEP, CTL_CREATE, CTL_EOL); +} Index: sys/arch/arm/include/arm32/pmap.h =================================================================== RCS file: /cvsroot/src/sys/arch/arm/include/arm32/pmap.h,v retrieving revision 1.156 diff -p -u -r1.156 pmap.h --- sys/arch/arm/include/arm32/pmap.h 18 Oct 2018 09:01:52 -0000 1.156 +++ sys/arch/arm/include/arm32/pmap.h 27 Jul 2019 13:09:18 -0000 @@ -215,6 +215,8 @@ struct pmap_devmap { #define DEVMAP_ALIGN(a) ((a) & ~L1_S_OFFSET) #define DEVMAP_SIZE(s) roundup2((s), L1_S_SIZE) +#define DEVMAP_ALIGNPG(a) ((a) & ~L2_S_OFFSET) +#define DEVMAP_PGSZ(s) roundup2((s), L2_S_SIZE) #define DEVMAP_ENTRY(va, pa, sz) \ { \ .pd_va = DEVMAP_ALIGN(va), \ @@ -223,6 +225,14 @@ struct pmap_devmap { .pd_prot = VM_PROT_READ|VM_PROT_WRITE, \ .pd_cache = PTE_NOCACHE \ } +#define DEVMAP_ENTRY_PAGES(va, pa, sz) \ + { \ + .pd_va = DEVMAP_ALIGNPG(va), \ + .pd_pa = DEVMAP_ALIGNPG(pa), \ + .pd_size = DEVMAP_PGSZ(sz), \ + .pd_prot = VM_PROT_READ|VM_PROT_WRITE, \ + .pd_cache = PTE_NOCACHE \ + } #define DEVMAP_ENTRY_END { 0 } /* Index: sys/arch/arm/pic/pic.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/pic/pic.c,v retrieving revision 1.48 diff -p -u -r1.48 pic.c --- sys/arch/arm/pic/pic.c 16 Nov 2018 15:06:22 -0000 1.48 +++ sys/arch/arm/pic/pic.c 27 Jul 2019 13:09:18 -0000 @@ -813,9 +813,9 @@ pic_establish_intr(struct pic_softc *pic is->is_iplidx = off - pic_ipl_offset[ipl]; pic__iplsources[off] = is; +unblock: (*pic->pic_ops->pic_establish_irq)(pic, is); -unblock: (*pic->pic_ops->pic_unblock_irqs)(pic, is->is_irq & ~0x1f, __BIT(is->is_irq & 0x1f)); Index: sys/arch/evbarm/conf/GENERIC64 =================================================================== RCS file: /cvsroot/src/sys/arch/evbarm/conf/GENERIC64,v retrieving revision 1.103 diff -p -u -r1.103 GENERIC64 --- sys/arch/evbarm/conf/GENERIC64 25 Jul 2019 00:30:45 -0000 1.103 +++ sys/arch/evbarm/conf/GENERIC64 27 Jul 2019 13:09:18 -0000 @@ -506,4 +506,8 @@ vioscsi* at virtio? # Virtio SCSI devic scsibus* at scsi? sd* at scsibus? target ? lun ? # SCSI disk drives +# IPMI device +ipmi_acpi* at acpi? +ipmi0 at ipmi_acpi? + cinclude "arch/evbarm/conf/GENERIC64.local" Index: sys/arch/evbarm/rpi/vcprop.h =================================================================== RCS file: /cvsroot/src/sys/arch/evbarm/rpi/vcprop.h,v retrieving revision 1.16 diff -p -u -r1.16 vcprop.h --- sys/arch/evbarm/rpi/vcprop.h 17 Jun 2017 17:03:40 -0000 1.16 +++ sys/arch/evbarm/rpi/vcprop.h 27 Jul 2019 13:09:19 -0000 @@ -71,10 +71,19 @@ struct vcprop_tag { #define VCPROPTAG_GET_TEMPERATURE 0x00030006 #define VCPROPTAG_GET_MAX_TEMPERATURE 0x0003000a +#define VCPROPTAG_GET_DOMAINSTATE 0x00030030 +#define VCPROPTAG_SET_DOMAINSTATE 0x00038030 + +#define VCPROPTAG_GET_OTP 0x00030021 +#define VCPROPTAG_SET_OTP 0x00038021 + +#define VCPROPTAG_SET_SDHOST_CLOCK 0x00038042 + #define VCPROPTAG_GET_CMDLINE 0x00050001 #define VCPROPTAG_GET_DMACHAN 0x00060001 #define VCPROPTAG_ALLOCATE_BUFFER 0x00040001 +#define VCPROPTAG_RELEASE_BUFFER 0x00048001 #define VCPROPTAG_BLANK_SCREEN 0x00040002 #define VCPROPTAG_GET_FB_RES 0x00040003 #define VCPROPTAG_SET_FB_RES 0x00048003 @@ -87,6 +96,18 @@ struct vcprop_tag { #define VCPROPTAG_GET_FB_ALPHA_MODE 0x00040007 #define VCPROPTAG_SET_FB_ALPHA_MODE 0x00048007 #define VCPROPTAG_GET_FB_PITCH 0x00040008 +#define VCPROPTAG_GET_VIRTUAL_OFFSET 0x00040009 +#define VCPROPTAG_SET_VIRTUAL_OFFSET 0x00048009 +#define VCPROPTAG_GET_OVERSCAN 0x0004000a +#define VCPROPTAG_SET_OVERSCAN 0x0004800a +#define VCPROPTAG_GET_PALETTE 0x0004000b +#define VCPROPTAG_SET_PALETTE 0x0004800b +#define VCPROPTAG_SET_VSYNC 0x0004800e +#define VCPROPTAG_GET_TOUCHBUF 0x0004000f +#define VCPROPTAG_GET_SET_BACKLIGHT 0x0004800f +#define VCPROPTAG_GET_GPIOVIRTBUF 0x00040010 + +#define VCPROPTAG_VCHIQ_INIT 0x00048010 #define VCPROPTAG_GET_EDID_BLOCK 0x00030020 @@ -146,16 +167,25 @@ struct vcprop_tag_boardrev { #define RPI_MODEL_B_PI2 4 #define RPI_MODEL_ALPHA 5 #define RPI_MODEL_COMPUTE 6 -#define RPI_MODEL_ZERO 7 #define RPI_MODEL_B_PI3 8 -#define RPI_MODEL_COMPUTE_PI3 9 -#define RPI_MODEL_ZERO_W 10 +#define RPI_MODEL_ZERO 9 +#define RPI_MODEL_COMPUTE_PI3 10 +#define RPI_MODEL_ZERO_W 12 +#define RPI_MODEL_B_PLUS_PI3 13 #define VCPROP_REV_PROCESSOR __BITS(15,12) #define RPI_PROCESSOR_BCM2835 0 #define RPI_PROCESSOR_BCM2836 1 #define RPI_PROCESSOR_BCM2837 2 #define VCPROP_REV_MANUF __BITS(19,16) +#define RPI_MANUF_SONY 0 +#define RPI_MANUF_EGOMAN 1 +#define RPI_MANUF_QISDA 16 +#define RPI_MANUF_EMBEST 2 +#define RPI_MANUF_SONYJAPAN 3 #define VCPROP_REV_MEMSIZE __BITS(22,20) +#define RPI_MEMSIZE_256 0 +#define RPI_MEMSIZE_512 1 +#define RPI_MEMSIZE_1024 2 #define VCPROP_REV_ENCFLAG __BIT(23) #define VCPROP_REV_WARRANTY __BITS(25,24) @@ -179,6 +209,7 @@ struct vcprop_tag_boardserial { #define VCPROP_CLK_SDRAM 8 #define VCPROP_CLK_PIXEL 9 #define VCPROP_CLK_PWM 10 +#define VCPROP_CLK_EMMC2 12 struct vcprop_clock { uint32_t pclk; @@ -217,6 +248,13 @@ struct vcprop_tag_clockrate { uint32_t noturbo; }; +struct vcprop_tag_sdhostclock { + struct vcprop_tag tag; + uint32_t clock; + uint32_t clock1; + uint32_t clock2; +}; + #define VCPROP_VOLTAGE_CORE 1 #define VCPROP_VOLTAGE_SDRAM_C 2 #define VCPROP_VOLTAGE_SDRAM_P 3 @@ -246,6 +284,30 @@ struct vcprop_tag_temperature { #define VCPROP_POWER_SPI 7 #define VCPROP_POWER_CCP2TX 8 +#define VCPROP_DOMAIN_I2C0 1 +#define VCPROP_DOMAIN_I2C1 2 +#define VCPROP_DOMAIN_I2C2 3 +#define VCPROP_DOMAIN_VIDEO_SCALER 4 +#define VCPROP_DOMAIN_VPU1 5 +#define VCPROP_DOMAIN_HDMI 6 +#define VCPROP_DOMAIN_USB 7 +#define VCPROP_DOMAIN_VEC 8 +#define VCPROP_DOMAIN_JPEG 9 +#define VCPROP_DOMAIN_H264 10 +#define VCPROP_DOMAIN_V3D 11 +#define VCPROP_DOMAIN_ISP 12 +#define VCPROP_DOMAIN_UNICAM0 13 +#define VCPROP_DOMAIN_UNICAM1 14 +#define VCPROP_DOMAIN_CCP2RX 15 +#define VCPROP_DOMAIN_CSI2 16 +#define VCPROP_DOMAIN_CPI 17 +#define VCPROP_DOMAIN_DSI0 18 +#define VCPROP_DOMAIN_DSI1 19 +#define VCPROP_DOMAIN_TRANSPOSER 20 +#define VCPROP_DOMAIN_CCP2TX 21 +#define VCPROP_DOMAIN_CDP 22 +#define VCPROP_DOMAIN_ARM 23 + struct vcprop_tag_powertiming { struct vcprop_tag tag; uint32_t id; @@ -395,3 +457,6 @@ int rpi_fb_set_video(int); int rpi_fb_movecursor(int, int, int); int rpi_fb_initcursor(bus_addr_t, int, int); + +int rpi_set_domain(uint32_t, uint32_t); +int rpi_get_domain(uint32_t, uint32_t *); Index: sys/arch/evbarm/rpi/vcprop_subr.c =================================================================== RCS file: /cvsroot/src/sys/arch/evbarm/rpi/vcprop_subr.c,v retrieving revision 1.5 diff -p -u -r1.5 vcprop_subr.c --- sys/arch/evbarm/rpi/vcprop_subr.c 1 Jan 2018 17:03:25 -0000 1.5 +++ sys/arch/evbarm/rpi/vcprop_subr.c 27 Jul 2019 13:09:19 -0000 @@ -391,3 +391,132 @@ rpi_fb_initcursor(bus_addr_t pixels, int return 0; } + +int +rpi_set_domain(uint32_t domain, uint32_t state) +{ + int error; + uint32_t tag, res; + + tag = VCPROPTAG_SET_DOMAINSTATE; + if (domain == VCPROP_DOMAIN_USB) { + /* use old interface */ + tag = VCPROPTAG_SET_POWERSTATE; + domain = VCPROP_POWER_USB; + } + + /* + * might as well put it here since we need to re-init it every time + * and it's not like this is going to be called very often anyway + */ + struct __aligned(16) { + struct vcprop_buffer_hdr vb_hdr; + struct vcprop_tag_powerstate vbt_power; + struct vcprop_tag end; + } vb_setpower = + { + .vb_hdr = { + .vpb_len = sizeof(vb_setpower), + .vpb_rcode = VCPROP_PROCESS_REQUEST, + }, + .vbt_power = { + .tag = { + .vpt_tag = tag, + .vpt_len = VCPROPTAG_LEN(vb_setpower.vbt_power), + .vpt_rcode = VCPROPTAG_REQUEST, + }, + .id = domain, + .state = state + }, + .end = { + .vpt_tag = VCPROPTAG_NULL, + }, + }; + + error = bcmmbox_request(BCMMBOX_CHANARM2VC, &vb_setpower, + sizeof(vb_setpower), &res); +#ifdef RPI_IOCTL_DEBUG + printf("%s: %08x %08x %d %08x %08x %d %d %08x %08x\n", __func__, + tag, domain, state, + vb_setpower.vbt_power.tag.vpt_tag, + vb_setpower.vbt_power.id, + vb_setpower.vbt_power.state, + error, res, + vb_setpower.vbt_power.tag.vpt_rcode); +#endif + if (error) + return error; + + if (!vcprop_buffer_success_p(&vb_setpower.vb_hdr) || + !vcprop_tag_success_p(&vb_setpower.vbt_power.tag)) { + return EIO; + } + + return 0; +} + +int +rpi_get_domain(uint32_t domain, uint32_t *statep) +{ + int error; + uint32_t tag, res; + + tag = VCPROPTAG_GET_DOMAINSTATE; + if (domain == VCPROP_DOMAIN_USB) { + /* use old interface */ + tag = VCPROPTAG_GET_POWERSTATE; + domain = VCPROP_POWER_USB; + } + + /* + * might as well put it here since we need to re-init it every time + * and it's not like this is going to be called very often anyway + */ + struct __aligned(16) { + struct vcprop_buffer_hdr vb_hdr; + struct vcprop_tag_powerstate vbt_power; + struct vcprop_tag end; + } vb_setpower = + { + .vb_hdr = { + .vpb_len = sizeof(vb_setpower), + .vpb_rcode = VCPROP_PROCESS_REQUEST, + }, + .vbt_power = { + .tag = { + .vpt_tag = tag, + .vpt_len = VCPROPTAG_LEN(vb_setpower.vbt_power), + .vpt_rcode = VCPROPTAG_REQUEST, + }, + .id = domain, + .state = ~0 + }, + .end = { + .vpt_tag = VCPROPTAG_NULL, + }, + }; + + error = bcmmbox_request(BCMMBOX_CHANARM2VC, &vb_setpower, + sizeof(vb_setpower), &res); +#ifdef RPI_IOCTL_DEBUG + printf("%s: %08x %08x %d %08x %08x %d %d %08x %08x\n", __func__, + tag, domain, *statep, + vb_setpower.vbt_power.tag.vpt_tag, + vb_setpower.vbt_power.id, + vb_setpower.vbt_power.state, + error, res, + vb_setpower.vbt_power.tag.vpt_rcode); +#endif + if (error) + return error; + + if (!vcprop_buffer_success_p(&vb_setpower.vb_hdr) || + !vcprop_tag_success_p(&vb_setpower.vbt_power.tag)) { + return EIO; + } + + *statep = vb_setpower.vbt_power.state; + + return 0; +} + Index: sys/arch/aarch64/aarch64/aarch64_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/aarch64_machdep.c,v retrieving revision 1.28 diff -p -u -r1.28 aarch64_machdep.c --- sys/arch/aarch64/aarch64/aarch64_machdep.c 27 Jan 2019 02:08:36 -0000 1.28 +++ sys/arch/aarch64/aarch64/aarch64_machdep.c 27 Jul 2019 13:09:19 -0000 @@ -149,8 +149,10 @@ cpu_kernel_vm_init(uint64_t memory_start * * kernel image has mapped by L2 block. (2Mbyte) */ +printf("write protect %p .. %p\n", (void*)kernstart, (void*)data_start); pmapboot_protect(L2_TRUNC_BLOCK(kernstart), L2_TRUNC_BLOCK(data_start), VM_PROT_WRITE); +printf("exec protect %p .. %p\n", (void*)rodata_start, (void*)(kernend + kernend_extra)); pmapboot_protect(L2_ROUND_BLOCK(rodata_start), L2_ROUND_BLOCK(kernend + kernend_extra), VM_PROT_EXECUTE); Index: sys/arch/aarch64/aarch64/bus_space.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/bus_space.c,v retrieving revision 1.8 diff -p -u -r1.8 bus_space.c --- sys/arch/aarch64/aarch64/bus_space.c 27 Jan 2019 02:08:36 -0000 1.8 +++ sys/arch/aarch64/aarch64/bus_space.c 27 Jul 2019 13:09:19 -0000 @@ -562,7 +562,7 @@ generic_bs_map(void *t, bus_addr_t bpa, else if ((flag & BUS_SPACE_MAP_CACHEABLE) != 0) pmapflags = PMAP_WRITE_BACK; else - pmapflags = PMAP_DEV; + pmapflags = PMAP_NOCACHE | PMAP_DEV; for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) { pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE, pmapflags); Index: sys/arch/aarch64/aarch64/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/pmap.c,v retrieving revision 1.41 diff -p -u -r1.41 pmap.c --- sys/arch/aarch64/aarch64/pmap.c 17 May 2019 06:05:07 -0000 1.41 +++ sys/arch/aarch64/aarch64/pmap.c 27 Jul 2019 13:09:19 -0000 @@ -279,10 +279,16 @@ pmap_map_chunk(vaddr_t va, paddr_t pa, v psize_t blocksize; int rc; - /* devmap always use L2 mapping */ - blocksize = L2_SIZE; + /* devmap use L2 mapping when possible */ + if (size % L2_SIZE == 0) { + blocksize = L2_SIZE; + attr = L2_BLOCK; + } else { + blocksize = L3_SIZE; + attr = L3_PAGE; + } - attr = _pmap_pte_adjust_prot(L2_BLOCK, prot, VM_PROT_ALL, false); + attr = _pmap_pte_adjust_prot(attr, prot, VM_PROT_ALL, false); attr = _pmap_pte_adjust_cacheflags(attr, flags | PMAP_DEV); /* user cannot execute, and kernel follows the prot */ attr |= (LX_BLKPAG_UXN|LX_BLKPAG_PXN); @@ -338,6 +344,7 @@ pmap_devmap_bootstrap(vaddr_t l0pt, cons table[i].pd_prot, table[i].pd_flags); } + VPRINTF("%s: done\n", __func__); } const struct pmap_devmap * Index: sys/arch/aarch64/aarch64/pmapboot.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/pmapboot.c,v retrieving revision 1.4 diff -p -u -r1.4 pmapboot.c --- sys/arch/aarch64/aarch64/pmapboot.c 18 Jul 2019 06:47:36 -0000 1.4 +++ sys/arch/aarch64/aarch64/pmapboot.c 27 Jul 2019 13:09:19 -0000 @@ -87,6 +87,7 @@ pmapboot_protect(vaddr_t sva, vaddr_t ev else pa = (reg_ttbr0_el1_read() & TTBR_BADDR); l0 = (pd_entry_t *)AARCH64_PA_TO_KVA(pa); +printf("va %016lx -> pa %016lx -> l0 %016lx\n", (uint64_t)va, (uint64_t)pa, (uintptr_t)l0); idx = l0pde_index(va); if (!l0pde_valid(l0[idx])) Index: sys/arch/aarch64/include/pmap.h =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/include/pmap.h,v retrieving revision 1.24 diff -p -u -r1.24 pmap.h --- sys/arch/aarch64/include/pmap.h 8 Apr 2019 21:18:22 -0000 1.24 +++ sys/arch/aarch64/include/pmap.h 27 Jul 2019 13:09:19 -0000 @@ -196,18 +196,32 @@ paddr_t pmap_alloc_pdp(struct pmap *, st #define L1_ROUND_BLOCK(x) L1_TRUNC_BLOCK((x) + L1_SIZE - 1) #define L2_TRUNC_BLOCK(x) ((x) & L2_FRAME) #define L2_ROUND_BLOCK(x) L2_TRUNC_BLOCK((x) + L2_SIZE - 1) +#define L3_TRUNC_BLOCK(x) ((x) & L3_FRAME) +#define L3_ROUND_BLOCK(x) L3_TRUNC_BLOCK((x) + L3_SIZE - 1) /* devmap use L2 blocks. (2Mbyte) */ #define DEVMAP_TRUNC_ADDR(x) L2_TRUNC_BLOCK((x)) #define DEVMAP_ROUND_SIZE(x) L2_ROUND_BLOCK((x)) +/* or L3 blocks. (pages) */ +#define DEVMAP_TRUNC_PAGE(x) L3_TRUNC_BLOCK((x)) +#define DEVMAP_ROUND_PGSZ(x) L3_ROUND_BLOCK((x)) + #define DEVMAP_ENTRY(va, pa, sz) \ { \ .pd_va = DEVMAP_TRUNC_ADDR(va), \ .pd_pa = DEVMAP_TRUNC_ADDR(pa), \ .pd_size = DEVMAP_ROUND_SIZE(sz), \ .pd_prot = VM_PROT_READ|VM_PROT_WRITE, \ - .pd_flags = PMAP_NOCACHE \ + .pd_flags = PMAP_NOCACHE|PMAP_DEV \ + } +#define DEVMAP_ENTRY_PAGES(va, pa, sz) \ + { \ + .pd_va = DEVMAP_TRUNC_PAGE(va), \ + .pd_pa = DEVMAP_TRUNC_PAGE(pa), \ + .pd_size = DEVMAP_ROUND_PGSZ(sz), \ + .pd_prot = VM_PROT_READ|VM_PROT_WRITE, \ + .pd_flags = PMAP_NOCACHE|PMAP_DEV \ } #define DEVMAP_ENTRY_END { 0 } @@ -247,7 +261,7 @@ aarch64_mmap_flags(paddr_t mdpgno) nflag = (mdpgno >> AARCH64_MMAP_FLAG_SHIFT) & AARCH64_MMAP_FLAG_MASK; switch (nflag) { case AARCH64_MMAP_DEVICE: - pflag = PMAP_DEV; + pflag = PMAP_NOCACHE | PMAP_DEV; break; case AARCH64_MMAP_WRITECOMBINE: pflag = PMAP_WRITE_COMBINE; Index: sys/dev/sdmmc/sdhc.c =================================================================== RCS file: /cvsroot/src/sys/dev/sdmmc/sdhc.c,v retrieving revision 1.103 diff -p -u -r1.103 sdhc.c --- sys/dev/sdmmc/sdhc.c 3 Jul 2019 23:10:08 -0000 1.103 +++ sys/dev/sdmmc/sdhc.c 27 Jul 2019 13:09:19 -0000 @@ -52,7 +52,7 @@ void sdhc_dump_regs(struct sdhc_host *); #define DPRINTF(n,s) do {} while (0) #endif -#define SDHC_COMMAND_TIMEOUT hz +#define SDHC_COMMAND_TIMEOUT (hz*3) #define SDHC_BUFFER_TIMEOUT hz #define SDHC_TRANSFER_TIMEOUT hz #define SDHC_DMA_TIMEOUT (hz*3) Index: sys/dev/sdmmc/sdmmc.c =================================================================== RCS file: /cvsroot/src/sys/dev/sdmmc/sdmmc.c,v retrieving revision 1.36 diff -p -u -r1.36 sdmmc.c --- sys/dev/sdmmc/sdmmc.c 6 Nov 2018 16:01:38 -0000 1.36 +++ sys/dev/sdmmc/sdmmc.c 27 Jul 2019 13:09:19 -0000 @@ -246,7 +246,7 @@ sdmmc_doattach(device_t dev) { struct sdmmc_softc *sc = device_private(dev); - if (kthread_create(PRI_SOFTBIO, 0, NULL, + if (kthread_create(PRI_BIO, 0, NULL, sdmmc_task_thread, sc, &sc->sc_tskq_lwp, "%s", device_xname(dev))) { aprint_error_dev(dev, "couldn't create task thread\n"); } Index: sys/dev/sdmmc/sdmmc_cis.c =================================================================== RCS file: /cvsroot/src/sys/dev/sdmmc/sdmmc_cis.c,v retrieving revision 1.5 diff -p -u -r1.5 sdmmc_cis.c --- sys/dev/sdmmc/sdmmc_cis.c 28 Jan 2018 14:34:06 -0000 1.5 +++ sys/dev/sdmmc/sdmmc_cis.c 27 Jul 2019 13:09:21 -0000 @@ -259,6 +259,11 @@ sdmmc_read_cis(struct sdmmc_function *sf reg += tpllen; break; + case PCMCIA_CISTPL_SDIO: + aprint_normal_dev(dev, "SDIO function\n"); + reg += tpllen; + break; + default: /* * Tuple codes between 80h-8Fh are vendor unique. Index: sys/dev/sdmmc/sdmmc_mem.c =================================================================== RCS file: /cvsroot/src/sys/dev/sdmmc/sdmmc_mem.c,v retrieving revision 1.68 diff -p -u -r1.68 sdmmc_mem.c --- sys/dev/sdmmc/sdmmc_mem.c 6 Jun 2019 20:50:46 -0000 1.68 +++ sys/dev/sdmmc/sdmmc_mem.c 27 Jul 2019 13:09:22 -0000 @@ -201,12 +201,14 @@ mmc_mode: /* Set the lowest voltage supported by the card and host. */ host_ocr = sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch); +#if 0 error = sdmmc_set_bus_power(sc, host_ocr, card_ocr); if (error) { DPRINTF(("%s: couldn't supply voltage requested by card\n", SDMMCDEVNAME(sc))); goto out; } +#endif DPRINTF(("%s: host_ocr 0x%08x\n", SDMMCDEVNAME(sc), host_ocr)); DPRINTF(("%s: card_ocr 0x%08x\n", SDMMCDEVNAME(sc), card_ocr)); .