Module Name: src Committed By: matt Date: Mon Oct 28 22:51:16 UTC 2013
Modified Files: src/sys/arch/arm/broadcom: bcm53xx_board.c bcm53xx_ccb.c bcm53xx_eth.c bcm53xx_intr.h bcm53xx_reg.h bcm53xx_usb.c bcm53xx_var.h bcmgen_space.c files.bcm53xx Added Files: src/sys/arch/arm/broadcom: bcm53xx_nand.c Log Message: Add support for the BCM56340 iProc based switch To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/broadcom/bcm53xx_board.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/broadcom/bcm53xx_ccb.c \ src/sys/arch/arm/broadcom/bcm53xx_usb.c \ src/sys/arch/arm/broadcom/bcmgen_space.c \ src/sys/arch/arm/broadcom/files.bcm53xx cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/broadcom/bcm53xx_eth.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/broadcom/bcm53xx_intr.h cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/broadcom/bcm53xx_nand.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/broadcom/bcm53xx_reg.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/broadcom/bcm53xx_var.h 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/bcm53xx_board.c diff -u src/sys/arch/arm/broadcom/bcm53xx_board.c:1.16 src/sys/arch/arm/broadcom/bcm53xx_board.c:1.17 --- src/sys/arch/arm/broadcom/bcm53xx_board.c:1.16 Thu Aug 29 15:46:17 2013 +++ src/sys/arch/arm/broadcom/bcm53xx_board.c Mon Oct 28 22:51:16 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm53xx_board.c,v 1.16 2013/08/29 15:46:17 riz Exp $ */ +/* $NetBSD: bcm53xx_board.c,v 1.17 2013/10/28 22:51:16 matt Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -34,7 +34,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: bcm53xx_board.c,v 1.16 2013/08/29 15:46:17 riz Exp $"); +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_board.c,v 1.17 2013/10/28 22:51:16 matt Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -46,6 +46,7 @@ __KERNEL_RCSID(1, "$NetBSD: bcm53xx_boar #include <net/if.h> #include <net/if_ether.h> +#define CCA_PRIVATE #define CRU_PRIVATE #define DDR_PRIVATE #define DMU_PRIVATE @@ -67,6 +68,7 @@ bus_space_handle_t bcm53xx_armcore_bsh; static struct cpu_softc cpu_softc; struct arm32_dma_range bcm53xx_dma_ranges[] = { +#ifdef BCM5301X [0] = { .dr_sysbase = 0x80000000, .dr_busbase = 0x80000000, @@ -75,6 +77,16 @@ struct arm32_dma_range bcm53xx_dma_range .dr_sysbase = 0x90000000, .dr_busbase = 0x90000000, }, +#elif defined(BCM56340) + [0] = { + .dr_sysbase = 0x60000000, + .dr_busbase = 0x60000000, + .dr_len = 0x20000000, + }, [1] = { + .dr_sysbase = 0xa0000000, + .dr_busbase = 0xa0000000, + }. +#endif }; struct arm32_bus_dma_tag bcm53xx_dma_tag = { @@ -86,6 +98,7 @@ struct arm32_bus_dma_tag bcm53xx_dma_tag }; struct arm32_dma_range bcm53xx_coherent_dma_ranges[] = { +#ifdef BCM5301X [0] = { .dr_sysbase = 0x80000000, .dr_busbase = 0x80000000, @@ -95,6 +108,17 @@ struct arm32_dma_range bcm53xx_coherent_ .dr_sysbase = 0x90000000, .dr_busbase = 0x90000000, }, +#elif defined(BCM563XX) + [0] = { + .dr_sysbase = 0x60000000, + .dr_busbase = 0x60000000, + .dr_len = 0x20000000, + .dr_flags = _BUS_DMAMAP_COHERENT, + }, [1] = { + .dr_sysbase = 0xa0000000, + .dr_busbase = 0xa0000000, + }, +#endif }; struct arm32_bus_dma_tag bcm53xx_coherent_dma_tag = { @@ -453,6 +477,11 @@ bcm53xx_cpu_softc_init(struct cpu_info * cpu->cpu_armcore_bst = bcm53xx_armcore_bst; cpu->cpu_armcore_bsh = bcm53xx_armcore_bsh; + + const uint32_t chipid = bus_space_read_4(cpu->cpu_ioreg_bst, + cpu->cpu_ioreg_bsh, CCA_MISC_BASE + MISC_CHIPID); + + cpu->cpu_chipid = __SHIFTOUT(chipid, CHIPID_ID); } void @@ -525,7 +554,8 @@ bcm53xx_bootstrap(vaddr_t iobase) curcpu()->ci_data.cpu_cc_freq = clk->clk_cpu; - arml2cc_init(bcm53xx_armcore_bst, bcm53xx_armcore_bsh, ARMCORE_L2C_BASE); + arml2cc_init(bcm53xx_armcore_bst, bcm53xx_armcore_bsh, + ARMCORE_L2C_BASE); } void Index: src/sys/arch/arm/broadcom/bcm53xx_ccb.c diff -u src/sys/arch/arm/broadcom/bcm53xx_ccb.c:1.3 src/sys/arch/arm/broadcom/bcm53xx_ccb.c:1.4 --- src/sys/arch/arm/broadcom/bcm53xx_ccb.c:1.3 Wed Oct 3 19:18:41 2012 +++ src/sys/arch/arm/broadcom/bcm53xx_ccb.c Mon Oct 28 22:51:16 2013 @@ -34,7 +34,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: bcm53xx_ccb.c,v 1.3 2012/10/03 19:18:41 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_ccb.c,v 1.4 2013/10/28 22:51:16 matt Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -101,18 +101,35 @@ static const struct bcm_locators bcmccb_ { "bcmtmr", TIMER1_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT, 2, { IRQ_TIMER1_1, IRQ_TIMER1_2 } }, { "bcmsw", SRAB_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT, }, { "bcmcom", UART2_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT, 1, { IRQ_UART2 } }, - { "bcmi2c", SMBUS_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT, 1, { IRQ_SMBUS } }, +#ifdef BCM5301X + { "bcmi2c", SMBUS1_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT, 1, { IRQ_SMBUS1 } }, +#endif +#ifdef BCM536XX + { "bcmi2c", SMBUS1_BASE, 0x1000, 1, 1, { IRQ_SMBUS1 } }, + { "bcmi2c", SMBUS2_BASE, 0x1000, 2, 1, { IRQ_SMBUS2 } }, +#endif { "bcmcru", CRU_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT }, { "bcmdmu", DMU_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT }, { "bcmddr", DDR_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT, 1, { IRQ_DDR_CONTROLLER } }, { "bcmeth", GMAC0_BASE, 0x1000, 0, 1, { IRQ_GMAC0 }, }, { "bcmeth", GMAC1_BASE, 0x1000, 1, 1, { IRQ_GMAC1 }, }, +#ifdef GMAC2_BASE { "bcmeth", GMAC2_BASE, 0x1000, 2, 1, { IRQ_GMAC2 }, }, +#endif // { "bcmeth", GMAC3_BASE, 0x1000, 3, 1, { IRQ_GMAC3 }, }, { "bcmpax", PCIE0_BASE, 0x1000, 0, 6, { IRQ_PCIE_INT0 }, }, { "bcmpax", PCIE1_BASE, 0x1000, 1, 6, { IRQ_PCIE_INT1 }, }, +#ifdef PCIE2_BASE { "bcmpax", PCIE2_BASE, 0x1000, 2, 6, { IRQ_PCIE_INT2 }, }, +#endif +#ifdef SDIO_BASE { "sdhc", SDIO_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT, 1, { IRQ_SDIO } }, +#endif + { "bcmnand", NAND_BASE, 0x1000, BCMCCBCF_PORT_DEFAULT, 8, + { IRQ_NAND_RD_MISS, IRQ_NAND_BLK_ERASE_COMP, + IRQ_NAND_COPY_BACK_COMP, IRQ_NAND_PGM_PAGE_COMP, + IRQ_NAND_RO_CTLR_READY, IRQ_NAND_RB_B, + IRQ_NAND_ECC_MIPS_UNCORR, IRQ_NAND_ECC_MIPS_CORR } }, { "bcmusb", EHCI_BASE, 0x2000, BCMCCBCF_PORT_DEFAULT, 1, { IRQ_USB2 } }, }; @@ -159,22 +176,27 @@ bcmccb_mainbus_attach(device_t parent, d aprint_naive("\n"); aprint_normal("\n"); - bcm53xx_srab_init(); // need this for ethernet. - for (size_t i = 0; i < __arraycount(bcmccb_locators); i++) { + const struct bcm_locators *loc = &bcmccb_locators[i]; + +#ifdef BCM5301X + if (strcmp(loc->loc_name, "bcmsw") == 0) { + bcm53xx_srab_init(); // need this for ethernet. + } +#endif + struct bcmccb_attach_args ccbaa = { .ccbaa_ccb_bst = sc->sc_bst, .ccbaa_ccb_bsh = sc->sc_bsh, .ccbaa_dmat = &bcm53xx_dma_tag, - .ccbaa_loc = bcmccb_locators[i], + .ccbaa_loc = *loc, }; /* * If the device might be in reset, let's try to take it * out of it. If it fails or is unavailable, skip it. */ - if (!bcm53xx_idm_device_init(&bcmccb_locators[i], - sc->sc_bst, sc->sc_bsh)) + if (!bcm53xx_idm_device_init(loc, sc->sc_bst, sc->sc_bsh)) continue; cfdata_t cf = config_search_ia(bcmccb_find, self, "bcmccb", Index: src/sys/arch/arm/broadcom/bcm53xx_usb.c diff -u src/sys/arch/arm/broadcom/bcm53xx_usb.c:1.3 src/sys/arch/arm/broadcom/bcm53xx_usb.c:1.4 --- src/sys/arch/arm/broadcom/bcm53xx_usb.c:1.3 Thu Nov 29 17:38:26 2012 +++ src/sys/arch/arm/broadcom/bcm53xx_usb.c Mon Oct 28 22:51:16 2013 @@ -32,7 +32,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: bcm53xx_usb.c,v 1.3 2012/11/29 17:38:26 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_usb.c,v 1.4 2013/10/28 22:51:16 matt Exp $"); #include <sys/bus.h> #include <sys/device.h> @@ -227,6 +227,8 @@ bcmusb_ccb_match(device_t parent, cfdata return 1; } +#define OHCI_OFFSET (OHCI_BASE - EHCI_BASE) + void bcmusb_ccb_attach(device_t parent, device_t self, void *aux) { @@ -237,10 +239,10 @@ bcmusb_ccb_attach(device_t parent, devic usbsc->usbsc_bst = ccbaa->ccbaa_ccb_bst; usbsc->usbsc_dmat = ccbaa->ccbaa_dmat; - bus_space_subregion(usbsc->usbsc_bst, ccbaa->ccbaa_ccb_bsh, EHCI_BASE, - 0x1000, &usbsc->usbsc_ehci_bsh); - bus_space_subregion(usbsc->usbsc_bst, ccbaa->ccbaa_ccb_bsh, OHCI_BASE, - 0x1000, &usbsc->usbsc_ohci_bsh); + bus_space_subregion(usbsc->usbsc_bst, ccbaa->ccbaa_ccb_bsh, + loc->loc_offset, 0x1000, &usbsc->usbsc_ehci_bsh); + bus_space_subregion(usbsc->usbsc_bst, ccbaa->ccbaa_ccb_bsh, + loc->loc_offset + OHCI_OFFSET, 0x1000, &usbsc->usbsc_ohci_bsh); /* * Bring the PHYs out of reset. Index: src/sys/arch/arm/broadcom/bcmgen_space.c diff -u src/sys/arch/arm/broadcom/bcmgen_space.c:1.3 src/sys/arch/arm/broadcom/bcmgen_space.c:1.4 --- src/sys/arch/arm/broadcom/bcmgen_space.c:1.3 Mon Aug 12 21:20:02 2013 +++ src/sys/arch/arm/broadcom/bcmgen_space.c Mon Oct 28 22:51:16 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bcmgen_space.c,v 1.3 2013/08/12 21:20:02 matt Exp $ */ +/* $NetBSD: bcmgen_space.c,v 1.4 2013/10/28 22:51:16 matt Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcmgen_space.c,v 1.3 2013/08/12 21:20:02 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcmgen_space.c,v 1.4 2013/10/28 22:51:16 matt Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -39,6 +39,7 @@ __KERNEL_RCSID(0, "$NetBSD: bcmgen_space #include <uvm/uvm_extern.h> #include <sys/bus.h> +#include <sys/endian.h> /* Prototypes for all the bus_space structure functions */ bs_protos(bcmgen); @@ -46,6 +47,12 @@ bs_protos(generic); bs_protos(generic_armv4); bs_protos(bs_notimpl); +#if BYTE_ORDER == BIG_ENDIAN +#define NSWAP(n) n ## _swap +#else +#define NSWAP(n) n +#endif + struct bus_space bcmgen_bs_tag = { /* cookie */ (void *) 0, @@ -70,38 +77,38 @@ struct bus_space bcmgen_bs_tag = { /* read (single) */ generic_bs_r_1, - generic_armv4_bs_r_2, - generic_bs_r_4, + NSWAP(generic_armv4_bs_r_2), + NSWAP(generic_bs_r_4), bs_notimpl_bs_r_8, /* read multiple */ generic_bs_rm_1, - generic_armv4_bs_rm_2, - generic_bs_rm_4, + NSWAP(generic_armv4_bs_rm_2), + NSWAP(generic_bs_rm_4), bs_notimpl_bs_rm_8, /* read region */ generic_bs_rr_1, - generic_armv4_bs_rr_2, - generic_bs_rr_4, + NSWAP(generic_armv4_bs_rr_2), + NSWAP(generic_bs_rr_4), bs_notimpl_bs_rr_8, /* write (single) */ generic_bs_w_1, - generic_armv4_bs_w_2, - generic_bs_w_4, + NSWAP(generic_armv4_bs_w_2), + NSWAP(generic_bs_w_4), bs_notimpl_bs_w_8, /* write multiple */ generic_bs_wm_1, - generic_armv4_bs_wm_2, - generic_bs_wm_4, + NSWAP(generic_armv4_bs_wm_2), + NSWAP(generic_bs_wm_4), bs_notimpl_bs_wm_8, /* write region */ generic_bs_wr_1, - generic_armv4_bs_wr_2, - generic_bs_wr_4, + NSWAP(generic_armv4_bs_wr_2), + NSWAP(generic_bs_wr_4), bs_notimpl_bs_wr_8, /* set multiple */ @@ -112,7 +119,7 @@ struct bus_space bcmgen_bs_tag = { /* set region */ generic_bs_sr_1, - generic_armv4_bs_sr_2, + NSWAP(generic_armv4_bs_sr_2), bs_notimpl_bs_sr_4, bs_notimpl_bs_sr_8, @@ -125,38 +132,38 @@ struct bus_space bcmgen_bs_tag = { #ifdef __BUS_SPACE_HAS_STREAM_METHODS /* read (single) */ generic_bs_r_1, - generic_armv4_bs_r_2, - generic_bs_r_4, + NSWAP(generic_armv4_bs_r_2), + NSWAP(generic_bs_r_4), bs_notimpl_bs_r_8, /* read multiple */ generic_bs_rm_1, - generic_armv4_bs_rm_2, - generic_bs_rm_4, + NSWAP(generic_armv4_bs_rm_2), + NSWAP(generic_bs_rm_4), bs_notimpl_bs_rm_8, /* read region */ generic_bs_rr_1, - generic_armv4_bs_rr_2, - generic_bs_rr_4, + NSWAP(generic_armv4_bs_rr_2), + NSWAP(generic_bs_rr_4), bs_notimpl_bs_rr_8, /* write (single) */ generic_bs_w_1, - generic_armv4_bs_w_2, - generic_bs_w_4, + NSWAP(generic_armv4_bs_w_2), + NSWAP(generic_bs_w_4), bs_notimpl_bs_w_8, /* write multiple */ generic_bs_wm_1, - generic_armv4_bs_wm_2, - generic_bs_wm_4, + NSWAP(generic_armv4_bs_wm_2), + NSWAP(generic_bs_wm_4), bs_notimpl_bs_wm_8, /* write region */ generic_bs_wr_1, - generic_armv4_bs_wr_2, - generic_bs_wr_4, + NSWAP(generic_armv4_bs_wr_2), + NSWAP(generic_bs_wr_4), bs_notimpl_bs_wr_8, #endif }; Index: src/sys/arch/arm/broadcom/files.bcm53xx diff -u src/sys/arch/arm/broadcom/files.bcm53xx:1.3 src/sys/arch/arm/broadcom/files.bcm53xx:1.4 --- src/sys/arch/arm/broadcom/files.bcm53xx:1.3 Fri Dec 7 22:18:45 2012 +++ src/sys/arch/arm/broadcom/files.bcm53xx Mon Oct 28 22:51:16 2013 @@ -1,4 +1,4 @@ -# $NetBSD: files.bcm53xx,v 1.3 2012/12/07 22:18:45 matt Exp $ +# $NetBSD: files.bcm53xx,v 1.4 2013/10/28 22:51:16 matt Exp $ # # Configuration info for Broadcom BCM5301X ARM Peripherals # @@ -21,6 +21,8 @@ defparam opt_broadcom.h CONMODE defparam opt_broadcom.h MEMSIZE defflag opt_broadcom.h BCM53XX_CONSOLE_EARLY defflag opt_broadcom.h BCMETH_COUNTERS +defflag opt_broadcom.h BCM563XX +defflag opt_broadcom.h BCM5301X # ChipCommonA attach point device bcmcca { [channel=-1] } : bus_space_generic, gpiobus, sysmon_wdog @@ -42,6 +44,10 @@ device bcmi2c : i2cbus, i2cexec attach bcmi2c at bcmccb with bcmi2c_ccb file arch/arm/broadcom/bcm53xx_i2c.c bcmi2c_ccb +device bcmnand : nandbus +attach bcmnand at bcmccb with bcmnand_ccb +file arch/arm/broadcom/bcm53xx_nand.c bcmnand_ccb + device bcmrng attach bcmrng at bcmccb with bcmrng_ccb file arch/arm/broadcom/bcm53xx_rng.c bcmrng_ccb needs-flag Index: src/sys/arch/arm/broadcom/bcm53xx_eth.c diff -u src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.24 src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.25 --- src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.24 Tue Feb 19 02:18:29 2013 +++ src/sys/arch/arm/broadcom/bcm53xx_eth.c Mon Oct 28 22:51:16 2013 @@ -35,7 +35,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.24 2013/02/19 02:18:29 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.25 2013/10/28 22:51:16 matt Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -903,7 +903,7 @@ bcmeth_rx_buf_alloc( } KASSERT(map->dm_mapsize == MCLBYTES); #ifdef BCMETH_RCVMAGIC - *mtod(m, uint32_t *) = BCMETH_RCVMAGIC; + *mtod(m, uint32_t *) = htole32(BCMETH_RCVMAGIC); bus_dmamap_sync(sc->sc_dmat, map, 0, sizeof(uint32_t), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); bus_dmamap_sync(sc->sc_dmat, map, sizeof(uint32_t), @@ -955,9 +955,9 @@ bcmeth_rxq_produce( bus_dmamap_t map = M_GETCTX(m, bus_dmamap_t); KASSERT(map); - producer->rxdb_buflen = MCLBYTES; - producer->rxdb_addrlo = map->dm_segs[0].ds_addr; - producer->rxdb_flags &= RXDB_FLAG_ET; + producer->rxdb_buflen = htole32(MCLBYTES); + producer->rxdb_addrlo = htole32(map->dm_segs[0].ds_addr); + producer->rxdb_flags &= htole32(RXDB_FLAG_ET); *rxq->rxq_mtail = m; rxq->rxq_mtail = &m->m_next; m->m_len = MCLBYTES; @@ -1063,6 +1063,7 @@ bcmeth_rxq_consume( bus_dmamap_sync(sc->sc_dmat, map, 0, arm_dcache_align, BUS_DMASYNC_POSTREAD); memcpy(&rxsts, rxq->rxq_mhead->m_data, 4); + rxsts = le32toh(rxsts); #if 0 KASSERTMSG(rxsts != BCMETH_RCVMAGIC, "currdscr=%u consumer=%zd", currdscr, consumer - rxq->rxq_first); @@ -1138,7 +1139,7 @@ bcmeth_rxq_consume( * Wrap at the last entry! */ if (++consumer == rxq->rxq_last) { - KASSERT(consumer[-1].rxdb_flags & RXDB_FLAG_ET); + KASSERT(consumer[-1].rxdb_flags & htole32(RXDB_FLAG_ET)); rxq->rxq_consumer = rxq->rxq_first; } else { rxq->rxq_consumer = consumer; @@ -1166,7 +1167,7 @@ bcmeth_rxq_consume( * Wrap at the last entry! */ if (++consumer == rxq->rxq_last) { - KASSERT(consumer[-1].rxdb_flags & RXDB_FLAG_ET); + KASSERT(consumer[-1].rxdb_flags & htole32(RXDB_FLAG_ET)); consumer = rxq->rxq_first; } } @@ -1227,13 +1228,13 @@ bcmeth_rxq_reset( */ struct gmac_rxdb *rxdb; for (rxdb = rxq->rxq_first; rxdb < rxq->rxq_last - 1; rxdb++) { - rxdb->rxdb_flags = RXDB_FLAG_IC; + rxdb->rxdb_flags = htole32(RXDB_FLAG_IC); } /* * Last descriptor has the wrap flag. */ - rxdb->rxdb_flags = RXDB_FLAG_ET|RXDB_FLAG_IC; + rxdb->rxdb_flags = htole32(RXDB_FLAG_ET|RXDB_FLAG_IC); /* * Reset the producer consumer indexes. @@ -1415,14 +1416,16 @@ bcmeth_txq_produce( struct gmac_txdb *start = producer; size_t count = map->dm_nsegs; - producer->txdb_flags |= first_flags; - producer->txdb_addrlo = map->dm_segs[0].ds_addr; - producer->txdb_buflen = map->dm_segs[0].ds_len; + producer->txdb_flags |= htole32(first_flags); + producer->txdb_addrlo = htole32(map->dm_segs[0].ds_addr); + producer->txdb_buflen = htole32(map->dm_segs[0].ds_len); for (u_int i = 1; i < map->dm_nsegs; i++) { #if 0 printf("[%zu]: %#x/%#x/%#x/%#x\n", producer - txq->txq_first, - producer->txdb_flags, producer->txdb_buflen, - producer->txdb_addrlo, producer->txdb_addrhi); + le32toh(producer->txdb_flags), + le32toh(producer->txdb_buflen), + le32toh(producer->txdb_addrlo), + le32toh(producer->txdb_addrhi)); #endif if (__predict_false(++producer == txq->txq_last)) { bcmeth_txq_desc_presync(sc, txq, start, @@ -1431,14 +1434,14 @@ bcmeth_txq_produce( producer = txq->txq_first; start = txq->txq_first; } - producer->txdb_addrlo = map->dm_segs[i].ds_addr; - producer->txdb_buflen = map->dm_segs[i].ds_len; + producer->txdb_addrlo = htole32(map->dm_segs[i].ds_addr); + producer->txdb_buflen = htole32(map->dm_segs[i].ds_len); } - producer->txdb_flags |= last_flags; + producer->txdb_flags |= htole32(last_flags); #if 0 printf("[%zu]: %#x/%#x/%#x/%#x\n", producer - txq->txq_first, - producer->txdb_flags, producer->txdb_buflen, - producer->txdb_addrlo, producer->txdb_addrhi); + le32toh(producer->txdb_flags), le32toh(producer->txdb_buflen), + le32toh(producer->txdb_addrlo), le32toh(producer->txdb_addrhi)); #endif if (count) bcmeth_txq_desc_presync(sc, txq, start, count); @@ -1448,8 +1451,8 @@ bcmeth_txq_produce( */ txq->txq_free -= map->dm_nsegs; KASSERT(map->dm_nsegs == 1 || txq->txq_producer != producer); - KASSERT(map->dm_nsegs == 1 || (txq->txq_producer->txdb_flags & TXDB_FLAG_EF) == 0); - KASSERT(producer->txdb_flags & TXDB_FLAG_EF); + KASSERT(map->dm_nsegs == 1 || (txq->txq_producer->txdb_flags & htole32(TXDB_FLAG_EF)) == 0); + KASSERT(producer->txdb_flags & htole32(TXDB_FLAG_EF)); #if 0 printf("%s: mbuf %p: produced a %u byte packet in %u segments (%zd..%zd)\n", @@ -1622,7 +1625,7 @@ bcmeth_txq_consume( * If this is the last descriptor in the chain, get the * mbuf, free its dmamap, and free the mbuf chain itself. */ - const uint32_t txdb_flags = consumer->txdb_flags; + const uint32_t txdb_flags = le32toh(consumer->txdb_flags); if (txdb_flags & TXDB_FLAG_EF) { struct mbuf *m; @@ -1650,7 +1653,7 @@ bcmeth_txq_consume( * Wrap at the last entry! */ if (txdb_flags & TXDB_FLAG_ET) { - consumer->txdb_flags = TXDB_FLAG_ET; + consumer->txdb_flags = htole32(TXDB_FLAG_ET); KASSERT(consumer + 1 == txq->txq_last); consumer = txq->txq_first; } else { @@ -1705,7 +1708,7 @@ bcmeth_txq_reset( /* * Last descriptor has the wrap flag. */ - txdb->txdb_flags = TXDB_FLAG_ET; + txdb->txdb_flags = htole32(TXDB_FLAG_ET); /* * Reset the producer consumer indexes. Index: src/sys/arch/arm/broadcom/bcm53xx_intr.h diff -u src/sys/arch/arm/broadcom/bcm53xx_intr.h:1.1 src/sys/arch/arm/broadcom/bcm53xx_intr.h:1.2 --- src/sys/arch/arm/broadcom/bcm53xx_intr.h:1.1 Sat Sep 1 00:04:44 2012 +++ src/sys/arch/arm/broadcom/bcm53xx_intr.h Mon Oct 28 22:51:16 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm53xx_intr.h,v 1.1 2012/09/01 00:04:44 matt Exp $ */ +/* $NetBSD: bcm53xx_intr.h,v 1.2 2013/10/28 22:51:16 matt Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -31,6 +31,10 @@ #ifndef _ARM_BROADCOM_BCM53XX_INTR_H_ #define _ARM_BROADCOM_BCM53XX_INTR_H_ +#ifdef _KERNEL_OPT +#include "opt_broadcom.h" +#endif + #define PIC_MAXSOURCES 256 #define PIC_MAXMAXSOURCES 280 @@ -81,58 +85,95 @@ #define IRQ_QSPI_S0_PINS_BUS 70 #define IRQ_A9JTAG_S0_PINS_BUS 71 #define IRQ_APBX_S0_PINS_BUS 72 -#define IRQ_DS_0_PINS_BUS 73 -#define IRQ_DS_1_PINS_BUS 74 -#define IRQ_DS_2_PINS_BUS 75 -#define IRQ_DS_3_PINS_BUS 76 -#define IRQ_DS_4_PINS_BUS 77 -#define IRQ_DDR_CONTROLLER 78 -#define IRQ_DMAC 79 /* 16 */ -#define IRQ_DMAC_ABORT 95 -#define IRQ_NAND_RD_MISS 96 -#define IRQ_NAND_BLK_ERASE_COMP 97 -#define IRQ_NAND_COPY_BACK_COMP 98 -#define IRQ_NAND_PGM_PAGE_COMP 99 -#define IRQ_NAND_RO_CTLR_READY 100 -#define IRQ_NAND_RB_B 101 -#define IRQ_NAND_ECC_MIPS_UNCORR 102 -#define IRQ_NAND_ECC_MIPS_CORR 103 -#define IRQ_SPI_FULLNESS_REACHED 104 -#define IRQ_SPI_TRUNCATED 105 -#define IRQ_SPI_IMPATIENT 106 -#define IRQ_SPI_SESSION_DONE 107 -#define IRQ_SPI_INTERRUPT_OVERREAD 108 -#define IRQ_SPI_MSPI_INTERRUPT_DONE 109 -#define IRQ_SPI_MSPI_INTERRUPT_HALT_SET_TRANSACTION_DONE 110 -#define IRQ_USB2 111 -#define IRQ_XHCI_0 112 -#define IRQ_XHCI_1 113 -#define IRQ_XHCI_2 114 -#define IRQ_XHCI_3 115 -#define IRQ_XHCI_HSE 116 -#define IRQ_CCA 117 -#define IRQ_UART2 118 -#define IRQ_RSVD119 119 -#define IRQ_I2S 120 -#define IRQ_SMBUS 121 -#define IRQ_TIMER0_1 122 -#define IRQ_TIMER0_2 123 -#define IRQ_TIMER1_1 124 -#define IRQ_TIMER1_2 125 -#define IRQ_RNG 126 -#define IRQ_SWITCH_SOC 127 /* 32 */ -#define IRQ_NETWORK_LINK_EVENT 127 /* 8 */ -#define IRQ_PHY 135 -#define IRQ_TIMESYNC 136 -#define IRQ_IMP_SLEEP_TIMER 137 /* 3 */ -#define IRQ_PCIE_INT0 159 /* 6 */ -#define IRQ_PCIE_INT1 165 /* 6 */ -#define IRQ_PCIE_INT2 171 /* 6 */ -#define IRQ_SDIO 177 -#define IRQ_FA 178 -#define IRQ_GMAC0 179 -#define IRQ_GMAC1 180 -#define IRQ_GMAC2 181 -#define IRQ_GMAC3 182 + +#ifdef BCM5301X +#define BCM53XXX_IRQ(a,c) ((a)) +#elif defined(BCM563XX) +#define BCM53XXX_IRQ(a,c) ((a) + (c)) +#else +#error unknown iProc variant +#endif + +#define IRQ_DS_0_PINS_BUS BCM53XXX_IRQ(73, 6) +#define IRQ_DS_1_PINS_BUS BCM53XXX_IRQ(74, 6) +#define IRQ_DS_2_PINS_BUS BCM53XXX_IRQ(75, 6) +#define IRQ_DS_3_PINS_BUS BCM53XXX_IRQ(76, 6) +#define IRQ_DS_4_PINS_BUS BCM53XXX_IRQ(77, 6) +#define IRQ_DDR_CONTROLLER BCM53XXX_IRQ(78, 6) +#define IRQ_DMAC BCM53XXX_IRQ(79, 6) /* 16 */ +#define IRQ_DMAC_ABORT BCM53XXX_IRQ(95, 6) +#define IRQ_NAND_RD_MISS BCM53XXX_IRQ(96, 6) +#define IRQ_NAND_BLK_ERASE_COMP BCM53XXX_IRQ(97, 6) +#define IRQ_NAND_COPY_BACK_COMP BCM53XXX_IRQ(98, 6) +#define IRQ_NAND_PGM_PAGE_COMP BCM53XXX_IRQ(99, 6) +#define IRQ_NAND_RO_CTLR_READY BCM53XXX_IRQ(100, 6) +#define IRQ_NAND_RB_B BCM53XXX_IRQ(101, 6) +#define IRQ_NAND_ECC_MIPS_UNCORR BCM53XXX_IRQ(102, 6) +#define IRQ_NAND_ECC_MIPS_CORR BCM53XXX_IRQ(103, 6) + +#define IRQ_SPI_FULLNESS_REACHED BCM53XXX_IRQ(104, 6) +#define IRQ_SPI_TRUNCATED BCM53XXX_IRQ(105, 6) +#define IRQ_SPI_IMPATIENT BCM53XXX_IRQ(106, 6) +#define IRQ_SPI_SESSION_DONE BCM53XXX_IRQ(107, 6) +#define IRQ_SPI_INTERRUPT_OVERREAD BCM53XXX_IRQ(108, 6) +#define IRQ_SPI_MSPI_INTERRUPT_DONE BCM53XXX_IRQ(109, 6) +#define IRQ_SPI_MSPI_INTERRUPT_HALT_SET_TRANSACTION_DONE \ + BCM53XXX_IRQ(110, 6) +#define IRQ_USB2 BCM53XXX_IRQ(111, 6) + +#define IRQ_CCA BCM53XXX_IRQ(117, 6) +#define IRQ_UART2 BCM53XXX_IRQ(118, 6) +#define IRQ_GPIO BCM53XXX_IRQ(119, 6) +#define IRQ_I2S BCM53XXX_IRQ(120, 6) +#define IRQ_SMBUS1 BCM53XXX_IRQ(121, 6) +#define IRQ_TIMER0_1 BCM53XXX_IRQ(122, 7) +#define IRQ_TIMER0_2 BCM53XXX_IRQ(123, 7) +#define IRQ_TIMER1_1 BCM53XXX_IRQ(124, 7) +#define IRQ_TIMER1_2 BCM53XXX_IRQ(125, 7) +#define IRQ_RNG BCM53XXX_IRQ(126, 7) +#define IRQ_SWITCH_SOC BCM53XXX_IRQ(127, 7) /* 32 */ +#define IRQ_NETWORK_LINK_EVENT BCM53XXX_IRQ(127, 7) /* 8 */ +#define IRQ_PHY BCM53XXX_IRQ(135, 7) +#define IRQ_TIMESYNC BCM53XXX_IRQ(136, 7) +#define IRQ_IMP_SLEEP_TIMER BCM53XXX_IRQ(137, 7) /* 3 */ +#define IRQ_PCIE_INT0 BCM53XXX_IRQ(159, 55) /* 6 */ +#define IRQ_PCIE_INT1 BCM53XXX_IRQ(165, 55) /* 6 */ +#define IRQ_PCIE_INT2 BCM53XXX_IRQ(171, 55) /* 6 */ +#define IRQ_SDIO BCM53XXX_IRQ(177, 55) +#define IRQ_GMAC0 BCM53XXX_IRQ(179, 55) +#define IRQ_GMAC1 BCM53XXX_IRQ(180, 55) + +#ifdef BCM5301X +#define IRQ_XHCI_0 (112) +#define IRQ_XHCI_1 (113) +#define IRQ_XHCI_2 (114) +#define IRQ_XHCI_3 (115) +#define IRQ_XHCI_HSE (116) +#define IRQ_FA (178) +#define IRQ_GMAC2 (181) +#define IRQ_GMAC3 (182) +#endif + +#ifdef BCM563XX +#define IRQ_SATA_PINS_BUS (73) +#define IRQ_SRAM_PINS_BUS (74) +#define IRQ_APBW_PINS_BUS (75) +#define IRQ_APBX_PINS_BUS (76) +#define IRQ_APBY_PINS_BUS (77) +#define IRQ_APBZ_PINS_BUS (78) +#define IRQ_SMBUS2 (128) +#define IRQ_SATA0 (190) +#define IRQ_SATA1 (191) +#define IRQ_I2S_INTR (201) +#define IRQ_MACSEC0 (202) +#define IRQ_MACSEC1 (203) +#define IRQ_USB2D (238) +#define IRQ_APBV_PINS_BUS (239) +#define IRQ_SRAM_MEM_CORRECTABLE (240) +#define IRQ_SRAM_MEM_UNCORRECTABLE (241) +#define IRQ_SRAM_MEM_ACCESS_VIO (242) +#define IRQ_SRAM_MEM_SBMA_MISMATCH (243) +#define IRQ_CCB_WDT (244) +#endif /* BCM563XX */ #endif /* _ARM_BROADCOM_BC53XX_INTR_H_ */ Index: src/sys/arch/arm/broadcom/bcm53xx_reg.h diff -u src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.13 src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.14 --- src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.13 Fri Jan 25 22:37:59 2013 +++ src/sys/arch/arm/broadcom/bcm53xx_reg.h Mon Oct 28 22:51:16 2013 @@ -94,8 +94,6 @@ #define TIMER0_BASE 0x005000 #define TIMER1_BASE 0x006000 #define SRAB_BASE 0x007000 -#define UART2_BASE 0x008000 -#define SMBUS_BASE 0x009000 #define CRU_BASE 0x00b000 #define DMU_BASE 0x00c000 @@ -104,16 +102,38 @@ #define PCIE0_BASE 0x012000 #define PCIE1_BASE 0x013000 -#define PCIE2_BASE 0x014000 +#ifdef BCM5301X +#define UART2_BASE 0x008000 +#define SMBUS1_BASE 0x009000 +#define PCIE2_BASE 0x014000 #define SDIO_BASE 0x020000 #define EHCI_BASE 0x021000 #define OHCI_BASE 0x022000 - #define GMAC0_BASE 0x024000 #define GMAC1_BASE 0x025000 #define GMAC2_BASE 0x026000 #define GMAC3_BASE 0x027000 +#define NAND_BASE 0x028000 +#define QSPI_BASE 0x029000 +#define I2S_BASE 0x02A000 +#define DMAC_BASE 0x02C000 +#endif + +#ifdef BCM563XX +#define UART2_BASE 0x007000 +#define SMBUS1_BASE 0x008000 +#define WDT_BASE 0x009000 +#define PKA_BASE 0x00a000 +#define SMBUS2_BASE 0x00b000 +#define DMAC_BASE 0x020000 +#define GMAC0_BASE 0x022000 +#define GMAC1_BASE 0x023000 +#define NAND_BASE 0x026000 +#define QSPI_BASE 0x027000 +#define EHCI_BASE 0x02A000 +#define OHCI_BASE 0x02B000 +#endif #define IDM_BASE 0x100000 #define IDM_SIZE 0x100000 @@ -129,6 +149,7 @@ #define ID_BCM53011 0xcf13 // 53011 #define ID_BCM53012 0xcf14 // 53012 #define ID_BCM53013 0xcf15 // 53013 +#define ID_BCM56340 0xdc14 // 56340 #define MISC_CAPABILITY 0x004 #define CAPABILITY_JTAG_PRESENT __BIT(22) @@ -904,4 +925,97 @@ struct gmac_rxdb { #endif /* GMAC_PRIVATE */ +#ifdef NAND_PRIVATE + +#define NAND_REVISION 0x0000 // NAND Revision +#define NAND_CMD_START 0x0004 // Nand Flash Command Start +#define NAND_CMD_EXT_ADDR 0x0008 // Nand Flash Command Extended Address +#define NAND_CMD_ADDR 0x000c // Nand Flash Command Address +#define NAND_CMD_END_ADDR 0x0010 // Nand Flash Command End Address +#define NAND_INTFC_STATUS 0x0014 // Nand Flash Interface Status +#define NAND_CS_NAND_XOR 0x001c // Nand Flash EBI +#define NAND_LL_OP 0x0020 // Nand Flash Low Level Operation +#define NAND_MPLANE_BASE_EXT_ADDR 0x0024 // Nand Flash Multiplane base address +#define NAND_MPLANE_BASE_ADDR 0x0028 // Nand Flash Multiplane base address +#define NAND_ACC_CONTROL_CS0 0x0050 // Nand Flash Access Control +#define NAND_CONFIG_CS0 0x0054 // Nand Flash Config +#define NAND_TIMING_1_CS0 0x0058 // Nand Flash Timing Parameters 1 +#define NAND_TIMING_2_CS0 0x005c // Nand Flash Timing Parameters 2 +#define NAND_ACC_CONTROL_CS1 0x0060 // Nand Flash Access Control +#define NAND_CONFIG_CS1 0x0064 // Nand Flash +#define NAND_TIMING_1_CS1 0x0068 // Nand Flash Timing Parameters 1 +#define NAND_TIMING_2_CS1 0x006c // Nand Flash Timing Parameters 2 +#define NAND_CORR_STAT_THRESHOLD 0x00c0 // Correctable Error Reporting Threshold +#define NAND_BLK_WR_PROTECT 0x00c8 // Block Write Protect Enable and Size for EBI_CS0b +#define NAND_MULTIPLANE_OPCODES_1 0x00cc // Nand Flash Multiplane Customized Opcodes +#define NAND_MULTIPLANE_OPCODES_2 0x00d0 // Nand Flash Multiplane Customized Opcodes +#define NAND_MULTIPLANE_CTRL 0x00d4 // Nand Flash Multiplane Control +#define NAND_UNCORR_ERROR_COUNT 0x00fc // Read Uncorrectable Event Count +#define NAND_CORR_ERROR_COUNT 0x0100 // Read Error Count +#define NAND_READ_ERROR_COUNT 0x0104 // Read Error Count +#define NAND_BLOCK_LOCK_STATUS 0x0108 // Nand Flash Block Lock Status +#define NAND_ECC_CORR_EXT_ADDR 0x010c // ECC Correctable Error Extended Address +#define NAND_ECC_CORR_ADDR 0x0110 // ECC Correctable Error Address +#define NAND_ECC_UNC_EXT_ADDR 0x0114 // ECC Uncorrectable Error Extended Address +#define NAND_ECC_UNC_ADDR 0x0118 // ECC Uncorrectable Error Address +#define NAND_FLASH_READ_EXT_ADDR 0x011c // Flash Read Data Extended Address +#define NAND_FLASH_READ_ADDR 0x0120 // Flash Read Data Address +#define NAND_PROGRAM_PAGE_EXT_ADDR 0x0124 // Page Program Extended Address +#define NAND_PROGRAM_PAGE_ADDR 0x0128 // Page Program Address +#define NAND_COPY_BACK_EXT_ADDR 0x012c // Copy Back Extended Address +#define NAND_COPY_BACK_ADDR 0x0130 // Copy Back Address +#define NAND_BLOCK_ERASE_EXT_ADDR 0x0134 // Block Erase Extended Address +#define NAND_BLOCK_ERASE_ADDR 0x0138 // Block Erase Address +#define NAND_INV_READ_EXT_ADDR 0x013c // Flash Invalid Data Extended Address +#define NAND_INV_READ_ADDR 0x0140 // Flash Invalid Data Address +#define NAND_INIT_STATUS 0x0144 // Initialization status +#define NAND_ONFI_STATUS 0x0148 // ONFI Status +#define NAND_ONFI_DEBUG_DATA 0x014c // ONFI Debug Data +#define NAND_SEMAPHORE 0x0150 // Semaphore +#define NAND_FLASH_DEVICE_ID 0x0194 // Nand Flash Device ID +#define NAND_FLASH_DEVICE_ID_EXT 0x0198 // Nand Flash Extended Device ID +#define NAND_LL_RDDATA 0x019c // Nand Flash Low Level Read Data + +#define NAND_SPARE_AREA_READ_OFSn(n) (0x0200+4*(n)) // Nand Flash Spare Area Read Bytes +#define NAND_SPARE_AREA_WRITE_OFSn(n) (0x0280+4*(n)) // Nand Flash Spare Area Write Bytes 8-11 +#define NAND_FLASH_CACHEn(n) (0x0400+4*(n)) // Flash Cache Buffer Read Access + +#define NAND_DIRECT_READ_RD_MISS 0x0f00 // Interrupt from Nand indicating a read miss on internal memory +#define NAND_BLOCK_ERASE_COMPLETE 0x0f04 // Interrupt from Nand indicating block erase +#define NAND_COPY_BACK_COMPLETE 0x0f08 // Interrupt from Nand indicating Copy-Back complete. +#define NAND_PROGRAM_PAGE_COMPLETE 0x0f0c // Interrupt from nand indicating page program is complete. +#define NAND_RO_CTLR_READY 0x0f10 // Interrupt from nand indicating controller ready +#define NAND_NAND_RB_B 0x0f14 // Interrupt from nand indicating status of Nand Flash ready_bus pin +#define NAND_ECC_MIPS_UNCORR 0x0f18 // Interrupt from Nand indicating Uncorrectable error +#define NAND_ECC_MIPS_CORR 0x0f1c // Interrupt from Nand indicating correctable error + +#define NAND_CMD_START_OPCODE __BITS(28,24) +#define NAND_CMD_START_OPCODE_DEFAULT 0 +#define NAND_CMD_START_OPCODE_NULL 0 +#define NAND_CMD_START_OPCODE_PAGE_READ 1 +#define NAND_CMD_START_OPCODE_SPARE_AREA_READ 2 +#define NAND_CMD_START_OPCODE_STATUS_READ 3 +#define NAND_CMD_START_OPCODE_PROGRAM_PAGE 4 +#define NAND_CMD_START_OPCODE_PROGRAM_SPARE_AREA 5 +#define NAND_CMD_START_OPCODE_COPY_BACK 6 +#define NAND_CMD_START_OPCODE_DEVICE_ID_READ 7 +#define NAND_CMD_START_OPCODE_BLOCK_ERASE 8 +#define NAND_CMD_START_OPCODE_FLASH_RESET 9 +#define NAND_CMD_START_OPCODE_BLOCKS_LOCK 10 +#define NAND_CMD_START_OPCODE_BLOCKS_LOCK_DOWN 11 +#define NAND_CMD_START_OPCODE_BLOCKS_UNLOCK 12 +#define NAND_CMD_START_OPCODE_READ_BLOCKS_LOCK_STATUS 13 +#define NAND_CMD_START_OPCODE_PARAMETER_READ 14 +#define NAND_CMD_START_OPCODE_PARAMETER_CHANGE_COL 15 +#define NAND_CMD_START_OPCODE_LOW_LEVEL_OP 16 +#define NAND_CMD_START_OPCODE_PAGE_READ_MULTI 17 +#define NAND_CMD_START_OPCODE_STATUS_READ_MULTI 18 +#define NAND_CMD_START_OPCODE_PROGRAM_PAGE_MULTI 19 +#define NAND_CMD_START_OPCODE_PROGRAM_PAGE_MULTI_CACHE 20 +#define NAND_CMD_START_OPCODE_BLOCK_ERASE_MULTI 21 +#define NAND_CMD_START_CSEL __BITS(18,16) +#define NAND_CMD_EXT_ADDRESS __BITS(15,0) + +#endif /* NAND_PRIVATE */ + #endif /* _ARM_BROADCOM_BCM53XX_REG_H_ */ Index: src/sys/arch/arm/broadcom/bcm53xx_var.h diff -u src/sys/arch/arm/broadcom/bcm53xx_var.h:1.5 src/sys/arch/arm/broadcom/bcm53xx_var.h:1.6 --- src/sys/arch/arm/broadcom/bcm53xx_var.h:1.5 Tue Feb 19 02:15:18 2013 +++ src/sys/arch/arm/broadcom/bcm53xx_var.h Mon Oct 28 22:51:16 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm53xx_var.h,v 1.5 2013/02/19 02:15:18 matt Exp $ */ +/* $NetBSD: bcm53xx_var.h,v 1.6 2013/10/28 22:51:16 matt Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -40,7 +40,7 @@ struct bcm_locators { bus_size_t loc_size; int loc_port; uint8_t loc_nintrs; - u_int loc_intrs[4]; + u_int loc_intrs[8]; int loc_mdio; int loc_phy; }; @@ -95,6 +95,7 @@ struct cpu_softc { bus_space_handle_t cpu_armcore_bsh; struct bcm53xx_clock_info cpu_clk; + uint32_t cpu_chipid; }; Added files: Index: src/sys/arch/arm/broadcom/bcm53xx_nand.c diff -u /dev/null src/sys/arch/arm/broadcom/bcm53xx_nand.c:1.1 --- /dev/null Mon Oct 28 22:51:16 2013 +++ src/sys/arch/arm/broadcom/bcm53xx_nand.c Mon Oct 28 22:51:16 2013 @@ -0,0 +1,92 @@ +/*- + * 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. + */ + +#include "locators.h" + +#include <sys/cdefs.h> + +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_nand.c,v 1.1 2013/10/28 22:51:16 matt Exp $"); + +#include <sys/bus.h> +#include <sys/device.h> +#include <sys/intr.h> +#include <sys/systm.h> + +#define NAND_PRIVATE + +#include <arm/broadcom/bcm53xx_reg.h> +#include <arm/broadcom/bcm53xx_var.h> + +#include <dev/nand/nand.h> +#include <dev/nand/onfi.h> + +static int bcmnand_ccb_match(device_t, cfdata_t, void *); +static void bcmnand_ccb_attach(device_t, device_t, void *); + +struct bcmnand_softc { + device_t sc_dev; + bus_space_tag_t sc_bst; + bus_space_handle_t sc_bsh; + bus_dma_tag_t sc_dmat; +}; + +CFATTACH_DECL_NEW(bcmnand_ccb, sizeof(struct bcmnand_softc), + bcmnand_ccb_match, bcmnand_ccb_attach, NULL, NULL); + +static int +bcmnand_ccb_match(device_t parent, cfdata_t cf, void *aux) +{ + struct bcmccb_attach_args * const ccbaa = aux; + const struct bcm_locators * const loc = &ccbaa->ccbaa_loc; + + if (strcmp(cf->cf_name, loc->loc_name)) + return 0; + + KASSERT(cf->cf_loc[BCMCCBCF_PORT] == BCMCCBCF_PORT_DEFAULT); + + return 1; +} + +static void +bcmnand_ccb_attach(device_t parent, device_t self, void *aux) +{ + struct bcmnand_softc * const sc = device_private(self); + struct bcmccb_attach_args * const ccbaa = aux; + const struct bcm_locators * const loc = &ccbaa->ccbaa_loc; + + sc->sc_dev = self; + + sc->sc_bst = ccbaa->ccbaa_ccb_bst; + sc->sc_dmat = ccbaa->ccbaa_dmat; + bus_space_subregion(sc->sc_bst, ccbaa->ccbaa_ccb_bsh, + loc->loc_offset, loc->loc_size, &sc->sc_bsh); + + aprint_naive("\n"); + aprint_normal("\n"); +}