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");
+}

Reply via email to