PERFORCE change 33961 for review

Marcel Moolenaar marcel at FreeBSD.org
Tue Jul 1 19:47:49 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=33961

Change 33961 by marcel at marcel_nfs on 2003/07/01 19:46:59

	IFC @33957

Affected files ...

.. //depot/projects/uart/alpha/alpha/busdma_machdep.c#2 integrate
.. //depot/projects/uart/alpha/include/bus.h#2 integrate
.. //depot/projects/uart/alpha/isa/isa_dma.c#2 integrate
.. //depot/projects/uart/amd64/amd64/busdma_machdep.c#2 integrate
.. //depot/projects/uart/amd64/include/bus_dma.h#2 integrate
.. //depot/projects/uart/boot/ficl/Makefile#2 integrate
.. //depot/projects/uart/boot/forth/loader.conf#2 integrate
.. //depot/projects/uart/boot/i386/btx/lib/Makefile#2 integrate
.. //depot/projects/uart/boot/pc98/btx/lib/Makefile#2 integrate
.. //depot/projects/uart/conf/files.sparc64#3 integrate
.. //depot/projects/uart/conf/options.sparc64#2 integrate
.. //depot/projects/uart/dev/aac/aac.c#2 integrate
.. //depot/projects/uart/dev/aac/aac_pci.c#2 integrate
.. //depot/projects/uart/dev/acpica/acpi_pci.c#2 integrate
.. //depot/projects/uart/dev/advansys/adv_eisa.c#2 integrate
.. //depot/projects/uart/dev/advansys/adv_isa.c#2 integrate
.. //depot/projects/uart/dev/advansys/adv_pci.c#2 integrate
.. //depot/projects/uart/dev/advansys/advansys.c#2 integrate
.. //depot/projects/uart/dev/advansys/adw_pci.c#2 integrate
.. //depot/projects/uart/dev/advansys/adwcam.c#2 integrate
.. //depot/projects/uart/dev/aha/aha.c#2 integrate
.. //depot/projects/uart/dev/aha/aha_isa.c#2 integrate
.. //depot/projects/uart/dev/aha/aha_mca.c#2 integrate
.. //depot/projects/uart/dev/ahb/ahb.c#2 integrate
.. //depot/projects/uart/dev/aic7xxx/ahc_eisa.c#2 integrate
.. //depot/projects/uart/dev/aic7xxx/ahc_pci.c#2 integrate
.. //depot/projects/uart/dev/aic7xxx/ahd_pci.c#2 integrate
.. //depot/projects/uart/dev/aic7xxx/aic79xx_osm.h#2 integrate
.. //depot/projects/uart/dev/aic7xxx/aic7xxx_osm.h#2 integrate
.. //depot/projects/uart/dev/amd/amd.c#2 integrate
.. //depot/projects/uart/dev/amr/amr_pci.c#2 integrate
.. //depot/projects/uart/dev/an/if_an_pci.c#2 integrate
.. //depot/projects/uart/dev/ata/ata-dma.c#2 integrate
.. //depot/projects/uart/dev/ath/if_ath.c#2 integrate
.. //depot/projects/uart/dev/ath/if_ath_pci.c#2 integrate
.. //depot/projects/uart/dev/buslogic/bt.c#2 integrate
.. //depot/projects/uart/dev/buslogic/bt_eisa.c#2 integrate
.. //depot/projects/uart/dev/buslogic/bt_isa.c#2 integrate
.. //depot/projects/uart/dev/buslogic/bt_mca.c#2 integrate
.. //depot/projects/uart/dev/buslogic/bt_pci.c#2 integrate
.. //depot/projects/uart/dev/cardbus/cardbus.c#2 integrate
.. //depot/projects/uart/dev/ciss/ciss.c#2 integrate
.. //depot/projects/uart/dev/ct/ct_isa.c#2 integrate
.. //depot/projects/uart/dev/dpt/dpt_eisa.c#2 integrate
.. //depot/projects/uart/dev/dpt/dpt_isa.c#2 integrate
.. //depot/projects/uart/dev/dpt/dpt_pci.c#2 integrate
.. //depot/projects/uart/dev/dpt/dpt_scsi.c#2 integrate
.. //depot/projects/uart/dev/em/if_em.c#2 integrate
.. //depot/projects/uart/dev/en/midway.c#2 integrate
.. //depot/projects/uart/dev/fatm/if_fatm.c#2 integrate
.. //depot/projects/uart/dev/firewire/firewire.c#2 integrate
.. //depot/projects/uart/dev/firewire/fwdma.c#2 integrate
.. //depot/projects/uart/dev/firewire/fwmem.c#2 integrate
.. //depot/projects/uart/dev/firewire/fwohci.c#2 integrate
.. //depot/projects/uart/dev/firewire/fwohci_pci.c#2 integrate
.. //depot/projects/uart/dev/firewire/sbp.c#2 integrate
.. //depot/projects/uart/dev/fxp/if_fxp.c#2 integrate
.. //depot/projects/uart/dev/gem/if_gem.c#2 integrate
.. //depot/projects/uart/dev/gem/if_gem_pci.c#2 integrate
.. //depot/projects/uart/dev/hatm/if_hatm.c#2 integrate
.. //depot/projects/uart/dev/hifn/hifn7751.c#2 integrate
.. //depot/projects/uart/dev/hme/if_hme.c#2 integrate
.. //depot/projects/uart/dev/hme/if_hme_pci.c#2 integrate
.. //depot/projects/uart/dev/ida/ida.c#2 integrate
.. //depot/projects/uart/dev/ida/ida_eisa.c#2 integrate
.. //depot/projects/uart/dev/ida/ida_pci.c#2 integrate
.. //depot/projects/uart/dev/iir/iir.c#2 integrate
.. //depot/projects/uart/dev/iir/iir_pci.c#2 integrate
.. //depot/projects/uart/dev/ips/ips.c#2 integrate
.. //depot/projects/uart/dev/ips/ips_commands.c#2 integrate
.. //depot/projects/uart/dev/ips/ips_ioctl.c#2 integrate
.. //depot/projects/uart/dev/ips/ips_pci.c#2 integrate
.. //depot/projects/uart/dev/isp/isp_pci.c#2 integrate
.. //depot/projects/uart/dev/isp/isp_sbus.c#2 integrate
.. //depot/projects/uart/dev/lnc/if_lnc_cbus.c#2 integrate
.. //depot/projects/uart/dev/lnc/if_lnc_isa.c#2 integrate
.. //depot/projects/uart/dev/lnc/if_lnc_pci.c#2 integrate
.. //depot/projects/uart/dev/mlx/mlx.c#2 integrate
.. //depot/projects/uart/dev/mlx/mlx_pci.c#2 integrate
.. //depot/projects/uart/dev/mly/mly.c#2 integrate
.. //depot/projects/uart/dev/mpt/mpt_pci.c#2 integrate
.. //depot/projects/uart/dev/pci/pci.c#2 integrate
.. //depot/projects/uart/dev/pci/pci_if.m#2 integrate
.. //depot/projects/uart/dev/pci/pci_private.h#2 integrate
.. //depot/projects/uart/dev/sound/isa/ad1816.c#2 integrate
.. //depot/projects/uart/dev/sound/isa/ess.c#2 integrate
.. //depot/projects/uart/dev/sound/isa/mss.c#2 integrate
.. //depot/projects/uart/dev/sound/isa/sb16.c#2 integrate
.. //depot/projects/uart/dev/sound/isa/sb8.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/als4000.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/au88x0.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/aureal.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/cmi.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/cs4281.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/csapcm.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/ds1.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/emu10k1.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/es137x.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/fm801.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/ich.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/maestro.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/maestro3.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/solo.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/t4dwave.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/via8233.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/via82c686.c#2 integrate
.. //depot/projects/uart/dev/sound/pci/vibes.c#2 integrate
.. //depot/projects/uart/dev/sound/usb/uaudio_pcm.c#2 integrate
.. //depot/projects/uart/dev/sym/sym_hipd.c#2 integrate
.. //depot/projects/uart/dev/trm/trm.c#2 integrate
.. //depot/projects/uart/dev/twe/twe_freebsd.c#2 integrate
.. //depot/projects/uart/dev/tx/if_tx.c#2 integrate
.. //depot/projects/uart/dev/ubsec/ubsec.c#2 integrate
.. //depot/projects/uart/dev/usb/usbdevs#2 integrate
.. //depot/projects/uart/dev/usb/usbdevs.h#2 integrate
.. //depot/projects/uart/dev/usb/usbdevs_data.h#2 integrate
.. //depot/projects/uart/dev/usb/uscanner.c#2 integrate
.. //depot/projects/uart/dev/vinum/vinumconfig.c#2 integrate
.. //depot/projects/uart/dev/wds/wd7000.c#2 integrate
.. //depot/projects/uart/dev/wi/if_wi.c#3 integrate
.. //depot/projects/uart/i386/acpica/acpi_wakeup.c#2 integrate
.. //depot/projects/uart/i386/i386/busdma_machdep.c#2 integrate
.. //depot/projects/uart/i386/include/bus_dma.h#2 integrate
.. //depot/projects/uart/i4b/layer1/itjc/i4b_itjc_pci.c#2 integrate
.. //depot/projects/uart/ia64/ia64/busdma_machdep.c#2 integrate
.. //depot/projects/uart/ia64/include/bus.h#2 integrate
.. //depot/projects/uart/ia64/isa/isa_dma.c#2 integrate
.. //depot/projects/uart/isa/psm.c#2 integrate
.. //depot/projects/uart/kern/kern_condvar.c#2 integrate
.. //depot/projects/uart/kern/kern_intr.c#2 integrate
.. //depot/projects/uart/kern/kern_thread.c#2 integrate
.. //depot/projects/uart/kern/vfs_mount.c#2 integrate
.. //depot/projects/uart/modules/ath_hal/Makefile#2 integrate
.. //depot/projects/uart/netipsec/ipsec_output.c#2 integrate
.. //depot/projects/uart/netipsec/xform_ah.c#2 integrate
.. //depot/projects/uart/netipsec/xform_esp.c#2 integrate
.. //depot/projects/uart/netipsec/xform_ipcomp.c#2 integrate
.. //depot/projects/uart/opencrypto/crypto.c#2 integrate
.. //depot/projects/uart/opencrypto/cryptodev.h#2 integrate
.. //depot/projects/uart/pci/if_rl.c#3 integrate
.. //depot/projects/uart/pci/if_sis.c#2 integrate
.. //depot/projects/uart/pci/if_xl.c#2 integrate
.. //depot/projects/uart/powerpc/include/bus.h#2 integrate
.. //depot/projects/uart/powerpc/powerpc/busdma_machdep.c#2 integrate
.. //depot/projects/uart/sparc64/conf/GENERIC#2 integrate
.. //depot/projects/uart/sparc64/conf/NOTES#2 integrate
.. //depot/projects/uart/sparc64/ebus/ebus.c#2 integrate
.. //depot/projects/uart/sparc64/include/bus.h#2 integrate
.. //depot/projects/uart/sparc64/include/ofw_bus.h#2 integrate
.. //depot/projects/uart/sparc64/isa/isa.c#2 integrate
.. //depot/projects/uart/sparc64/isa/ofw_isa.c#2 integrate
.. //depot/projects/uart/sparc64/isa/ofw_isa.h#2 integrate
.. //depot/projects/uart/sparc64/pci/apb.c#2 integrate
.. //depot/projects/uart/sparc64/pci/ofw_pci.c#2 integrate
.. //depot/projects/uart/sparc64/pci/ofw_pci.h#2 integrate
.. //depot/projects/uart/sparc64/pci/ofw_pci_if.m#2 integrate
.. //depot/projects/uart/sparc64/pci/ofw_pcib.c#1 branch
.. //depot/projects/uart/sparc64/pci/ofw_pcib_subr.c#1 branch
.. //depot/projects/uart/sparc64/pci/ofw_pcib_subr.h#1 branch
.. //depot/projects/uart/sparc64/pci/ofw_pcibus.c#1 branch
.. //depot/projects/uart/sparc64/pci/psycho.c#2 integrate
.. //depot/projects/uart/sparc64/pci/psychovar.h#2 integrate
.. //depot/projects/uart/sparc64/sbus/sbus.c#2 integrate
.. //depot/projects/uart/sparc64/sparc64/bus_machdep.c#3 integrate
.. //depot/projects/uart/sparc64/sparc64/ofw_bus.c#2 integrate
.. //depot/projects/uart/sparc64/sparc64/sparcbus_if.m#2 delete
.. //depot/projects/uart/sys/mount.h#2 integrate
.. //depot/projects/uart/vm/vm_contig.c#2 integrate
.. //depot/projects/uart/vm/vm_map.c#3 integrate
.. //depot/projects/uart/vm/vm_page.c#2 integrate

Differences ...

==== //depot/projects/uart/alpha/alpha/busdma_machdep.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/busdma_machdep.c,v 1.39 2003/06/27 08:31:47 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/busdma_machdep.c,v 1.42 2003/07/01 21:20:51 mux Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -64,6 +64,8 @@
 	int		  flags;
 	int		  ref_count;
 	int		  map_count;
+	bus_dma_lock_t	 *lockfunc;
+	void		 *lockfuncarg;
 };
 
 struct bounce_page {
@@ -94,7 +96,6 @@
 	vm_offset_t	       busaddress;	/* address in bus space */
 	bus_dmamap_callback_t *callback;
 	void		      *callback_arg;
-	struct mtx	      *callback_mtx;
 	void		      *sgmaphandle;	/* handle into sgmap */
 	STAILQ_ENTRY(bus_dmamap) links;
 };
@@ -105,12 +106,21 @@
 
 static void init_bounce_pages(void *dummy);
 static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages);
-static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map);
-static vm_offset_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map,
+static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map,
+				int commit);
+static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map,
 				   vm_offset_t vaddr, bus_size_t size);
 static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage);
 static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr);
 
+/*
+ * Return true if a match is made.
+ *
+ * To find a match walk the chain of bus_dma_tag_t's looking for 'paddr'.
+ *
+ * If paddr is within the bounds of the dma tag then call the filter callback
+ * to check for a match, if there is no filter callback then assume a match.
+ */
 static __inline int
 run_filter(bus_dma_tag_t dmat, bus_addr_t paddr)
 {
@@ -129,6 +139,46 @@
 	return (retval);
 }
 
+/*
+ * Convenience function for manipulating driver locks from busdma (during
+ * busdma_swi, for example).  Drivers that don't provide their own locks
+ * should specify &Giant to dmat->lockfuncarg.  Drivers that use their own
+ * non-mutex locking scheme don't have to use this at all.
+ */
+void
+busdma_lock_mutex(void *arg, bus_dma_lock_op_t op)
+{
+	struct mtx *dmtx;
+
+	dmtx = (struct mtx *)arg;
+	switch (op) {
+	case BUS_DMA_LOCK:
+		mtx_lock(dmtx);
+		break;
+	case BUS_DMA_UNLOCK:
+		mtx_unlock(dmtx);
+		break;
+	default:
+		panic("Unknown operation 0x%x for busdma_lock_mutex!", op);
+	}
+}
+
+/*
+ * dflt_lock should never get called.  It gets put into the dma tag when
+ * lockfunc == NULL, which is only valid if the maps that are associated
+ * with the tag are meant to never be defered.
+ * XXX Should have a way to identify which driver is responsible here.
+ */
+static void
+dflt_lock(void *arg, bus_dma_lock_op_t op)
+{
+#ifdef INVARIANTS
+	panic("driver error: busdma dflt_lock called");
+#else
+	printf("DRIVER_ERROR: busdma dflt_lock called\n");
+#endif
+}
+
 #define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4
 /*
  * Allocate a device specific dma_tag.
@@ -138,7 +188,8 @@
 		   bus_size_t boundary, bus_addr_t lowaddr,
 		   bus_addr_t highaddr, bus_dma_filter_t *filter,
 		   void *filterarg, bus_size_t maxsize, int nsegments,
-		   bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat)
+		   bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
+		   void *lockfuncarg, bus_dma_tag_t *dmat)
 {
 	bus_dma_tag_t newtag;
 	int error = 0;
@@ -163,6 +214,13 @@
 	newtag->flags = flags;
 	newtag->ref_count = 1; /* Count ourself */
 	newtag->map_count = 0;
+	if (lockfunc != NULL) {
+		newtag->lockfunc = lockfunc;
+		newtag->lockfuncarg = lockfuncarg;
+	} else {
+		newtag->lockfunc = dflt_lock;
+		newtag->lockfuncarg = NULL;
+	}
 	
 	/* Take into account any restrictions imposed by our parent tag */
 	if (parent != NULL) {
@@ -233,8 +291,14 @@
 			atomic_subtract_int(&dmat->ref_count, 1);
 			if (dmat->ref_count == 0) {
 				free(dmat, M_DEVBUF);
-			}
-			dmat = parent;
+				/*
+				 * Last reference count, so
+				 * release our reference
+				 * count on our parent.
+				 */
+				dmat = parent;
+			} else
+				dmat = NULL;
 		}
 	}
 	return (0);
@@ -330,16 +394,10 @@
 		sgmap_free_region(chipset.sgmap, map->sgmaphandle);
 	}
 
-	if (map != NULL) {
+	if (map != NULL && map != &nobounce_dmamap) {
 		if (STAILQ_FIRST(&map->bpages) != NULL)
 			return (EBUSY);
-		/*
-		 * The nobounce_dmamap map is not dynamically
-		 * allocated, thus we should on no account try to
-		 * free it.
-		 */
-		if (map != &nobounce_dmamap)
-			free(map, M_DEVBUF);
+		free(map, M_DEVBUF);
 	}
 	dmat->map_count--;
 	return (0);
@@ -381,7 +439,7 @@
 
 /*
  * Free a piece of memory and it's allociated dmamap, that was allocated
- * via bus_dmamem_alloc.
+ * via bus_dmamem_alloc.  Make the same choice for free/contigfree.
  */
 void
 bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
@@ -476,18 +534,24 @@
 	/* Reserve Necessary Bounce Pages */
 	if (map->pagesneeded != 0) {
 		mtx_lock(&bounce_lock);
-	 	if (reserve_bounce_pages(dmat, map) != 0) {
-
-			/* Queue us for resources */
-			map->dmat = dmat;
-			map->buf = buf;
-			map->buflen = buflen;
-			map->callback = callback;
-			map->callback_arg = callback_arg;
-
-			STAILQ_INSERT_TAIL(&bounce_map_waitinglist, map, links);
-			mtx_unlock(&bounce_lock);
-			return (EINPROGRESS);
+		if (flags & BUS_DMA_NOWAIT) {
+			if (reserve_bounce_pages(dmat, map, 0) != 0) {
+				mtx_unlock(&bounce_lock);
+				return (ENOMEM);
+			}
+		} else {
+			if (reserve_bounce_pages(dmat, map, 1) != 0) {
+				/* Queue us for resources */
+				map->dmat = dmat;
+				map->buf = buf;
+				map->buflen = buflen;
+				map->callback = callback;
+				map->callback_arg = callback_arg;
+				STAILQ_INSERT_TAIL(&bounce_map_waitinglist,
+				    map, links);
+				mtx_unlock(&bounce_lock);
+				return (EINPROGRESS);
+			}
 		}
 		mtx_unlock(&bounce_lock);
 	}
@@ -570,7 +634,7 @@
 		pmap = NULL;
 
 	lastaddr = *lastaddrp;
-	bmask  = ~(dmat->boundary - 1);
+	bmask = ~(dmat->boundary - 1);
 
 	for (seg = *segp; buflen > 0 ; ) {
 		/*
@@ -657,7 +721,7 @@
 	error = 0;
 	if (m0->m_pkthdr.len <= dmat->maxsize) {
 		int first = 1;
-		vm_offset_t lastaddr = 0;
+		bus_addr_t lastaddr = 0;
 		struct mbuf *m;
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
@@ -693,7 +757,7 @@
 		    bus_dmamap_callback2_t *callback, void *callback_arg,
 		    int flags)
 {
-	vm_offset_t lastaddr;
+	bus_addr_t lastaddr;
 #ifdef __GNUC__
 	bus_dma_segment_t dm_segments[dmat->nsegments];
 #else
@@ -776,7 +840,6 @@
 	struct bounce_page *bpage;
 
 	if ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
-		
 		/*
 		 * Handle data bouncing.  We might also
 		 * want to add support for invalidating
@@ -838,7 +901,7 @@
 							 PAGE_SIZE,
 							 dmat->boundary);
 		mtx_unlock(&Giant);
-		if (bpage->vaddr == NULL) {
+		if (bpage->vaddr == 0) {
 			free(bpage, M_DEVBUF);
 			break;
 		}
@@ -855,12 +918,14 @@
 }
 
 static int
-reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map)
+reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int commit)
 {
 	int pages;
 
 	mtx_assert(&bounce_lock, MA_OWNED);
 	pages = MIN(free_bpages, map->pagesneeded - map->pagesreserved);
+	if (commit == 0 && map->pagesneeded > (map->pagesreserved + pages))
+		return (map->pagesneeded - (map->pagesreserved + pages));
 	free_bpages -= pages;
 	reserved_bpages += pages;
 	map->pagesreserved += pages;
@@ -869,7 +934,7 @@
 	return (pages);
 }
 
-static vm_offset_t
+static bus_addr_t
 add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
 		bus_size_t size)
 {
@@ -912,7 +977,7 @@
 	free_bpages++;
 	active_bpages--;
 	if ((map = STAILQ_FIRST(&bounce_map_waitinglist)) != NULL) {
-		if (reserve_bounce_pages(map->dmat, map) == 0) {
+		if (reserve_bounce_pages(map->dmat, map, 1) == 0) {
 			STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links);
 			STAILQ_INSERT_TAIL(&bounce_map_callbacklist,
 					   map, links);
@@ -926,18 +991,18 @@
 void
 busdma_swi(void)
 {
+	bus_dma_tag_t dmat;
 	struct bus_dmamap *map;
 
 	mtx_lock(&bounce_lock);
 	while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) {
 		STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links);
 		mtx_unlock(&bounce_lock);
-		if (map->callback_mtx != NULL)
-			mtx_lock(map->callback_mtx);
+		dmat = map->dmat;
+		(dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK);
 		bus_dmamap_load(map->dmat, map, map->buf, map->buflen,
 				map->callback, map->callback_arg, /*flags*/0);
-		if (map->callback_mtx != NULL)
-			mtx_unlock(map->callback_mtx);
+		(dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK);
 		mtx_lock(&bounce_lock);
 	}
 	mtx_unlock(&bounce_lock);

==== //depot/projects/uart/alpha/include/bus.h#2 (text+ko) ====

@@ -67,7 +67,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/* $FreeBSD: src/sys/alpha/include/bus.h,v 1.21 2003/05/30 20:40:32 hmp Exp $ */
+/* $FreeBSD: src/sys/alpha/include/bus.h,v 1.22 2003/07/01 15:51:50 scottl Exp $ */
 
 #ifndef _ALPHA_BUS_H_
 #define _ALPHA_BUS_H_
@@ -523,6 +523,17 @@
 typedef int bus_dma_filter_t(void *, bus_addr_t);
 
 /*
+ * A function that performs driver-specific syncronization on behalf of
+ * busdma.
+ */
+typedef enum {
+	BUS_DMA_LOCK	= 0x01,
+	BUS_DMA_UNLOCK	= 0x02,
+} bus_dma_lock_op_t;
+
+typedef void bus_dma_lock_t(void *, bus_dma_lock_op_t);
+
+/*
  * Allocate a device specific dma_tag encapsulating the constraints of
  * the parent tag in addition to other restrictions specified:
  *
@@ -547,7 +558,8 @@
 		       bus_size_t boundary, bus_addr_t lowaddr,
 		       bus_addr_t highaddr, bus_dma_filter_t *filtfunc,
 		       void *filtfuncarg, bus_size_t maxsize, int nsegments,
-		       bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat);
+		       bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
+		       void *lockfuncarg, bus_dma_tag_t *dmat);
 
 int bus_dma_tag_destroy(bus_dma_tag_t dmat);
 
@@ -629,4 +641,9 @@
 	if ((dmamap) != NULL)				\
 		_bus_dmamap_unload(dmat, dmamap)
 
+/*
+ * Generic helper function for manipulating mutexes.
+ */
+void busdma_lock_mutex(void *arg, bus_dma_lock_op_t op);
+
 #endif /* _ALPHA_BUS_H_ */

==== //depot/projects/uart/alpha/isa/isa_dma.c#2 (text+ko) ====

@@ -48,11 +48,13 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/isa/isa_dma.c,v 1.8 2003/06/10 16:57:28 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/isa/isa_dma.c,v 1.9 2003/07/01 15:51:50 scottl Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/malloc.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
 #include <sys/bus.h>
 #include <vm/vm.h>
 #include <vm/vm_param.h>
@@ -131,6 +133,8 @@
 			       /*maxsize*/bouncebufsize,
 			       /*nsegments*/1, /*maxsegz*/0x3ffff,
 			       /*flags*/BUS_DMA_ISA,
+			       /*lockfunc*/busdma_lock_mutex,
+			       /*lockarg*/&Giant,
 			       &dma_tag[chan]) != 0) {
 		panic("isa_dmainit: unable to create dma tag\n");
 	}

==== //depot/projects/uart/amd64/amd64/busdma_machdep.c#2 (text+ko) ====

@@ -22,10 +22,11 @@
  * 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.
- *
- * $FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.46 2003/06/28 06:07:06 scottl Exp $
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.49 2003/07/01 19:16:48 mux Exp $");
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/malloc.h>
@@ -62,6 +63,8 @@
 	int		  flags;
 	int		  ref_count;
 	int		  map_count;
+	bus_dma_lock_t	 *lockfunc;
+	void		 *lockfuncarg;
 };
 
 struct bounce_page {
@@ -74,6 +77,7 @@
 
 int busdma_swi_pending;
 
+static struct mtx bounce_lock;
 static STAILQ_HEAD(bp_list, bounce_page) bounce_page_list;
 static int free_bpages;
 static int reserved_bpages;
@@ -90,7 +94,6 @@
 	bus_size_t	       buflen;		/* unmapped buffer length */
 	bus_dmamap_callback_t *callback;
 	void		      *callback_arg;
-	struct mtx	      *callback_mtx;
 	STAILQ_ENTRY(bus_dmamap) links;
 };
 
@@ -101,20 +104,17 @@
 static void init_bounce_pages(void *dummy);
 static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages);
 static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map,
-    				int commit);
+				int commit);
 static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map,
 				   vm_offset_t vaddr, bus_size_t size);
 static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage);
 static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr);
 
-/* To protect all the the bounce pages related lists and data. */
-static struct mtx bounce_lock;
-
 /*
  * Return true if a match is made.
- * 
+ *
  * To find a match walk the chain of bus_dma_tag_t's looking for 'paddr'.
- * 
+ *
  * If paddr is within the bounds of the dma tag then call the filter callback
  * to check for a match, if there is no filter callback then assume a match.
  */
@@ -136,6 +136,46 @@
 	return (retval);
 }
 
+/*
+ * Convenience function for manipulating driver locks from busdma (during
+ * busdma_swi, for example).  Drivers that don't provide their own locks
+ * should specify &Giant to dmat->lockfuncarg.  Drivers that use their own
+ * non-mutex locking scheme don't have to use this at all.
+ */
+void
+busdma_lock_mutex(void *arg, bus_dma_lock_op_t op)
+{
+	struct mtx *dmtx;
+
+	dmtx = (struct mtx *)arg;
+	switch (op) {
+	case BUS_DMA_LOCK:
+		mtx_lock(dmtx);
+		break;
+	case BUS_DMA_UNLOCK:
+		mtx_unlock(dmtx);
+		break;
+	default:
+		panic("Unknown operation 0x%x for busdma_lock_mutex!", op);
+	}
+}
+
+/*
+ * dflt_lock should never get called.  It gets put into the dma tag when
+ * lockfunc == NULL, which is only valid if the maps that are associated
+ * with the tag are meant to never be defered.
+ * XXX Should have a way to identify which driver is responsible here.
+ */
+static void
+dflt_lock(void *arg, bus_dma_lock_op_t op)
+{
+#ifdef INVARIANTS
+	panic("driver error: busdma dflt_lock called");
+#else
+	printf("DRIVER_ERROR: busdma dflt_lock called\n");
+#endif
+}
+
 #define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4
 /*
  * Allocate a device specific dma_tag.
@@ -145,7 +185,8 @@
 		   bus_size_t boundary, bus_addr_t lowaddr,
 		   bus_addr_t highaddr, bus_dma_filter_t *filter,
 		   void *filterarg, bus_size_t maxsize, int nsegments,
-		   bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat)
+		   bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
+		   void *lockfuncarg, bus_dma_tag_t *dmat)
 {
 	bus_dma_tag_t newtag;
 	int error = 0;
@@ -171,6 +212,13 @@
 	newtag->flags = flags;
 	newtag->ref_count = 1; /* Count ourself */
 	newtag->map_count = 0;
+	if (lockfunc != NULL) {
+		newtag->lockfunc = lockfunc;
+		newtag->lockfuncarg = lockfuncarg;
+	} else {
+		newtag->lockfunc = dflt_lock;
+		newtag->lockfuncarg = NULL;
+	}
 	
 	/* Take into account any restrictions imposed by our parent tag */
 	if (parent != NULL) {
@@ -323,7 +371,7 @@
 int
 bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map)
 {
-	if (map != NULL) {
+	if (map != NULL && map != &nobounce_dmamap) {
 		if (STAILQ_FIRST(&map->bpages) != NULL)
 			return (EBUSY);
 		free(map, M_DEVBUF);
@@ -460,7 +508,7 @@
 				map->buf = buf;
 				map->buflen = buflen;
 				STAILQ_INSERT_TAIL(&bounce_map_waitinglist,
-								map, links);
+				    map, links);
 				mtx_unlock(&bounce_lock);
 				return (EINPROGRESS);
 			}
@@ -590,8 +638,7 @@
 #endif
 	int nsegs, error;
 
-	KASSERT(m0->m_flags & M_PKTHDR,
-		("bus_dmamap_load_mbuf: no packet header"));
+	M_ASSERTPKTHDR(m0);
 
 	flags |= BUS_DMA_NOWAIT;
 	nsegs = 0;
@@ -767,7 +814,7 @@
 							 M_NOWAIT, 0ul,
 							 dmat->lowaddr,
 							 PAGE_SIZE,
-							 0);
+							 dmat->boundary);
 		mtx_unlock(&Giant);
 		if (bpage->vaddr == 0) {
 			free(bpage, M_DEVBUF);
@@ -862,18 +909,18 @@
 void
 busdma_swi(void)
 {
+	bus_dma_tag_t dmat;
 	struct bus_dmamap *map;
 
 	mtx_lock(&bounce_lock);
 	while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) {
 		STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links);
 		mtx_unlock(&bounce_lock);
-		if (map->callback_mtx != NULL)
-			mtx_lock(map->callback_mtx);
+		dmat = map->dmat;
+		(dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK);
 		bus_dmamap_load(map->dmat, map, map->buf, map->buflen,
 				map->callback, map->callback_arg, /*flags*/0);
-		if (map->callback_mtx != NULL)
-			mtx_unlock(map->callback_mtx);
+		(dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK);
 		mtx_lock(&bounce_lock);
 	}
 	mtx_unlock(&bounce_lock);

==== //depot/projects/uart/amd64/include/bus_dma.h#2 (text+ko) ====

@@ -67,7 +67,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/* $FreeBSD: src/sys/amd64/include/bus_dma.h,v 1.22 2003/05/30 20:40:33 hmp Exp $ */
+/* $FreeBSD: src/sys/amd64/include/bus_dma.h,v 1.23 2003/07/01 15:51:51 scottl Exp $ */
 
 #ifndef _AMD64_BUS_DMA_H_
 #define _AMD64_BUS_DMA_H_
@@ -132,6 +132,17 @@
 typedef int bus_dma_filter_t(void *, bus_addr_t);
 
 /*
+ * A function that performs driver-specific syncronization on behalf of
+ * busdma.
+ */
+typedef enum {
+	BUS_DMA_LOCK	= 0x01,
+	BUS_DMA_UNLOCK	= 0x02,
+} bus_dma_lock_op_t;
+
+typedef void bus_dma_lock_t(void *, bus_dma_lock_op_t);
+
+/*
  * Allocate a device specific dma_tag encapsulating the constraints of
  * the parent tag in addition to other restrictions specified:
  *
@@ -156,7 +167,8 @@
 		       bus_size_t boundary, bus_addr_t lowaddr,
 		       bus_addr_t highaddr, bus_dma_filter_t *filtfunc,
 		       void *filtfuncarg, bus_size_t maxsize, int nsegments,
-		       bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat);
+		       bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
+		       void *lockfuncarg, bus_dma_tag_t *dmat);
 
 int bus_dma_tag_destroy(bus_dma_tag_t dmat);
 
@@ -238,4 +250,8 @@
 	if ((dmamap) != NULL)				\
 		_bus_dmamap_unload(dmat, dmamap)
 
+/*
+ * Generic helper function for manipulating mutexes.
+ */
+void busdma_lock_mutex(void *arg, bus_dma_lock_op_t op);
 #endif /* _AMD64_BUS_DMA_H_ */

==== //depot/projects/uart/boot/ficl/Makefile#2 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/boot/ficl/Makefile,v 1.34 2003/06/26 03:51:57 peter Exp $
+# $FreeBSD: src/sys/boot/ficl/Makefile,v 1.35 2003/06/30 19:08:49 ru Exp $
 #
 .if ${MACHINE_ARCH} == "amd64"
 .MAKEFLAGS:  MACHINE_ARCH=i386 MACHINE=i386 REALLY_AMD64=true
@@ -43,7 +43,6 @@
 
 .if defined(REALLY_AMD64)
 CFLAGS+=	-m32 -I.
-LDFLAGS=	-m elf_i386_fbsd
 .endif
 
 CFLAGS+=	-I${.CURDIR} -I${.CURDIR}/${MACHINE_ARCH} -I${.CURDIR}/../common

==== //depot/projects/uart/boot/forth/loader.conf#2 (text+ko) ====

@@ -6,7 +6,7 @@
 #
 # All arguments must be in double quotes.
 #
-# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.71 2003/05/16 04:31:00 murray Exp $
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.72 2003/07/01 01:03:32 brueffer Exp $
 
 ##############################################################
 ###  Basic configuration options  ############################
@@ -46,6 +46,7 @@
 ##############################################################
 
 #autoboot_delay="10"		# Delay in seconds before autobooting
+#beastie_disable="NO"		# Turn the beastie boot menu on and off
 #console="vidconsole"		# Set the current console
 #currdev="disk1s1a"		# Set the current device
 module_path="/boot/kernel;/boot/modules"	# Set the module search path

==== //depot/projects/uart/boot/i386/btx/lib/Makefile#2 (text+ko) ====

@@ -1,14 +1,11 @@
-# $FreeBSD: src/sys/boot/i386/btx/lib/Makefile,v 1.10 2002/09/17 01:48:55 peter Exp $
+# $FreeBSD: src/sys/boot/i386/btx/lib/Makefile,v 1.11 2003/06/30 14:10:57 ru Exp $
 
 OBJS=		btxcsu.o btxsys.o btxv86.o
-CLEANFILES+=	crt0.o ${OBJS}
+CLEANFILES=	crt0.o
 
 all: crt0.o
 
 crt0.o: ${OBJS}
 	${LD} ${LDFLAGS} -i -o ${.TARGET} ${OBJS}
 
-.include <bsd.lib.mk>
-
-.s.o:
-	${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC}
+.include <bsd.prog.mk>

==== //depot/projects/uart/boot/pc98/btx/lib/Makefile#2 (text+ko) ====

@@ -1,14 +1,11 @@
-# $FreeBSD: src/sys/boot/pc98/btx/lib/Makefile,v 1.7 2002/09/19 13:43:02 nyan Exp $
+# $FreeBSD: src/sys/boot/pc98/btx/lib/Makefile,v 1.8 2003/06/30 14:10:58 ru Exp $
 
 OBJS=		btxcsu.o btxsys.o btxv86.o
-CLEANFILES+=	crt0.o ${OBJS}
+CLEANFILES=	crt0.o
 
 all: crt0.o
 
 crt0.o: ${OBJS}
 	${LD} ${LDFLAGS} -i -o ${.TARGET} ${OBJS}
 
-.include <bsd.lib.mk>
-
-.s.o:
-	${AS} ${AFLAGS} -o ${.TARGET} ${.IMPSRC}
+.include <bsd.prog.mk>

==== //depot/projects/uart/conf/files.sparc64#3 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.sparc64,v 1.43 2003/06/19 18:06:58 jake Exp $
+# $FreeBSD: src/sys/conf/files.sparc64,v 1.44 2003/07/01 14:52:46 tmm Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -35,6 +35,10 @@
 sparc64/isa/ofw_isa.c		optional	isa
 sparc64/pci/apb.c		optional	apb
 sparc64/pci/ofw_pci.c		optional	pci
+sparc64/pci/ofw_pcib.c		optional	pci ofw_newpci
+sparc64/pci/ofw_pcib_subr.c	optional	pci ofw_newpci
+sparc64/pci/ofw_pcibus.c	optional	pci ofw_newpci
+sparc64/pci/ofw_pci_if.m	optional	pci
 sparc64/pci/psycho.c		optional	pci
 sparc64/sbus/sbus.c		optional	sbus
 sparc64/sparc64/autoconf.c	standard
@@ -72,7 +76,6 @@
 sparc64/sparc64/pmap.c		standard
 sparc64/sparc64/prof_machdep.c	optional	profiling-routine
 sparc64/sparc64/rwindow.c	standard
-sparc64/sparc64/sparcbus_if.m	standard
 sparc64/sparc64/spitfire.c	standard
 sparc64/sparc64/support.S	standard
 sparc64/sparc64/sys_machdep.c	standard

==== //depot/projects/uart/conf/options.sparc64#2 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options.sparc64,v 1.6 2003/06/12 15:00:34 tmm Exp $
+# $FreeBSD: src/sys/conf/options.sparc64,v 1.7 2003/07/01 14:52:46 tmm Exp $
 
 SUN4U			opt_global.h
 
@@ -6,6 +6,7 @@
 PSYCHO_DEBUG		opt_psycho.h
 DEBUGGER_ON_POWERFAIL	opt_psycho.h
 OFW_PCI_DEBUG		opt_ofw_pci.h
+OFW_NEWPCI		opt_ofw_pci.h
 # Normal IOMMU debugging
 IOMMU_DEBUG		opt_iommu.h
 # Debug IOMMU inserts/removes using diagnostic accesses. Very loud.

==== //depot/projects/uart/dev/aac/aac.c#2 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/aac/aac.c,v 1.69 2003/06/03 02:10:55 scottl Exp $
+ *	$FreeBSD: src/sys/dev/aac/aac.c,v 1.70 2003/07/01 15:51:51 scottl Exp $
  */
 
 /*
@@ -233,8 +233,15 @@
 	if ((error = aac_check_firmware(sc)) != 0)
 		return(error);
 
-	/* Init the sync fib lock */
+	/*
+	 * Initialize locks
+	 */
 	AAC_LOCK_INIT(&sc->aac_sync_lock, "AAC sync FIB lock");
+	AAC_LOCK_INIT(&sc->aac_aifq_lock, "AAC AIF lock");
+	AAC_LOCK_INIT(&sc->aac_io_lock, "AAC I/O lock");
+	AAC_LOCK_INIT(&sc->aac_container_lock, "AAC container lock");
+	TAILQ_INIT(&sc->aac_container_tqh);
+
 
 	/*
 	 * Initialise the adapter.
@@ -248,14 +255,6 @@
 	aac_describe_controller(sc);
 
 	/*
-	 * Initialize locks
-	 */
-	AAC_LOCK_INIT(&sc->aac_aifq_lock, "AAC AIF lock");
-	TAILQ_INIT(&sc->aac_container_tqh);
-	AAC_LOCK_INIT(&sc->aac_container_lock, "AAC container lock");
-	AAC_LOCK_INIT(&sc->aac_io_lock, "AAC I/O lock");
-
-	/*
 	 * Register to probe our containers later.
 	 */
 	sc->aac_ich.ich_func = aac_startup;
@@ -1450,6 +1449,8 @@
 			       AAC_MAXSGENTRIES,	/* nsegments */
 			       MAXBSIZE,		/* maxsegsize */
 			       BUS_DMA_ALLOCNOW,	/* flags */
+			       busdma_lock_mutex,	/* lockfunc */
+			       &sc->aac_io_lock,	/* lockfuncarg */
 			       &sc->aac_buffer_dmat)) {
 		device_printf(sc->aac_dev, "can't allocate buffer DMA tag\n");
 		goto out;
@@ -1471,6 +1472,7 @@
 			       AAC_FIB_COUNT *
 			       sizeof(struct aac_fib),	/* maxsegsize */
 			       BUS_DMA_ALLOCNOW,	/* flags */
+			       NULL, NULL,		/* No locking needed */
 			       &sc->aac_fib_dmat)) {
 		device_printf(sc->aac_dev, "can't allocate FIB DMA tag\n");;
 		goto out;
@@ -1490,6 +1492,7 @@
 			       1,			/* nsegments */
 			       BUS_SPACE_MAXSIZE_32BIT,	/* maxsegsize */
 			       BUS_DMA_ALLOCNOW,	/* flags */

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list