Module Name:    src
Committed By:   tsutsui
Date:           Sat May  9 03:22:20 UTC 2009

Modified Files:
        src/sys/arch/ews4800mips/sbd: if_iee_sbdio.c
        src/sys/arch/hp700/gsc: if_iee_gsc.c
        src/sys/dev/ic: i82596.c i82596var.h

Log Message:
Move allocation of DMA shared memory with bus_dma(9) ops
from MD attachments to MI iee_attach().
Tested on HP9000 735/125. Compile test only on ews4800mips.

XXX: more strict bus_dmamap_sync(9) calls are required in various places.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/hp700/gsc/if_iee_gsc.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/ic/i82596.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/ic/i82596var.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/ews4800mips/sbd/if_iee_sbdio.c
diff -u src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c:1.7 src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c:1.8
--- src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c:1.7	Sat May  9 02:18:48 2009
+++ src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c	Sat May  9 03:22:20 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_iee_sbdio.c,v 1.7 2009/05/09 02:18:48 tsutsui Exp $	*/
+/*	$NetBSD: if_iee_sbdio.c,v 1.8 2009/05/09 03:22:20 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 2003 Jochen Kunz.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iee_sbdio.c,v 1.7 2009/05/09 02:18:48 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iee_sbdio.c,v 1.8 2009/05/09 03:22:20 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -85,7 +85,6 @@
 	struct sbdio_attach_args *sa = aux;
 	uint8_t eaddr[ETHER_ADDR_LEN];
 	int media[2];
-	int rsegs;
 
 	sc->sc_dev = self;
 	sc_ssc->sc_port =
@@ -98,44 +97,8 @@
 
 	sc->sc_dmat = sa->sa_dmat;
 
-	if (bus_dmamem_alloc(sc->sc_dmat, IEE_SHMEM_MAX, PAGE_SIZE, 0,
-	    &sc->sc_dma_segs, 1, &rsegs, BUS_DMA_NOWAIT) != 0) {
-		aprint_error(": can't allocate %d bytes of DMA memory\n",
-		    (int)IEE_SHMEM_MAX);
-		return;
-	}
-
-	if (bus_dmamem_map(sc->sc_dmat, &sc->sc_dma_segs, rsegs, IEE_SHMEM_MAX,
-	    (void **)sc->sc_shmem_addr,
-	    BUS_DMA_NOWAIT | BUS_DMA_COHERENT) != 0) {
-		aprint_error(": can't map DMA memory\n");
-		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, rsegs);
-		return;
-	}
-
-	if (bus_dmamap_create(sc->sc_dmat, IEE_SHMEM_MAX, rsegs,
-	    IEE_SHMEM_MAX, 0, BUS_DMA_NOWAIT, &sc->sc_shmem_map) != 0) {
-		aprint_error(": can't create DMA map\n");
-		bus_dmamem_unmap(sc->sc_dmat, sc->sc_shmem_addr, IEE_SHMEM_MAX);
-		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, rsegs);
-		return;
-	}
-
-	if (bus_dmamap_load(sc->sc_dmat, sc->sc_shmem_map, sc->sc_shmem_addr,
-	    IEE_SHMEM_MAX, NULL, BUS_DMA_NOWAIT) != 0) {
-		aprint_error(": can't load DMA map\n");
-		bus_dmamap_destroy(sc->sc_dmat, sc->sc_shmem_map);
-		bus_dmamem_unmap(sc->sc_dmat, sc->sc_shmem_addr, IEE_SHMEM_MAX);
-		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, rsegs);
-		return;
-	}
-	memset(sc->sc_shmem_addr, 0, IEE_SHMEM_MAX);
-
-	bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, 0, IEE_SHMEM_MAX,
-	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
-
 	/* Setup SYSBUS byte. TR2 specific? -uch */
-	SC_SCP->scp_sysbus = IEE_SYSBUS_BE | IEE_SYSBUS_INT |
+	sc->sc_sysbus = IEE_SYSBUS_BE | IEE_SYSBUS_INT |
 	    IEE_SYSBUS_LIEAR | IEE_SYSBUS_STD;
 
 	sc->sc_iee_reset = iee_sbdio_reset;

Index: src/sys/arch/hp700/gsc/if_iee_gsc.c
diff -u src/sys/arch/hp700/gsc/if_iee_gsc.c:1.11 src/sys/arch/hp700/gsc/if_iee_gsc.c:1.12
--- src/sys/arch/hp700/gsc/if_iee_gsc.c:1.11	Sat May  9 02:29:29 2009
+++ src/sys/arch/hp700/gsc/if_iee_gsc.c	Sat May  9 03:22:20 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: if_iee_gsc.c,v 1.11 2009/05/09 02:29:29 tsutsui Exp $ */
+/* $NetBSD: if_iee_gsc.c,v 1.12 2009/05/09 03:22:20 tsutsui Exp $ */
 
 /*
  * Copyright (c) 2003 Jochen Kunz.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iee_gsc.c,v 1.11 2009/05/09 02:29:29 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iee_gsc.c,v 1.12 2009/05/09 03:22:20 tsutsui Exp $");
 
 /* autoconfig and device stuff */
 #include <sys/param.h>
@@ -214,7 +214,6 @@
 	struct gsc_attach_args *ga = aux;
 	enum hppa_cpu_type cpu_type;
 	int media[2];
-	int rsegs;
 
 	sc->sc_dev = self;
 
@@ -241,34 +240,6 @@
 	}
 
 	sc->sc_dmat = ga->ga_dmatag;
-	if (bus_dmamem_alloc(sc->sc_dmat, IEE_SHMEM_MAX, PAGE_SIZE, 0,
-	    &sc->sc_dma_segs, 1, &rsegs, BUS_DMA_NOWAIT) != 0) {
-		aprint_error(": iee_gsc_attach: can't allocate %d bytes of "
-		    "DMA memory\n", (int)IEE_SHMEM_MAX);
-		return;
-	}
-	if (bus_dmamem_map(sc->sc_dmat, &sc->sc_dma_segs, rsegs, IEE_SHMEM_MAX,
-	    (void **)&sc->sc_shmem_addr, BUS_DMA_NOWAIT) != 0) {
-		aprint_error(": iee_gsc_attach: can't map DMA memory\n");
-		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, rsegs);
-		return;
-	}
-	if (bus_dmamap_create(sc->sc_dmat, IEE_SHMEM_MAX, rsegs,
-	    IEE_SHMEM_MAX, 0, BUS_DMA_NOWAIT, &sc->sc_shmem_map) != 0) {
-		aprint_error(": iee_gsc_attach: can't create DMA map\n");
-		bus_dmamem_unmap(sc->sc_dmat, sc->sc_shmem_addr, IEE_SHMEM_MAX);
-		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, rsegs);
-		return;
-	}
-	if (bus_dmamap_load(sc->sc_dmat, sc->sc_shmem_map, sc->sc_shmem_addr,
-	    IEE_SHMEM_MAX, NULL, BUS_DMA_NOWAIT) != 0) {
-		aprint_error(": iee_gsc_attach: can't load DMA map\n");
-		bus_dmamap_destroy(sc->sc_dmat, sc->sc_shmem_map);
-		bus_dmamem_unmap(sc->sc_dmat, sc->sc_shmem_addr, IEE_SHMEM_MAX);
-		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, rsegs);
-		return;
-	}
-	memset(sc->sc_shmem_addr, 0, IEE_SHMEM_MAX);
 
 	/* Setup SYSBUS byte. */
 	if (ga->ga_type.iodc_sv_model == HPPA_FIO_LAN) {
@@ -281,11 +252,11 @@
 		 *	715/50, 735/99: Rev A1? (per PR port-hp700/35531)
 		 *	735/125: Rev C
 		 */
-		SC_SCP->scp_sysbus = IEE_SYSBUS_INT |
+		sc->sc_sysbus = IEE_SYSBUS_INT |
 		    IEE_SYSBUS_TRG | IEE_SYSBUS_LIEAR | IEE_SYSBUS_STD;
 		sc->sc_flags = IEE_NEED_SWAP | IEE_REV_A;
 	} else {
-		SC_SCP->scp_sysbus = IEE_SYSBUS_BE | IEE_SYSBUS_INT |
+		sc->sc_sysbus = IEE_SYSBUS_BE | IEE_SYSBUS_INT |
 		    IEE_SYSBUS_TRG | IEE_SYSBUS_LIEAR | IEE_SYSBUS_STD;
 		sc->sc_flags = IEE_NEED_SWAP;
 	}
@@ -311,10 +282,6 @@
 
 	iee_detach(sc, flags);
 	bus_space_unmap(sc_gsc->sc_iot, sc_gsc->sc_ioh, IEE_GSC_IO_SZ);
-	bus_dmamap_unload(sc->sc_dmat, sc->sc_shmem_map);
-	bus_dmamap_destroy(sc->sc_dmat, sc->sc_shmem_map);
-	bus_dmamem_unmap(sc->sc_dmat, sc->sc_shmem_addr, IEE_SHMEM_MAX);
-	bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, 1);
 	/* There is no hp700_intr_disestablish()! */
 	return 0;
 }

Index: src/sys/dev/ic/i82596.c
diff -u src/sys/dev/ic/i82596.c:1.20 src/sys/dev/ic/i82596.c:1.21
--- src/sys/dev/ic/i82596.c:1.20	Tue May  5 15:47:35 2009
+++ src/sys/dev/ic/i82596.c	Sat May  9 03:22:20 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: i82596.c,v 1.20 2009/05/05 15:47:35 tsutsui Exp $ */
+/* $NetBSD: i82596.c,v 1.21 2009/05/09 03:22:20 tsutsui Exp $ */
 
 /*
  * Copyright (c) 2003 Jochen Kunz.
@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i82596.c,v 1.20 2009/05/05 15:47:35 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i82596.c,v 1.21 2009/05/09 03:22:20 tsutsui Exp $");
 
 /* autoconfig and device stuff */
 #include <sys/param.h>
@@ -156,12 +156,13 @@
  * sc->sc_cl_align MUST BE INITIALIZED BEFORE THE FOLLOWING MACROS ARE USED:
  * SC_* IEE_*_SZ IEE_*_OFF IEE_SHMEM_MAX (shell style glob(3) pattern)
  * 
- * The MD frontend has to allocate a piece of DMA memory at least of
- * IEE_SHMEM_MAX bytes size. All communication with the chip is done via
- * this shared memory. If possible map this memory non-cachable on
- * archs with non DMA I/O coherent caches. The base of the memory needs
- * to be aligned to an even address if sc->sc_cl_align == 1 and aligned
- * to a cache line if sc->sc_cl_align != 1.
+ * The MD frontend also has to set sc->sc_cl_align and sc->sc_sysbus
+ * to allocate and setup shared DMA memory in MI iee_attach().
+ * All communication with the chip is done via this shared memory.
+ * This memory is mapped with BUS_DMA_COHERENT so it will be uncached
+ * if possible for archs with non DMA I/O coherent caches.
+ * The base of the memory needs to be aligned to an even address
+ * if sc->sc_cl_align == 1 and aligned to a cache line if sc->sc_cl_align != 1.
  * 
  * An interrupt with iee_intr() as handler must be established.
  * 
@@ -530,9 +531,44 @@
 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 	int n;
 
+	KASSERT(sc->sc_cl_align > 0);
+
+	/* allocate memory for shared DMA descriptors */
+	if (bus_dmamem_alloc(sc->sc_dmat, IEE_SHMEM_MAX, PAGE_SIZE, 0,
+	    &sc->sc_dma_segs, 1, &sc->sc_dma_rsegs, BUS_DMA_NOWAIT) != 0) {
+		aprint_error(": iee_gsc_attach: can't allocate %d bytes of "
+		    "DMA memory\n", (int)IEE_SHMEM_MAX);
+		return;
+	}
+	if (bus_dmamem_map(sc->sc_dmat, &sc->sc_dma_segs, sc->sc_dma_rsegs,
+	    IEE_SHMEM_MAX, (void **)&sc->sc_shmem_addr,
+	    BUS_DMA_COHERENT | BUS_DMA_NOWAIT) != 0) {
+		aprint_error(": iee_gsc_attach: can't map DMA memory\n");
+		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs,
+		    sc->sc_dma_rsegs); 
+		return;
+	}
+	if (bus_dmamap_create(sc->sc_dmat, IEE_SHMEM_MAX, sc->sc_dma_rsegs,
+	    IEE_SHMEM_MAX, 0, BUS_DMA_NOWAIT, &sc->sc_shmem_map) != 0) {
+		aprint_error(": iee_gsc_attach: can't create DMA map\n");
+		bus_dmamem_unmap(sc->sc_dmat, sc->sc_shmem_addr, IEE_SHMEM_MAX);		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs,
+		    sc->sc_dma_rsegs);
+		return;
+	}
+	if (bus_dmamap_load(sc->sc_dmat, sc->sc_shmem_map, sc->sc_shmem_addr,
+	    IEE_SHMEM_MAX, NULL, BUS_DMA_NOWAIT) != 0) {
+		aprint_error(": iee_gsc_attach: can't load DMA map\n");
+		bus_dmamap_destroy(sc->sc_dmat, sc->sc_shmem_map);
+		bus_dmamem_unmap(sc->sc_dmat, sc->sc_shmem_addr, IEE_SHMEM_MAX);		bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs,
+		    sc->sc_dma_rsegs);
+		return;
+	}
+	memset(sc->sc_shmem_addr, 0, IEE_SHMEM_MAX);
+
 	/* Set pointer to Intermediate System Configuration Pointer. */
 	/* Phys. addr. in big endian order. (Big endian as defined by Intel.) */
 	SC_SCP->scp_iscp_addr = IEE_SWAP32(IEE_PHYS_SHMEM(IEE_ISCP_OFF));
+	SC_SCP->scp_sysbus = sc->sc_sysbus;
 	/* Set pointer to System Control Block. */
 	/* Phys. addr. in big endian order. (Big endian as defined by Intel.) */
 	SC_ISCP->iscp_scb_addr = IEE_SWAP32(IEE_PHYS_SHMEM(IEE_SCB_OFF));
@@ -541,6 +577,9 @@
 	/* Set pointer to Command Block. (physical address) */
 	SC_SCB->scb_cmd_blk_addr = IEE_SWAPA32(IEE_PHYS_SHMEM(IEE_CB_OFF));
 
+	bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, 0, IEE_SHMEM_MAX,
+	    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
+
 	ifmedia_init(&sc->sc_ifmedia, 0, iee_mediachange, iee_mediastatus);
 	if (media != NULL) {
 		for (n = 0 ; n < nmedia ; n++)
@@ -591,6 +630,10 @@
 		iee_stop(ifp, 1);
 	ether_ifdetach(ifp);
 	if_detach(ifp);
+	bus_dmamap_unload(sc->sc_dmat, sc->sc_shmem_map);
+	bus_dmamap_destroy(sc->sc_dmat, sc->sc_shmem_map);
+	bus_dmamem_unmap(sc->sc_dmat, sc->sc_shmem_addr, IEE_SHMEM_MAX);
+	bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, sc->sc_dma_rsegs);
 }
 
 

Index: src/sys/dev/ic/i82596var.h
diff -u src/sys/dev/ic/i82596var.h:1.11 src/sys/dev/ic/i82596var.h:1.12
--- src/sys/dev/ic/i82596var.h:1.11	Tue May  5 15:47:35 2009
+++ src/sys/dev/ic/i82596var.h	Sat May  9 03:22:20 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: i82596var.h,v 1.11 2009/05/05 15:47:35 tsutsui Exp $ */
+/* $NetBSD: i82596var.h,v 1.12 2009/05/09 03:22:20 tsutsui Exp $ */
 
 /*
  * Copyright (c) 2003 Jochen Kunz.
@@ -156,6 +156,7 @@
 	bus_dma_tag_t sc_dmat;
 	bus_dmamap_t sc_shmem_map;
 	bus_dma_segment_t sc_dma_segs;
+	int sc_dma_rsegs;
 	bus_dmamap_t sc_rx_map[IEE_NRFD];
 	bus_dmamap_t sc_tx_map[IEE_NCB];
 	struct mbuf *sc_rx_mbuf[IEE_NRFD];
@@ -167,6 +168,7 @@
 	uint8_t sc_cf[14];
 	int sc_flags;
 	int sc_cl_align;
+	uint32_t sc_sysbus;
 	uint32_t sc_crc_err;
 	uint32_t sc_align_err;
 	uint32_t sc_resource_err;

Reply via email to