diff --git a/sys/arm/xscale/ixp425/if_npe.c b/sys/arm/xscale/ixp425/if_npe.c index c63fc986093b..a963fb07f918 100644 --- a/sys/arm/xscale/ixp425/if_npe.c +++ b/sys/arm/xscale/ixp425/if_npe.c @@ -88,6 +88,12 @@ __FBSDID("$FreeBSD$"); #include "miibus_if.h" +/* + * XXX: For the main bus dma tag. Can go away if the new method to get the + * dma tag from the parent got MFC'd into RELENG_6. + */ +extern struct ixp425_softc *ixp425_softc; + struct npebuf { struct npebuf *ix_next; /* chain to next buffer */ void *ix_m; /* backpointer to mbuf */ @@ -447,7 +453,7 @@ npe_dma_setup(struct npe_softc *sc, struct npedma *dma, dma->nbuf = nbuf; /* DMA tag for mapped mbufs */ - error = bus_dma_tag_create(NULL, 1, 0, + error = bus_dma_tag_create(ixp425_softc->sc_dmat, 1, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, maxseg, MCLBYTES, 0, busdma_lock_mutex, &sc->sc_mtx, &dma->mtag); @@ -458,7 +464,7 @@ npe_dma_setup(struct npe_softc *sc, struct npedma *dma, } /* DMA tag and map for the NPE buffers */ - error = bus_dma_tag_create(NULL, sizeof(uint32_t), 0, + error = bus_dma_tag_create(ixp425_softc->sc_dmat, sizeof(uint32_t), 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, nbuf * sizeof(struct npehwbuf), 1, nbuf * sizeof(struct npehwbuf), 0, @@ -582,7 +588,7 @@ npe_activate(device_t dev) return error; /* setup statistics block */ - error = bus_dma_tag_create(NULL, sizeof(uint32_t), 0, + error = bus_dma_tag_create(ixp425_softc->sc_dmat, sizeof(uint32_t), 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, sizeof(struct npestats), 1, sizeof(struct npestats), 0, busdma_lock_mutex, &sc->sc_mtx, &sc->sc_stats_tag); diff --git a/sys/arm/xscale/ixp425/ixp425.c b/sys/arm/xscale/ixp425/ixp425.c index fbbc70770a3d..f35db997f40a 100644 --- a/sys/arm/xscale/ixp425/ixp425.c +++ b/sys/arm/xscale/ixp425/ixp425.c @@ -149,6 +149,7 @@ arm_mask_irq(uintptr_t nb) void arm_unmask_irq(uintptr_t nb) { + intr_enabled |= (1 << nb); ixp425_set_intrmask(); } @@ -211,6 +212,11 @@ ixp425_attach(device_t dev) ixp425_set_intrmask(); ixp425_set_intrsteer(); + if (bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_32BIT, + BUS_SPACE_MAXADDR, NULL, NULL, 0xffffffff, 0xff, 0xffffffff, 0, + NULL, NULL, &sc->sc_dmat)) + panic("couldn't create the IXP425 dma tag !"); + sc->sc_irq_rman.rm_type = RMAN_ARRAY; sc->sc_irq_rman.rm_descr = "IXP425 IRQs"; if (rman_init(&sc->sc_irq_rman) != 0 || diff --git a/sys/arm/xscale/ixp425/ixp425_pci.c b/sys/arm/xscale/ixp425/ixp425_pci.c index adb9b16d93eb..cadb0882ccc9 100644 --- a/sys/arm/xscale/ixp425/ixp425_pci.c +++ b/sys/arm/xscale/ixp425/ixp425_pci.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#define _ARM32_BUS_DMA_PRIVATE #include #include #include @@ -129,6 +130,19 @@ ixppcib_attach(device_t dev) if (sc->sc_mem == NULL) panic("cannot allocate PCI MEM space"); +#define AHB_OFFSET 0x10000000UL + if (bus_dma_tag_create(NULL, 1, 0, AHB_OFFSET + 64 * 1024 * 1024, + BUS_SPACE_MAXADDR, NULL, NULL, 0xffffffff, 0xff, 0xffffffff, 0, + NULL, NULL, &sc->sc_dmat)) + panic("couldn't create the PCI dma tag !"); + /* + * The PCI bus can only address 64MB. However, due to the way our + * implementation of busdma works, busdma can't tell if a device + * is a PCI device or not. So defaults to the PCI dma tag, which + * restrict the DMA'able memory to the first 64MB, and explicitely + * create less restrictive tags for non-PCI devices. + */ + arm_root_dma_tag = sc->sc_dmat; /* * Initialize the bus space tags. */ @@ -158,7 +172,6 @@ ixppcib_attach(device_t dev) * PCI->AHB address translation * begin at the physical memory start + OFFSET */ -#define AHB_OFFSET 0x10000000UL PCI_CSR_WRITE_4(sc, PCI_AHBMEMBASE, (AHB_OFFSET & 0xFF000000) + ((AHB_OFFSET & 0xFF000000) >> 8) + diff --git a/sys/arm/xscale/ixp425/ixp425var.h b/sys/arm/xscale/ixp425/ixp425var.h index 91a163cd72f1..35a2b7d3698b 100644 --- a/sys/arm/xscale/ixp425/ixp425var.h +++ b/sys/arm/xscale/ixp425/ixp425var.h @@ -57,6 +57,7 @@ struct ixp425_softc { struct rman sc_irq_rman; struct rman sc_mem_rman; + bus_dma_tag_t sc_dmat; }; struct ixppcib_softc { @@ -73,6 +74,7 @@ struct ixppcib_softc { struct bus_space sc_pci_memt; struct bus_space sc_pci_iot; + bus_dma_tag_t sc_dmat; }; #define EXP_BUS_WRITE_4(sc, reg, data) \